From f3b1e07903a7f509b11ad7cf188fac46d98f77f6 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Mon, 6 Apr 2020 15:10:04 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- .../projects/files/template_type_dropdown_spec.rb | 4 - spec/frontend/api_spec.js | 28 ++++++ spec/frontend/static_site_editor/mock_data.js | 18 ++++ .../services/load_source_content_spec.js | 31 +++++++ .../projects/jira_imports_resolver_spec.rb | 10 +++ .../metrics/requests_rack_middleware_spec.rb | 68 ++++++++++++++ spec/models/user_spec.rb | 100 ++++++--------------- spec/routing/project_routing_spec.rb | 2 +- .../concerns/has_repository_shared_examples.rb | 1 + 9 files changed, 182 insertions(+), 80 deletions(-) create mode 100644 spec/frontend/static_site_editor/mock_data.js create mode 100644 spec/frontend/static_site_editor/services/load_source_content_spec.js (limited to 'spec') diff --git a/spec/features/projects/files/template_type_dropdown_spec.rb b/spec/features/projects/files/template_type_dropdown_spec.rb index 03b4b9b4517..5ea0b9b015f 100644 --- a/spec/features/projects/files/template_type_dropdown_spec.rb +++ b/spec/features/projects/files/template_type_dropdown_spec.rb @@ -40,10 +40,6 @@ describe 'Projects > Files > Template type dropdown selector', :js do check_type_selector_display(true) end - it 'is displayed when input matches' do - check_type_selector_display(true) - end - it 'selects every template type correctly' do try_selecting_all_types end diff --git a/spec/frontend/api_spec.js b/spec/frontend/api_spec.js index 179aa3a49d7..fdefa16ac19 100644 --- a/spec/frontend/api_spec.js +++ b/spec/frontend/api_spec.js @@ -631,4 +631,32 @@ describe('Api', () => { }); }); }); + + describe('getRawFile', () => { + const dummyProjectPath = 'gitlab-org/gitlab'; + const dummyFilePath = 'doc/CONTRIBUTING.md'; + const expectedUrl = `${dummyUrlRoot}/api/${dummyApiVersion}/projects/${encodeURIComponent( + dummyProjectPath, + )}/repository/files/${encodeURIComponent(dummyFilePath)}/raw`; + + describe('when the raw file is successfully fetched', () => { + it('resolves the Promise', () => { + mock.onGet(expectedUrl).replyOnce(200); + + return Api.getRawFile(dummyProjectPath, dummyFilePath).then(() => { + expect(mock.history.get).toHaveLength(1); + }); + }); + }); + + describe('when an error occurs while getting a raw file', () => { + it('rejects the Promise', () => { + mock.onDelete(expectedUrl).replyOnce(500); + + return Api.getRawFile(dummyProjectPath, dummyFilePath).catch(() => { + expect(mock.history.get).toHaveLength(1); + }); + }); + }); + }); }); diff --git a/spec/frontend/static_site_editor/mock_data.js b/spec/frontend/static_site_editor/mock_data.js new file mode 100644 index 00000000000..0b2a69420d8 --- /dev/null +++ b/spec/frontend/static_site_editor/mock_data.js @@ -0,0 +1,18 @@ +export const sourceContent = ` +--- +layout: handbook-page-toc +title: Handbook +twitter_image: '/images/tweets/handbook-gitlab.png' +--- + +## On this page +{:.no_toc .hidden-md .hidden-lg} + +- TOC +{:toc .hidden-md .hidden-lg} +`; + +export const sourceContentTitle = 'Handbook'; + +export const projectId = '123456'; +export const sourcePath = 'foobar.md.html'; diff --git a/spec/frontend/static_site_editor/services/load_source_content_spec.js b/spec/frontend/static_site_editor/services/load_source_content_spec.js new file mode 100644 index 00000000000..87893bb7a6e --- /dev/null +++ b/spec/frontend/static_site_editor/services/load_source_content_spec.js @@ -0,0 +1,31 @@ +import Api from '~/api'; + +import loadSourceContent from '~/static_site_editor/services/load_source_content'; + +import { sourceContent, sourceContentTitle, projectId, sourcePath } from '../mock_data'; + +describe('loadSourceContent', () => { + describe('requesting source content succeeds', () => { + let result; + + beforeEach(() => { + jest.spyOn(Api, 'getRawFile').mockResolvedValue({ data: sourceContent }); + + return loadSourceContent({ projectId, sourcePath }).then(_result => { + result = _result; + }); + }); + + it('calls getRawFile API with project id and source path', () => { + expect(Api.getRawFile).toHaveBeenCalledWith(projectId, sourcePath); + }); + + it('extracts page title from source content', () => { + expect(result.title).toBe(sourceContentTitle); + }); + + it('returns raw content', () => { + expect(result.content).toBe(sourceContent); + }); + }); +}); diff --git a/spec/graphql/resolvers/projects/jira_imports_resolver_spec.rb b/spec/graphql/resolvers/projects/jira_imports_resolver_spec.rb index 54d51292919..a5f17acce91 100644 --- a/spec/graphql/resolvers/projects/jira_imports_resolver_spec.rb +++ b/spec/graphql/resolvers/projects/jira_imports_resolver_spec.rb @@ -14,6 +14,16 @@ describe Resolvers::Projects::JiraImportsResolver do data end + context 'when feature flag disabled' do + let_it_be(:project) { create(:project, :private, import_data: jira_import_data) } + + before do + stub_feature_flags(jira_issue_import: false) + end + + it_behaves_like 'no jira import access' + end + context 'when project does not have Jira import data' do let_it_be(:project) { create(:project, :private, import_data: nil) } diff --git a/spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb b/spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb index 1fc6fdcf622..6ee8acbf6fd 100644 --- a/spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb +++ b/spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb @@ -36,6 +36,74 @@ describe Gitlab::Metrics::RequestsRackMiddleware do Timecop.scale(3600) { subject.call(env) } end + + context 'request is a health check endpoint' do + it 'increments health endpoint counter' do + env['PATH_INFO'] = '/-/liveness' + + expect(described_class).to receive_message_chain(:http_health_requests_total, :increment).with(method: 'get') + + subject.call(env) + end + + context 'with trailing slash' do + before do + env['PATH_INFO'] = '/-/liveness/' + end + + it 'increments health endpoint counter' do + expect(described_class).to receive_message_chain(:http_health_requests_total, :increment).with(method: 'get') + + subject.call(env) + end + end + + context 'with percent encoded values' do + before do + env['PATH_INFO'] = '/-/%6D%65%74%72%69%63%73' # /-/metrics + end + + it 'increments health endpoint counter' do + expect(described_class).to receive_message_chain(:http_health_requests_total, :increment).with(method: 'get') + + subject.call(env) + end + end + end + + context 'request is not a health check endpoint' do + it 'does not increment health endpoint counter' do + env['PATH_INFO'] = '/-/ordinary-requests' + + expect(described_class).not_to receive(:http_health_requests_total) + + subject.call(env) + end + + context 'path info is a root path' do + before do + env['PATH_INFO'] = '/-/' + end + + it 'does not increment health endpoint counter' do + expect(described_class).not_to receive(:http_health_requests_total) + + subject.call(env) + end + end + + context 'path info is a subpath' do + before do + env['PATH_INFO'] = '/-/health/subpath' + end + + it 'does not increment health endpoint counter' do + expect(described_class).not_to receive(:http_health_requests_total) + + subject.call(env) + end + end + end end context '@app.call throws exception' do diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index e69d4e18c1e..679f4a19f5b 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -28,7 +28,6 @@ describe User, :do_not_mock_admin_mode do describe 'associations' do it { is_expected.to have_one(:namespace) } it { is_expected.to have_one(:status) } - it { is_expected.to have_one(:max_access_level_membership) } it { is_expected.to have_one(:user_detail) } it { is_expected.to have_one(:user_highest_role) } it { is_expected.to have_many(:snippets).dependent(:destroy) } @@ -1000,91 +999,42 @@ describe User, :do_not_mock_admin_mode do end describe '#highest_role' do - let(:user) { create(:user) } - let(:group) { create(:group) } - - context 'with association :max_access_level_membership' do - let(:another_user) { create(:user) } - - before do - create(:project, group: group) do |project| - group.add_user(user, GroupMember::GUEST) - group.add_user(another_user, GroupMember::DEVELOPER) - end - - create(:project, group: create(:group)) do |project| - project.add_guest(another_user) - end - - create(:project, group: create(:group)) do |project| - project.add_maintainer(user) - end - end - - it 'returns the correct highest role' do - users = User.includes(:max_access_level_membership).where(id: [user.id, another_user.id]) - - expect(users.collect { |u| [u.id, u.highest_role] }).to contain_exactly( - [user.id, Gitlab::Access::MAINTAINER], - [another_user.id, Gitlab::Access::DEVELOPER] - ) - end - end - - it 'returns NO_ACCESS if none has been set' do - expect(user.highest_role).to eq(Gitlab::Access::NO_ACCESS) - end - - it 'returns MAINTAINER if user is maintainer of a project' do - create(:project, group: group) do |project| - project.add_maintainer(user) - end - - expect(user.highest_role).to eq(Gitlab::Access::MAINTAINER) - end + let_it_be(:user) { create(:user) } - it 'returns the highest role if user is member of multiple projects' do - create(:project, group: group) do |project| - project.add_maintainer(user) + context 'when user_highest_role does not exist' do + it 'returns NO_ACCESS' do + expect(user.highest_role).to eq(Gitlab::Access::NO_ACCESS) end - - create(:project, group: group) do |project| - project.add_developer(user) - end - - expect(user.highest_role).to eq(Gitlab::Access::MAINTAINER) end - it 'returns MAINTAINER if user is maintainer of a group' do - create(:group) do |group| - group.add_user(user, GroupMember::MAINTAINER) - end - - expect(user.highest_role).to eq(Gitlab::Access::MAINTAINER) - end + context 'when user_highest_role exists' do + context 'stored highest access level is nil' do + it 'returns Gitlab::Access::NO_ACCESS' do + create(:user_highest_role, user: user) - it 'returns the highest role if user is member of multiple groups' do - create(:group) do |group| - group.add_user(user, GroupMember::MAINTAINER) + expect(user.highest_role).to eq(Gitlab::Access::NO_ACCESS) + end end - create(:group) do |group| - group.add_user(user, GroupMember::DEVELOPER) - end + context 'stored highest access level present' do + context 'with association :user_highest_role' do + let(:another_user) { create(:user) } - expect(user.highest_role).to eq(Gitlab::Access::MAINTAINER) - end + before do + create(:user_highest_role, :maintainer, user: user) + create(:user_highest_role, :developer, user: another_user) + end - it 'returns the highest role if user is member of multiple groups and projects' do - create(:group) do |group| - group.add_user(user, GroupMember::DEVELOPER) - end + it 'returns the correct highest role' do + users = User.includes(:user_highest_role).where(id: [user.id, another_user.id]) - create(:project, group: group) do |project| - project.add_maintainer(user) + expect(users.collect { |u| [u.id, u.highest_role] }).to contain_exactly( + [user.id, Gitlab::Access::MAINTAINER], + [another_user.id, Gitlab::Access::DEVELOPER] + ) + end + end end - - expect(user.highest_role).to eq(Gitlab::Access::MAINTAINER) end end diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb index 1a43342d278..0272d269aa4 100644 --- a/spec/routing/project_routing_spec.rb +++ b/spec/routing/project_routing_spec.rb @@ -802,7 +802,7 @@ describe 'project routing' do # TODO: remove this test as part of https://gitlab.com/gitlab-org/gitlab/issues/207079 (12.9) it 'to ci_cd#create_deploy_token' do - expect(post('gitlab/gitlabhq/-/settings/repository/deploy_token/create')).to route_to('projects/settings/ci_cd#create_deploy_token', namespace_id: 'gitlab', project_id: 'gitlabhq') + expect(post('gitlab/gitlabhq/-/settings/ci_cd/deploy_token/create')).to route_to('projects/settings/ci_cd#create_deploy_token', namespace_id: 'gitlab', project_id: 'gitlabhq') end end diff --git a/spec/support/shared_examples/models/concerns/has_repository_shared_examples.rb b/spec/support/shared_examples/models/concerns/has_repository_shared_examples.rb index 5a5d7c8f038..368ec0694fd 100644 --- a/spec/support/shared_examples/models/concerns/has_repository_shared_examples.rb +++ b/spec/support/shared_examples/models/concerns/has_repository_shared_examples.rb @@ -167,6 +167,7 @@ RSpec.shared_examples 'model with repository' do describe 'Respond to' do it { is_expected.to respond_to(:base_dir) } it { is_expected.to respond_to(:disk_path) } + it { is_expected.to respond_to(:gitlab_shell) } end describe '.pick_repository_storage' do -- cgit v1.2.1