event_spec.rb 6.45 KB
Newer Older
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
1 2
require 'spec_helper'

Douwe Maan's avatar
Douwe Maan committed
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

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) }
15 16
  end

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
  describe 'Callbacks' do
    describe 'after_create :reset_project_activity' do
      let(:project) { create(:project) }

      context "project's last activity was less than 5 minutes ago" do
        it 'does not update project.last_activity_at if it has been touched less than 5 minutes ago' do
          create_event(project, project.owner)
          project.update_column(:last_activity_at, 5.minutes.ago)
          project_last_activity_at = project.last_activity_at

          create_event(project, project.owner)

          expect(project.last_activity_at).to eq(project_last_activity_at)
        end
      end
    end
  end

randx's avatar
randx committed
35 36
  describe "Push event" do
    before do
37
      project = create(:project)
38
      @user = project.owner
39
      @event = create_event(project, @user)
40 41
    end

42
    it { expect(@event.push?).to be_truthy }
43
    it { expect(@event.visible_to_user?).to be_truthy }
44 45 46
    it { expect(@event.tag?).to be_falsey }
    it { expect(@event.branch_name).to eq("master") }
    it { expect(@event.author).to eq(@user) }
47
  end
48

49 50 51 52 53 54 55 56 57
  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

58
    context 'merge request diff note event' do
59
      let(:target) { create(:legacy_diff_note_on_merge_request) }
60 61 62 63 64

      it { is_expected.to be_note }
    end
  end

65
  describe '#visible_to_user?' do
66 67 68
    let(:project) { create(:empty_project, :public) }
    let(:non_member) { create(:user) }
    let(:member)  { create(:user) }
69
    let(:guest)  { create(:user) }
70 71 72 73 74 75 76 77 78 79 80
    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]
81
      project.team << [guest, :guest]
82
    end
83

84
    context 'issue event' do
85
      context 'for non confidential issues' do
86
        let(:target) { issue }
87

88 89 90 91
        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 }
92
        it { expect(event.visible_to_user?(guest)).to eq true }
93
        it { expect(event.visible_to_user?(admin)).to eq true }
94 95 96
      end

      context 'for confidential issues' do
97 98
        let(:target) { confidential_issue }

99 100 101 102
        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 }
103
        it { expect(event.visible_to_user?(guest)).to eq false }
104
        it { expect(event.visible_to_user?(admin)).to eq true }
105 106 107
      end
    end

108
    context 'issue note event' do
109 110 111
      context 'on non confidential issues' do
        let(:target) { note_on_issue }

112 113 114 115
        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 }
116
        it { expect(event.visible_to_user?(guest)).to eq true }
117
        it { expect(event.visible_to_user?(admin)).to eq true }
118 119 120 121
      end

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

123 124 125 126
        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 }
127
        it { expect(event.visible_to_user?(guest)).to eq false }
128
        it { expect(event.visible_to_user?(admin)).to eq true }
129 130
      end
    end
131

132
    context 'merge request diff note event' do
133 134
      let(:project) { create(:project, :public) }
      let(:merge_request) { create(:merge_request, source_project: project, author: author, assignee: assignee) }
135
      let(:note_on_merge_request) { create(:legacy_diff_note_on_merge_request, noteable: merge_request, project: project) }
136 137 138 139 140 141 142 143 144
      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
145 146
  end

Yorick Peterse's avatar
Yorick Peterse committed
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
  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
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

  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
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
187
end