diff options
author | Jan Provaznik <jprovaznik@gitlab.com> | 2019-06-05 13:25:22 +0300 |
---|---|---|
committer | Jan Provaznik <jprovaznik@gitlab.com> | 2019-06-05 13:25:22 +0300 |
commit | d9a761ed14ab5025626dee17faf1528c1264a1b0 (patch) | |
tree | 8e5acee47fee5454b0d56efa2a70f18455d1a1cd /spec | |
parent | 2b7fb50f5d2015e11a78c0ff60d0f9ac8b7776aa (diff) | |
parent | f16b13113ff580fbde78f8f6ba42a3f86c04ca12 (diff) |
Merge branch 'bvl-use-global-ids-graphql' into 'master'
Use global IDs when exposing GraphQL resources
Closes #62650
See merge request gitlab-org/gitlab-ce!29080
Diffstat (limited to 'spec')
-rw-r--r-- | spec/graphql/features/authorization_spec.rb | 2 | ||||
-rw-r--r-- | spec/graphql/gitlab_schema_spec.rb | 58 | ||||
-rw-r--r-- | spec/requests/api/graphql/gitlab_schema_spec.rb | 13 | ||||
-rw-r--r-- | spec/requests/api/graphql/group_query_spec.rb | 2 | ||||
-rw-r--r-- | spec/requests/api/graphql/mutations/merge_requests/set_wip_spec.rb | 2 | ||||
-rw-r--r-- | spec/requests/api/graphql/namespace/projects_spec.rb | 2 |
6 files changed, 74 insertions, 5 deletions
diff --git a/spec/graphql/features/authorization_spec.rb b/spec/graphql/features/authorization_spec.rb index f5eb628a982..c427893f9cc 100644 --- a/spec/graphql/features/authorization_spec.rb +++ b/spec/graphql/features/authorization_spec.rb @@ -282,7 +282,7 @@ describe 'Gitlab::Graphql::Authorization' do issue_ids = issue_edges.map { |issue_edge| issue_edge['node']&.fetch('id') } expect(issue_edges.size).to eq(visible_issues.size) - expect(issue_ids).to eq(visible_issues.map { |i| i.id.to_s }) + expect(issue_ids).to eq(visible_issues.map { |i| i.to_global_id.to_s }) end it 'does not check access on fields that will not be rendered' do diff --git a/spec/graphql/gitlab_schema_spec.rb b/spec/graphql/gitlab_schema_spec.rb index e9149f4250f..4076c1f824b 100644 --- a/spec/graphql/gitlab_schema_spec.rb +++ b/spec/graphql/gitlab_schema_spec.rb @@ -107,6 +107,64 @@ describe GitlabSchema do end end + describe '.id_from_object' do + it 'returns a global id' do + expect(described_class.id_from_object(build(:project, id: 1))).to be_a(GlobalID) + end + + it "raises a meaningful error if a global id couldn't be generated" do + expect { described_class.id_from_object(build(:commit)) } + .to raise_error(RuntimeError, /include `GlobalID::Identification` into/i) + end + end + + describe '.object_from_id' do + context 'for subclasses of `ApplicationRecord`' do + it 'returns the correct record' do + user = create(:user) + + result = described_class.object_from_id(user.to_global_id.to_s) + + expect(result.__sync).to eq(user) + end + + it 'batchloads the queries' do + user1 = create(:user) + user2 = create(:user) + + expect do + [described_class.object_from_id(user1.to_global_id), + described_class.object_from_id(user2.to_global_id)].map(&:__sync) + end.not_to exceed_query_limit(1) + end + end + + context 'for other classes' do + # We cannot use an anonymous class here as `GlobalID` expects `.name` not + # to return `nil` + class TestGlobalId + include GlobalID::Identification + attr_accessor :id + + def initialize(id) + @id = id + end + end + + it 'falls back to a regular find' do + result = TestGlobalId.new(123) + + expect(TestGlobalId).to receive(:find).with("123").and_return(result) + + expect(described_class.object_from_id(result.to_global_id)).to eq(result) + end + end + + it 'raises the correct error on invalid input' do + expect { described_class.object_from_id("bogus id") }.to raise_error(Gitlab::Graphql::Errors::ArgumentError) + end + end + def field_instrumenters described_class.instrumenters[:field] + described_class.instrumenters[:field_after_built_ins] end diff --git a/spec/requests/api/graphql/gitlab_schema_spec.rb b/spec/requests/api/graphql/gitlab_schema_spec.rb index b6ca9246399..28676bb02f4 100644 --- a/spec/requests/api/graphql/gitlab_schema_spec.rb +++ b/spec/requests/api/graphql/gitlab_schema_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe 'GitlabSchema configurations' do include GraphqlHelpers - let(:project) { create(:project) } + set(:project) { create(:project) } shared_examples 'imposing query limits' do describe '#max_complexity' do @@ -136,4 +136,15 @@ describe 'GitlabSchema configurations' do post_graphql(query, current_user: nil) end end + + context "global id's" do + it 'uses GlobalID to expose ids' do + post_graphql(graphql_query_for('project', { 'fullPath' => project.full_path }, %w(id)), + current_user: project.owner) + + parsed_id = GlobalID.parse(graphql_data['project']['id']) + + expect(parsed_id).to eq(project.to_global_id) + end + end end diff --git a/spec/requests/api/graphql/group_query_spec.rb b/spec/requests/api/graphql/group_query_spec.rb index db9f2ac9dd0..e0f1e4dbe9e 100644 --- a/spec/requests/api/graphql/group_query_spec.rb +++ b/spec/requests/api/graphql/group_query_spec.rb @@ -56,7 +56,7 @@ describe 'getting group information' do post_graphql(group_query(group1), current_user: user1) expect(response).to have_gitlab_http_status(200) - expect(graphql_data['group']['id']).to eq(group1.id.to_s) + expect(graphql_data['group']['id']).to eq(group1.to_global_id.to_s) expect(graphql_data['group']['name']).to eq(group1.name) expect(graphql_data['group']['path']).to eq(group1.path) expect(graphql_data['group']['description']).to eq(group1.description) diff --git a/spec/requests/api/graphql/mutations/merge_requests/set_wip_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/set_wip_spec.rb index 8f427d71a32..d75f0df9fd3 100644 --- a/spec/requests/api/graphql/mutations/merge_requests/set_wip_spec.rb +++ b/spec/requests/api/graphql/mutations/merge_requests/set_wip_spec.rb @@ -11,7 +11,7 @@ describe 'Setting WIP status of a merge request' do let(:mutation) do variables = { project_path: project.full_path, - iid: merge_request.iid + iid: merge_request.iid.to_s } graphql_mutation(:merge_request_set_wip, variables.merge(input)) end diff --git a/spec/requests/api/graphql/namespace/projects_spec.rb b/spec/requests/api/graphql/namespace/projects_spec.rb index e05273da4bd..de1cd9586b6 100644 --- a/spec/requests/api/graphql/namespace/projects_spec.rb +++ b/spec/requests/api/graphql/namespace/projects_spec.rb @@ -60,7 +60,7 @@ describe 'getting projects', :nested_groups do expect(graphql_data['namespace']['projects']['edges'].size).to eq(1) project = graphql_data['namespace']['projects']['edges'][0]['node'] - expect(project['id']).to eq(public_project.id.to_s) + expect(project['id']).to eq(public_project.to_global_id.to_s) end end end |