rspec-graphql_response 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e1c5814d390ff22a3d15ddc35b4679614cc1f18211daf647121e6ca6b04156e4
4
- data.tar.gz: 1a9c6ea2c3cc642ed2df3b2efd4108906934fdb696a48e5e37eed4b4b7567245
3
+ metadata.gz: 647c52ffa5ae347bc9c2166bd94af15ee82556d10f37fa5a11a0cf0229d40b31
4
+ data.tar.gz: a93873e4d4a40a9a4702026321d96d913056188dd51eec86836232add5e7c4b7
5
5
  SHA512:
6
- metadata.gz: 7cc7e794a155fbeb8c1c485b46aa4c625e242f307234a51dde9323532041c9e8edac065300a5ac650105c605c8d65283b0cea967147b5b842b152fb90612eac7
7
- data.tar.gz: b2f520c30cd95c28169323821045f796d806647e076518e8c406f6f8257b2cf635ce0623fd1ef75c1d3336ae45028d9f82977b7598de750183c757390d3d49cc
6
+ metadata.gz: 9ad72db1bdd814a65f02cf4ee9a59c9836c452003fe840e9c28903aa805ab0553fcd7afa4558d610c63c5ae1959fea61690f037641bd3fa31b417c378ed1805a
7
+ data.tar.gz: 46ec7e724d5784feb01e33fbb5024d9c8713ddb8df77a1efb2273f1dd94c2bf8c3658ecb1f11ad9065741119b6e4a71815f9911ba3e87a779caafe97563b2dd8
data/Gemfile.lock CHANGED
@@ -1,18 +1,22 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rspec-graphql_response (0.4.0)
4
+ rspec-graphql_response (0.4.1)
5
5
  graphql (>= 1.0)
6
6
  rspec (>= 3.0)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
+ attr_extras (6.2.4)
11
12
  byebug (11.1.3)
12
13
  coderay (1.1.3)
13
14
  diff-lcs (1.4.4)
14
- graphql (1.12.5)
15
+ graphql (1.12.6)
15
16
  method_source (1.0.0)
17
+ optimist (3.0.1)
18
+ patience_diff (1.2.0)
19
+ optimist (~> 3.0)
16
20
  pry (0.14.0)
17
21
  coderay (~> 1.1)
18
22
  method_source (~> 1.0)
@@ -33,6 +37,10 @@ GEM
33
37
  diff-lcs (>= 1.2.0, < 2.0)
34
38
  rspec-support (~> 3.10.0)
35
39
  rspec-support (3.10.2)
40
+ super_diff (0.6.1)
41
+ attr_extras (>= 6.2.4)
42
+ diff-lcs
43
+ patience_diff
36
44
 
37
45
  PLATFORMS
38
46
  ruby
@@ -43,6 +51,7 @@ DEPENDENCIES
43
51
  pry-byebug (~> 3.8)
44
52
  rake (>= 12.0)
45
53
  rspec-graphql_response!
54
+ super_diff (~> 0.6)
46
55
 
47
56
  BUNDLED WITH
48
57
  1.17.2
data/README.md CHANGED
@@ -55,7 +55,7 @@ Spec Helper Methods:
55
55
 
56
56
  - [execute_graphql](/docs/execute_graphql.md) - executes a graphql call with the registered schema, query, variables and context
57
57
  - [response](/docs/response.md) - the response, as JSON, of the executed graphql query
58
- - [operation](/docs/operation.md) - retrieves the results of a named operation from the GraphQL response
58
+ - [response_data](/docs/response_data.md) - digs through the graphql response to return data from the specified node(s)
59
59
 
60
60
  API / Development
61
61
 
data/docs/operation.md CHANGED
@@ -1,38 +1,3 @@
1
1
  # Using the `operation` helper
2
2
 
3
- The `operation` helper will dig through a response to find a data
4
- structure that looks like,
5
-
6
- ```ruby
7
- {
8
- "data" => {
9
- operation_name
10
- }
11
- }
12
- ```
13
-
14
- ## Basic Use
15
-
16
- ```ruby
17
- it "has characters" do
18
- characters = operation(:characters)
19
-
20
- expect(character).to include(
21
- { id: 1, name: "Jam" },
22
- # ...
23
- )
24
- end
25
- ```
26
-
27
- ## Handling Nil
28
-
29
- If there is no `"data"` or no named operation for the name supplied, the
30
- `operation` helper will return `nil`
31
-
32
- ```ruby
33
- it "returns nil if operation doesn't exist" do
34
- character = operation(:something_that_does_not_exist)
35
-
36
- expect(operation).to be_nil
37
- end
38
- ```
3
+ Deprecated. See [response_data](response_data.md) instead.
data/docs/response.md CHANGED
@@ -1 +1 @@
1
- # Check the GraphQL Response with Helper `response`
1
+ # The GraphQL Response, via Helper `response`
@@ -0,0 +1,146 @@
1
+ # Using the `response_data` Helper
2
+
3
+ The `response_data` helper will dig through a graphql response, through
4
+ the outer hash, into the response data for an operation, and through any
5
+ and all layers of hash and array.
6
+
7
+ ## Syntax
8
+
9
+ ```ruby
10
+ response_data *[dig_pattern]
11
+ ```
12
+
13
+ Data returned via this helper will assume a `"data" => ` key at the root of
14
+ the `response` object. This root does not need to be specified in the list
15
+ of attributes for the `dig_pattern`.
16
+
17
+ ### Params
18
+
19
+ * `*[dig_pattern]` - an array of attributes (`:symbol`, `"string"`, or `key: :value` pair) that describes
20
+ the data structure to dig through, and the final data set to retrieve from the graphql response.
21
+
22
+ #### dig_pattern
23
+
24
+ Each attribute added to the `dig_pattern` represents an attribute at the given level of the
25
+ data structure, in numeric order from left to right. The first attribute provides will dig into
26
+ that attribute at the first level of data (just below the `"data" =>` key). The second attribute
27
+ will dig through data just below that first level, etc. etc. etc.
28
+
29
+ For example, with a data structure as shown below, in "Basic Use", you could specifiy these
30
+ attributes for the dig pattern:
31
+
32
+ * :characters
33
+ * :name
34
+
35
+ Like this:
36
+
37
+ ```ruby
38
+ response_data :characters, :name
39
+ ```
40
+
41
+ This dig pattern will find the `"characters"` key just below `"data"`, then iterate through
42
+ the array of characters and retrieve the `"name"` of each character.
43
+
44
+ For more details and options for the dig pattern, see the examples below.
45
+
46
+ ## Basic Use
47
+
48
+ A `response` data structure may look something like the following.
49
+
50
+ ```ruby
51
+ {
52
+ "data" => {
53
+ "characters" => [
54
+ { "id" => "1", "name" => "Jam" },
55
+ { "id" => "2", "name" => "Redemption" },
56
+ { "id" => "3", "name" => "Pet" }
57
+ ]
58
+ }
59
+ }
60
+ ```
61
+
62
+ The `response_data` helper will dig through to give you simplified
63
+ results that are easier to verify.
64
+
65
+ For example, if only the names of the characters need to be checked:
66
+
67
+ ```ruby
68
+ response_data :characters, :name
69
+
70
+ # => ["Jam", "Redemption", "Pet"]
71
+ ```
72
+
73
+ Or perhaps only the name for 2nd character is needed:
74
+
75
+ ```ruby
76
+ response_data {characters: [1]}, :name
77
+
78
+ # => "Redemption"
79
+ ```
80
+
81
+ ## List Every Item in an Array
82
+
83
+ Many responses from a graphql call will include an array of data somewhere
84
+ in the data structure. If you need to return all of the items in an array,
85
+ you only need to specify that array's key:
86
+
87
+ ```ruby
88
+ it "has characters" do
89
+ characters = response_data(:characters)
90
+
91
+ expect(character).to include(
92
+ { id: 1, name: "Jam" },
93
+ # ...
94
+ )
95
+ end
96
+ ```
97
+
98
+ ## Dig a Field From Every Item in an Array
99
+
100
+ When validation only needs to occur on a specific field for items found in
101
+ an array, there are two options.
102
+
103
+ 1. Specify a list of fields as already shown
104
+ 2. change the array's key to a hash and provide a `:symbol` wrapped in an array as the value
105
+
106
+ The first option was already shown in the Basic Use section above.
107
+
108
+ ```ruby
109
+ response_data :characters, :name
110
+
111
+ # => ["Jam", "Redemption", "Pet"]
112
+ ```
113
+
114
+ For the second option, the code would look like this:
115
+
116
+ ```ruby
117
+ response_data characters: [:name]
118
+
119
+ # => ["Jam", "Redemption", "Pet"]
120
+ ```
121
+
122
+ Both of these options are functionaly the same. The primary difference will be
123
+ how you wish to express the data structure in your code. Changing the list of
124
+ attributes to a hash with an array wrapping the value will provide a better
125
+ indication that an array is expected at that point in the data structure.
126
+
127
+ ## Dig Out an Item By Index, From an Array
128
+
129
+ There may be times when only a single piece of a returned array needs to be
130
+ validated. To handle this, switch the key of the array to a hash, as in the
131
+ previous example. Rather than specifying a child node's key in the value, though,
132
+ specify the index of the item you wish to extract.
133
+
134
+ ```ruby
135
+ response_data characters: [1]
136
+ ```
137
+
138
+ This will return the character at index 1, from the array of characters.
139
+
140
+ ## Handling Nil
141
+
142
+ If there is no data the key supplied, the helper will return `nil`
143
+
144
+ ```ruby
145
+ response_data(:something_that_does_not_exist) #=> nil
146
+ ```
@@ -1,5 +1,6 @@
1
1
  require "rspec"
2
2
 
3
+ require_relative "graphql_response/dig_dug/dig_dug"
3
4
  require_relative "graphql_response/version"
4
5
  require_relative "graphql_response/configuration"
5
6
  require_relative "graphql_response/validators"
@@ -0,0 +1,83 @@
1
+ module RSpec
2
+ module GraphQLResponse
3
+ class DigDug
4
+ attr_reader :dig_pattern
5
+
6
+ def initialize(*dig_pattern)
7
+ @dig_pattern = parse_dig_pattern(*dig_pattern)
8
+ end
9
+
10
+ def dig(data)
11
+ dig_data(data, dig_pattern)
12
+ end
13
+
14
+ private
15
+
16
+ def dig_data(data, patterns)
17
+ return data if patterns.nil?
18
+ return data if patterns.empty?
19
+
20
+ node = patterns[0]
21
+ node_key = node[:key]
22
+ node_key = node_key.to_s if node_key.is_a? Symbol
23
+ node_value = node[:value]
24
+
25
+ if node[:type] == :symbol
26
+ result = dig_symbol(data, node_key)
27
+ elsif node[:type] == :array
28
+ if data.is_a? Hash
29
+ child_data = data[node_key]
30
+ result = dig_symbol(child_data, node_value)
31
+ elsif data.is_a? Array
32
+ result = data.map { |value|
33
+ child_data = value[node_key]
34
+ dig_symbol(child_data, node_value)
35
+ }.compact
36
+ else
37
+ result = data
38
+ end
39
+ end
40
+
41
+ dig_data(result, patterns.drop(1))
42
+ end
43
+
44
+ def parse_dig_pattern(*pattern)
45
+ pattern_config = pattern.map do |pattern_item|
46
+ if pattern_item.is_a? Symbol
47
+ {
48
+ type: :symbol,
49
+ key: pattern_item
50
+ }
51
+ elsif pattern_item.is_a? Hash
52
+ pattern_item.map do |key, value|
53
+ {
54
+ type: :array,
55
+ key: key,
56
+ value: value[0]
57
+ }
58
+ end
59
+ end
60
+ end
61
+
62
+ pattern_config.flatten
63
+ end
64
+
65
+ def dig_symbol(data, key)
66
+ key = key.to_s if key.is_a? Symbol
67
+ return data[key] if data.is_a? Hash
68
+
69
+ if data.is_a? Array
70
+ if key.is_a? Numeric
71
+ mapped_data = data[key]
72
+ else
73
+ mapped_data = data.map { |value| value[key] }.flatten
74
+ end
75
+
76
+ return mapped_data
77
+ end
78
+
79
+ return data
80
+ end
81
+ end
82
+ end
83
+ end
@@ -40,11 +40,12 @@ module RSpec
40
40
  end
41
41
 
42
42
  # describe level helpers
43
+ require_relative "helpers/graphql_context"
43
44
  require_relative "helpers/graphql_operation"
44
45
  require_relative "helpers/graphql_variables"
45
- require_relative "helpers/graphql_context"
46
46
 
47
47
  # spec level helpers
48
+ require_relative "helpers/execute_graphql"
48
49
  require_relative "helpers/operation"
49
50
  require_relative "helpers/response"
50
- require_relative "helpers/execute_graphql"
51
+ require_relative "helpers/response_data"
@@ -1,4 +1,5 @@
1
1
  RSpec::GraphQLResponse.add_helper :operation do |name|
2
+ warn 'WARNING: operation has been deprecated in favor of response_data. This helper will be removed in v0.5'
2
3
  return nil unless response.is_a? Hash
3
4
 
4
5
  response.dig("data", name.to_s)
@@ -0,0 +1,13 @@
1
+ RSpec::GraphQLResponse.add_helper :response_data do |*fields|
2
+ next nil unless response.is_a? Hash
3
+
4
+ response_data = response["data"]
5
+ next nil if response_data.nil?
6
+ next nil if response_data.empty?
7
+
8
+ fields = fields.compact
9
+ next response_data if fields.empty?
10
+
11
+ dig_dug = RSpec::GraphQLResponse::DigDug.new(*fields)
12
+ dig_dug.dig(response_data)
13
+ end
@@ -1,5 +1,5 @@
1
1
  module RSpec
2
2
  module GraphQLResponse
3
- VERSION = "0.4.0"
3
+ VERSION = "0.4.1"
4
4
  end
5
5
  end
@@ -29,6 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.add_development_dependency "rake", ">= 12.0"
30
30
  spec.add_development_dependency "pry", "~> 0.14"
31
31
  spec.add_development_dependency "pry-byebug", "~> 3.8"
32
+ spec.add_development_dependency "super_diff", "~> 0.6"
32
33
 
33
34
  spec.add_runtime_dependency "rspec", ">= 3.0"
34
35
  spec.add_runtime_dependency "graphql", ">= 1.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-graphql_response
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - River Lynn Bailey
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-11 00:00:00.000000000 Z
11
+ date: 2021-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.8'
69
+ - !ruby/object:Gem::Dependency
70
+ name: super_diff
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.6'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.6'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rspec
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -129,8 +143,10 @@ files:
129
143
  - docs/have_operation.md
130
144
  - docs/operation.md
131
145
  - docs/response.md
146
+ - docs/response_data.md
132
147
  - lib/rspec/graphql_response.rb
133
148
  - lib/rspec/graphql_response/configuration.rb
149
+ - lib/rspec/graphql_response/dig_dug/dig_dug.rb
134
150
  - lib/rspec/graphql_response/helpers.rb
135
151
  - lib/rspec/graphql_response/helpers/execute_graphql.rb
136
152
  - lib/rspec/graphql_response/helpers/graphql_context.rb
@@ -138,6 +154,7 @@ files:
138
154
  - lib/rspec/graphql_response/helpers/graphql_variables.rb
139
155
  - lib/rspec/graphql_response/helpers/operation.rb
140
156
  - lib/rspec/graphql_response/helpers/response.rb
157
+ - lib/rspec/graphql_response/helpers/response_data.rb
141
158
  - lib/rspec/graphql_response/matchers.rb
142
159
  - lib/rspec/graphql_response/matchers/have_errors.rb
143
160
  - lib/rspec/graphql_response/matchers/have_operation.rb