Welcome to mirror list, hosted at ThFree Co, Russian Federation.

assignment_event_recorder_spec.rb « resource_events « gitlab « lib « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b15f95dbd9cd0729a2f68610a9eebd92442df195 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::ResourceEvents::AssignmentEventRecorder, feature_category: :value_stream_management do
  using RSpec::Parameterized::TableSyntax

  let_it_be(:user1) { create(:user) }
  let_it_be(:user2) { create(:user) }
  let_it_be(:user3) { create(:user) }

  let_it_be_with_refind(:issue_with_two_assignees) { create(:issue, assignees: [user1, user2]) }
  let_it_be_with_refind(:mr_with_no_assignees) { create(:merge_request) }
  let_it_be_with_refind(:mr_with_one_assignee) { create(:merge_request, assignee: [user3]) }

  let(:parent_records) do
    {
      issue_with_two_assignees: issue_with_two_assignees,
      mr_with_no_assignees: mr_with_no_assignees,
      mr_with_one_assignee: mr_with_one_assignee
    }
  end

  let(:user_records) do
    {
      user1: user1,
      user2: user2,
      user3: user3
    }
  end

  where(:parent, :new_assignees, :assignee_history) do
    :issue_with_two_assignees | [:user1, :user2, :user3] | [[:user3, :add]]
    :issue_with_two_assignees | [:user1, :user3]         | [[:user2, :remove], [:user3, :add]]
    :issue_with_two_assignees | [:user1]                 | [[:user2, :remove]]
    :issue_with_two_assignees | []                       | [[:user1, :remove], [:user2, :remove]]
    :mr_with_no_assignees     | [:user1]                 | [[:user1, :add]]
    :mr_with_no_assignees     | []                       | []
    :mr_with_one_assignee     | [:user3]                 | []
    :mr_with_one_assignee     | [:user1]                 | [[:user3, :remove], [:user1, :add]]
  end

  with_them do
    it 'records the assignment history corrently' do
      parent_record = parent_records[parent]
      old_assignees = parent_record.assignees.to_a
      parent_record.assignees = new_assignees.map { |user_variable_name| user_records[user_variable_name] }

      described_class.new(parent: parent_record, old_assignees: old_assignees).record

      expected_records = assignee_history.map do |user_variable_name, action|
        have_attributes({
          user_id: user_records[user_variable_name].id,
          action: action.to_s
        })
      end

      expect(parent_record.assignment_events).to match_array(expected_records)
    end
  end

  context 'when batching' do
    it 'invokes multiple insert queries' do
      stub_const('Gitlab::ResourceEvents::AssignmentEventRecorder::BATCH_SIZE', 1)

      expect(ResourceEvents::MergeRequestAssignmentEvent).to receive(:insert_all).twice

      described_class.new(parent: mr_with_one_assignee, old_assignees: [user1]).record # 1 assignment, 1 unassignment
    end
  end

  context 'when duplicated old assignees were given' do
    it 'deduplicates the records' do
      expect do
        described_class.new(parent: mr_with_one_assignee, old_assignees: [user3, user2, user2]).record
      end.to change { ResourceEvents::MergeRequestAssignmentEvent.count }.by(1)
    end
  end

  context 'when the record_issue_and_mr_assignee_events FF is off' do
    before do
      stub_feature_flags(record_issue_and_mr_assignee_events: false)
    end

    it 'does nothing' do
      expect do
        described_class.new(parent: mr_with_one_assignee, old_assignees: [user2, user3]).record
      end.not_to change { mr_with_one_assignee.assignment_events.count }
    end
  end
end