summaryrefslogtreecommitdiff
path: root/spec/support/graphql/var.rb
blob: 4f2c774e8987d915568546e5922b820e1b9e7722 (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
# frozen_string_literal: true

module Graphql
  # Helper to pass variables around generated queries.
  #
  # e.g.:
  #   first = var('Int')
  #   after = var('String')
  #
  #   query = with_signature(
  #     [first, after],
  #     query_graphql_path([
  #       [:project, { full_path: project.full_path }],
  #       [:issues, { after: after, first: first }]
  #       :nodes
  #     ], all_graphql_fields_for('Issue'))
  #   )
  #
  #   post_graphql(query, variables: [first.with(2), after.with(some_cursor)])
  #
  class Var
    attr_reader :name, :type
    attr_accessor :value

    def initialize(name, type)
      @name = name
      @type = type
    end

    def sig
      "#{to_graphql_value}: #{type}"
    end

    def to_graphql_value
      "$#{name}"
    end

    # We return a new object so that running the same query twice with
    # different values does not risk re-using the value
    #
    # e.g.
    #
    #   x = var('Int')
    #   expect { post_graphql(query, variables: x) }
    #     .to issue_same_number_of_queries_as { post_graphql(query, variables: x.with(1)) }
    #
    # Here we post the `x` variable once with the value set to 1, and once with
    # the value set to `nil`.
    def with(value)
      copy = Var.new(name, type)
      copy.value = value
      copy
    end

    def to_h
      { name => value }
    end
  end
end