summaryrefslogtreecommitdiff
path: root/spec/graphql/types/base_edge_spec.rb
blob: b02ccbaffef875e68bd4aba5fab6e0f9e5ead2af (plain)
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
75
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Types::BaseEdge 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