summaryrefslogtreecommitdiff
path: root/spec/services/work_items/export_csv_service_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/services/work_items/export_csv_service_spec.rb')
-rw-r--r--spec/services/work_items/export_csv_service_spec.rb77
1 files changed, 77 insertions, 0 deletions
diff --git a/spec/services/work_items/export_csv_service_spec.rb b/spec/services/work_items/export_csv_service_spec.rb
new file mode 100644
index 00000000000..0718d3b686a
--- /dev/null
+++ b/spec/services/work_items/export_csv_service_spec.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe WorkItems::ExportCsvService, :with_license, feature_category: :team_planning do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :public, group: group) }
+ let_it_be(:work_item_1) { create(:work_item, project: project) }
+ let_it_be(:work_item_2) { create(:work_item, :incident, project: project) }
+
+ subject { described_class.new(WorkItem.all, project) }
+
+ def csv
+ CSV.parse(subject.csv_data, headers: true)
+ end
+
+ context 'when import_export_work_items_csv flag is not enabled' do
+ before do
+ stub_feature_flags(import_export_work_items_csv: false)
+ end
+
+ it 'renders an error' do
+ expect { subject.csv_data }.to raise_error(described_class::NotAvailableError)
+ end
+ end
+
+ it 'renders csv to string' do
+ expect(subject.csv_data).to be_a String
+ end
+
+ describe '#email' do
+ # TODO - will be implemented as part of https://gitlab.com/gitlab-org/gitlab/-/issues/379082
+ xit 'emails csv' do
+ expect { subject.email(user) }.o change { ActionMailer::Base.deliveries.count }.from(0).to(1)
+ end
+ end
+
+ it 'returns two work items' do
+ expect(csv.count).to eq(2)
+ end
+
+ specify 'iid' do
+ expect(csv[0]['Id']).to eq work_item_1.iid.to_s
+ end
+
+ specify 'title' do
+ expect(csv[0]['Title']).to eq work_item_1.title
+ end
+
+ specify 'type' do
+ expect(csv[0]['Type']).to eq('Issue')
+ expect(csv[1]['Type']).to eq('Incident')
+ end
+
+ specify 'author name' do
+ expect(csv[0]['Author']).to eq(work_item_1.author_name)
+ end
+
+ specify 'author username' do
+ expect(csv[0]['Author Username']).to eq(work_item_1.author.username)
+ end
+
+ specify 'created_at' do
+ expect(csv[0]['Created At (UTC)']).to eq(work_item_1.created_at.to_s(:csv))
+ end
+
+ it 'preloads fields to avoid N+1 queries' do
+ control = ActiveRecord::QueryRecorder.new { subject.csv_data }
+
+ create(:work_item, :task, project: project)
+
+ expect { subject.csv_data }.not_to exceed_query_limit(control)
+ end
+
+ it_behaves_like 'a service that returns invalid fields from selection'
+end