59 lines
1.3 KiB
Ruby
59 lines
1.3 KiB
Ruby
# 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
|