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

resolves_groups_spec.rb « concerns « resolvers « graphql « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: d15c8f2ee42754a1a77669ed20f62a97e0725a06 (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
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe ResolvesGroups do
  include GraphqlHelpers
  include AfterNextHelpers

  let_it_be(:user) { create(:user) }
  let_it_be(:groups) { create_pair(:group) }

  let_it_be(:resolver) do
    Class.new(Resolvers::BaseResolver) do
      include ResolvesGroups
      type Types::GroupType, null: true
    end
  end

  let_it_be(:query_type) do
    query_factory do |query|
      query.field :groups,
                  Types::GroupType.connection_type,
                  null: true,
                  resolver: resolver
    end
  end

  let_it_be(:lookahead_fields) do
    <<~FIELDS
      containerRepositoriesCount
      customEmoji { nodes { id } }
      fullPath
      path
      dependencyProxyBlobCount
      dependencyProxyBlobs { nodes { fileName } }
      dependencyProxyImageCount
      dependencyProxyImageTtlPolicy { enabled }
      dependencyProxySetting { enabled }
    FIELDS
  end

  it 'avoids N+1 queries on the fields marked with lookahead' do
    group_ids = groups.map(&:id)

    allow_next(resolver).to receive(:resolve_groups).and_return(Group.id_in(group_ids))
    # Prevent authorization queries from affecting the test.
    allow(Ability).to receive(:allowed?).and_return(true)

    single_group_query = ActiveRecord::QueryRecorder.new do
      data = query_groups(limit: 1)
      expect(data.size).to eq(1)
    end

    multi_group_query = -> {
      data = query_groups(limit: 2)
      expect(data.size).to eq(2)
    }

    expect { multi_group_query.call }.not_to exceed_query_limit(single_group_query)
  end

  def query_groups(limit:)
    query_string = "{ groups(first: #{limit}) { nodes { id #{lookahead_fields} } } }"

    data = execute_query(query_type, graphql: query_string)

    graphql_dig_at(data, :data, :groups, :nodes)
  end
end