From 113c7af4c295df678af41daf1ed76b58304a393c Mon Sep 17 00:00:00 2001 From: rpereira2 Date: Mon, 22 Apr 2019 23:57:29 +0530 Subject: Refactor operations controller spec - Move specs into a shared_context so that they can be reused. - Move common specs out of a more specific context. --- .../settings/operations_controller_spec.rb | 222 +++++++++++---------- 1 file changed, 117 insertions(+), 105 deletions(-) diff --git a/spec/controllers/projects/settings/operations_controller_spec.rb b/spec/controllers/projects/settings/operations_controller_spec.rb index 02a392f23c2..7ec5ebf3ce9 100644 --- a/spec/controllers/projects/settings/operations_controller_spec.rb +++ b/spec/controllers/projects/settings/operations_controller_spec.rb @@ -11,66 +11,142 @@ describe Projects::Settings::OperationsController do project.add_maintainer(user) end - context 'error tracking' do - describe 'GET #show' do - it 'renders show template' do + describe 'GET #show' do + it 'renders show template' do + get :show, params: project_params(project) + + expect(response).to have_gitlab_http_status(:ok) + expect(response).to render_template(:show) + end + + context 'with insufficient permissions' do + before do + project.add_reporter(user) + end + + it 'renders 404' do get :show, params: project_params(project) - expect(response).to have_gitlab_http_status(:ok) - expect(response).to render_template(:show) + expect(response).to have_gitlab_http_status(:not_found) end + end - context 'with existing setting' do - let!(:error_tracking_setting) do - create(:project_error_tracking_setting, project: project) - end + context 'as an anonymous user' do + before do + sign_out(user) + end - it 'loads existing setting' do - get :show, params: project_params(project) + it 'redirects to signup page' do + get :show, params: project_params(project) - expect(controller.helpers.error_tracking_setting) - .to eq(error_tracking_setting) - end + expect(response).to redirect_to(new_user_session_path) end + end + end - context 'without an existing setting' do - it 'builds a new setting' do - get :show, params: project_params(project) + describe 'PATCH #update' do + context 'with insufficient permissions' do + before do + project.add_reporter(user) + end - expect(controller.helpers.error_tracking_setting).to be_new_record + it 'renders 404' do + patch :update, params: project_params(project) + + expect(response).to have_gitlab_http_status(:not_found) + end + end + + context 'as an anonymous user' do + before do + sign_out(user) + end + + it 'redirects to signup page' do + patch :update, params: project_params(project) + + expect(response).to redirect_to(new_user_session_path) + end + end + end + + shared_context 'PATCH #update' do + let(:operations_update_service) { instance_double(::Projects::Operations::UpdateService) } + let(:operations_url) { project_settings_operations_url(project) } + + let(:permitted_params) do + ActionController::Parameters.new(params).permit! + end + + context 'format json' do + context 'when update succeeds' do + before do + stub_operations_update_service_returning(status: :success) + end + + it 'returns success status' do + patch :update, + params: project_params(project, params), + format: :json + + expect(::Projects::Operations::UpdateService) + .to have_received(:new).with(project, user, permitted_params) + expect(operations_update_service).to have_received(:execute) + expect(response).to have_gitlab_http_status(:ok) + expect(json_response).to eq('status' => 'success') + expect(flash[:notice]).to eq('Your changes have been saved') end end - context 'with insufficient permissions' do + context 'when update fails' do before do - project.add_reporter(user) + stub_operations_update_service_returning( + status: :error, + message: 'error message' + ) end - it 'renders 404' do - get :show, params: project_params(project) + it 'returns error' do + patch :update, + params: project_params(project, params), + format: :json - expect(response).to have_gitlab_http_status(:not_found) + expect(::Projects::Operations::UpdateService) + .to have_received(:new).with(project, user, permitted_params) + expect(operations_update_service).to have_received(:execute) + expect(response).to have_gitlab_http_status(:bad_request) + expect(json_response['message']).not_to be_nil end end + end + end - context 'as an anonymous user' do - before do - sign_out(user) + context 'error tracking' do + describe 'GET #show' do + context 'with existing setting' do + let!(:error_tracking_setting) do + create(:project_error_tracking_setting, project: project) + end + + it 'loads existing setting' do + get :show, params: project_params(project) + + expect(controller.helpers.error_tracking_setting) + .to eq(error_tracking_setting) end + end - it 'redirects to signup page' do + context 'without an existing setting' do + it 'builds a new setting' do get :show, params: project_params(project) - expect(response).to redirect_to(new_user_session_path) + expect(controller.helpers.error_tracking_setting).to be_new_record end end end describe 'PATCH #update' do - let(:operations_update_service) { spy(:operations_update_service) } - let(:operations_url) { project_settings_operations_url(project) } - - let(:error_tracking_params) do + let(:params) do { error_tracking_setting_attributes: { enabled: '1', @@ -86,79 +162,7 @@ describe Projects::Settings::OperationsController do } end - let(:error_tracking_permitted) do - ActionController::Parameters.new(error_tracking_params).permit! - end - - context 'format json' do - context 'when update succeeds' do - before do - stub_operations_update_service_returning(status: :success) - end - - it 'returns success status' do - patch :update, - params: project_params(project, error_tracking_params), - format: :json - - expect(response).to have_gitlab_http_status(:ok) - expect(json_response).to eq('status' => 'success') - expect(flash[:notice]).to eq('Your changes have been saved') - end - end - - context 'when update fails' do - before do - stub_operations_update_service_returning( - status: :error, - message: 'error message' - ) - end - - it 'returns error' do - patch :update, - params: project_params(project, error_tracking_params), - format: :json - - expect(response).to have_gitlab_http_status(:bad_request) - expect(json_response['message']).not_to be_nil - end - end - end - - context 'with insufficient permissions' do - before do - project.add_reporter(user) - end - - it 'renders 404' do - patch :update, params: project_params(project) - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'as an anonymous user' do - before do - sign_out(user) - end - - it 'redirects to signup page' do - patch :update, params: project_params(project) - - expect(response).to redirect_to(new_user_session_path) - end - end - end - - private - - def stub_operations_update_service_returning(return_value = {}) - expect(::Projects::Operations::UpdateService) - .to receive(:new).with(project, user, error_tracking_permitted) - .and_return(operations_update_service) - expect(operations_update_service).to receive(:execute) - .and_return(return_value) + it_behaves_like 'PATCH #update' end end @@ -171,4 +175,12 @@ describe Projects::Settings::OperationsController do project: params } end + + def stub_operations_update_service_returning(return_value = {}) + allow(::Projects::Operations::UpdateService) + .to receive(:new).with(project, user, permitted_params) + .and_return(operations_update_service) + allow(operations_update_service).to receive(:execute) + .and_return(return_value) + end end -- cgit v1.2.1 From 9f9bb16cdfb07fc975e1bcf50d900c50837836b3 Mon Sep 17 00:00:00 2001 From: rpereira2 Date: Wed, 24 Apr 2019 11:56:31 +0530 Subject: Move shared context to top of spec file - Rename the shared_context - Use expect in stub_operations_update_service_returning. --- .../settings/operations_controller_spec.rb | 112 ++++++++++----------- 1 file changed, 52 insertions(+), 60 deletions(-) diff --git a/spec/controllers/projects/settings/operations_controller_spec.rb b/spec/controllers/projects/settings/operations_controller_spec.rb index 7ec5ebf3ce9..7df63266f71 100644 --- a/spec/controllers/projects/settings/operations_controller_spec.rb +++ b/spec/controllers/projects/settings/operations_controller_spec.rb @@ -11,6 +11,57 @@ describe Projects::Settings::OperationsController do project.add_maintainer(user) end + shared_context 'PATCHable' do + let(:operations_update_service) { instance_double(::Projects::Operations::UpdateService) } + let(:operations_url) { project_settings_operations_url(project) } + + let(:permitted_params) do + ActionController::Parameters.new(params).permit! + end + + context 'format json' do + context 'when update succeeds' do + it 'returns success status' do + stub_operations_update_service_returning(status: :success) + + patch :update, + params: project_params(project, params), + format: :json + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response).to eq('status' => 'success') + expect(flash[:notice]).to eq('Your changes have been saved') + end + end + + context 'when update fails' do + it 'returns error' do + stub_operations_update_service_returning( + status: :error, + message: 'error message' + ) + + patch :update, + params: project_params(project, params), + format: :json + + expect(response).to have_gitlab_http_status(:bad_request) + expect(json_response['message']).to eq('error message') + end + end + end + + private + + def stub_operations_update_service_returning(return_value = {}) + expect(::Projects::Operations::UpdateService) + .to receive(:new).with(project, user, permitted_params) + .and_return(operations_update_service) + expect(operations_update_service).to receive(:execute) + .and_return(return_value) + end + end + describe 'GET #show' do it 'renders show template' do get :show, params: project_params(project) @@ -70,57 +121,6 @@ describe Projects::Settings::OperationsController do end end - shared_context 'PATCH #update' do - let(:operations_update_service) { instance_double(::Projects::Operations::UpdateService) } - let(:operations_url) { project_settings_operations_url(project) } - - let(:permitted_params) do - ActionController::Parameters.new(params).permit! - end - - context 'format json' do - context 'when update succeeds' do - before do - stub_operations_update_service_returning(status: :success) - end - - it 'returns success status' do - patch :update, - params: project_params(project, params), - format: :json - - expect(::Projects::Operations::UpdateService) - .to have_received(:new).with(project, user, permitted_params) - expect(operations_update_service).to have_received(:execute) - expect(response).to have_gitlab_http_status(:ok) - expect(json_response).to eq('status' => 'success') - expect(flash[:notice]).to eq('Your changes have been saved') - end - end - - context 'when update fails' do - before do - stub_operations_update_service_returning( - status: :error, - message: 'error message' - ) - end - - it 'returns error' do - patch :update, - params: project_params(project, params), - format: :json - - expect(::Projects::Operations::UpdateService) - .to have_received(:new).with(project, user, permitted_params) - expect(operations_update_service).to have_received(:execute) - expect(response).to have_gitlab_http_status(:bad_request) - expect(json_response['message']).not_to be_nil - end - end - end - end - context 'error tracking' do describe 'GET #show' do context 'with existing setting' do @@ -162,7 +162,7 @@ describe Projects::Settings::OperationsController do } end - it_behaves_like 'PATCH #update' + it_behaves_like 'PATCHable' end end @@ -175,12 +175,4 @@ describe Projects::Settings::OperationsController do project: params } end - - def stub_operations_update_service_returning(return_value = {}) - allow(::Projects::Operations::UpdateService) - .to receive(:new).with(project, user, permitted_params) - .and_return(operations_update_service) - allow(operations_update_service).to receive(:execute) - .and_return(return_value) - end end -- cgit v1.2.1 From e7e9929e0d9c7f208394ccb61239228216fe0be8 Mon Sep 17 00:00:00 2001 From: rpereira2 Date: Thu, 25 Apr 2019 16:06:17 +0530 Subject: Fix a bug in shared_examples definition --- spec/controllers/projects/settings/operations_controller_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/controllers/projects/settings/operations_controller_spec.rb b/spec/controllers/projects/settings/operations_controller_spec.rb index 7df63266f71..0dd73972098 100644 --- a/spec/controllers/projects/settings/operations_controller_spec.rb +++ b/spec/controllers/projects/settings/operations_controller_spec.rb @@ -11,7 +11,7 @@ describe Projects::Settings::OperationsController do project.add_maintainer(user) end - shared_context 'PATCHable' do + shared_examples 'PATCHable' do let(:operations_update_service) { instance_double(::Projects::Operations::UpdateService) } let(:operations_url) { project_settings_operations_url(project) } -- cgit v1.2.1