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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-03-28 21:15:00 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-03-28 21:15:00 +0300
commit14059114eb35b29cf83aa1b715158c96c55ab388 (patch)
treeb9b96e6bb66e3b1caf900bdce664a234087a4848 /spec/controllers/projects/work_items_controller_spec.rb
parentee7db70e1185876e97eca97ce8efabfc64c360b9 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/controllers/projects/work_items_controller_spec.rb')
-rw-r--r--spec/controllers/projects/work_items_controller_spec.rb156
1 files changed, 156 insertions, 0 deletions
diff --git a/spec/controllers/projects/work_items_controller_spec.rb b/spec/controllers/projects/work_items_controller_spec.rb
new file mode 100644
index 00000000000..e0f61a4977b
--- /dev/null
+++ b/spec/controllers/projects/work_items_controller_spec.rb
@@ -0,0 +1,156 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Projects::WorkItemsController, feature_category: :team_planning do
+ let_it_be(:reporter) { create(:user) }
+ let_it_be(:guest) { create(:user) }
+ let_it_be(:project) { create(:project) }
+ let_it_be(:work_item) { create(:work_item, project: project) }
+
+ let(:file) { 'file' }
+
+ before do
+ project.add_reporter(reporter)
+ project.add_guest(guest)
+ end
+
+ shared_examples 'response with 404 status' do
+ it 'renders a not found message' do
+ expect(WorkItems::ImportWorkItemsCsvWorker).not_to receive(:perform_async)
+
+ subject
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ shared_examples 'redirects to new session path' do
+ it 'redirects to sign in' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:found)
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+
+ describe 'GET index' do
+ specify do
+ expect(
+ get(:index, params: { namespace_id: project.namespace, project_id: project, work_items_path: work_item.id })
+ ).to have_request_urgency(:low)
+ end
+ end
+
+ describe 'POST authorize' do
+ subject do
+ post(:authorize, params: { namespace_id: project.namespace, project_id: project, file: file })
+ end
+
+ specify do
+ expect(subject).to have_request_urgency(:high)
+ end
+
+ context 'when user is anonymous' do
+ it_behaves_like 'redirects to new session path'
+ end
+ end
+
+ describe 'POST import_csv' do
+ subject { post :import_csv, params: { namespace_id: project.namespace, project_id: project, file: file } }
+
+ let(:upload_service) { double }
+ let(:uploader) { double }
+ let(:upload) { double }
+ let(:upload_id) { 99 }
+
+ specify do
+ expect(subject).to have_request_urgency(:low)
+ end
+
+ context 'with authorized user' do
+ before do
+ sign_in(reporter)
+ allow(controller).to receive(:file_is_valid?).and_return(true)
+ end
+
+ context 'when feature is available' do
+ context 'when the upload is processed successfully' do
+ before do
+ mock_upload
+ end
+
+ it 'renders the correct message' do
+ expect(WorkItems::ImportWorkItemsCsvWorker).to receive(:perform_async)
+ .with(reporter.id, project.id, upload_id)
+
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response['message']).to eq(
+ "Your work items are being imported. Once finished, you'll receive a confirmation email."
+ )
+ end
+ end
+
+ context 'when file is not valid' do
+ before do
+ allow(controller).to receive(:file_is_valid?).and_return(false)
+ end
+
+ it 'renders the error message' do
+ expect(WorkItems::ImportWorkItemsCsvWorker).not_to receive(:perform_async)
+
+ subject
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['errors'])
+ .to eq('The uploaded file was invalid. Supported file extensions are .csv.')
+ end
+ end
+
+ context 'when service response includes errors' do
+ before do
+ mock_upload(false)
+ end
+
+ it 'renders the error message' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['errors']).to eq('File upload error.')
+ end
+ end
+ end
+
+ context 'when feature is not available' do
+ before do
+ stub_feature_flags(import_export_work_items_csv: false)
+ end
+
+ it_behaves_like 'response with 404 status'
+ end
+ end
+
+ context 'with unauthorised user' do
+ before do
+ mock_upload
+ sign_in(guest)
+ allow(controller).to receive(:file_is_valid?).and_return(true)
+ end
+
+ it_behaves_like 'response with 404 status'
+ end
+
+ context 'with anonymous user' do
+ it 'redirects to sign in page' do
+ expect(WorkItems::ImportWorkItemsCsvWorker).not_to receive(:perform_async)
+
+ subject
+
+ expect(response).to have_gitlab_http_status(:found)
+ expect(response).to redirect_to(new_user_session_path)
+ end
+ end
+ end
+end