diff options
Diffstat (limited to 'spec')
-rw-r--r-- | spec/controllers/projects/error_tracking/projects_controller_spec.rb | 122 | ||||
-rw-r--r-- | spec/controllers/projects/error_tracking_controller_spec.rb | 107 | ||||
-rw-r--r-- | spec/features/dashboard/instance_statistics_spec.rb | 22 | ||||
-rw-r--r-- | spec/finders/environments_finder_spec.rb | 28 | ||||
-rw-r--r-- | spec/finders/events_finder_spec.rb | 26 | ||||
-rw-r--r-- | spec/frontend/error_tracking_settings/store/actions_spec.js | 8 | ||||
-rw-r--r-- | spec/models/environment_spec.rb | 6 | ||||
-rw-r--r-- | spec/models/merge_request_spec.rb | 16 | ||||
-rw-r--r-- | spec/requests/api/events_spec.rb | 15 |
9 files changed, 223 insertions, 127 deletions
diff --git a/spec/controllers/projects/error_tracking/projects_controller_spec.rb b/spec/controllers/projects/error_tracking/projects_controller_spec.rb new file mode 100644 index 00000000000..e55495700c2 --- /dev/null +++ b/spec/controllers/projects/error_tracking/projects_controller_spec.rb @@ -0,0 +1,122 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Projects::ErrorTracking::ProjectsController do + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + + before do + sign_in(user) + project.add_maintainer(user) + end + + describe 'POST #index' do + context 'with insufficient permissions' do + before do + project.add_guest(user) + end + + it 'returns 404' do + get :index, params: list_projects_params + + expect(response).to have_gitlab_http_status(:not_found) + end + end + + context 'with an anonymous user' do + before do + sign_out(user) + end + + it 'redirects to sign-in page' do + get :index, params: list_projects_params + + expect(response).to have_gitlab_http_status(:redirect) + end + end + + context 'with authorized user' do + let(:list_projects_service) { spy(:list_projects_service) } + let(:sentry_project) { build(:error_tracking_project) } + + let(:query_params) do + list_projects_params.slice(:api_host, :token) + end + + before do + allow(ErrorTracking::ListProjectsService) + .to receive(:new).with(project, user, query_params) + .and_return(list_projects_service) + end + + context 'service result is successful' do + before do + expect(list_projects_service).to receive(:execute) + .and_return(status: :success, projects: [sentry_project]) + end + + it 'returns a list of projects' do + get :index, params: list_projects_params + + expect(response).to have_gitlab_http_status(:ok) + expect(response).to match_response_schema('error_tracking/list_projects') + expect(json_response['projects']).to eq([sentry_project].as_json) + end + end + + context 'service result is erroneous' do + let(:error_message) { 'error message' } + + context 'without http_status' do + before do + expect(list_projects_service).to receive(:execute) + .and_return(status: :error, message: error_message) + end + + it 'returns 400 with message' do + get :index, params: list_projects_params + + expect(response).to have_gitlab_http_status(:bad_request) + expect(json_response['message']).to eq(error_message) + end + end + + context 'with explicit http_status' do + let(:http_status) { :no_content } + + before do + expect(list_projects_service).to receive(:execute).and_return( + status: :error, + message: error_message, + http_status: http_status + ) + end + + it 'returns http_status with message' do + get :index, params: list_projects_params + + expect(response).to have_gitlab_http_status(http_status) + expect(json_response['message']).to eq(error_message) + end + end + end + end + + private + + def list_projects_params(opts = {}) + project_params( + format: :json, + api_host: 'gitlab.com', + token: 'token' + ) + end + end + + private + + def project_params(opts = {}) + opts.reverse_merge(namespace_id: project.namespace, project_id: project) + end +end diff --git a/spec/controllers/projects/error_tracking_controller_spec.rb b/spec/controllers/projects/error_tracking_controller_spec.rb index e5585d7b52d..b1f7c7178c1 100644 --- a/spec/controllers/projects/error_tracking_controller_spec.rb +++ b/spec/controllers/projects/error_tracking_controller_spec.rb @@ -179,113 +179,6 @@ describe Projects::ErrorTrackingController do end end - describe 'POST #list_projects' do - context 'with insufficient permissions' do - before do - project.add_guest(user) - end - - it 'returns 404' do - post :list_projects, params: list_projects_params - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'with an anonymous user' do - before do - sign_out(user) - end - - it 'redirects to sign-in page' do - post :list_projects, params: list_projects_params - - expect(response).to have_gitlab_http_status(:redirect) - end - end - - context 'with authorized user' do - let(:list_projects_service) { spy(:list_projects_service) } - let(:sentry_project) { build(:error_tracking_project) } - - let(:permitted_params) do - ActionController::Parameters.new( - list_projects_params[:error_tracking_setting] - ).permit! - end - - before do - allow(ErrorTracking::ListProjectsService) - .to receive(:new).with(project, user, permitted_params) - .and_return(list_projects_service) - end - - context 'service result is successful' do - before do - expect(list_projects_service).to receive(:execute) - .and_return(status: :success, projects: [sentry_project]) - end - - it 'returns a list of projects' do - post :list_projects, params: list_projects_params - - expect(response).to have_gitlab_http_status(:ok) - expect(response).to match_response_schema('error_tracking/list_projects') - expect(json_response['projects']).to eq([sentry_project].as_json) - end - end - - context 'service result is erroneous' do - let(:error_message) { 'error message' } - - context 'without http_status' do - before do - expect(list_projects_service).to receive(:execute) - .and_return(status: :error, message: error_message) - end - - it 'returns 400 with message' do - get :list_projects, params: list_projects_params - - expect(response).to have_gitlab_http_status(:bad_request) - expect(json_response['message']).to eq(error_message) - end - end - - context 'with explicit http_status' do - let(:http_status) { :no_content } - - before do - expect(list_projects_service).to receive(:execute).and_return( - status: :error, - message: error_message, - http_status: http_status - ) - end - - it 'returns http_status with message' do - get :list_projects, params: list_projects_params - - expect(response).to have_gitlab_http_status(http_status) - expect(json_response['message']).to eq(error_message) - end - end - end - end - - private - - def list_projects_params(opts = {}) - project_params( - format: :json, - error_tracking_setting: { - api_host: 'gitlab.com', - token: 'token' - } - ) - end - end - describe 'GET #issue_details' do let_it_be(:issue_id) { 1234 } diff --git a/spec/features/dashboard/instance_statistics_spec.rb b/spec/features/dashboard/instance_statistics_spec.rb index 21ee2796bd8..feb568d8ef4 100644 --- a/spec/features/dashboard/instance_statistics_spec.rb +++ b/spec/features/dashboard/instance_statistics_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -describe 'Showing instance statistics' do +describe 'Showing analytics' do before do sign_in user if user end @@ -13,10 +13,10 @@ describe 'Showing instance statistics' do context 'for unauthenticated users' do let(:user) { nil } - it 'does not show the instance statistics link' do + it 'does not show the Analytics link' do subject - expect(page).not_to have_link('Instance Statistics') + expect(page).not_to have_link('Analytics') end end @@ -28,10 +28,10 @@ describe 'Showing instance statistics' do stub_application_setting(instance_statistics_visibility_private: false) end - it 'shows the instance statistics link' do + it 'shows the analytics link' do subject - expect(page).to have_link('Instance Statistics') + expect(page).to have_link('Analytics') end end @@ -40,10 +40,14 @@ describe 'Showing instance statistics' do stub_application_setting(instance_statistics_visibility_private: true) end - it 'shows the instance statistics link' do + it 'does not show the analytics link' do subject - expect(page).not_to have_link('Instance Statistics') + # Skipping this test on EE as there is an EE specifc spec for this functionality + # ee/spec/features/dashboards/analytics_spec.rb + skip if Gitlab.ee? + + expect(page).not_to have_link('Analytics') end end end @@ -51,10 +55,10 @@ describe 'Showing instance statistics' do context 'for admins' do let(:user) { create(:admin) } - it 'shows the instance statistics link' do + it 'shows the analytics link' do subject - expect(page).to have_link('Instance Statistics') + expect(page).to have_link('Analytics') end end end diff --git a/spec/finders/environments_finder_spec.rb b/spec/finders/environments_finder_spec.rb index 69687eaa99f..7100376478a 100644 --- a/spec/finders/environments_finder_spec.rb +++ b/spec/finders/environments_finder_spec.rb @@ -13,17 +13,22 @@ describe EnvironmentsFinder do end context 'tagged deployment' do + let(:environment_two) { create(:environment, project: project) } + # Environments need to include commits, so rewind two commits to fit + let(:commit) { project.commit('HEAD~2') } + before do - create(:deployment, :success, environment: environment, ref: 'v1.1.0', tag: true, sha: project.commit.id) + create(:deployment, :success, environment: environment, ref: 'v1.0.0', tag: true, sha: project.commit.id) + create(:deployment, :success, environment: environment_two, ref: 'v1.1.0', tag: true, sha: project.commit('HEAD~1').id) end it 'returns environment when with_tags is set' do - expect(described_class.new(project, user, ref: 'master', commit: project.commit, with_tags: true).execute) - .to contain_exactly(environment) + expect(described_class.new(project, user, ref: 'master', commit: commit, with_tags: true).execute) + .to contain_exactly(environment, environment_two) end it 'does not return environment when no with_tags is set' do - expect(described_class.new(project, user, ref: 'master', commit: project.commit).execute) + expect(described_class.new(project, user, ref: 'master', commit: commit).execute) .to be_empty end @@ -31,6 +36,21 @@ describe EnvironmentsFinder do expect(described_class.new(project, user, ref: 'master', commit: project.commit('feature')).execute) .to be_empty end + + it 'returns environment when with_tags is set' do + expect(described_class.new(project, user, ref: 'master', commit: commit, with_tags: true).execute) + .to contain_exactly(environment, environment_two) + end + + # We expect two Gitaly calls: FindCommit, CommitIsAncestor + # This tests to ensure we don't call one CommitIsAncestor per environment + it 'only calls Gitaly twice when multiple environments are present', :request_store do + expect do + result = described_class.new(project, user, ref: 'master', commit: commit, with_tags: true, find_latest: true).execute + + expect(result).to contain_exactly(environment_two) + end.to change { Gitlab::GitalyClient.get_request_count }.by(2) + end end context 'branch deployment' do diff --git a/spec/finders/events_finder_spec.rb b/spec/finders/events_finder_spec.rb index 848030262cd..5c28b31e8c8 100644 --- a/spec/finders/events_finder_spec.rb +++ b/spec/finders/events_finder_spec.rb @@ -5,8 +5,10 @@ require 'spec_helper' describe EventsFinder do let(:user) { create(:user) } let(:other_user) { create(:user) } + let(:project1) { create(:project, :private, creator_id: user.id, namespace: user.namespace) } let(:project2) { create(:project, :private, creator_id: user.id, namespace: user.namespace) } + let(:closed_issue) { create(:closed_issue, project: project1, author: user) } let(:opened_merge_request) { create(:merge_request, source_project: project2, author: user) } let!(:closed_issue_event) { create(:event, project: project1, author: user, target: closed_issue, action: Event::CLOSED, created_at: Date.new(2016, 12, 30)) } @@ -15,6 +17,8 @@ describe EventsFinder do let(:opened_merge_request2) { create(:merge_request, source_project: project2, author: user) } let!(:closed_issue_event2) { create(:event, project: project1, author: user, target: closed_issue, action: Event::CLOSED, created_at: Date.new(2016, 2, 2)) } let!(:opened_merge_request_event2) { create(:event, project: project2, author: user, target: opened_merge_request, action: Event::CREATED, created_at: Date.new(2017, 2, 2)) } + let(:opened_merge_request3) { create(:merge_request, source_project: project1, author: other_user) } + let!(:other_developer_event) { create(:event, project: project1, author: other_user, target: opened_merge_request3, action: Event::CREATED) } let(:public_project) { create(:project, :public, creator_id: user.id, namespace: user.namespace) } let(:confidential_issue) { create(:closed_issue, confidential: true, project: public_project, author: user) } @@ -55,6 +59,28 @@ describe EventsFinder do end end + context 'dashboard events' do + before do + project1.add_developer(other_user) + end + + context 'scope is `all`' do + it 'includes activity of other users' do + events = described_class.new(source: user, current_user: user, scope: 'all').execute + + expect(events).to include(other_developer_event) + end + end + + context 'scope is not `all`' do + it 'does not include activity of other users' do + events = described_class.new(source: user, current_user: user, scope: '').execute + + expect(events).not_to include(other_developer_event) + end + end + end + context 'when targeting a project' do it 'returns project events between specified dates filtered on action and type' do events = described_class.new(source: project1, current_user: user, action: 'closed', target_type: 'issue', after: Date.new(2016, 12, 1), before: Date.new(2017, 1, 1)).execute diff --git a/spec/frontend/error_tracking_settings/store/actions_spec.js b/spec/frontend/error_tracking_settings/store/actions_spec.js index e12c4e20f58..b076e6ecd31 100644 --- a/spec/frontend/error_tracking_settings/store/actions_spec.js +++ b/spec/frontend/error_tracking_settings/store/actions_spec.js @@ -28,7 +28,7 @@ describe('error tracking settings actions', () => { }); it('should request and transform the project list', done => { - mock.onPost(TEST_HOST).reply(() => [200, { projects: projectList }]); + mock.onGet(TEST_HOST).reply(() => [200, { projects: projectList }]); testAction( actions.fetchProjects, null, @@ -42,14 +42,14 @@ describe('error tracking settings actions', () => { }, ], () => { - expect(mock.history.post.length).toBe(1); + expect(mock.history.get.length).toBe(1); done(); }, ); }); it('should handle a server error', done => { - mock.onPost(`${TEST_HOST}.json`).reply(() => [400]); + mock.onGet(`${TEST_HOST}.json`).reply(() => [400]); testAction( actions.fetchProjects, null, @@ -62,7 +62,7 @@ describe('error tracking settings actions', () => { }, ], () => { - expect(mock.history.post.length).toBe(1); + expect(mock.history.get.length).toBe(1); done(); }, ); diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index 0537220fcd2..b82a9e9aa9d 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -36,9 +36,13 @@ describe Environment, :use_clean_rails_memory_store_caching do let!(:deployment2) { create(:deployment, environment: environment2) } let!(:deployment3) { create(:deployment, environment: environment1) } - it 'returns the environments in order of having been last deployed' do + it 'returns the environments in ascending order of having been last deployed' do expect(project.environments.order_by_last_deployed_at.to_a).to eq([environment3, environment2, environment1]) end + + it 'returns the environments in descending order of having been last deployed' do + expect(project.environments.order_by_last_deployed_at_desc.to_a).to eq([environment1, environment2, environment3]) + end end describe 'state machine' do diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index bf6fa20dc17..bf90fa53aba 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -2322,6 +2322,10 @@ describe MergeRequest do let(:project) { create(:project, :repository) } let(:user) { project.creator } let(:merge_request) { create(:merge_request, source_project: project) } + let(:source_branch) { merge_request.source_branch } + let(:target_branch) { merge_request.target_branch } + let(:source_oid) { project.commit(source_branch).id } + let(:target_oid) { project.commit(target_branch).id } before do merge_request.source_project.add_maintainer(user) @@ -2332,13 +2336,21 @@ describe MergeRequest do let(:environments) { create_list(:environment, 3, project: project) } before do - create(:deployment, :success, environment: environments.first, ref: 'master', sha: project.commit('master').id) - create(:deployment, :success, environment: environments.second, ref: 'feature', sha: project.commit('feature').id) + create(:deployment, :success, environment: environments.first, ref: source_branch, sha: source_oid) + create(:deployment, :success, environment: environments.second, ref: target_branch, sha: target_oid) end it 'selects deployed environments' do expect(merge_request.environments_for(user)).to contain_exactly(environments.first) end + + it 'selects latest deployed environment' do + latest_environment = create(:environment, project: project) + create(:deployment, :success, environment: latest_environment, ref: source_branch, sha: source_oid) + + expect(merge_request.environments_for(user)).to eq([environments.first, latest_environment]) + expect(merge_request.environments_for(user, latest: true)).to contain_exactly(latest_environment) + end end context 'with environments on source project' do diff --git a/spec/requests/api/events_spec.rb b/spec/requests/api/events_spec.rb index 9f8d254a00c..240f9a02877 100644 --- a/spec/requests/api/events_spec.rb +++ b/spec/requests/api/events_spec.rb @@ -8,6 +8,8 @@ describe API::Events do let(:private_project) { create(:project, :private, creator_id: user.id, namespace: user.namespace) } let(:closed_issue) { create(:closed_issue, project: private_project, author: user) } let!(:closed_issue_event) { create(:event, project: private_project, author: user, target: closed_issue, action: Event::CLOSED, created_at: Date.new(2016, 12, 30)) } + let(:closed_issue2) { create(:closed_issue, project: private_project, author: non_member) } + let!(:closed_issue_event2) { create(:event, project: private_project, author: non_member, target: closed_issue2, action: Event::CLOSED, created_at: Date.new(2016, 12, 30)) } describe 'GET /events' do context 'when unauthenticated' do @@ -27,6 +29,19 @@ describe API::Events do expect(json_response).to be_an Array expect(json_response.size).to eq(1) end + + context 'when scope is passed' do + it 'returns all events across projects' do + private_project.add_developer(non_member) + + get api('/events?action=closed&target_type=issue&after=2016-12-1&before=2016-12-31&scope=all', user) + + expect(response).to have_gitlab_http_status(200) + expect(response).to include_pagination_headers + expect(json_response).to be_an Array + expect(json_response.size).to eq(2) + end + end end context 'when the requesting token has "read_user" scope' do |