graphql 1.9.7 → 1.9.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/install_generator.rb +2 -1
  3. data/lib/generators/graphql/templates/base_argument.erb +4 -0
  4. data/lib/generators/graphql/templates/base_field.erb +2 -0
  5. data/lib/generators/graphql/templates/base_input_object.erb +1 -0
  6. data/lib/graphql/analysis/ast/query_complexity.rb +34 -18
  7. data/lib/graphql/argument.rb +8 -2
  8. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +1 -1
  9. data/lib/graphql/language/lexer.rb +24 -13
  10. data/lib/graphql/language/lexer.rl +23 -13
  11. data/lib/graphql/query/arguments.rb +16 -15
  12. data/lib/graphql/schema.rb +105 -48
  13. data/lib/graphql/schema/argument.rb +12 -1
  14. data/lib/graphql/schema/build_from_definition.rb +3 -0
  15. data/lib/graphql/schema/field.rb +3 -8
  16. data/lib/graphql/schema/find_inherited_value.rb +20 -0
  17. data/lib/graphql/schema/input_object.rb +1 -3
  18. data/lib/graphql/schema/loader.rb +1 -0
  19. data/lib/graphql/schema/member/base_dsl_methods.rb +7 -18
  20. data/lib/graphql/schema/member/has_arguments.rb +4 -9
  21. data/lib/graphql/schema/member/has_fields.rb +14 -0
  22. data/lib/graphql/schema/member/relay_shortcuts.rb +2 -2
  23. data/lib/graphql/schema/resolver.rb +31 -8
  24. data/lib/graphql/schema/resolver/has_payload_type.rb +3 -2
  25. data/lib/graphql/schema/subscription.rb +1 -1
  26. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +1 -1
  27. data/lib/graphql/version.rb +1 -1
  28. data/spec/graphql/analysis/analyze_query_spec.rb +14 -25
  29. data/spec/graphql/analysis/ast/max_query_complexity_spec.rb +7 -19
  30. data/spec/graphql/analysis/ast/max_query_depth_spec.rb +5 -12
  31. data/spec/graphql/analysis/max_query_complexity_spec.rb +12 -20
  32. data/spec/graphql/analysis/max_query_depth_spec.rb +6 -13
  33. data/spec/graphql/language/lexer_spec.rb +19 -1
  34. data/spec/graphql/schema/argument_spec.rb +1 -1
  35. data/spec/graphql/schema/build_from_definition_spec.rb +10 -0
  36. data/spec/graphql/schema/catchall_middleware_spec.rb +6 -9
  37. data/spec/graphql/schema/input_object_spec.rb +25 -0
  38. data/spec/graphql/schema/loader_spec.rb +65 -1
  39. data/spec/graphql/schema/object_spec.rb +21 -0
  40. data/spec/graphql/schema/resolver_spec.rb +30 -1
  41. data/spec/graphql/schema_spec.rb +135 -0
  42. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +25 -0
  43. data/spec/integration/rails/generators/graphql/install_generator_spec.rb +20 -0
  44. data/spec/integration/tmp/app/graphql/types/page_type.rb +5 -0
  45. data/spec/support/dummy/schema.rb +1 -1
  46. data/spec/support/lazy_helpers.rb +1 -1
  47. data/spec/support/parser/filename_example_invalid_utf8.graphql +1 -0
  48. metadata +10 -132
  49. data/spec/integration/tmp/app/graphql/types/date_type.rb +0 -14
  50. data/spec/integration/tmp/dummy/Gemfile +0 -50
  51. data/spec/integration/tmp/dummy/README.md +0 -24
  52. data/spec/integration/tmp/dummy/Rakefile +0 -6
  53. data/spec/integration/tmp/dummy/app/assets/config/manifest.js +0 -3
  54. data/spec/integration/tmp/dummy/app/assets/javascripts/application.js +0 -16
  55. data/spec/integration/tmp/dummy/app/assets/javascripts/cable.js +0 -13
  56. data/spec/integration/tmp/dummy/app/assets/stylesheets/application.css +0 -15
  57. data/spec/integration/tmp/dummy/app/channels/application_cable/channel.rb +0 -5
  58. data/spec/integration/tmp/dummy/app/channels/application_cable/connection.rb +0 -5
  59. data/spec/integration/tmp/dummy/app/controllers/application_controller.rb +0 -4
  60. data/spec/integration/tmp/dummy/app/controllers/graphql_controller.rb +0 -44
  61. data/spec/integration/tmp/dummy/app/helpers/application_helper.rb +0 -3
  62. data/spec/integration/tmp/dummy/app/jobs/application_job.rb +0 -3
  63. data/spec/integration/tmp/dummy/app/mailers/application_mailer.rb +0 -5
  64. data/spec/integration/tmp/dummy/app/mydirectory/dummy_schema.rb +0 -5
  65. data/spec/integration/tmp/dummy/app/mydirectory/mutations/update_name.rb +0 -15
  66. data/spec/integration/tmp/dummy/app/mydirectory/types/base_enum.rb +0 -5
  67. data/spec/integration/tmp/dummy/app/mydirectory/types/base_input_object.rb +0 -5
  68. data/spec/integration/tmp/dummy/app/mydirectory/types/base_interface.rb +0 -6
  69. data/spec/integration/tmp/dummy/app/mydirectory/types/base_object.rb +0 -5
  70. data/spec/integration/tmp/dummy/app/mydirectory/types/base_scalar.rb +0 -5
  71. data/spec/integration/tmp/dummy/app/mydirectory/types/base_union.rb +0 -5
  72. data/spec/integration/tmp/dummy/app/mydirectory/types/mutation_type.rb +0 -12
  73. data/spec/integration/tmp/dummy/app/mydirectory/types/query_type.rb +0 -14
  74. data/spec/integration/tmp/dummy/app/views/layouts/application.html.erb +0 -14
  75. data/spec/integration/tmp/dummy/app/views/layouts/mailer.html.erb +0 -13
  76. data/spec/integration/tmp/dummy/app/views/layouts/mailer.text.erb +0 -1
  77. data/spec/integration/tmp/dummy/bin/bundle +0 -3
  78. data/spec/integration/tmp/dummy/bin/rails +0 -4
  79. data/spec/integration/tmp/dummy/bin/rake +0 -4
  80. data/spec/integration/tmp/dummy/bin/setup +0 -34
  81. data/spec/integration/tmp/dummy/bin/update +0 -29
  82. data/spec/integration/tmp/dummy/config.ru +0 -5
  83. data/spec/integration/tmp/dummy/config/application.rb +0 -26
  84. data/spec/integration/tmp/dummy/config/boot.rb +0 -4
  85. data/spec/integration/tmp/dummy/config/cable.yml +0 -9
  86. data/spec/integration/tmp/dummy/config/environment.rb +0 -6
  87. data/spec/integration/tmp/dummy/config/environments/development.rb +0 -52
  88. data/spec/integration/tmp/dummy/config/environments/production.rb +0 -84
  89. data/spec/integration/tmp/dummy/config/environments/test.rb +0 -43
  90. data/spec/integration/tmp/dummy/config/initializers/application_controller_renderer.rb +0 -9
  91. data/spec/integration/tmp/dummy/config/initializers/assets.rb +0 -12
  92. data/spec/integration/tmp/dummy/config/initializers/backtrace_silencers.rb +0 -8
  93. data/spec/integration/tmp/dummy/config/initializers/cookies_serializer.rb +0 -6
  94. data/spec/integration/tmp/dummy/config/initializers/filter_parameter_logging.rb +0 -5
  95. data/spec/integration/tmp/dummy/config/initializers/inflections.rb +0 -17
  96. data/spec/integration/tmp/dummy/config/initializers/mime_types.rb +0 -5
  97. data/spec/integration/tmp/dummy/config/initializers/new_framework_defaults.rb +0 -24
  98. data/spec/integration/tmp/dummy/config/initializers/session_store.rb +0 -4
  99. data/spec/integration/tmp/dummy/config/initializers/wrap_parameters.rb +0 -10
  100. data/spec/integration/tmp/dummy/config/locales/en.yml +0 -23
  101. data/spec/integration/tmp/dummy/config/puma.rb +0 -48
  102. data/spec/integration/tmp/dummy/config/routes.rb +0 -9
  103. data/spec/integration/tmp/dummy/config/secrets.yml +0 -22
  104. data/spec/integration/tmp/dummy/db/seeds.rb +0 -8
  105. data/spec/integration/tmp/dummy/log/test.log +0 -0
  106. data/spec/integration/tmp/dummy/public/404.html +0 -67
  107. data/spec/integration/tmp/dummy/public/422.html +0 -67
  108. data/spec/integration/tmp/dummy/public/500.html +0 -66
  109. data/spec/integration/tmp/dummy/public/apple-touch-icon-precomposed.png +0 -0
  110. data/spec/integration/tmp/dummy/public/apple-touch-icon.png +0 -0
  111. data/spec/integration/tmp/dummy/public/favicon.ico +0 -0
  112. data/spec/integration/tmp/dummy/public/robots.txt +0 -5
  113. data/spec/integration/tmp/dummy/test/test_helper.rb +0 -8
@@ -2,14 +2,7 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe GraphQL::Analysis::AST::MaxQueryComplexity do
5
- before do
6
- @prev_max_complexity = Dummy::Schema.max_complexity
7
- end
8
-
9
- after do
10
- Dummy::Schema.max_complexity = @prev_max_complexity
11
- end
12
-
5
+ let(:schema) { Class.new(Dummy::Schema) }
13
6
  let(:query_string) {%|
14
7
  {
15
8
  a: cheese(id: 1) { id }
@@ -19,7 +12,7 @@ describe GraphQL::Analysis::AST::MaxQueryComplexity do
19
12
  e: cheese(id: 1) { id }
20
13
  }
21
14
  |}
22
- let(:query) { GraphQL::Query.new(Dummy::Schema, query_string, variables: {}, max_complexity: max_complexity) }
15
+ let(:query) { GraphQL::Query.new(schema, query_string, variables: {}, max_complexity: max_complexity) }
23
16
  let(:result) {
24
17
  GraphQL::Analysis::AST.analyze_query(query, [GraphQL::Analysis::AST::MaxQueryComplexity]).first
25
18
  }
@@ -52,7 +45,7 @@ describe GraphQL::Analysis::AST::MaxQueryComplexity do
52
45
 
53
46
  describe "when max_complexity is decreased at query-level" do
54
47
  before do
55
- Dummy::Schema.max_complexity = 100
48
+ schema.max_complexity = 100
56
49
  end
57
50
 
58
51
  let(:max_complexity) { 7 }
@@ -65,7 +58,7 @@ describe GraphQL::Analysis::AST::MaxQueryComplexity do
65
58
 
66
59
  describe "when max_complexity is increased at query-level" do
67
60
  before do
68
- Dummy::Schema.max_complexity = 1
61
+ schema.max_complexity = 1
69
62
  end
70
63
 
71
64
  let(:max_complexity) { 10 }
@@ -77,22 +70,17 @@ describe GraphQL::Analysis::AST::MaxQueryComplexity do
77
70
 
78
71
  describe "across a multiplex" do
79
72
  before do
80
- @old_analysis_engine = Dummy::Schema.analysis_engine
81
- Dummy::Schema.analysis_engine = GraphQL::Analysis::AST
82
- end
83
-
84
- after do
85
- Dummy::Schema.analysis_engine = @old_analysis_engine
73
+ schema.analysis_engine = GraphQL::Analysis::AST
86
74
  end
87
75
 
88
76
  let(:queries) {
89
77
  5.times.map { |n|
90
- GraphQL::Query.new(Dummy::Schema, "{ cheese(id: #{n}) { id } }", variables: {})
78
+ GraphQL::Query.new(schema, "{ cheese(id: #{n}) { id } }", variables: {})
91
79
  }
92
80
  }
93
81
 
94
82
  let(:max_complexity) { 9 }
95
- let(:multiplex) { GraphQL::Execution::Multiplex.new(schema: Dummy::Schema, queries: queries, context: {}, max_complexity: max_complexity) }
83
+ let(:multiplex) { GraphQL::Execution::Multiplex.new(schema: schema, queries: queries, context: {}, max_complexity: max_complexity) }
96
84
  let(:analyze_multiplex) {
97
85
  GraphQL::Analysis::AST.analyze_multiplex(multiplex, [GraphQL::Analysis::AST::MaxQueryComplexity])
98
86
  }
@@ -2,14 +2,7 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe GraphQL::Analysis::AST::MaxQueryDepth do
5
- before do
6
- @prev_max_depth = Dummy::Schema.max_depth
7
- end
8
-
9
- after do
10
- Dummy::Schema.max_depth = @prev_max_depth
11
- end
12
-
5
+ let(:schema) { Class.new(Dummy::Schema) }
13
6
  let(:query_string) { "
14
7
  {
15
8
  cheese(id: 1) {
@@ -30,7 +23,7 @@ describe GraphQL::Analysis::AST::MaxQueryDepth do
30
23
  let(:max_depth) { nil }
31
24
  let(:query) {
32
25
  GraphQL::Query.new(
33
- Dummy::Schema.graphql_definition,
26
+ schema.graphql_definition,
34
27
  query_string,
35
28
  variables: {},
36
29
  max_depth: max_depth
@@ -58,7 +51,7 @@ describe GraphQL::Analysis::AST::MaxQueryDepth do
58
51
 
59
52
  describe "When the query is not deeper than max_depth" do
60
53
  before do
61
- Dummy::Schema.max_depth = 100
54
+ schema.max_depth = 100
62
55
  end
63
56
 
64
57
  it "doesn't add an error" do
@@ -68,7 +61,7 @@ describe GraphQL::Analysis::AST::MaxQueryDepth do
68
61
 
69
62
  describe "when the max depth isn't set" do
70
63
  before do
71
- Dummy::Schema.max_depth = nil
64
+ schema.max_depth = nil
72
65
  end
73
66
 
74
67
  it "doesn't add an error message" do
@@ -78,7 +71,7 @@ describe GraphQL::Analysis::AST::MaxQueryDepth do
78
71
 
79
72
  describe "when a fragment exceeds max depth" do
80
73
  before do
81
- Dummy::Schema.max_depth = 4
74
+ schema.max_depth = 4
82
75
  end
83
76
 
84
77
  let(:query_string) { "
@@ -2,16 +2,8 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe GraphQL::Analysis::MaxQueryComplexity do
5
- before do
6
- @prev_max_complexity = Dummy::Schema.max_complexity
7
- end
8
-
9
- after do
10
- Dummy::Schema.max_complexity = @prev_max_complexity
11
- end
12
-
13
-
14
- let(:result) { Dummy::Schema.execute(query_string) }
5
+ let(:schema) { Class.new(Dummy::Schema) }
6
+ let(:result) { schema.execute(query_string) }
15
7
  let(:query_string) {%|
16
8
  {
17
9
  a: cheese(id: 1) { id }
@@ -24,7 +16,7 @@ describe GraphQL::Analysis::MaxQueryComplexity do
24
16
 
25
17
  describe "when a query goes over max complexity" do
26
18
  before do
27
- Dummy::Schema.max_complexity = 9
19
+ schema.max_complexity = 9
28
20
  end
29
21
 
30
22
  it "returns an error" do
@@ -34,7 +26,7 @@ describe GraphQL::Analysis::MaxQueryComplexity do
34
26
 
35
27
  describe "when there is no max complexity" do
36
28
  before do
37
- Dummy::Schema.max_complexity = nil
29
+ schema.max_complexity = nil
38
30
  end
39
31
  it "doesn't error" do
40
32
  assert_nil result["errors"]
@@ -43,7 +35,7 @@ describe GraphQL::Analysis::MaxQueryComplexity do
43
35
 
44
36
  describe "when the query is less than the max complexity" do
45
37
  before do
46
- Dummy::Schema.max_complexity = 99
38
+ schema.max_complexity = 99
47
39
  end
48
40
  it "doesn't error" do
49
41
  assert_nil result["errors"]
@@ -52,9 +44,9 @@ describe GraphQL::Analysis::MaxQueryComplexity do
52
44
 
53
45
  describe "when max_complexity is decreased at query-level" do
54
46
  before do
55
- Dummy::Schema.max_complexity = 100
47
+ schema.max_complexity = 100
56
48
  end
57
- let(:result) { Dummy::Schema.execute(query_string, max_complexity: 7) }
49
+ let(:result) {schema.execute(query_string, max_complexity: 7) }
58
50
 
59
51
  it "is applied" do
60
52
  assert_equal "Query has complexity of 10, which exceeds max complexity of 7", result["errors"][0]["message"]
@@ -63,9 +55,9 @@ describe GraphQL::Analysis::MaxQueryComplexity do
63
55
 
64
56
  describe "when max_complexity is increased at query-level" do
65
57
  before do
66
- Dummy::Schema.max_complexity = 1
58
+ schema.max_complexity = 1
67
59
  end
68
- let(:result) { Dummy::Schema.execute(query_string, max_complexity: 10) }
60
+ let(:result) {schema.execute(query_string, max_complexity: 10) }
69
61
 
70
62
  it "doesn't error" do
71
63
  assert_nil result["errors"]
@@ -74,13 +66,13 @@ describe GraphQL::Analysis::MaxQueryComplexity do
74
66
 
75
67
  describe "across a multiplex" do
76
68
  before do
77
- Dummy::Schema.max_complexity = 9
69
+ schema.max_complexity = 9
78
70
  end
79
71
 
80
72
  let(:queries) { 5.times.map { |n| { query: "{ cheese(id: #{n}) { id } }" } } }
81
73
 
82
74
  it "returns errors for all queries" do
83
- results = Dummy::Schema.multiplex(queries)
75
+ results = schema.multiplex(queries)
84
76
  assert_equal 5, results.length
85
77
  err_msg = "Query has complexity of 10, which exceeds max complexity of 9"
86
78
  results.each do |res|
@@ -90,7 +82,7 @@ describe GraphQL::Analysis::MaxQueryComplexity do
90
82
 
91
83
  describe "with a local override" do
92
84
  it "uses the override" do
93
- results = Dummy::Schema.multiplex(queries, max_complexity: 10)
85
+ results = schema.multiplex(queries, max_complexity: 10)
94
86
  assert_equal 5, results.length
95
87
  results.each do |res|
96
88
  assert_equal true, res.key?("data")
@@ -2,15 +2,8 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe GraphQL::Analysis::MaxQueryDepth do
5
- before do
6
- @prev_max_depth = Dummy::Schema.max_depth
7
- end
8
-
9
- after do
10
- Dummy::Schema.max_depth = @prev_max_depth
11
- end
12
-
13
- let(:result) { Dummy::Schema.execute(query_string) }
5
+ let(:schema) { Class.new(Dummy::Schema) }
6
+ let(:result) { schema.execute(query_string) }
14
7
  let(:query_string) { "
15
8
  {
16
9
  cheese(id: 1) {
@@ -36,7 +29,7 @@ describe GraphQL::Analysis::MaxQueryDepth do
36
29
  end
37
30
 
38
31
  describe "when the query specifies a different max_depth" do
39
- let(:result) { Dummy::Schema.execute(query_string, max_depth: 100) }
32
+ let(:result) { schema.execute(query_string, max_depth: 100) }
40
33
 
41
34
  it "obeys that max_depth" do
42
35
  assert_nil result["errors"]
@@ -45,7 +38,7 @@ describe GraphQL::Analysis::MaxQueryDepth do
45
38
 
46
39
  describe "When the query is not deeper than max_depth" do
47
40
  before do
48
- Dummy::Schema.max_depth = 100
41
+ schema.max_depth = 100
49
42
  end
50
43
 
51
44
  it "doesn't add an error" do
@@ -55,7 +48,7 @@ describe GraphQL::Analysis::MaxQueryDepth do
55
48
 
56
49
  describe "when the max depth isn't set" do
57
50
  before do
58
- Dummy::Schema.max_depth = nil
51
+ schema.max_depth = nil
59
52
  end
60
53
 
61
54
  it "doesn't add an error message" do
@@ -65,7 +58,7 @@ describe GraphQL::Analysis::MaxQueryDepth do
65
58
 
66
59
  describe "when a fragment exceeds max depth" do
67
60
  before do
68
- Dummy::Schema.max_depth = 4
61
+ schema.max_depth = 4
69
62
  end
70
63
 
71
64
  let(:query_string) { "
@@ -53,6 +53,13 @@ describe GraphQL::Language::Lexer do
53
53
  tokens = subject.tokenize('"""{"foo":"bar"}"""')
54
54
  assert_equal '{"foo":"bar"}', tokens[0].value
55
55
  end
56
+
57
+ it "tokenizes empty block strings correctly" do
58
+ empty_block_string = '""""""'
59
+ tokens = subject.tokenize(empty_block_string)
60
+
61
+ assert_equal '', tokens[0].value
62
+ end
56
63
  end
57
64
 
58
65
  it "unescapes escaped characters" do
@@ -67,6 +74,17 @@ describe GraphQL::Language::Lexer do
67
74
  assert_equal :BAD_UNICODE_ESCAPE, subject.tokenize('"\\u0XXF \\u0009"').first.name
68
75
  end
69
76
 
77
+ it "rejects truly invalid UTF-8 bytes" do
78
+ error_filename = "spec/support/parser/filename_example_invalid_utf8.graphql"
79
+ assert_equal :BAD_UNICODE_ESCAPE, subject.tokenize(File.read(error_filename)).first.name
80
+ end
81
+
82
+ it "rejects unicode that's well-formed but results in invalidly-encoded strings" do
83
+ # when the string here gets tokenized into an actual `:STRING`, it results in `valid_encoding?` being false for
84
+ # the ruby string so application code usually blows up trying to manipulate it
85
+ assert_equal :BAD_UNICODE_ESCAPE, subject.tokenize('"\\ud83c\\udf2c"').first.name
86
+ end
87
+
70
88
  it "clears the previous_token between runs" do
71
89
  tok_2 = subject.tokenize(query_string)
72
90
  assert_nil tok_2[0].prev_token
@@ -80,7 +98,7 @@ describe GraphQL::Language::Lexer do
80
98
  assert_equal 8, str_token.col
81
99
  assert_equal '(STRING "c" [1:8])', str_token.inspect
82
100
  rparen_token = tokens[6]
83
- assert_equal '(RPAREN ")" [1:10])', rparen_token.inspect
101
+ assert_equal '(RPAREN ")" [1:11])', rparen_token.inspect
84
102
  end
85
103
 
86
104
  it "counts block string line properly" do
@@ -18,7 +18,7 @@ describe GraphQL::Schema::Argument do
18
18
  raise GraphQL::ExecutionError.new('boom!')
19
19
  end
20
20
 
21
- argument :keys, [String], required: false
21
+ argument :keys, [String], required: false, method_access: false
22
22
 
23
23
  class Multiply
24
24
  def call(val, context)
@@ -1063,6 +1063,16 @@ SCHEMA
1063
1063
 
1064
1064
  assert_equal({ "str" => "abc", "int" => 123 }, result["data"])
1065
1065
  end
1066
+
1067
+ it "doesn't warn about method conflicts" do
1068
+ assert_output "", "" do
1069
+ GraphQL::Schema.from_definition "
1070
+ type Query {
1071
+ int(method: Int): Int
1072
+ }
1073
+ "
1074
+ end
1075
+ end
1066
1076
  end
1067
1077
 
1068
1078
  describe "executable schemas from string" do
@@ -2,16 +2,13 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe GraphQL::Schema::CatchallMiddleware do
5
- let(:result) { Dummy::Schema.execute(query_string) }
6
- let(:query_string) {%| query noMilk { error }|}
7
-
8
- before do
9
- Dummy::Schema.middleware << GraphQL::Schema::CatchallMiddleware
10
- end
11
-
12
- after do
13
- Dummy::Schema.middleware.delete(GraphQL::Schema::CatchallMiddleware)
5
+ let(:schema) do
6
+ Class.new(Dummy::Schema) do
7
+ middleware GraphQL::Schema::CatchallMiddleware
8
+ end
14
9
  end
10
+ let(:result) { schema.execute(query_string) }
11
+ let(:query_string) {%| query noMilk { error }|}
15
12
 
16
13
  if TESTING_RESCUE_FROM
17
14
  describe "rescuing errors" do
@@ -393,4 +393,29 @@ describe GraphQL::Schema::InputObject do
393
393
  assert_equal ["ensembleId", "stringValue", "nestedInput", "legacyInput"], input_type["inputFields"].map { |f| f["name"] }
394
394
  end
395
395
  end
396
+
397
+ describe "warning for method objects" do
398
+ it "warns for method conflicts" do
399
+ input_object = Class.new(GraphQL::Schema::InputObject) do
400
+ graphql_name "X"
401
+ argument :method, String, required: true
402
+ end
403
+
404
+ expected_warning = "Unable to define a helper for argument with name 'method' as this is a reserved name. Add `method_access: false` to stop this warning.\n"
405
+ assert_output "", expected_warning do
406
+ input_object.graphql_definition
407
+ end
408
+ end
409
+
410
+ it "doesn't warn with `method_access: false`" do
411
+ input_object = Class.new(GraphQL::Schema::InputObject) do
412
+ graphql_name "X"
413
+ argument :method, String, required: true, method_access: false
414
+ end
415
+
416
+ assert_output "", "" do
417
+ input_object.graphql_definition
418
+ end
419
+ end
420
+ end
396
421
  end
@@ -275,7 +275,71 @@ describe GraphQL::Schema::Loader do
275
275
  assert type.arguments['sub'].default_value.nil?
276
276
  end
277
277
 
278
- it "sets correct default values `null` on complex field arguments" do
278
+ it "doesnt warn about method conflicts (because it doesn't make method accesses)" do
279
+ assert_output "", "" do
280
+ GraphQL::Schema.from_introspection({
281
+ "data" => {
282
+ "__schema" => {
283
+ "queryType" => {
284
+ "name" => "Query"
285
+ },
286
+ "mutationType" => nil,
287
+ "subscriptionType" => nil,
288
+ "types" => [
289
+ {
290
+ "kind" => "OBJECT",
291
+ "name" => "Query",
292
+ "description" => nil,
293
+ "fields" => [
294
+ {
295
+ "name" => "int",
296
+ "description" => nil,
297
+ "args" => [
298
+ {
299
+ "name" => "method",
300
+ "description" => nil,
301
+ "type" => {
302
+ "kind" => "SCALAR",
303
+ "name" => "Int",
304
+ "ofType" => nil
305
+ },
306
+ "defaultValue" => nil
307
+ }
308
+ ],
309
+ "type" => {
310
+ "kind" => "SCALAR",
311
+ "name" => "Int",
312
+ "ofType" => nil
313
+ },
314
+ "isDeprecated" => false,
315
+ "deprecationReason" => nil
316
+ }
317
+ ],
318
+ "inputFields" => nil,
319
+ "interfaces" => [
320
+
321
+ ],
322
+ "enumValues" => nil,
323
+ "possibleTypes" => nil
324
+ },
325
+ {
326
+ "kind" => "SCALAR",
327
+ "name" => "Int",
328
+ "description" => "Represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.",
329
+ "fields" => nil,
330
+ "inputFields" => nil,
331
+ "interfaces" => nil,
332
+ "enumValues" => nil,
333
+ "possibleTypes" => nil
334
+ },
335
+ ]
336
+ }
337
+ }
338
+ })
339
+ end
340
+ end
341
+
342
+ it "sets correct default values `nil` on complex field arguments" do
279
343
  type = loaded_schema.types['Query']
280
344
  field = type.fields['post']
281
345
  arg = field.arguments['variedWithNull']