158 lines
4 KiB
Ruby
158 lines
4 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
require 'spec_helper'
|
||
|
|
||
|
describe Projects::Settings::OperationsController do
|
||
|
set(:user) { create(:user) }
|
||
|
set(:project) { create(:project) }
|
||
|
|
||
|
before do
|
||
|
sign_in(user)
|
||
|
project.add_maintainer(user)
|
||
|
end
|
||
|
|
||
|
context 'error tracking' 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 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
|
||
|
|
||
|
context 'without an existing setting' do
|
||
|
it 'builds a new setting' do
|
||
|
get :show, params: project_params(project)
|
||
|
|
||
|
expect(controller.helpers.error_tracking_setting).to be_new_record
|
||
|
end
|
||
|
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(:not_found)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'as an anonymous user' do
|
||
|
before do
|
||
|
sign_out(user)
|
||
|
end
|
||
|
|
||
|
it 'redirects to signup page' do
|
||
|
get :show, params: project_params(project)
|
||
|
|
||
|
expect(response).to redirect_to(new_user_session_path)
|
||
|
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
|
||
|
{
|
||
|
error_tracking_setting_attributes: {
|
||
|
enabled: '1',
|
||
|
api_url: 'http://url',
|
||
|
token: 'token'
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
let(:error_tracking_permitted) do
|
||
|
ActionController::Parameters.new(error_tracking_params).permit!
|
||
|
end
|
||
|
|
||
|
context 'when update succeeds' do
|
||
|
before do
|
||
|
stub_operations_update_service_returning(status: :success)
|
||
|
end
|
||
|
|
||
|
it 'shows a notice' do
|
||
|
patch :update, params: project_params(project, error_tracking_params)
|
||
|
|
||
|
expect(response).to redirect_to(operations_url)
|
||
|
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)
|
||
|
end
|
||
|
|
||
|
it 'renders show page' do
|
||
|
patch :update, params: project_params(project, error_tracking_params)
|
||
|
|
||
|
expect(response).to have_gitlab_http_status(:ok)
|
||
|
expect(response).to render_template(:show)
|
||
|
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)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def project_params(project, params = {})
|
||
|
{
|
||
|
namespace_id: project.namespace,
|
||
|
project_id: project,
|
||
|
project: params
|
||
|
}
|
||
|
end
|
||
|
end
|