rspec-graphql_response 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +14 -0
- data/.gitignore +3 -0
- data/.gituprc +128 -0
- data/Gemfile.lock +4 -4
- data/README.md +62 -75
- data/RELEASE_NOTES.md +39 -0
- data/UPGRADE.md +37 -0
- data/docs/add_helper.md +95 -0
- data/docs/add_validator.md +168 -1
- data/docs/configuration.md +12 -0
- data/docs/execute_graphql.md +43 -0
- data/docs/graphql_spec_type.md +14 -0
- data/docs/have_operation.md +46 -0
- data/docs/response.md +1 -0
- data/lib/rspec/graphql_response.rb +1 -1
- data/lib/rspec/graphql_response/helpers.rb +29 -4
- data/lib/rspec/graphql_response/helpers/execute_graphql.rb +9 -1
- data/lib/rspec/graphql_response/helpers/graphql_context.rb +3 -0
- data/lib/rspec/graphql_response/helpers/graphql_query.rb +3 -0
- data/lib/rspec/graphql_response/helpers/graphql_variables.rb +3 -0
- data/lib/rspec/graphql_response/matchers.rb +1 -0
- data/lib/rspec/graphql_response/matchers/have_errors.rb +2 -2
- data/lib/rspec/graphql_response/matchers/have_operation.rb +23 -0
- data/lib/rspec/graphql_response/validators.rb +6 -0
- data/lib/rspec/graphql_response/validators/have_operation.rb +24 -0
- data/lib/rspec/graphql_response/version.rb +1 -1
- metadata +17 -3
- data/.travis.yml +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 352fd084b9379469d7b4f71c86cfe94ea90172047c61c1ea2d20dced4bc85026
|
4
|
+
data.tar.gz: 7eccaeb870a708fe43f2b0891a45d703b7d1fd64901efddd5323a27b6d87a77f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83ebc95cd8c33beb6f62df67c9eb7a6846f820ca7bbc2c8412aadd0b4ceb0098449c23aeaf599bcaf65db6ddd4f4d92d2029a46e5a83c2b463f26e826040156c
|
7
|
+
data.tar.gz: 876549c88363f4e330bdb01416940116bb7a997ee7f22d2864a0d8c7a55b9310df7198b135d4bc1d655b22adecfc02df09e89feb7e173f5febfd4f2a0bd73f9a
|
@@ -0,0 +1,14 @@
|
|
1
|
+
name: Test rspec-graphql_response
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
branches: [ $default-branch ]
|
5
|
+
pull_request:
|
6
|
+
jobs:
|
7
|
+
test:
|
8
|
+
runs-on: ubuntu-latest
|
9
|
+
steps:
|
10
|
+
- uses: actions/checkout@v2
|
11
|
+
- uses: ruby/setup-ruby@v1
|
12
|
+
with:
|
13
|
+
bundler-cache: true
|
14
|
+
- run: bin/rspec
|
data/.gitignore
CHANGED
data/.gituprc
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
# Gitup: Git Update Dance Configuration
|
2
|
+
# -------------------------------------
|
3
|
+
# configuration for gitup can be set as a default for the current user
|
4
|
+
# by adding a ~/.gituprc file with settings
|
5
|
+
#
|
6
|
+
# current project or local directory settings can be added in ./.gituprc
|
7
|
+
#
|
8
|
+
# the .gituprc file is a valid shell script, loaded every time gitup is
|
9
|
+
# run. this means you can add logic, functions, and other calls to the
|
10
|
+
# .gituprc file and it will be executed at runtime
|
11
|
+
|
12
|
+
|
13
|
+
# GIT CONFIGURATION
|
14
|
+
# -----------------
|
15
|
+
# Manages the git branch update process for your project
|
16
|
+
#
|
17
|
+
# GITUP_SKIP_UPDATE:
|
18
|
+
# Whether or not a git update is performed prior to running
|
19
|
+
# the bundle install or db:migrate steps
|
20
|
+
#
|
21
|
+
# Options:
|
22
|
+
# 0: (default) do not skip the update
|
23
|
+
# 1: skip the update
|
24
|
+
#
|
25
|
+
# GITUP_MERGE_COMMAND:
|
26
|
+
# How to update the local git branch, from the upstream branch.
|
27
|
+
#
|
28
|
+
# Options:
|
29
|
+
# rebase: (default) force a rebase of the upstream branch
|
30
|
+
# merge: force a merge of the upstream branch
|
31
|
+
# <other>: your own command: `git <other> <remote>/<branch>`
|
32
|
+
#
|
33
|
+
# GITUP_REMOTE_NAME:
|
34
|
+
# The git remote name to pull from
|
35
|
+
#
|
36
|
+
# Default:
|
37
|
+
# origin
|
38
|
+
#
|
39
|
+
# GITUP_BRANCH_NAME:
|
40
|
+
# The main remote branch name to pull, from which your current
|
41
|
+
# branch will be updated
|
42
|
+
#
|
43
|
+
# Default:
|
44
|
+
# development
|
45
|
+
#
|
46
|
+
# GITUP_GIT_UPDATE_FN:
|
47
|
+
# The method called to update your git branch. Responsible
|
48
|
+
# for handling git pull, git merge or rebase, etc.
|
49
|
+
#
|
50
|
+
# Params:
|
51
|
+
# $1: Merge Command
|
52
|
+
# $2: Remote Name
|
53
|
+
# $3: Branch Name
|
54
|
+
#
|
55
|
+
# Default:
|
56
|
+
# GITUP_GIT_UPDATE_FN=__gitup_git_update
|
57
|
+
#
|
58
|
+
GITUP_SKIP_UPDATE=0
|
59
|
+
# GITUP_MERGE_COMMAND=rebase
|
60
|
+
GITUP_REMOTE_NAME=origin
|
61
|
+
GITUP_BRANCH_NAME=main
|
62
|
+
GITUP_GIT_UPDATE_FN=__gitup_git_update
|
63
|
+
|
64
|
+
# ADVANCED GIT CONFIGURATION
|
65
|
+
# --------------------------
|
66
|
+
# This .gituprs file is a full bash script. You can add logic
|
67
|
+
# to determine how to update, based on your current branch, etc.
|
68
|
+
#
|
69
|
+
# Examples:
|
70
|
+
#
|
71
|
+
# How to change merge command for specific branches
|
72
|
+
#
|
73
|
+
# current git branch
|
74
|
+
local branch_name=$(git symbolic-ref -q HEAD)
|
75
|
+
|
76
|
+
# remove the `refs/heads/` structure from the name
|
77
|
+
branch_name=${branch_name##refs/heads/}
|
78
|
+
|
79
|
+
# merge if we're in 'development' branch
|
80
|
+
if [[ $branch_name == $GITUP_BRANCH_NAME ]]; then
|
81
|
+
GITUP_MERGE_COMMAND=merge
|
82
|
+
else
|
83
|
+
GITUP_MERGE_COMMAND=rebase
|
84
|
+
fi
|
85
|
+
|
86
|
+
# DEPENDENCY INSTALLATION
|
87
|
+
# -----------------------
|
88
|
+
# Manage the step installs dependencies, after updating git.
|
89
|
+
# For example, run `bundle install` (default) and/or other
|
90
|
+
# commands to keep your project's dependencies up to date.
|
91
|
+
#
|
92
|
+
# GITUP_SKIP_INSTALL_DEPENDENCIES:
|
93
|
+
# Whether or not to skip the step that runs immediately after
|
94
|
+
# the git-update completes
|
95
|
+
#
|
96
|
+
# Options:
|
97
|
+
# 0: (default) do not skip the after_update step
|
98
|
+
# 1: skip the after_update step
|
99
|
+
#
|
100
|
+
# GITUP_INSTALL_DEPENDENCIES_FN:
|
101
|
+
# Function to run after gitup has completed the git update process
|
102
|
+
#
|
103
|
+
# Default:
|
104
|
+
# GITUP_INSTALL_DEPENDENCIES_FN=__gitup_install_dependencies
|
105
|
+
#
|
106
|
+
GITUP_SKIP_INSTALL_DEPENDENCIES=0
|
107
|
+
GITUP_INSTALL_DEPENDENCIES_FN=__gitup_install_dependencies
|
108
|
+
|
109
|
+
# RUN MIGRATIONS
|
110
|
+
# --------------
|
111
|
+
# Manage the process of running schema and/or data migrations,
|
112
|
+
# after your project's post-git-update function has run
|
113
|
+
#
|
114
|
+
# GITUP_SKIP_MIGRATIONS:
|
115
|
+
# Whether or not to skip the db:migration steps after the git update
|
116
|
+
#
|
117
|
+
# Options:
|
118
|
+
# 0: (default) do not skip the db:migration steps
|
119
|
+
# 1: skip the db:migration steps
|
120
|
+
#
|
121
|
+
# GITUP_RUN_MIGRATIONS_FN:
|
122
|
+
# Function to run migrations. Occurs after git update and post-update steps
|
123
|
+
#
|
124
|
+
# Default:
|
125
|
+
# GITUP_RUN_MIGRATIONS_FN=__gitup_migrations
|
126
|
+
#
|
127
|
+
GITUP_SKIP_MIGRATIONS=1
|
128
|
+
# GITUP_RUN_MIGRATIONS_FN=__gitup_migrations
|
data/Gemfile.lock
CHANGED
@@ -2,7 +2,7 @@ PATH
|
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
4
|
rspec-graphql_response (0.1.0)
|
5
|
-
rspec
|
5
|
+
rspec (~> 3.10)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
@@ -39,9 +39,9 @@ PLATFORMS
|
|
39
39
|
DEPENDENCIES
|
40
40
|
bundler (~> 1.17)
|
41
41
|
graphql (~> 1.12)
|
42
|
-
pry
|
43
|
-
pry-byebug
|
44
|
-
rake
|
42
|
+
pry (~> 0.14)
|
43
|
+
pry-byebug (~> 3.8)
|
44
|
+
rake (>= 12.0)
|
45
45
|
rspec-graphql_response!
|
46
46
|
|
47
47
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -3,6 +3,15 @@
|
|
3
3
|
RSpec::GraphQLResponse provides a series of RSpec matchers, helper methods, and other configuration to help simplify
|
4
4
|
the testing of responses from the `graphql-ruby` gem and the `<GraphQLSchemaName>.execute` method.
|
5
5
|
|
6
|
+
## "Why Should I Use This?"
|
7
|
+
|
8
|
+
There are a number of built-in helper methods and matchers that will allow you to skip the copy & paste work of executing
|
9
|
+
a GraphQL Schema `.execute`. Additionally, there are custom matchers and other bits that will help simplify your work in
|
10
|
+
validating common peices of a graphql response.
|
11
|
+
|
12
|
+
Lastly, the work in this gem is geared toward customization for your own application's needs. Every API call used for building
|
13
|
+
the pieces of this gem are available to you, directly, in the `API / Development` documentation, below.
|
14
|
+
|
6
15
|
## Installation
|
7
16
|
|
8
17
|
Your app must have `graphql-ruby` and `rspec`. With that done, add this line to your application's Gemfile:
|
@@ -21,71 +30,55 @@ Or install it yourself as:
|
|
21
30
|
|
22
31
|
## Full Documentation
|
23
32
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
Custom Matchers:
|
28
|
-
* [have_errors matcher](/docs/have_errors.md) - validates errors, or lack of, on
|
29
|
-
the GraphQL response
|
30
|
-
|
31
|
-
Helper Methods:
|
32
|
-
* [operation](/docs/operation.md) - retrieves the results of a named operation
|
33
|
-
from the GraphQL response
|
33
|
+
* [Release Notes](/RELEASE_NOTES.md)
|
34
|
+
* [Upgrade Guide](/UPGRADE.md)
|
34
35
|
|
35
|
-
|
36
|
+
The full documentation for RSpec::GraphQLResponse can be found in the `/docs` folder.
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
* [
|
40
|
-
by the custom matchers
|
38
|
+
Configuration:
|
39
|
+
* [RSpec::GraphQLResponse.configure](/docs/configuration.md)
|
40
|
+
* [Spec Type :graphql](/docs/graphql_spec_type.md)
|
41
41
|
|
42
|
-
|
42
|
+
Custom Matchers:
|
43
|
+
* [have_errors](/docs/have_errors.md) - validates errors, or lack of, on the GraphQL response
|
44
|
+
* [have_operation](/docs/have_operation.md) - validates the presence of a specified graphql operation in the graphql response
|
43
45
|
|
44
|
-
|
45
|
-
|
46
|
+
Context / Describe Helper Methods:
|
47
|
+
* [execute_graphql](/docs/execute_graphql.md) - executes a graphql call with the registered schema, query, variables and context
|
48
|
+
* [graphql_query](/docs/execute_graphql.md) - the query to execute
|
49
|
+
* [graphql_variables](/docs/execute_graphql.md) - a hash of variables the query expects
|
50
|
+
* [graphql_context](/docs/execute_graphql.md) - the `context` of a query or mutation's resolver
|
46
51
|
|
47
|
-
|
48
|
-
|
52
|
+
Spec Helper Methods:
|
53
|
+
* [response](/docs/response.md) - the response, as JSON, of the executed graphql query
|
54
|
+
* [operation](/docs/operation.md) - retrieves the results of a named operation from the GraphQL response
|
49
55
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
56
|
+
API / Development
|
57
|
+
* [.add_matcher](/docs/add_matcher.md) - add a custom RSpec matcher to the GraphQLResponse matchers
|
58
|
+
* [.add_validator](/docs/add_validator.md) - add a custom validator to be used by the custom matchers
|
59
|
+
* [.add_helper](/docs/add_helper.md) - add helper methods to your specs, made avialable in `it` or `describe` / `context` blocks
|
54
60
|
|
55
61
|
## Getting Started
|
56
62
|
|
57
|
-
There are a
|
58
|
-
a GraphQL Schema `.execute`. These include:
|
59
|
-
|
60
|
-
Spec types:
|
61
|
-
|
62
|
-
* `type: :graphql`
|
63
|
-
|
64
|
-
Helper methods:
|
65
|
-
|
66
|
-
* `execute_graphql`
|
67
|
-
* `response`
|
68
|
-
* `operation`
|
63
|
+
There are only a couple of bits you need to get started:
|
69
64
|
|
70
|
-
|
71
|
-
|
72
|
-
* `have_errors`
|
73
|
-
|
74
|
-
### The `:graphql` Spec Type
|
75
|
-
|
76
|
-
To use these custom helpers and matchers, you need to specificy `type: :graphql` as part of your spec's description. For exmaple,
|
65
|
+
* configuration of a GraphQL Schema in [`RSpec::GraphQLResponse.configure`](/docs/configuration.md)
|
66
|
+
* the inclusion of [`type: :graphql`](/docs/graphql_spec_type.md) in your `RSpec.describe` call
|
77
67
|
|
78
68
|
```ruby
|
79
|
-
RSpec.
|
80
|
-
|
81
|
-
|
69
|
+
RSpec::GraphQLResponse.configure do |config|
|
70
|
+
config.graphql_schema = MyGraphQLSchema
|
71
|
+
end
|
82
72
|
|
73
|
+
RSpec.describe My::Cool::Thing, type: :graphql do
|
74
|
+
# ...
|
83
75
|
end
|
84
76
|
```
|
85
77
|
|
86
|
-
|
78
|
+
Beyond these two basic needs, understanding the reason for this gem's existence can be useful in figuring out what the gem
|
79
|
+
does, and what methods and options are available.
|
87
80
|
|
88
|
-
|
81
|
+
## How We Got Here
|
89
82
|
|
90
83
|
Executing a GraphQL call from RSpec is not the most challening code to write:
|
91
84
|
|
@@ -121,16 +114,14 @@ in your specs.
|
|
121
114
|
|
122
115
|
```ruby
|
123
116
|
RSpec.describe Some::Thing, type: :graphql do
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
name
|
130
|
-
}
|
117
|
+
graphql_query <<-GQL
|
118
|
+
query ListCharacters{
|
119
|
+
characters {
|
120
|
+
id
|
121
|
+
name
|
131
122
|
}
|
132
|
-
|
133
|
-
|
123
|
+
}
|
124
|
+
GQL
|
134
125
|
|
135
126
|
it "executes the query" do
|
136
127
|
response = execute_graphql.to_h
|
@@ -147,16 +138,14 @@ way. The reduce this, `RSpec::GraphQLResponse` provides a built-in `response` he
|
|
147
138
|
|
148
139
|
```ruby
|
149
140
|
RSpec.describe Some::Thing, type: :graphql do
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
name
|
156
|
-
}
|
141
|
+
graphql_query <<-GQL
|
142
|
+
query ListCharacters{
|
143
|
+
characters {
|
144
|
+
id
|
145
|
+
name
|
157
146
|
}
|
158
|
-
|
159
|
-
|
147
|
+
}
|
148
|
+
GQL
|
160
149
|
|
161
150
|
it "executes the query" do
|
162
151
|
expect(response).to include(
|
@@ -176,16 +165,14 @@ nested hash checking, use the built-in `operation` method to retrieve the `chara
|
|
176
165
|
|
177
166
|
```ruby
|
178
167
|
RSpec.describe Some::Thing, type: :graphql do
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
name
|
185
|
-
}
|
168
|
+
graphql_query <<-GQL
|
169
|
+
query ListCharacters{
|
170
|
+
characters {
|
171
|
+
id
|
172
|
+
name
|
186
173
|
}
|
187
|
-
|
188
|
-
|
174
|
+
}
|
175
|
+
GQL
|
189
176
|
|
190
177
|
it "executes the query" do
|
191
178
|
characters = operation(:characters)
|
data/RELEASE_NOTES.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# Release Notes
|
2
|
+
|
3
|
+
Release notes for various versions of RSpec::GraphQLResponse
|
4
|
+
|
5
|
+
See [the upgrade guide](/UPGRADE.md) for details on changes between versions and how to upgrade.
|
6
|
+
|
7
|
+
## v0.2.0 - GraphQL Configuration DSL and Refactorings
|
8
|
+
|
9
|
+
Misc changes and corrections, some new features, and generally trying to create a more robust
|
10
|
+
and usable experience, right out of the box.
|
11
|
+
|
12
|
+
### New Features
|
13
|
+
|
14
|
+
* Significantly improved documentation
|
15
|
+
* `have_operation` matcher
|
16
|
+
* GraphQL configuration DSL
|
17
|
+
* `graphql_query`
|
18
|
+
* `graphql_variables`
|
19
|
+
* `graphql_context`
|
20
|
+
* Describe/Context level RSpec helper methods via `.add_context_helper` DSL
|
21
|
+
|
22
|
+
### Breaking Changes
|
23
|
+
|
24
|
+
This release changes the graphql query, variables and context configuration away from `let` vars
|
25
|
+
and into a proper DSL.
|
26
|
+
|
27
|
+
### Bug Fixes
|
28
|
+
|
29
|
+
Lots of misc bug fixes, including caching of values, ensuring things work in nested contexts, etc.
|
30
|
+
|
31
|
+
## v0.1.0 - Initial Release
|
32
|
+
|
33
|
+
Early beta work to get this out the door and begin adoption
|
34
|
+
|
35
|
+
* `have_errors` matcher
|
36
|
+
* `operation` helper
|
37
|
+
* `response` helper
|
38
|
+
* `execute_graphql` helper
|
39
|
+
* DSL for adding custom matchers, validators, and helpers
|
data/UPGRADE.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# Upgrade Guide
|
2
|
+
|
3
|
+
## v0.1.0 to v0.2.0
|
4
|
+
|
5
|
+
There is a breaking change between v0.1.0 and v0.2.0 regarding the configuration of graphql queries, variables and context.
|
6
|
+
Previously, you defined these three items with `let` in rspec:
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
let(:graphql_query) { ... }
|
10
|
+
```
|
11
|
+
|
12
|
+
In v0.2.0, this changes to a new DSL for each of these three items:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
RSpec.describe My::Stuff, type: :graphql do
|
16
|
+
|
17
|
+
graphql_query <<-GQL
|
18
|
+
query Characters($name: String) {
|
19
|
+
characters(name: $name) {
|
20
|
+
id
|
21
|
+
name
|
22
|
+
}
|
23
|
+
}
|
24
|
+
GQL
|
25
|
+
|
26
|
+
graphql_variables({
|
27
|
+
name: "Jam"
|
28
|
+
})
|
29
|
+
|
30
|
+
graphql_context({
|
31
|
+
some: "context here",
|
32
|
+
current_user: some_user
|
33
|
+
})
|
34
|
+
|
35
|
+
it " ... "
|
36
|
+
end
|
37
|
+
```
|
data/docs/add_helper.md
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
# Adding Helper Methods with `.add_helper`
|
2
|
+
|
3
|
+
Much of the value that RSpec::GraphQLResponse brings is in the form of helper methods. Some helpers
|
4
|
+
will let you simplify a spec from a verbose set of structure parsing, like this:
|
5
|
+
|
6
|
+
```ruby
|
7
|
+
it "does stuff" do
|
8
|
+
characters = response["data"]["characters"]
|
9
|
+
|
10
|
+
expect(characters).to include(
|
11
|
+
...
|
12
|
+
)
|
13
|
+
end
|
14
|
+
```
|
15
|
+
|
16
|
+
Down into something a little more reasonable with the `operation` helper, like this:
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
it "does stuff" do
|
20
|
+
expect(operation(:characters)).to include(
|
21
|
+
...
|
22
|
+
)
|
23
|
+
end
|
24
|
+
```
|
25
|
+
|
26
|
+
It's not a huge difference, but when you consider how well the `operation` method handles `nil` and
|
27
|
+
operation results that are not found, it's well worth the few lines of savings.
|
28
|
+
|
29
|
+
There are many other helpers available for your test suites, as well. Be sure to check the full
|
30
|
+
documentation list in the main readme.
|
31
|
+
|
32
|
+
## Add a Spec Helper
|
33
|
+
|
34
|
+
Most of the helpers that you'll want to add will be methods that are made available inside of
|
35
|
+
your `it` (and related / similar) blocks, as shown above.
|
36
|
+
|
37
|
+
To do this, you only need to call `RSpec::GraphQLResponse.add_helper(name, &helper_block)`. The `name` should
|
38
|
+
be a symbol that represents the method name you wish to create. And the `&helper_block` is the actual
|
39
|
+
method body, with any params you need.
|
40
|
+
|
41
|
+
Within the helper body, you will have access to all available features of RSpec's `it` blocks, including
|
42
|
+
other helper methods that come with RSpec::GraphQLResponse.
|
43
|
+
|
44
|
+
A simple example can be found in the `operation` helper:
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
RSpec::GraphQLResponse.add_helper :operation do |operation_name|
|
48
|
+
return nil unless response.is_a? Hash
|
49
|
+
|
50
|
+
response.dig("data", operation_name)
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
In this example, the `response` helper is used, which guarantees the graphql has been executed and a response
|
55
|
+
is available, assuming there were no exceptions preventing that.
|
56
|
+
|
57
|
+
## Add a Context Helper
|
58
|
+
|
59
|
+
In addition to Spec level helpers, RSpec::GraphQLResponse allows you to add custom helpers at the context
|
60
|
+
level. This means you can add configuration and other bits that can be called outside of an `it` block.
|
61
|
+
The existing `graphql_query` and other DSL methods for configuring graphql calls are a great example of
|
62
|
+
context level helpers.
|
63
|
+
|
64
|
+
To create a context helper, call `RSpec::GraphQLResponse.add_context_helper(name, &helper_block)`. The params
|
65
|
+
are the same as `.add_helper`, but the resulting method will be made available in `describe` and `context`
|
66
|
+
blocks.
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
RSpec::GraphQLResponse.add_context_helper :my_setting do |some_arg|
|
70
|
+
@my_setting = some_arg
|
71
|
+
end
|
72
|
+
```
|
73
|
+
|
74
|
+
In this simple example, a method called `my_setting` is created, and it stores a value in the instance variable
|
75
|
+
`@my_setting`. This takes advantage of RSpec's native ability to handle instance variables in describe and
|
76
|
+
context blocks, allowing the variable to exist withing the hierarchy of objects for a given spec.
|
77
|
+
|
78
|
+
With that defined, it can be used within a spec:
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
RSpec.describe Cool::Thing, type: :graphql do
|
82
|
+
|
83
|
+
my_setting "this is a cool setting!"
|
84
|
+
|
85
|
+
|
86
|
+
it "has the setting" do
|
87
|
+
setting = self.class.instance_variable_get(:@my_setting)
|
88
|
+
|
89
|
+
expect(setting).to eq("this is a cool setting!")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
```
|
93
|
+
|
94
|
+
You may want to provide a better way of retrieving the `@my_setting` var from the class, but this at least
|
95
|
+
demonstrates the ability to retrieve it from the class created by the `describe` block.
|
data/docs/add_validator.md
CHANGED
@@ -6,5 +6,172 @@ organizing your matcher code.
|
|
6
6
|
|
7
7
|
To solve this, RSpec::GraphQLResponse introduced validators - code that is
|
8
8
|
called to manage the validation of a graphql response, and provide the failure
|
9
|
-
messages.
|
9
|
+
messages.
|
10
|
+
|
11
|
+
|
12
|
+
## Clean Matchers with Validators
|
13
|
+
|
14
|
+
Validators allow your code to be well organized, and unit tested,
|
10
15
|
while providing a clean implementation of the matcher, as shown here:
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
RSpec::GraphQLResponse.add_matcher :foo_bar do |expected_value)
|
19
|
+
match do |actual_value|
|
20
|
+
foo_bar = RSpec::GraphQLResponse.validator(:foo_bar)
|
21
|
+
|
22
|
+
@result = foo_bar.validate(actual_value, expected_value)
|
23
|
+
end
|
24
|
+
|
25
|
+
failure_message do |response|
|
26
|
+
@result.reason
|
27
|
+
end
|
28
|
+
end
|
29
|
+
```
|
30
|
+
|
31
|
+
## Add a Validator with a Failure Message
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
RSpec::GraphQLResponse.add_validator :foo_bar do
|
35
|
+
# a regular failure message named `:nil`
|
36
|
+
failure_message :nil, "Can't validate nil"
|
37
|
+
|
38
|
+
# a lambda failure message named `:not_foo`
|
39
|
+
# this lets you pass data to the message so it can
|
40
|
+
# be more expressive of the failure reason
|
41
|
+
failure_message :not_foo, -> (actual, expected) { "Expected it to #{actual}, but it did not. found #{expected}" }
|
42
|
+
|
43
|
+
validate do |actual, expected|
|
44
|
+
# fail for one reason
|
45
|
+
next fail_validation(:nil) if actual.nil?
|
46
|
+
|
47
|
+
# fail for another reason, with data passed
|
48
|
+
# to the failure message
|
49
|
+
next fail_validation(:not_foo, actual, expected) unless actual == expected
|
50
|
+
|
51
|
+
# no failures found, so pass it!
|
52
|
+
pass_validation
|
53
|
+
end
|
54
|
+
end
|
55
|
+
```
|
56
|
+
|
57
|
+
### Method: `failure_message(name, message)`
|
58
|
+
|
59
|
+
The `failure_message` method allows a message to be registered with a specific name and a message associated with that name.
|
60
|
+
|
61
|
+
`failure_message name, message`
|
62
|
+
|
63
|
+
The `name` should be symbol which represents a reason for failure.
|
64
|
+
|
65
|
+
The `message` can either be a string containing the failure message, or a lambda (proc) that returns a string with the message.
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
RSpec::GraphQLResponse.add_validator :some_validator do
|
69
|
+
failure_message :a_failure, "Failed because of a failure"
|
70
|
+
|
71
|
+
# ...
|
72
|
+
end
|
73
|
+
```
|
74
|
+
|
75
|
+
Providing a lambda for the message allows the message to receive parameters and format the message using those parameters.
|
76
|
+
|
77
|
+
```ruby
|
78
|
+
RSpec::GraphQLResponse.add_validator :some_validator do
|
79
|
+
failure_message :wrong_value, ->(value) { "Failed because #{value} is not 'foo'" }
|
80
|
+
|
81
|
+
# ...
|
82
|
+
end
|
83
|
+
```
|
84
|
+
|
85
|
+
The failure messages can be referenced in the validation methods by calling `fail_validation` (see below)
|
86
|
+
|
87
|
+
### Method: `validate(&validation_block)`
|
88
|
+
|
89
|
+
Provide a validation method to determine if the actual value meets expectations. This validation method is most commonly
|
90
|
+
used with the `expect(something).to ...` RSpec matcher syntax.
|
91
|
+
|
92
|
+
The `&validation_block` will receive the actual value to validate as well as any other parameters that may need to be defined.
|
93
|
+
There are no limitations on the number of parameters or their names.
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
RSpec::GraphQLResponse.add_validator :some_validator do
|
97
|
+
# ... failure_messages and other bits
|
98
|
+
|
99
|
+
validate do |actual, some_value|
|
100
|
+
# ... validation logic here
|
101
|
+
|
102
|
+
next fail_validation(:reason) if some_failure_criteria
|
103
|
+
end
|
104
|
+
end
|
105
|
+
```
|
106
|
+
|
107
|
+
### Method: `validate_negated(&validation_block)`
|
108
|
+
|
109
|
+
Provide a negated validation method to determine if the actual value meets expectations. This validation method is
|
110
|
+
most commonly used with the negated expecation syntax, such as `expect(something).to_not ...`.
|
111
|
+
|
112
|
+
The `&validation_block` will receive the actual value to validate as well as any other parameters that may need to be defined.
|
113
|
+
There are no limitations on the number of parameters or their names.
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
RSpec::GraphQLResponse.add_validator :some_validator do
|
117
|
+
# ... failure_messages and other bits
|
118
|
+
|
119
|
+
validate_negated do |actual, some_value|
|
120
|
+
# ... negated validation logic here
|
121
|
+
|
122
|
+
next fail_validation(:reason) unless some_failure_criteria
|
123
|
+
end
|
124
|
+
end
|
125
|
+
```
|
126
|
+
|
127
|
+
Remember that `negated` validation should prove that the specified condition does _not_ exist. For example, when writing
|
128
|
+
an expectation such as `expect(response).to_not have_errors`, the `validate_negated` method needs to verify that there are
|
129
|
+
no errors in the response.
|
130
|
+
|
131
|
+
```ruby
|
132
|
+
validate_negated do |response|
|
133
|
+
errors = response.fetch("errors", [])
|
134
|
+
|
135
|
+
# check for the negation of have_errors, meaning check to
|
136
|
+
# make sure there are no errors
|
137
|
+
next fail_validation(:found_errors) unless errors.count == 0
|
138
|
+
end
|
139
|
+
```
|
140
|
+
|
141
|
+
### Validation Failure
|
142
|
+
|
143
|
+
When the actual value does not reflect any expected value, a failure can be noted by calling `next failure_message(name, [values])`.
|
144
|
+
|
145
|
+
The `name` is a symbol which has been registered using the `failure_message` method (see above). And `[values]` are an optional
|
146
|
+
array of values that will be provided to the failure message if the registered message is a lambda (proc).
|
147
|
+
|
148
|
+
```ruby
|
149
|
+
vadliate do |actual|
|
150
|
+
|
151
|
+
# something went wrong, better fail!
|
152
|
+
next fail_validation(:bad_thing) if actual.bad_value
|
153
|
+
end
|
154
|
+
```
|
155
|
+
|
156
|
+
**IMPORTANT NOTE**
|
157
|
+
|
158
|
+
There can be only _one_ valid reason for failure at a time. Therefore, as soon as a failure condition is met, the `fail_validation`
|
159
|
+
method should be invoked. Then to prevent the rest of the method from executing, the `validate` or `validate_negates` method should
|
160
|
+
be halted immediately. Due to the syntax requirements of ruby lambdas and procs, this is done with the `next` keyword.
|
161
|
+
|
162
|
+
So be sure to call `next failure_message ...` and not just `failure_message`!
|
163
|
+
|
164
|
+
### Validation Success
|
165
|
+
|
166
|
+
If all validation checks pass, the final call in the `validate` or `validate_negated` methods should be `pass_validation`
|
167
|
+
|
168
|
+
```ruby
|
169
|
+
validate do |actual|
|
170
|
+
# ... check for failed conditions
|
171
|
+
|
172
|
+
# everything passed!
|
173
|
+
pass_validation
|
174
|
+
end
|
175
|
+
```
|
176
|
+
|
177
|
+
The `pass_validation` method takes in no parameters, as a valid result does not provide a reason.
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# RSpec::GraphQLResponse Configuration
|
2
|
+
|
3
|
+
To get things rolling, add a configuration block to your `spec_helper.rb` (or other file that gets included in specs, as
|
4
|
+
desired). Within this block, you'll need to provide the GraphQL Schema to use for query execution.
|
5
|
+
|
6
|
+
```ruby
|
7
|
+
RSpec::GraphQLResponse.configure |config| do
|
8
|
+
|
9
|
+
config.graphql_schema = MyGraphQLSchema
|
10
|
+
|
11
|
+
end
|
12
|
+
```
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Executing GraphQL with Helper Method `execute_graphql`
|
2
|
+
|
3
|
+
Simplifies execution of a graphql query, using `context` / `describe` level helper
|
4
|
+
methods for configuring the query.
|
5
|
+
|
6
|
+
```ruby
|
7
|
+
RSPec.describe Cool::Stuff, type: :graphql do
|
8
|
+
graphql_query <<-GQL
|
9
|
+
query SomeThing($name: String) {
|
10
|
+
characters(name: $name) {
|
11
|
+
id
|
12
|
+
name
|
13
|
+
}
|
14
|
+
}
|
15
|
+
GQL
|
16
|
+
|
17
|
+
graphql_variables {
|
18
|
+
name: "Jam"
|
19
|
+
}
|
20
|
+
|
21
|
+
grapql_context {
|
22
|
+
current_user: "some user or whatever you need"
|
23
|
+
}
|
24
|
+
|
25
|
+
it "executes and does the thing with the vars and context" do
|
26
|
+
# ... expect things here
|
27
|
+
end
|
28
|
+
end
|
29
|
+
```
|
30
|
+
|
31
|
+
## Available Configuration Methods
|
32
|
+
|
33
|
+
### `graphql_query`
|
34
|
+
|
35
|
+
A string - most commonly a ruby heredoc - for the graphql query to execute
|
36
|
+
|
37
|
+
### `graphql_variables`
|
38
|
+
|
39
|
+
A hash of keys and values that the query expects to use
|
40
|
+
|
41
|
+
### `graphql_context`
|
42
|
+
|
43
|
+
A hash of keys and values that are passed to a query or mutation, as `context`, in that query or mutation's resolver method.
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Custom Spec Type, `type: :grapql`
|
2
|
+
|
3
|
+
To use the custom helpers and matchers provide by RSpec::GraphQLResponse, you need to specificy `type: :graphql` as
|
4
|
+
part of your spec's description.
|
5
|
+
|
6
|
+
```ruby
|
7
|
+
RSpec.describe My::Cool::Thing, type: :graphql do
|
8
|
+
|
9
|
+
# ... all of RSpec::GraphQLResponse is now available!
|
10
|
+
|
11
|
+
end
|
12
|
+
```
|
13
|
+
|
14
|
+
With this `type` set, your specs will have access to all of the `RSpec::GraphQLResponse` features.
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# Validate a response operation with `have_operation(name)`
|
2
|
+
|
3
|
+
Check for the presence of an operation's results. Useful when you want to ensure an operation exists before
|
4
|
+
retrieving the operation's results.
|
5
|
+
|
6
|
+
## Validate an Operation is Present
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
RSpec.describe My::Characters, type: :graphql do
|
10
|
+
graphql_query <<-GQL
|
11
|
+
query CharacterList {
|
12
|
+
characters {
|
13
|
+
id
|
14
|
+
name
|
15
|
+
}
|
16
|
+
}
|
17
|
+
GQL
|
18
|
+
|
19
|
+
it "has the characters" do
|
20
|
+
|
21
|
+
expect(response).to have_operation(:characters)
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
```
|
26
|
+
|
27
|
+
## Validate an operation is NOT Present
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
RSpec.describe My::Characters, type: :graphql do
|
31
|
+
graphql_query <<-GQL
|
32
|
+
query CharacterList {
|
33
|
+
characters {
|
34
|
+
id
|
35
|
+
name
|
36
|
+
}
|
37
|
+
}
|
38
|
+
GQL
|
39
|
+
|
40
|
+
it "does not have books" do
|
41
|
+
|
42
|
+
expect(response).to_not have_operation(:books)
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
```
|
data/docs/response.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Check the GraphQL Response with Helper `response`
|
@@ -1,9 +1,20 @@
|
|
1
1
|
module RSpec
|
2
2
|
module GraphQLResponse
|
3
|
-
def self.
|
3
|
+
def self.add_context_helper(name, &helper)
|
4
|
+
self.add_helper(name, scope: :context, &helper)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.add_helper(name, scope: :spec, &helper)
|
4
8
|
helper_module = Module.new do |mod|
|
5
9
|
mod.define_method(name) do |*args|
|
6
|
-
|
10
|
+
instance_var = "@#{name}".to_sym
|
11
|
+
|
12
|
+
if self.instance_variables.include? instance_var
|
13
|
+
return self.instance_variable_get(instance_var)
|
14
|
+
end
|
15
|
+
|
16
|
+
result = self.instance_exec(*args, &helper)
|
17
|
+
self.instance_variable_set(instance_var, result)
|
7
18
|
end
|
8
19
|
end
|
9
20
|
|
@@ -11,13 +22,27 @@ module RSpec
|
|
11
22
|
config.after(:each) do
|
12
23
|
helper_module.instance_variable_set(:@result, nil)
|
13
24
|
end
|
14
|
-
end
|
15
25
|
|
16
|
-
|
26
|
+
module_method = if scope == :spec
|
27
|
+
:include
|
28
|
+
elsif scope == :context
|
29
|
+
:extend
|
30
|
+
else
|
31
|
+
raise ArgumentError, "A helper method's scope must be either :spec or :describe"
|
32
|
+
end
|
33
|
+
|
34
|
+
config.send(module_method, helper_module, type: :graphql)
|
35
|
+
end
|
17
36
|
end
|
18
37
|
end
|
19
38
|
end
|
20
39
|
|
40
|
+
# describe level helpers
|
41
|
+
require_relative "helpers/graphql_query"
|
42
|
+
require_relative "helpers/graphql_variables"
|
43
|
+
require_relative "helpers/graphql_context"
|
44
|
+
|
45
|
+
# spec level helpers
|
21
46
|
require_relative "helpers/operation"
|
22
47
|
require_relative "helpers/response"
|
23
48
|
require_relative "helpers/execute_graphql"
|
@@ -1,4 +1,12 @@
|
|
1
1
|
RSpec::GraphQLResponse.add_helper :execute_graphql do
|
2
2
|
config = RSpec::GraphQLResponse.configuration
|
3
|
-
|
3
|
+
|
4
|
+
query = get_graphql_query if respond_to? :get_graphql_query
|
5
|
+
query_vars = get_graphql_variables if respond_to? :get_graphql_variables
|
6
|
+
query_context = get_graphql_context if respond_to? :get_graphql_context
|
7
|
+
|
8
|
+
config.graphql_schema.execute(query, {
|
9
|
+
variables: query_vars,
|
10
|
+
context: query_context
|
11
|
+
})
|
4
12
|
end
|
@@ -11,7 +11,7 @@ RSpec::GraphQLResponse.add_matcher :have_errors do |count = nil|
|
|
11
11
|
@result.valid?
|
12
12
|
end
|
13
13
|
|
14
|
-
failure_message do |
|
14
|
+
failure_message do |_|
|
15
15
|
@result.reason
|
16
16
|
end
|
17
17
|
|
@@ -27,7 +27,7 @@ RSpec::GraphQLResponse.add_matcher :have_errors do |count = nil|
|
|
27
27
|
@result.valid?
|
28
28
|
end
|
29
29
|
|
30
|
-
failure_message_when_negated do |
|
30
|
+
failure_message_when_negated do |_|
|
31
31
|
@result.reason
|
32
32
|
end
|
33
33
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
RSpec::GraphQLResponse.add_matcher :have_operation do |operation_name|
|
2
|
+
match do |response|
|
3
|
+
validator = RSpec::GraphQLResponse.validator(:have_operation)
|
4
|
+
|
5
|
+
@result = validator.validate(response, operation_name: operation_name)
|
6
|
+
@result.valid?
|
7
|
+
end
|
8
|
+
|
9
|
+
failure_message do |_|
|
10
|
+
@result.reason
|
11
|
+
end
|
12
|
+
|
13
|
+
match_when_negated do |response|
|
14
|
+
validator = RSpec::GraphQLResponse.validator(:have_operation)
|
15
|
+
|
16
|
+
@result = validator.validate_negated(response, operation_name: operation_name)
|
17
|
+
@result.valid?
|
18
|
+
end
|
19
|
+
|
20
|
+
failure_message_when_negated do |_|
|
21
|
+
@result.reason
|
22
|
+
end
|
23
|
+
end
|
@@ -11,6 +11,11 @@ module RSpec
|
|
11
11
|
@validators[name] = validator_class
|
12
12
|
end
|
13
13
|
|
14
|
+
def self.remove_validator(name)
|
15
|
+
@validators ||= {}
|
16
|
+
@validators.delete(:key)
|
17
|
+
end
|
18
|
+
|
14
19
|
def self.validator(name)
|
15
20
|
@validators[name].new
|
16
21
|
end
|
@@ -18,3 +23,4 @@ module RSpec
|
|
18
23
|
end
|
19
24
|
|
20
25
|
require_relative "validators/have_errors"
|
26
|
+
require_relative "validators/have_operation"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
RSpec::GraphQLResponse.add_validator :have_operation do
|
2
|
+
failure_message :nil, "Cannot evaluate operations on nil"
|
3
|
+
failure_message :not_found, ->(expected, actual) { "Expected to find operation result named #{expected}, but did not find it\n\t#{actual}" }
|
4
|
+
|
5
|
+
validate do |response, operation_name:|
|
6
|
+
next fail_validation(:nil) unless response.is_a? Hash
|
7
|
+
|
8
|
+
op = response.dig("data", operation_name.to_s)
|
9
|
+
next fail_validation(:not_found, operation_name, response) if op.nil?
|
10
|
+
|
11
|
+
pass_validation
|
12
|
+
end
|
13
|
+
|
14
|
+
failure_message :found, ->(expected, actual) { "Expected not to find operation result named #{expected}, but found it\n\t#{actual}" }
|
15
|
+
|
16
|
+
validate_negated do |response, operation_name:|
|
17
|
+
next fail_validation(:nil) unless response.is_a? Hash
|
18
|
+
|
19
|
+
op = response.dig("data", operation_name.to_s)
|
20
|
+
next fail_validation(:found, operation_name, response) unless op.nil?
|
21
|
+
|
22
|
+
pass_validation
|
23
|
+
end
|
24
|
+
end
|
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
|
+
version: 0.2.0
|
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-02
|
11
|
+
date: 2021-03-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -102,34 +102,48 @@ executables: []
|
|
102
102
|
extensions: []
|
103
103
|
extra_rdoc_files: []
|
104
104
|
files:
|
105
|
+
- ".github/workflows/test.yml"
|
105
106
|
- ".gitignore"
|
107
|
+
- ".gituprc"
|
106
108
|
- ".pryrc"
|
107
109
|
- ".rspec"
|
108
110
|
- ".ruby-version"
|
109
|
-
- ".travis.yml"
|
110
111
|
- CODE_OF_CONDUCT.md
|
111
112
|
- Gemfile
|
112
113
|
- Gemfile.lock
|
113
114
|
- LICENSE.txt
|
114
115
|
- README.md
|
116
|
+
- RELEASE_NOTES.md
|
115
117
|
- Rakefile
|
118
|
+
- UPGRADE.md
|
116
119
|
- bin/console
|
117
120
|
- bin/rspec
|
118
121
|
- bin/setup
|
122
|
+
- docs/add_helper.md
|
119
123
|
- docs/add_matcher.md
|
120
124
|
- docs/add_validator.md
|
125
|
+
- docs/configuration.md
|
126
|
+
- docs/execute_graphql.md
|
127
|
+
- docs/graphql_spec_type.md
|
121
128
|
- docs/have_errors.md
|
129
|
+
- docs/have_operation.md
|
122
130
|
- docs/operation.md
|
131
|
+
- docs/response.md
|
123
132
|
- lib/rspec/graphql_response.rb
|
124
133
|
- lib/rspec/graphql_response/configuration.rb
|
125
134
|
- lib/rspec/graphql_response/helpers.rb
|
126
135
|
- lib/rspec/graphql_response/helpers/execute_graphql.rb
|
136
|
+
- lib/rspec/graphql_response/helpers/graphql_context.rb
|
137
|
+
- lib/rspec/graphql_response/helpers/graphql_query.rb
|
138
|
+
- lib/rspec/graphql_response/helpers/graphql_variables.rb
|
127
139
|
- lib/rspec/graphql_response/helpers/operation.rb
|
128
140
|
- lib/rspec/graphql_response/helpers/response.rb
|
129
141
|
- lib/rspec/graphql_response/matchers.rb
|
130
142
|
- lib/rspec/graphql_response/matchers/have_errors.rb
|
143
|
+
- lib/rspec/graphql_response/matchers/have_operation.rb
|
131
144
|
- lib/rspec/graphql_response/validators.rb
|
132
145
|
- lib/rspec/graphql_response/validators/have_errors.rb
|
146
|
+
- lib/rspec/graphql_response/validators/have_operation.rb
|
133
147
|
- lib/rspec/graphql_response/validators/validation_base.rb
|
134
148
|
- lib/rspec/graphql_response/validators/validation_result.rb
|
135
149
|
- lib/rspec/graphql_response/validators/validation_runner.rb
|