graphql 1.9.7 → 1.9.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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']