1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Types::BaseEdge, feature_category: :api do
include GraphqlHelpers
let_it_be(:test_schema) do
project_edge_type = Class.new(described_class) do
field :proof_of_admin_rights, String, null: true, authorize: :admin_project
def proof_of_admin_rights
'ok'
end
end
project_type = Class.new(::Types::BaseObject) do
graphql_name 'Project'
authorize :read_project
edge_type_class project_edge_type
field :name, String, null: false
end
Class.new(GraphQL::Schema) do
lazy_resolve ::Gitlab::Graphql::Lazy, :force
use ::Gitlab::Graphql::Pagination::Connections
query(Class.new(::Types::BaseObject) do
graphql_name 'Query'
field :projects, project_type.connection_type, null: false
def projects
context[:projects]
end
end)
end
end
def document
GraphQL.parse(<<~GQL)
query {
projects {
edges {
proofOfAdminRights
node { name }
}
}
}
GQL
end
it 'supports field authorization on edge fields' do
user = create(:user)
private_project = create(:project, :private)
member_project = create(:project, :private)
maintainer_project = create(:project, :private)
public_project = create(:project, :public)
member_project.add_developer(user)
maintainer_project.add_maintainer(user)
projects = [private_project, member_project, maintainer_project, public_project]
data = { current_user: user, projects: projects }
query = GraphQL::Query.new(test_schema, document: document, context: data)
result = query.result.to_h
expect(graphql_dig_at(result, 'data', 'projects', 'edges', 'node', 'name'))
.to contain_exactly(member_project.name, maintainer_project.name, public_project.name)
expect(graphql_dig_at(result, 'data', 'projects', 'edges', 'proofOfAdminRights'))
.to contain_exactly(nil, 'ok', nil)
end
end
|