diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-04-08 09:09:54 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-04-08 09:09:54 +0300 |
commit | f6cdec670b9b757fc2225a2c6627ab79765e5b8a (patch) | |
tree | 7a1fde030f117b69332d01b22deefd1c81fff458 /spec | |
parent | e2ee1eec50aa8df8543d7ecc585ec0ba5ee544ac (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
13 files changed, 353 insertions, 3 deletions
diff --git a/spec/frontend/static_site_editor/components/saved_changes_message_spec.js b/spec/frontend/static_site_editor/components/saved_changes_message_spec.js new file mode 100644 index 00000000000..76ac7de5c32 --- /dev/null +++ b/spec/frontend/static_site_editor/components/saved_changes_message_spec.js @@ -0,0 +1,61 @@ +import { shallowMount } from '@vue/test-utils'; +import SavedChangesMessage from '~/static_site_editor/components/saved_changes_message.vue'; + +describe('~/static_site_editor/components/saved_changes_message.vue', () => { + let wrapper; + const props = { + branch: { + label: '123-the-branch', + url: 'https://gitlab.com/gitlab-org/gitlab/-/tree/123-the-branch', + }, + commit: { + label: 'a123', + url: 'https://gitlab.com/gitlab-org/gitlab/-/commit/a123', + }, + mergeRequest: { + label: '123', + url: 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123', + }, + returnUrl: 'https://www.the-static-site.com/post', + }; + const findReturnToSiteButton = () => wrapper.find({ ref: 'returnToSiteButton' }); + const findMergeRequestButton = () => wrapper.find({ ref: 'mergeRequestButton' }); + const findBranchLink = () => wrapper.find({ ref: 'branchLink' }); + const findCommitLink = () => wrapper.find({ ref: 'commitLink' }); + const findMergeRequestLink = () => wrapper.find({ ref: 'mergeRequestLink' }); + + beforeEach(() => { + wrapper = shallowMount(SavedChangesMessage, { + propsData: props, + }); + }); + + afterEach(() => { + wrapper.destroy(); + }); + + it.each` + text | findEl | url + ${'Return to site'} | ${findReturnToSiteButton} | ${props.returnUrl} + ${'View merge request'} | ${findMergeRequestButton} | ${props.mergeRequest.url} + `('renders "$text" button link', ({ text, findEl, url }) => { + const btn = findEl(); + + expect(btn.exists()).toBe(true); + expect(btn.text()).toBe(text); + expect(btn.attributes('href')).toBe(url); + }); + + it.each` + desc | findEl | prop + ${'branch'} | ${findBranchLink} | ${props.branch} + ${'commit'} | ${findCommitLink} | ${props.commit} + ${'merge request'} | ${findMergeRequestLink} | ${props.mergeRequest} + `('renders $desc link', ({ findEl, prop }) => { + const el = findEl(); + + expect(el.exists()).toBe(true); + expect(el.attributes('href')).toBe(prop.url); + expect(el.text()).toBe(prop.label); + }); +}); diff --git a/spec/graphql/resolvers/projects/services_resolver_spec.rb b/spec/graphql/resolvers/projects/services_resolver_spec.rb new file mode 100644 index 00000000000..00045442ea0 --- /dev/null +++ b/spec/graphql/resolvers/projects/services_resolver_spec.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Resolvers::Projects::ServicesResolver do + include GraphqlHelpers + + describe '#resolve' do + let_it_be(:user) { create(:user) } + + context 'when project does not have services' do + let_it_be(:project) { create(:project, :private) } + + context 'when user cannot access services' do + context 'when anonymous user' do + it_behaves_like 'cannot access project services' + end + + context 'when user developer' do + before do + project.add_developer(user) + end + + it_behaves_like 'cannot access project services' + end + end + + context 'when user can read project services' do + before do + project.add_maintainer(user) + end + + it_behaves_like 'no project services' + end + end + + context 'when project has services' do + let_it_be(:project) { create(:project, :private) } + let_it_be(:jira_service) { create(:jira_service, project: project) } + + context 'when user cannot access services' do + context 'when anonymous user' do + it_behaves_like 'cannot access project services' + end + + context 'when user developer' do + before do + project.add_developer(user) + end + + it_behaves_like 'cannot access project services' + end + end + + context 'when user can read project services' do + before do + project.add_maintainer(user) + end + + it 'returns project services' do + services = resolve_services + + expect(services.size).to eq 1 + end + end + end + end + + def resolve_services(args = {}, context = { current_user: user }) + resolve(described_class, obj: project, args: args, ctx: context) + end +end diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb index 0c8be50ed90..6ea852190c9 100644 --- a/spec/graphql/types/project_type_spec.rb +++ b/spec/graphql/types/project_type_spec.rb @@ -24,7 +24,7 @@ describe GitlabSchema.types['Project'] do namespace group statistics repository merge_requests merge_request issues issue pipelines removeSourceBranchAfterMerge sentryDetailedError snippets grafanaIntegration autocloseReferencedIssues suggestion_commit_message environments - boards jira_import_status jira_imports + boards jira_import_status jira_imports services ] expect(described_class).to include_graphql_fields(*expected_fields) @@ -84,4 +84,16 @@ describe GitlabSchema.types['Project'] do it { is_expected.to have_graphql_type(Types::BoardType.connection_type) } end + + describe 'jira_imports field' do + subject { described_class.fields['jiraImports'] } + + it { is_expected.to have_graphql_type(Types::JiraImportType.connection_type) } + end + + describe 'services field' do + subject { described_class.fields['services'] } + + it { is_expected.to have_graphql_type(Types::Projects::ServiceType.connection_type) } + end end diff --git a/spec/graphql/types/projects/base_service_type_spec.rb b/spec/graphql/types/projects/base_service_type_spec.rb new file mode 100644 index 00000000000..bda6022bf79 --- /dev/null +++ b/spec/graphql/types/projects/base_service_type_spec.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe GitlabSchema.types['BaseService'] do + it { expect(described_class.graphql_name).to eq('BaseService') } + + it 'has basic expected fields' do + expect(described_class).to have_graphql_fields(:type, :active) + end + + it { expect(described_class).to require_graphql_authorizations(:admin_project) } +end diff --git a/spec/graphql/types/projects/jira_service_type_spec.rb b/spec/graphql/types/projects/jira_service_type_spec.rb new file mode 100644 index 00000000000..7f8fa6538e9 --- /dev/null +++ b/spec/graphql/types/projects/jira_service_type_spec.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe GitlabSchema.types['JiraService'] do + it { expect(described_class.graphql_name).to eq('JiraService') } + + it 'has basic expected fields' do + expect(described_class).to have_graphql_fields(:type, :active) + end + + it { expect(described_class).to require_graphql_authorizations(:admin_project) } +end diff --git a/spec/graphql/types/projects/service_type_spec.rb b/spec/graphql/types/projects/service_type_spec.rb new file mode 100644 index 00000000000..ad30a4008bc --- /dev/null +++ b/spec/graphql/types/projects/service_type_spec.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Types::Projects::ServiceType do + it { expect(described_class).to have_graphql_fields(:type, :active) } + + describe ".resolve_type" do + it 'resolves the corresponding type for objects' do + expect(described_class.resolve_type(build(:jira_service), {})).to eq(Types::Projects::Services::JiraServiceType) + expect(described_class.resolve_type(build(:service), {})).to eq(Types::Projects::Services::BaseServiceType) + expect(described_class.resolve_type(build(:alerts_service), {})).to eq(Types::Projects::Services::BaseServiceType) + expect(described_class.resolve_type(build(:custom_issue_tracker_service), {})).to eq(Types::Projects::Services::BaseServiceType) + end + end +end diff --git a/spec/graphql/types/projects/services_enum_spec.rb b/spec/graphql/types/projects/services_enum_spec.rb new file mode 100644 index 00000000000..aac4aae4f69 --- /dev/null +++ b/spec/graphql/types/projects/services_enum_spec.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe GitlabSchema.types['ServiceType'] do + it { expect(described_class.graphql_name).to eq('ServiceType') } + + it 'exposes all the existing project services' do + expect(described_class.values.keys).to match_array(available_services_enum) + end +end + +def available_services_enum + ::Service.services_types.map(&:underscore).map(&:upcase) +end diff --git a/spec/requests/api/graphql/project/base_service_spec.rb b/spec/requests/api/graphql/project/base_service_spec.rb new file mode 100644 index 00000000000..8199f331fbf --- /dev/null +++ b/spec/requests/api/graphql/project/base_service_spec.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'query Jira service' do + include GraphqlHelpers + + let_it_be(:current_user) { create(:user) } + let_it_be(:project) { create(:project) } + let_it_be(:jira_service) { create(:jira_service, project: project) } + let_it_be(:bugzilla_service) { create(:bugzilla_service, project: project) } + let_it_be(:redmine_service) { create(:redmine_service, project: project) } + + let(:query) do + %( + query { + project(fullPath: "#{project.full_path}") { + services { + nodes { + type + active + } + } + } + } + ) + end + + let(:services) { graphql_data.dig('project', 'services', 'nodes')} + + it_behaves_like 'unauthorized users cannot read services' + + context 'when user can access project services' do + before do + project.add_maintainer(current_user) + post_graphql(query, current_user: current_user) + end + + it_behaves_like 'a working graphql query' + + it 'retuns list of jira imports' do + service_types = services.map { |s| s['type'] } + + expect(service_types).to match_array(%w(BugzillaService JiraService RedmineService)) + end + end +end diff --git a/spec/requests/api/graphql/project/jira_service_spec.rb b/spec/requests/api/graphql/project/jira_service_spec.rb new file mode 100644 index 00000000000..4ac598b789f --- /dev/null +++ b/spec/requests/api/graphql/project/jira_service_spec.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'query Jira service' do + include GraphqlHelpers + + let_it_be(:current_user) { create(:user) } + let_it_be(:project) { create(:project) } + let_it_be(:jira_service) { create(:jira_service, project: project) } + + let(:query) do + %( + query { + project(fullPath: "#{project.full_path}") { + services(active: true, type: JIRA_SERVICE) { + nodes { + type + } + } + } + } + ) + end + + let(:services) { graphql_data.dig('project', 'services', 'nodes')} + + it_behaves_like 'unauthorized users cannot read services' + + context 'when user can access project services' do + before do + project.add_maintainer(current_user) + post_graphql(query, current_user: current_user) + end + + it_behaves_like 'a working graphql query' + + it 'retuns list of jira imports' do + service = services.first + + expect(service['type']).to eq('JiraService') + end + end +end diff --git a/spec/requests/api/graphql/project_query_spec.rb b/spec/requests/api/graphql/project_query_spec.rb index fbb22958d51..035894c8022 100644 --- a/spec/requests/api/graphql/project_query_spec.rb +++ b/spec/requests/api/graphql/project_query_spec.rb @@ -9,7 +9,27 @@ describe 'getting project information' do let(:current_user) { create(:user) } let(:query) do - graphql_query_for('project', 'fullPath' => project.full_path) + graphql_query_for( + 'project', + { 'fullPath' => project.full_path }, + all_graphql_fields_for('project'.to_s.classify, excluded: %w(jiraImports services)) + ) + end + + context 'when the user has full access to the project' do + let(:full_access_query) do + graphql_query_for('project', 'fullPath' => project.full_path) + end + + before do + project.add_maintainer(current_user) + end + + it 'includes the project' do + post_graphql(query, current_user: current_user) + + expect(graphql_data['project']).not_to be_nil + end end context 'when the user has access to the project' do diff --git a/spec/support/helpers/graphql_helpers.rb b/spec/support/helpers/graphql_helpers.rb index 74582df6cd9..fc543186b08 100644 --- a/spec/support/helpers/graphql_helpers.rb +++ b/spec/support/helpers/graphql_helpers.rb @@ -149,7 +149,7 @@ module GraphqlHelpers FIELDS end - def all_graphql_fields_for(class_name, parent_types = Set.new, max_depth: 3) + def all_graphql_fields_for(class_name, parent_types = Set.new, max_depth: 3, excluded: []) # pulling _all_ fields can generate a _huge_ query (like complexity 180,000), # and significantly increase spec runtime. so limit the depth by default return if max_depth <= 0 @@ -165,6 +165,7 @@ module GraphqlHelpers type.fields.map do |name, field| # We can't guess arguments, so skip fields that require them next if required_arguments?(field) + next if excluded.include?(name) singular_field_type = field_type(field) diff --git a/spec/support/shared_examples/graphql/projects/services_resolver_shared_examples.rb b/spec/support/shared_examples/graphql/projects/services_resolver_shared_examples.rb new file mode 100644 index 00000000000..4bed322564a --- /dev/null +++ b/spec/support/shared_examples/graphql/projects/services_resolver_shared_examples.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +shared_examples 'no project services' do + it 'returns empty collection' do + expect(resolve_services).to eq [] + end +end + +shared_examples 'cannot access project services' do + it 'raises error' do + expect do + resolve_services + end.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable) + end +end diff --git a/spec/support/shared_examples/requests/api/graphql/projects/services_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/projects/services_shared_examples.rb new file mode 100644 index 00000000000..246f1850c3c --- /dev/null +++ b/spec/support/shared_examples/requests/api/graphql/projects/services_shared_examples.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +shared_examples 'unauthorized users cannot read services' do + before do + post_graphql(query, current_user: current_user) + end + + context 'when anonymous user' do + let(:current_user) { nil } + + it { expect(services).to be nil } + end + + context 'when user developer' do + before do + project.add_developer(current_user) + end + + it { expect(services).to be nil } + end +end |