rspec-graphql_matchers 0.2.0 → 0.3.0

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
  SHA1:
3
- metadata.gz: 64ee8b20fc5bbe24c5526a14923eba402e023d52
4
- data.tar.gz: 2203f40b9379eecc78296e0637bb8033e91daa5b
3
+ metadata.gz: eeaf0169ad7a9777dcd7391a7bc3572183d26156
4
+ data.tar.gz: e0f63135573cc773951fb2ffcae9870257cee9f7
5
5
  SHA512:
6
- metadata.gz: 85b11832795d76ca55a19c7fe62c9cc60fa5560781031dfac192ee16779624366da10e15d1178d3e7fda5c6779804ad8aa40749864236f9c4a157697e6e54a4d
7
- data.tar.gz: 4770e6cbeabe74e48b36ed621fbe494ae37195ae5e0cc766a639a13b660173ab44ae5261cda8d9fd45578cfb29531b8a36caed301bea118cc3bfbfbccf89822a
6
+ metadata.gz: 99166b1bad15d1a1b8cf11dfbc5a7f73a52597b34dbc4fc09111761f848974bd664ca95aaf659c9020d0fc22d0a7833fb45f8bbd9a3df07016e1e28b60b3bb1f
7
+ data.tar.gz: 18a35b6bb8e5c8f56ca7a2b3b8f75cf95350a29b805589b665fa38d2514b6e378964a71ed56ba9e8a59327aef622afa7c0393f5a8b8b79bec1afaa6def0ecba7
data/.codeclimate.yml CHANGED
@@ -1,7 +1,5 @@
1
1
  ---
2
2
  engines:
3
- bundler-audit:
4
- enabled: true
5
3
  duplication:
6
4
  enabled: true
7
5
  config:
@@ -16,7 +14,6 @@ engines:
16
14
  enabled: true
17
15
  ratings:
18
16
  paths:
19
- - Gemfile.lock
20
17
  - "**.inc"
21
18
  - "**.js"
22
19
  - "**.jsx"
@@ -25,6 +22,7 @@ ratings:
25
22
  - "**.py"
26
23
  - "**.rb"
27
24
  exclude_paths:
25
+ - Gemfile.lock
28
26
  - spec/
29
27
  - rspec-graphql_matchers.gemspec
30
28
  - bin/
data/CHANGELOG.md ADDED
@@ -0,0 +1,34 @@
1
+ # Changelog
2
+
3
+ ### Breaking changes
4
+
5
+ ### Deprecations
6
+
7
+ ### New features
8
+
9
+ ### Bug fixes
10
+
11
+ ## 0.3.0 (Sep 16, 2016)
12
+
13
+ ### Breaking changes
14
+
15
+ ### Deprecations
16
+
17
+ ### New features
18
+
19
+ - New matcher have_field(field_name).of_type(type) for testing types and their fields
20
+
21
+ ### Bug fixes
22
+
23
+ ## 0.2.0 Initial public release
24
+
25
+ ### Breaking changes
26
+
27
+ ### Deprecations
28
+
29
+ ### New features
30
+
31
+ - New matcher be_of_type for testing fields
32
+ - New matcher accept_arguments for testing fields
33
+
34
+ ### Bug fixes
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Rspec::GraphqlMatchers
2
2
 
3
- Convenient rspec matchers for testing your (GraphQL)[https://github.com/rmosolgo/graphql-ruby] API/Schema.
3
+ Convenient rspec matchers for testing your [graphql-ruby](https://github.com/rmosolgo/graphql-ruby) API/Schema.
4
4
 
5
5
  ## Installation
6
6
 
@@ -10,17 +10,19 @@ gem 'rspec-graphql_matchers'
10
10
 
11
11
  ## Usage
12
12
 
13
- The two matchers currently supported are:
14
- - be_of_type(a_graphql_type_identifier)
15
- - accept_arguments(hash_of_arg_names_and_type_identifiers)
13
+ The matchers currently supported are:
14
+ - `expect(graphql_type).to have_a_field(field_name).that_returns(valid_type)`
15
+ - `expect(graphql_field).to be_of_type(valid_type)`
16
+ - `expect(graphql_field).to accept_arguments(hash_of_arg_names_and_valid_types)`
16
17
 
17
- Where a type identifier is either:
18
- - A GraphQL type object (ex: `types.String`, `!types.Int`, `types[types.Int]`)
18
+ Where a valid type for the expectation is either:
19
+ - A `GraphQL::ObjectType` object (ex: `types.String`, `!types.Int`, `types[types.Int]`, or your own)
19
20
  - A String representation of a type: `"String!"`, `"Int!"`, `"[String]!"`
21
+ (note the exclamation mark at the end, as required by the [GraphQL specs](http://graphql.org/).
20
22
 
21
23
  ## Examples
22
24
 
23
- Given a GraphQL type defined as such
25
+ Given a `GraphQL::ObjectType` defined as
24
26
 
25
27
  ```ruby
26
28
 
@@ -41,17 +43,27 @@ PostType = GraphQL::ObjectType.define do
41
43
  end
42
44
  ```
43
45
 
44
- ### 1) Test the field types with `be_of_type` matcher:
46
+ ### 1) Test your type defines the correct fields:
47
+
48
+ ```ruby
49
+ describe PostType do
50
+ it 'defines a field id of type ID!' do
51
+ expect(subject).to have_field(:id).that_returns(!types.ID)
52
+ end
53
+
54
+ # Fluent alternatives
55
+ it { is_expected.to have_field(:id).of_type("ID!") }
56
+ it { is_expected.to have_a_field(:id).returning("ID!") }
57
+ end
58
+ ```
59
+ ### 2) Test a specific field type with `be_of_type` matcher:
45
60
 
46
61
  ```ruby
47
62
  describe PostType do
48
63
  describe 'id' do
49
64
  subject { PostType.fields['id'] }
50
65
 
51
- # These will match
52
66
  it { is_expected.to be_of_type('ID!') }
53
-
54
- # While 'Float!' will not match
55
67
  it { is_expected.not_to be_of_type('Float!') }
56
68
  end
57
69
 
@@ -74,10 +86,9 @@ type name (`Post`) and not the constant name (`PostType`).
74
86
 
75
87
  Using your type objects directly has the advantage that if you
76
88
  decide to rename the type your specs won't break, as they would had you
77
- hardcoded the type name as a String.
78
-
79
- You can also use the built-in GraphQL scalar types:
89
+ hardcoded it as a String.
80
90
 
91
+ You can also use the built-in [graphql-ruby](https://github.com/rmosolgo/graphql-ruby) scalar types:
81
92
 
82
93
  ```ruby
83
94
  # ensure you have the GraphQL type definer available in your tests
@@ -94,14 +105,10 @@ end
94
105
 
95
106
  Having to define `types` everywhere is quite annoying. If you prefer, you can
96
107
  just `include RSpec::GraphqlMatchers::TypesHelper` once
97
- (for example in your `spec_helper.rb`, but not within a `RSpec.configure` block)
98
- and the `types` shortcut will be available globally (ouch!) for your tests.
99
- Use at your own risk.
100
-
101
- ### 2) Test the arguments accepted by a field with `accept_arguments` matcher:
108
+ (for example in your `spec_helper.rb`)
109
+ and the `types` shortcut will be available within the include context.
102
110
 
103
- Testing arguments use the `accept_arguments` matcher passing a hash where
104
- keys represent the attribute name and values respresent the attribute type.
111
+ ### 3) Test the arguments accepted by a field with `accept_arguments` matcher:
105
112
 
106
113
  ```ruby
107
114
  describe PostType do
@@ -121,13 +128,19 @@ describe PostType do
121
128
  end
122
129
  end
123
130
  ```
124
- The spec will pass only if all attributes/types specified in the hash are
125
- defined on the field. Type specification follows the same rules from
126
- `be_of_type` matcher.
127
131
 
128
- For better fluency, `accept_arguments` is always available in singular form, as
132
+ The spec will only pass if all attributes/types specified in the hash are
133
+ defined on the field.
134
+
135
+ For better fluency, `accept_arguments` is also available in singular form, as
129
136
  `accept_argument`.
130
137
 
138
+ ## TODO
139
+
140
+ - Setup CI and integrate w/codeclimate
141
+ - Setup codeclimate / CI badges
142
+ - New matchers!
143
+
131
144
  ## Contributing
132
145
 
133
146
  - Send Bug reports, suggestions or any general
@@ -0,0 +1,49 @@
1
+ module RSpec
2
+ module GraphqlMatchers
3
+ class HaveAField
4
+ def initialize(field_name)
5
+ @field_name = field_name.to_s
6
+ @field_type = @graph_object = nil
7
+ end
8
+
9
+ def matches?(graph_object)
10
+ @graph_object = graph_object
11
+
12
+ actual_field = @graph_object.fields[@field_name]
13
+ actual_field && types_match?(@field_type, actual_field.type)
14
+ end
15
+
16
+ def that_returns(field_type)
17
+ @field_type = field_type
18
+
19
+ self
20
+ end
21
+ alias returning that_returns
22
+ alias of_type that_returns
23
+
24
+ def failure_message
25
+ "expected #{describe_obj(@graph_object)} to #{description}"
26
+ end
27
+
28
+ def description
29
+ "define field `#{@field_name}`" + of_type_description
30
+ end
31
+
32
+ private
33
+
34
+ def of_type_description
35
+ return '' unless @field_type
36
+
37
+ " of type `#{@field_type}`"
38
+ end
39
+
40
+ def types_match?(expected_type, actual_type)
41
+ !expected_type || expected_type.to_s == actual_type.to_s
42
+ end
43
+
44
+ def describe_obj(field)
45
+ field.respond_to?(:name) && field.name || field.inspect
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,6 +1,7 @@
1
1
  require 'rspec/matchers'
2
2
  require 'rspec/graphql_matchers/be_of_type'
3
3
  require 'rspec/graphql_matchers/accept_arguments'
4
+ require 'rspec/graphql_matchers/have_a_field'
4
5
 
5
6
  module RSpec
6
7
  module Matchers
@@ -11,7 +12,12 @@ module RSpec
11
12
  def accept_arguments(expected_args)
12
13
  RSpec::GraphqlMatchers::AcceptArguments.new(expected_args)
13
14
  end
14
-
15
15
  alias accept_argument accept_arguments
16
+
17
+ # rubocop:disable Style/PredicateName
18
+ def have_a_field(field_name)
19
+ RSpec::GraphqlMatchers::HaveAField.new(field_name)
20
+ end
21
+ alias have_field have_a_field
16
22
  end
17
23
  end
@@ -1,3 +1,5 @@
1
+ require 'graphql'
2
+
1
3
  module RSpec
2
4
  module GraphqlMatchers
3
5
  module TypesHelper
@@ -1,5 +1,5 @@
1
1
  module Rspec
2
2
  module GraphqlMatchers
3
- VERSION = '0.2.0'.freeze
3
+ VERSION = '0.3.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-graphql_matchers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Brandão
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-12 00:00:00.000000000 Z
11
+ date: 2016-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql
@@ -99,6 +99,7 @@ files:
99
99
  - ".rspec"
100
100
  - ".rubocop.yml"
101
101
  - ".travis.yml"
102
+ - CHANGELOG.md
102
103
  - CODE_OF_CONDUCT.md
103
104
  - Gemfile
104
105
  - LICENSE.txt
@@ -109,6 +110,7 @@ files:
109
110
  - lib/rspec/graphql_matchers.rb
110
111
  - lib/rspec/graphql_matchers/accept_arguments.rb
111
112
  - lib/rspec/graphql_matchers/be_of_type.rb
113
+ - lib/rspec/graphql_matchers/have_a_field.rb
112
114
  - lib/rspec/graphql_matchers/matchers.rb
113
115
  - lib/rspec/graphql_matchers/types_helper.rb
114
116
  - lib/rspec/graphql_matchers/version.rb
@@ -133,9 +135,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
135
  version: '0'
134
136
  requirements: []
135
137
  rubyforge_project:
136
- rubygems_version: 2.5.0
138
+ rubygems_version: 2.4.8
137
139
  signing_key:
138
140
  specification_version: 4
139
141
  summary: Collection of rspec matchers to test your graphQL api schema.
140
142
  test_files: []
141
- has_rdoc: