Welcome to mirror list, hosted at ThFree Co, Russian Federation.

query_spec.rb « graphql « api « requests « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 0602cfec149e59274f21f622fbf22acbc72d4a94 (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe 'Query', feature_category: :shared do
  include GraphqlHelpers

  let_it_be(:project) { create(:project, public_builds: false) }
  let_it_be(:issue) { create(:issue, project: project) }
  let_it_be(:developer) { create(:user) }

  let(:current_user) { developer }

  describe 'gitpodEnabled field' do
    let(:gitpod_enabled) { true }
    let(:gitpod_enabled_query) do
      <<~GRAPHQL
        { gitpodEnabled }
      GRAPHQL
    end

    before do
      allow(Gitlab::CurrentSettings.current_application_settings).to receive(:gitpod_enabled).and_return(gitpod_enabled)
      post_graphql(gitpod_enabled_query)
    end

    context 'When Gitpod is enabled for the application' do
      it { expect(graphql_data).to include('gitpodEnabled' => true) }
    end

    context 'When Gitpod is disabled for the application' do
      let(:gitpod_enabled) { false }

      it { expect(graphql_data).to include('gitpodEnabled' => false) }
    end
  end

  describe '.designManagement' do
    include DesignManagementTestHelpers

    let_it_be(:version) { create(:design_version, issue: issue) }
    let_it_be(:design) { version.designs.first }

    let(:query_result) { graphql_data.dig(*path) }
    let(:query) { graphql_query_for(:design_management, nil, dm_fields) }

    before do
      enable_design_management
      project.add_developer(developer)
      post_graphql(query, current_user: current_user)
    end

    shared_examples 'a query that needs authorization' do
      context 'the current user is not able to read designs' do
        let(:current_user) { create(:user) }

        it 'does not retrieve the record' do
          expect(query_result).to be_nil
        end

        it 'raises an error' do
          expect(graphql_errors).to include(
            a_hash_including('message' => a_string_matching(%r{you don't have permission}))
          )
        end
      end
    end

    describe '.version' do
      let(:path) { %w[designManagement version] }

      let(:dm_fields) do
        query_graphql_field(:version, { 'id' => global_id_of(version) }, 'id sha')
      end

      it_behaves_like 'a working graphql query'
      it_behaves_like 'a query that needs authorization'

      it 'fetches the expected data' do
        expect(query_result).to match a_graphql_entity_for(version, :sha)
      end
    end

    describe '.designAtVersion' do
      let_it_be(:design_at_version) do
        ::DesignManagement::DesignAtVersion.new(design: design, version: version)
      end

      let(:path) { %w[designManagement designAtVersion] }

      let(:dm_fields) do
        query_graphql_field(:design_at_version, { 'id' => global_id_of(design_at_version) }, <<~FIELDS)
          id
          filename
          version { id sha }
          design { id }
          issue { title iid }
          project { id fullPath }
        FIELDS
      end

      it_behaves_like 'a working graphql query'
      it_behaves_like 'a query that needs authorization'

      context 'the current user is able to read designs' do
        it 'fetches the expected data, including the correct associations' do
          expect(query_result).to match a_graphql_entity_for(
            design_at_version,
            'filename' => design_at_version.design.filename,
            'version' => a_graphql_entity_for(version, :sha),
            'design' => a_graphql_entity_for(design),
            'issue' => { 'title' => issue.title, 'iid' => issue.iid.to_s },
            'project' => a_graphql_entity_for(project, :full_path)
          )
        end
      end
    end
  end

  describe '.ciPipelineStage' do
    let_it_be(:ci_stage) { create(:ci_stage, name: 'graphql test stage', project: project) }

    let(:query) do
      <<~GRAPHQL
        {
          ciPipelineStage(id: "#{ci_stage.to_global_id}") {
            name
          }
        }
      GRAPHQL
    end

    context 'when the current user has access to the stage' do
      it 'fetches the stage for the given ID' do
        project.add_developer(developer)

        post_graphql(query, current_user: developer)

        expect(graphql_data.dig('ciPipelineStage', 'name')).to eq('graphql test stage')
      end
    end

    context 'when the current user does not have access to the stage' do
      it 'returns nil' do
        post_graphql(query, current_user: developer)

        expect(graphql_data['ciPipelineStage']).to be_nil
      end
    end
  end
end