File: project_variables_spec.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (136 lines) | stat: -rw-r--r-- 3,559 bytes parent folder | download
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
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe 'Query.project(fullPath).ciVariables', feature_category: :secrets_management do
  include GraphqlHelpers

  let_it_be(:project) { create(:project) }
  let_it_be(:user) { create(:user) }

  let(:query) do
    %(
      query {
        project(fullPath: "#{project.full_path}") {
          ciVariables {
            limit
            nodes {
              id
              key
              value
              variableType
              protected
              hidden
              masked
              raw
              environmentScope
            }
          }
        }
      }
    )
  end

  context 'when the user can administer builds' do
    before do
      project.add_maintainer(user)
    end

    it "returns the project's CI variables" do
      variable = create(
        :ci_variable,
        project: project,
        key: 'TEST_VAR',
        value: 'test',
        masked: false,
        protected: true,
        raw: true,
        environment_scope: 'production'
      )

      post_graphql(query, current_user: user)

      expect(graphql_data.dig('project', 'ciVariables', 'limit')).to be(8000)
      expect(graphql_data.dig('project', 'ciVariables', 'nodes')).to contain_exactly({
        'id' => variable.to_global_id.to_s,
        'key' => 'TEST_VAR',
        'value' => 'test',
        'variableType' => 'ENV_VAR',
        'masked' => false,
        'protected' => true,
        'hidden' => false,
        'raw' => true,
        'environmentScope' => 'production'
      })
    end

    it "sets the value to null if the variable is hidden" do
      variable = create(
        :ci_variable,
        project: project,
        key: 'TEST_VAR',
        value: 'TestVariable',
        masked: true,
        hidden: true,
        protected: true,
        raw: false,
        environment_scope: 'production'
      )

      post_graphql(query, current_user: user)

      expect(graphql_data.dig('project', 'ciVariables', 'limit')).to be(8000)
      expect(graphql_data.dig('project', 'ciVariables', 'nodes')).to contain_exactly({
        'id' => variable.to_global_id.to_s,
        'key' => 'TEST_VAR',
        'value' => nil,
        'variableType' => 'ENV_VAR',
        'masked' => true,
        'protected' => true,
        'hidden' => true,
        'raw' => false,
        'environmentScope' => 'production'
      })
    end
  end

  context 'when the user cannot administer builds' do
    it 'returns nothing' do
      create(:ci_variable, project: project, value: 'verysecret', masked: true)

      project.add_developer(user)

      post_graphql(query, current_user: user)

      expect(graphql_data.dig('project', 'ciVariables')).to be_nil
    end
  end

  describe 'sorting and pagination' do
    let_it_be(:current_user) { user }
    let_it_be(:data_path) { [:project, :ci_variables] }
    let_it_be(:variables) do
      [
        create(:ci_variable, project: project, key: 'd'),
        create(:ci_variable, project: project, key: 'a'),
        create(:ci_variable, project: project, key: 'c'),
        create(:ci_variable, project: project, key: 'e'),
        create(:ci_variable, project: project, key: 'b')
      ]
    end

    def pagination_query(params)
      graphql_query_for(
        :project,
        { fullPath: project.full_path },
        query_graphql_field('ciVariables', params, "#{page_info} nodes { id }")
      )
    end

    before do
      project.add_maintainer(current_user)
    end

    it_behaves_like 'sorted paginated variables'
  end
end