diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-28 21:15:00 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-28 21:15:00 +0300 |
commit | 14059114eb35b29cf83aa1b715158c96c55ab388 (patch) | |
tree | b9b96e6bb66e3b1caf900bdce664a234087a4848 /spec/controllers/projects/work_items_controller_spec.rb | |
parent | ee7db70e1185876e97eca97ce8efabfc64c360b9 (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.rb | 156 |
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 |