event_spec.rb 7.0 KB
Newer Older
D
Dmitriy Zaporozhets 已提交
1 2
require 'spec_helper'

D
Douwe Maan 已提交
3
describe Event, models: true do
4
  describe "Associations" do
5 6
    it { is_expected.to belong_to(:project) }
    it { is_expected.to belong_to(:target) }
7 8
  end

D
Dmitriy Zaporozhets 已提交
9
  describe "Respond to" do
10 11 12 13 14
    it { is_expected.to respond_to(:author_name) }
    it { is_expected.to respond_to(:author_email) }
    it { is_expected.to respond_to(:issue_title) }
    it { is_expected.to respond_to(:merge_request_title) }
    it { is_expected.to respond_to(:commits) }
D
Dmitriy Zaporozhets 已提交
15 16
  end

17 18
  describe 'Callbacks' do
    describe 'after_create :reset_project_activity' do
19
      let(:project) { create(:empty_project) }
20

21 22
      it 'calls the reset_project_activity method' do
        expect_any_instance_of(Event).to receive(:reset_project_activity)
23

24
        create_event(project, project.owner)
25 26 27 28
      end
    end
  end

R
randx 已提交
29 30
  describe "Push event" do
    before do
31
      project = create(:project)
D
Dmitriy Zaporozhets 已提交
32
      @user = project.owner
33
      @event = create_event(project, @user)
D
Dmitriy Zaporozhets 已提交
34 35
    end

36
    it { expect(@event.push?).to be_truthy }
37
    it { expect(@event.visible_to_user?).to be_truthy }
38 39 40
    it { expect(@event.tag?).to be_falsey }
    it { expect(@event.branch_name).to eq("master") }
    it { expect(@event.author).to eq(@user) }
D
Dmitriy Zaporozhets 已提交
41
  end
42

43 44 45 46 47 48 49 50 51
  describe '#note?' do
    subject { Event.new(project: target.project, target: target) }

    context 'issue note event' do
      let(:target) { create(:note_on_issue) }

      it { is_expected.to be_note }
    end

52
    context 'merge request diff note event' do
D
Douwe Maan 已提交
53
      let(:target) { create(:legacy_diff_note_on_merge_request) }
54 55 56 57 58

      it { is_expected.to be_note }
    end
  end

59
  describe '#visible_to_user?' do
60 61 62
    let(:project) { create(:empty_project, :public) }
    let(:non_member) { create(:user) }
    let(:member)  { create(:user) }
63
    let(:guest)  { create(:user) }
64 65 66 67 68 69 70 71 72 73 74
    let(:author) { create(:author) }
    let(:assignee) { create(:user) }
    let(:admin) { create(:admin) }
    let(:issue) { create(:issue, project: project, author: author, assignee: assignee) }
    let(:confidential_issue) { create(:issue, :confidential, project: project, author: author, assignee: assignee) }
    let(:note_on_issue) { create(:note_on_issue, noteable: issue, project: project) }
    let(:note_on_confidential_issue) { create(:note_on_issue, noteable: confidential_issue, project: project) }
    let(:event) { Event.new(project: project, target: target, author_id: author.id) }

    before do
      project.team << [member, :developer]
75
      project.team << [guest, :guest]
76
    end
77

78
    context 'issue event' do
79
      context 'for non confidential issues' do
80
        let(:target) { issue }
81

82 83 84 85
        it { expect(event.visible_to_user?(non_member)).to eq true }
        it { expect(event.visible_to_user?(author)).to eq true }
        it { expect(event.visible_to_user?(assignee)).to eq true }
        it { expect(event.visible_to_user?(member)).to eq true }
86
        it { expect(event.visible_to_user?(guest)).to eq true }
87
        it { expect(event.visible_to_user?(admin)).to eq true }
88 89 90
      end

      context 'for confidential issues' do
91 92
        let(:target) { confidential_issue }

93 94 95 96
        it { expect(event.visible_to_user?(non_member)).to eq false }
        it { expect(event.visible_to_user?(author)).to eq true }
        it { expect(event.visible_to_user?(assignee)).to eq true }
        it { expect(event.visible_to_user?(member)).to eq true }
97
        it { expect(event.visible_to_user?(guest)).to eq false }
98
        it { expect(event.visible_to_user?(admin)).to eq true }
99 100 101
      end
    end

102
    context 'issue note event' do
103 104 105
      context 'on non confidential issues' do
        let(:target) { note_on_issue }

106 107 108 109
        it { expect(event.visible_to_user?(non_member)).to eq true }
        it { expect(event.visible_to_user?(author)).to eq true }
        it { expect(event.visible_to_user?(assignee)).to eq true }
        it { expect(event.visible_to_user?(member)).to eq true }
110
        it { expect(event.visible_to_user?(guest)).to eq true }
111
        it { expect(event.visible_to_user?(admin)).to eq true }
112 113 114 115
      end

      context 'on confidential issues' do
        let(:target) { note_on_confidential_issue }
116

117 118 119 120
        it { expect(event.visible_to_user?(non_member)).to eq false }
        it { expect(event.visible_to_user?(author)).to eq true }
        it { expect(event.visible_to_user?(assignee)).to eq true }
        it { expect(event.visible_to_user?(member)).to eq true }
121
        it { expect(event.visible_to_user?(guest)).to eq false }
122
        it { expect(event.visible_to_user?(admin)).to eq true }
123 124
      end
    end
125

126
    context 'merge request diff note event' do
127 128
      let(:project) { create(:project, :public) }
      let(:merge_request) { create(:merge_request, source_project: project, author: author, assignee: assignee) }
D
Douwe Maan 已提交
129
      let(:note_on_merge_request) { create(:legacy_diff_note_on_merge_request, noteable: merge_request, project: project) }
130 131 132 133 134 135 136 137 138
      let(:target) { note_on_merge_request }

      it { expect(event.visible_to_user?(non_member)).to eq true }
      it { expect(event.visible_to_user?(author)).to eq true }
      it { expect(event.visible_to_user?(assignee)).to eq true }
      it { expect(event.visible_to_user?(member)).to eq true }
      it { expect(event.visible_to_user?(guest)).to eq true }
      it { expect(event.visible_to_user?(admin)).to eq true }
    end
139 140
  end

Y
Yorick Peterse 已提交
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
  describe '.limit_recent' do
    let!(:event1) { create(:closed_issue_event) }
    let!(:event2) { create(:closed_issue_event) }

    describe 'without an explicit limit' do
      subject { Event.limit_recent }

      it { is_expected.to eq([event2, event1]) }
    end

    describe 'with an explicit limit' do
      subject { Event.limit_recent(1) }

      it { is_expected.to eq([event2]) }
    end
  end
157

158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
  describe '#reset_project_activity' do
    let(:project) { create(:empty_project) }

    context 'when a project was updated less than 1 hour ago' do
      it 'does not update the project' do
        project.update(last_activity_at: Time.now)

        expect(project).not_to receive(:update_column).
          with(:last_activity_at, a_kind_of(Time))

        create_event(project, project.owner)
      end
    end

    context 'when a project was updated more than 1 hour ago' do
      it 'updates the project' do
        project.update(last_activity_at: 1.year.ago)

        expect_any_instance_of(Gitlab::ExclusiveLease).
          to receive(:try_obtain).and_return(true)

        expect(project).to receive(:update_column).
          with(:last_activity_at, a_kind_of(Time))

        create_event(project, project.owner)
      end
    end
  end

187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
  def create_event(project, user, attrs = {})
    data = {
      before: Gitlab::Git::BLANK_SHA,
      after: "0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e",
      ref: "refs/heads/master",
      user_id: user.id,
      user_name: user.name,
      repository: {
        name: project.name,
        url: "localhost/rubinius",
        description: "",
        homepage: "localhost/rubinius",
        private: true
      }
    }

    Event.create({
      project: project,
      action: Event::PUSHED,
      data: data,
      author_id: user.id
    }.merge(attrs))
  end
D
Dmitriy Zaporozhets 已提交
210
end