File: packages_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 (111 lines) | stat: -rw-r--r-- 3,782 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
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe 'getting a package list for a project', feature_category: :package_registry do
  include GraphqlHelpers

  let_it_be(:resource) { create(:project, :repository) }
  let_it_be(:current_user) { create(:user) }
  let_it_be(:project1) { resource }
  let_it_be(:project2) { resource }

  let(:resource_type) { :project }

  it_behaves_like 'group and project packages query'

  describe 'protectionRuleExists' do
    let_it_be(:maven_package) { create(:maven_package, project: project1, name: 'maven-package') }
    let_it_be(:npm_package) { create(:npm_package, project: project1, name: 'npm-package') }
    let_it_be(:npm_package_no_match) { create(:npm_package, project: project1, name: 'other-npm-package') }

    let_it_be(:npm_package_protection_rule) do
      create(:package_protection_rule, project: resource, package_name_pattern: npm_package.name, package_type: :npm,
        minimum_access_level_for_push: :maintainer)
    end

    let(:query) do
      graphql_query_for(
        resource_type,
        { 'fullPath' => resource.full_path },
        query_graphql_field('packages', {}, fields)
      )
    end

    let(:fields) do
      <<~QUERY
        nodes {
          name
          packageType
          protectionRuleExists
        }
      QUERY
    end

    describe "efficient database queries" do
      let_it_be(:project2) { create(:project, :repository) }
      let_it_be(:project2_npm_package) { create(:npm_package, project: project2, name: '@project2/npm-package') }
      let_it_be(:project2_npm_packages_no_match) do
        create_list(:npm_package, 4, project: project2) do |npm_package, i|
          npm_package.update!(name: "@project2/npm-package-no-match-#{i}")
        end
      end

      let_it_be(:project2_npm_package_protection_rule) do
        create(:package_protection_rule,
          project: project2,
          package_name_pattern: project2_npm_package.name,
          package_type: :npm,
          minimum_access_level_for_push: :maintainer
        )
      end

      let_it_be(:user1) { create(:user, developer_of: resource) }
      let_it_be(:user2) { create(:user, developer_of: project2) }

      it 'avoids N+1 database queries' do
        control_count = ActiveRecord::QueryRecorder.new { post_graphql(query, current_user: user1) }

        query2 = graphql_query_for(resource_type, { 'fullPath' => project2.full_path },
          query_graphql_field('packages', {}, fields))
        expect { post_graphql(query2, current_user: user2) }.not_to exceed_query_limit(control_count)
      end
    end

    context 'when package protection rule for package and user exists' do
      using RSpec::Parameterized::TableSyntax

      where(:current_user_access_level, :expected_protection_rule_exists) do
        :reporter   | true
        :developer  | true
        :maintainer | true
        :owner      | true
      end

      with_them do
        before do
          resource.send("add_#{current_user_access_level}", current_user)

          post_graphql(query, current_user: current_user)
        end

        it_behaves_like 'a working graphql query that returns data'

        it 'returns package protection rules' do
          expect(graphql_data_at(resource_type, :packages, :nodes)).to include(
            hash_including(
              'name' => npm_package.name,
              'packageType' => npm_package.package_type.upcase,
              'protectionRuleExists' => expected_protection_rule_exists
            ),
            hash_including(
              'name' => maven_package.name,
              'packageType' => maven_package.package_type.upcase,
              'protectionRuleExists' => false
            )
          )
        end
      end
    end
  end
end