summaryrefslogtreecommitdiff
path: root/spec/services/merge_requests/export_csv_service_spec.rb
blob: 2f0036845e7a643743da7ae4be08b04b15e0bc9d (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe MergeRequests::ExportCsvService, feature_category: :importers do
  let_it_be(:merge_request) { create(:merge_request) }

  let(:csv) { CSV.parse(subject.csv_data, headers: true).first }

  subject { described_class.new(MergeRequest.where(id: merge_request.id), merge_request.project) }

  describe 'csv_data' do
    it 'contains the correct information', :aggregate_failures do
      expect(csv['MR IID']).to eq(merge_request.iid.to_s)
      expect(csv['Title']).to eq(merge_request.title)
      expect(csv['State']).to eq(merge_request.state)
      expect(csv['Description']).to eq(merge_request.description)
      expect(csv['Source Branch']).to eq(merge_request.source_branch)
      expect(csv['Target Branch']).to eq(merge_request.target_branch)
      expect(csv['Source Project ID']).to eq(merge_request.source_project_id.to_s)
      expect(csv['Target Project ID']).to eq(merge_request.target_project_id.to_s)
      expect(csv['Author']).to eq(merge_request.author.name)
      expect(csv['Author Username']).to eq(merge_request.author.username)
    end

    describe 'assignees' do
      context 'when assigned' do
        let_it_be(:merge_request) { create(:merge_request, assignees: create_list(:user, 2)) }

        it 'contains the names of assignees' do
          expect(csv['Assignees'].split(', ')).to match_array(merge_request.assignees.map(&:name))
        end

        it 'contains the usernames of assignees' do
          expect(csv['Assignee Usernames'].split(', ')).to match_array(merge_request.assignees.map(&:username))
        end
      end

      context 'when not assigned' do
        it 'returns empty strings' do
          expect(csv['Assignees']).to eq('')
          expect(csv['Assignee Usernames']).to eq('')
        end
      end
    end

    describe 'approvers' do
      context 'when approved' do
        let_it_be(:merge_request) { create(:merge_request) }

        let(:approvers) { create_list(:user, 2) }

        before do
          merge_request.approved_by_users = approvers
        end

        it 'contains the names of approvers separated by a comma' do
          expect(csv['Approvers'].split(', ')).to contain_exactly(approvers[0].name, approvers[1].name)
        end

        it 'contains the usernames of approvers separated by a comma' do
          expect(csv['Approver Usernames'].split(', ')).to contain_exactly(approvers[0].username, approvers[1].username)
        end
      end

      context 'when not approved' do
        it 'returns empty strings' do
          expect(csv['Approvers']).to eq('')
          expect(csv['Approver Usernames']).to eq('')
        end
      end
    end

    describe 'merged user' do
      context 'MR is merged' do
        let_it_be(:merge_request) { create(:merge_request, :merged, :with_merged_metrics) }

        it 'is merged' do
          expect(csv['State']).to eq('merged')
        end

        it 'has a merged user' do
          expect(csv['Merged User']).to eq(merge_request.metrics.merged_by.name)
          expect(csv['Merged Username']).to eq(merge_request.metrics.merged_by.username)
        end
      end

      context 'MR is not merged' do
        it 'returns empty strings' do
          expect(csv['Merged User']).to eq('')
          expect(csv['Merged Username']).to eq('')
        end
      end
    end

    describe 'milestone' do
      context 'milestone is assigned' do
        let_it_be(:merge_request) { create(:merge_request) }
        let_it_be(:milestone) { create(:milestone, :active, project: merge_request.project) }

        before do
          merge_request.update!(milestone_id: milestone.id)
        end

        it 'contains the milestone ID' do
          expect(csv['Milestone ID']).to eq(merge_request.milestone.id.to_s)
        end
      end

      context 'no milestone is assigned' do
        it 'returns an empty string' do
          expect(csv['Milestone ID']).to eq('')
        end
      end
    end

    describe '#email' do
      let_it_be(:user) { create(:user) }

      it 'emails csv' do
        expect { subject.email(user) }.to change { ActionMailer::Base.deliveries.count }
      end

      it 'renders with a target filesize' do
        expect_next_instance_of(CsvBuilder) do |csv_builder|
          expect(csv_builder).to receive(:render).with(described_class::TARGET_FILESIZE).once
        end

        subject.email(user)
      end
    end
  end
end