rspec-json_api 1.1.1 → 1.2.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: 6f40d1a16f0eff4c046c4598ace80041df867575e52065a1b1dd298ec9cf98d6
4
- data.tar.gz: 8aae365879c35374679dac663a490bdb5018a3646f8b30e64836700220aed5fb
3
+ metadata.gz: 2b58959b3880f31b8098ee0183aee6e254043f7566db77bd242c590ee2f21d72
4
+ data.tar.gz: 33a0cd48bf51713452ed3bbad1c1b576c3c8d1fa3e90a9696ffa8085e6aa7173
5
5
  SHA512:
6
- metadata.gz: 8a5b5fe0e572b4e1424ebd7e32d1d0178046ee111e1c9e69f09fbae69eda8c273fd98498570c6ab7a4b58c12b214d11bfd8eec701e1b4502770826cd2c1cf724
7
- data.tar.gz: 82afdf75029cd84a8ae8bd84335a4ef48e5dab5db0682018a79a2f799991fcc1af8c069fd01abd3905fe4ee468e46d28cbc615e0cf4d5c8e80133e10abd309d7
6
+ metadata.gz: c9931ef0406562f563346e91f413c7ec65872c6397b97a2c4b61e80816cf7c52ca48a1b55dfce43524e65750ae971d9c61a2e70e2e2b82747eb3b570c8bb2425
7
+ data.tar.gz: 822fc1a4ab0431a4f1f75ba4c4f2d3a73378fc4971e4380b13557f0679a757f679ea8167696a1cdaa2a4b0c37ed5f6953d6029fd7186634d8232951ac3b19fc2
data/Gemfile CHANGED
@@ -9,3 +9,4 @@ gemspec
9
9
  gem "activesupport", "~> 6.1", ">= 6.1.4.1"
10
10
  gem "rake", "~> 13.0", ">= 13.0.6"
11
11
  gem "rspec-rails", "~> 5.0", ">= 5.0.2"
12
+ gem "rubocop"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rspec-json_api (1.1.0)
4
+ rspec-json_api (1.2.1)
5
5
  activesupport (>= 6.1.4.1)
6
6
  rails (>= 6.1.4.1)
7
7
  rspec-rails (>= 5.0.2)
@@ -68,6 +68,8 @@ GEM
68
68
  minitest (>= 5.1)
69
69
  tzinfo (~> 2.0)
70
70
  zeitwerk (~> 2.3)
71
+ ast (2.4.2)
72
+ base64 (0.1.1)
71
73
  builder (3.2.4)
72
74
  concurrent-ruby (1.1.9)
73
75
  crass (1.0.6)
@@ -78,6 +80,8 @@ GEM
78
80
  activesupport (>= 6.1)
79
81
  i18n (1.9.1)
80
82
  concurrent-ruby (~> 1.0)
83
+ json (2.6.3)
84
+ language_server-protocol (3.17.0.3)
81
85
  loofah (2.13.0)
82
86
  crass (~> 1.0.2)
83
87
  nokogiri (>= 1.5.9)
@@ -91,19 +95,23 @@ GEM
91
95
  mini_mime (1.1.5)
92
96
  mini_portile2 (2.7.1)
93
97
  minitest (5.15.0)
94
- net-imap (0.4.4)
98
+ net-imap (0.4.9.1)
95
99
  date
96
100
  net-protocol
97
101
  net-pop (0.1.2)
98
102
  net-protocol
99
103
  net-protocol (0.2.2)
100
104
  timeout
101
- net-smtp (0.4.0)
105
+ net-smtp (0.4.0.1)
102
106
  net-protocol
103
- nio4r (2.5.9)
107
+ nio4r (2.7.0)
104
108
  nokogiri (1.13.1)
105
109
  mini_portile2 (~> 2.7.0)
106
110
  racc (~> 1.4)
111
+ parallel (1.23.0)
112
+ parser (3.2.2.3)
113
+ ast (~> 2.4.1)
114
+ racc
107
115
  racc (1.6.0)
108
116
  rack (2.2.3)
109
117
  rack-test (1.1.0)
@@ -134,7 +142,10 @@ GEM
134
142
  method_source
135
143
  rake (>= 0.13)
136
144
  thor (~> 1.0)
145
+ rainbow (3.1.1)
137
146
  rake (13.0.6)
147
+ regexp_parser (2.8.1)
148
+ rexml (3.2.6)
138
149
  rspec-core (3.10.2)
139
150
  rspec-support (~> 3.10.0)
140
151
  rspec-expectations (3.10.2)
@@ -152,6 +163,21 @@ GEM
152
163
  rspec-mocks (~> 3.10)
153
164
  rspec-support (~> 3.10)
154
165
  rspec-support (3.10.3)
166
+ rubocop (1.56.3)
167
+ base64 (~> 0.1.1)
168
+ json (~> 2.3)
169
+ language_server-protocol (>= 3.17.0)
170
+ parallel (~> 1.10)
171
+ parser (>= 3.2.2.3)
172
+ rainbow (>= 2.2.2, < 4.0)
173
+ regexp_parser (>= 1.8, < 3.0)
174
+ rexml (>= 3.2.5, < 4.0)
175
+ rubocop-ast (>= 1.28.1, < 2.0)
176
+ ruby-progressbar (~> 1.7)
177
+ unicode-display_width (>= 2.4.0, < 3.0)
178
+ rubocop-ast (1.29.0)
179
+ parser (>= 3.2.1.0)
180
+ ruby-progressbar (1.13.0)
155
181
  sprockets (4.1.1)
156
182
  concurrent-ruby (~> 1.0)
157
183
  rack (> 1, < 3)
@@ -163,6 +189,7 @@ GEM
163
189
  timeout (0.4.1)
164
190
  tzinfo (2.0.4)
165
191
  concurrent-ruby (~> 1.0)
192
+ unicode-display_width (2.4.2)
166
193
  websocket-driver (0.7.6)
167
194
  websocket-extensions (>= 0.1.0)
168
195
  websocket-extensions (0.1.5)
@@ -177,6 +204,7 @@ DEPENDENCIES
177
204
  rake (~> 13.0, >= 13.0.6)
178
205
  rspec-json_api!
179
206
  rspec-rails (~> 5.0, >= 5.0.2)
207
+ rubocop
180
208
 
181
209
  BUNDLED WITH
182
210
  2.2.19
data/README.md CHANGED
@@ -66,6 +66,14 @@ RSpec.describe UsersController, type: :controller do
66
66
  expect(response.body).to match_json_schema(expected_schema)
67
67
  end
68
68
  end
69
+
70
+ describe '#update' do
71
+ it 'matches API response' do
72
+ put :update, params: { name: 'John', age: 35 }
73
+
74
+ expect(response.body).to have_no_content
75
+ end
76
+ end
69
77
  end
70
78
  ```
71
79
 
@@ -75,6 +83,11 @@ end
75
83
  expect(response.body).to match_json_schema(expected_schema)
76
84
  ```
77
85
 
86
+ - ### have_no_content
87
+ ```
88
+ expect(response.body).to have_no_content
89
+ ```
90
+
78
91
  ## Interfaces
79
92
  The gem introduces interfaces to reuse them during test matches.
80
93
 
@@ -8,17 +8,13 @@ module RSpec
8
8
  def compare(actual, expected)
9
9
  if interface?(expected)
10
10
  actual.all? do |actual_elem|
11
- # Compare actual and expected schema
12
11
  return false unless actual_elem.deep_keys == expected[0].deep_keys
13
12
 
14
13
  CompareHash.compare(actual_elem, expected[0])
15
14
  end
16
15
  else
17
16
  actual.each_with_index.all? do |actual_elem, index|
18
- # Compare actual and expected schema
19
- return false unless actual[index].deep_keys == expected[index].deep_keys
20
-
21
- CompareHash.compare(actual_elem, expected[index])
17
+ compare_primitive_type_element(actual, expected, actual_elem, index)
22
18
  end
23
19
  end
24
20
  end
@@ -28,6 +24,16 @@ module RSpec
28
24
  def interface?(expected_value)
29
25
  expected_value.size == 1 && expected_value[0].is_a?(Hash)
30
26
  end
27
+
28
+ def compare_primitive_type_element(actual, expected, actual_elem, index)
29
+ if actual[index].respond_to?(:deep_keys) && expected[index].respond_to?(:deep_keys)
30
+ return false unless actual[index].deep_keys == expected[index].deep_keys
31
+
32
+ CompareHash.compare(actual_elem, expected[index])
33
+ else
34
+ CompareHash.compare_values(actual[index], expected[index])
35
+ end
36
+ end
31
37
  end
32
38
  end
33
39
  end
@@ -15,18 +15,16 @@ module RSpec
15
15
  compare_key_paths_and_values(keys, actual, expected)
16
16
  end
17
17
 
18
- private
19
-
20
18
  def compare_key_paths_and_values(keys, actual, expected)
21
19
  keys.all? do |key_path|
22
20
  actual_value = actual.dig(*key_path)
23
21
  expected_value = expected.dig(*key_path)
24
22
 
25
- compare_hash_values(actual_value, expected_value)
23
+ compare_values(actual_value, expected_value)
26
24
  end
27
25
  end
28
26
 
29
- def compare_hash_values(actual_value, expected_value)
27
+ def compare_values(actual_value, expected_value)
30
28
  case expected_value
31
29
  when Class
32
30
  compare_class(actual_value, expected_value)
@@ -37,7 +35,7 @@ module RSpec
37
35
  when Array
38
36
  compare_array(actual_value, expected_value)
39
37
  else
40
- compare_value(actual_value, expected_value)
38
+ compare_simple_value(actual_value, expected_value)
41
39
  end
42
40
  end
43
41
 
@@ -63,7 +61,7 @@ module RSpec
63
61
  when :type
64
62
  compare_class(actual_value, condition_value)
65
63
  when :value
66
- compare_value(actual_value, condition_value)
64
+ compare_simple_value(actual_value, condition_value)
67
65
  when :inclusion
68
66
  condition_value.include?(actual_value)
69
67
  when :min
@@ -95,12 +93,12 @@ module RSpec
95
93
  return false if actual_value&.size != expected_value&.size
96
94
 
97
95
  expected_value.each_with_index.all? do |elem, index|
98
- elem.is_a?(Hash) ? compare(actual_value[index], elem) : compare_value(actual_value[index], elem)
96
+ elem.is_a?(Hash) ? compare(actual_value[index], elem) : compare_simple_value(actual_value[index], elem)
99
97
  end
100
98
  end
101
99
  end
102
100
 
103
- def compare_value(actual_value, expected_value)
101
+ def compare_simple_value(actual_value, expected_value)
104
102
  actual_value == expected_value
105
103
  end
106
104
 
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RSpec
4
+ module JsonApi
5
+ module Matchers
6
+ class HaveNoContent
7
+ def matches?(actual)
8
+ actual == ""
9
+ end
10
+
11
+ def failure_message
12
+ self
13
+ end
14
+
15
+ def failure_message_when_negated
16
+ self
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -11,6 +11,7 @@ module RSpec
11
11
  end
12
12
 
13
13
  def matches?(actual)
14
+ # Parse JSON to ruby object
14
15
  actual = JSON.parse(actual, symbolize_names: true)
15
16
 
16
17
  # Compare types
@@ -5,5 +5,9 @@ module RSpec
5
5
  def match_json_schema(expected)
6
6
  RSpec::JsonApi::Matchers::MatchJsonSchema.new(expected)
7
7
  end
8
+
9
+ def have_no_content
10
+ RSpec::JsonApi::Matchers::HaveNoContent.new
11
+ end
8
12
  end
9
13
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RSpec
4
4
  module JsonApi
5
- VERSION = "1.1.1"
5
+ VERSION = "1.2.1"
6
6
  end
7
7
  end
@@ -15,6 +15,7 @@ require "extentions/hash"
15
15
  # Load matchers
16
16
  require "rspec/json_api/matchers"
17
17
  require "rspec/json_api/matchers/match_json_schema"
18
+ require "rspec/json_api/matchers/have_no_content"
18
19
 
19
20
  # Load defined types
20
21
  require "rspec/json_api/types/email"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-json_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michal Gajowiak
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-11-07 00:00:00.000000000 Z
11
+ date: 2024-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -85,6 +85,7 @@ files:
85
85
  - lib/rspec/json_api/compare_hash.rb
86
86
  - lib/rspec/json_api/interfaces/example_interface.rb
87
87
  - lib/rspec/json_api/matchers.rb
88
+ - lib/rspec/json_api/matchers/have_no_content.rb
88
89
  - lib/rspec/json_api/matchers/match_json_schema.rb
89
90
  - lib/rspec/json_api/types/email.rb
90
91
  - lib/rspec/json_api/types/uri.rb