Skip to content

Commit 52bf27b

Browse files
authored
Merge pull request #6 from nomtek/feature/array-simple-types-support
Add support for array of simple values.
2 parents 722579d + 1d1d2aa commit 52bf27b

6 files changed

Lines changed: 74 additions & 15 deletions

File tree

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ gemspec
99
gem "activesupport", "~> 6.1", ">= 6.1.4.1"
1010
gem "rake", "~> 13.0", ">= 13.0.6"
1111
gem "rspec-rails", "~> 5.0", ">= 5.0.2"
12+
gem "rubocop"

Gemfile.lock

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
PATH
22
remote: .
33
specs:
4-
rspec-json_api (1.1.1)
4+
rspec-json_api (1.2.1)
55
activesupport (>= 6.1.4.1)
66
rails (>= 6.1.4.1)
77
rspec-rails (>= 5.0.2)
@@ -68,6 +68,8 @@ GEM
6868
minitest (>= 5.1)
6969
tzinfo (~> 2.0)
7070
zeitwerk (~> 2.3)
71+
ast (2.4.2)
72+
base64 (0.1.1)
7173
builder (3.2.4)
7274
concurrent-ruby (1.1.9)
7375
crass (1.0.6)
@@ -78,6 +80,8 @@ GEM
7880
activesupport (>= 6.1)
7981
i18n (1.9.1)
8082
concurrent-ruby (~> 1.0)
83+
json (2.6.3)
84+
language_server-protocol (3.17.0.3)
8185
loofah (2.13.0)
8286
crass (~> 1.0.2)
8387
nokogiri (>= 1.5.9)
@@ -104,6 +108,10 @@ GEM
104108
nokogiri (1.13.1)
105109
mini_portile2 (~> 2.7.0)
106110
racc (~> 1.4)
111+
parallel (1.23.0)
112+
parser (3.2.2.3)
113+
ast (~> 2.4.1)
114+
racc
107115
racc (1.6.0)
108116
rack (2.2.3)
109117
rack-test (1.1.0)
@@ -134,7 +142,10 @@ GEM
134142
method_source
135143
rake (>= 0.13)
136144
thor (~> 1.0)
145+
rainbow (3.1.1)
137146
rake (13.0.6)
147+
regexp_parser (2.8.1)
148+
rexml (3.2.6)
138149
rspec-core (3.10.2)
139150
rspec-support (~> 3.10.0)
140151
rspec-expectations (3.10.2)
@@ -152,6 +163,21 @@ GEM
152163
rspec-mocks (~> 3.10)
153164
rspec-support (~> 3.10)
154165
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)
155181
sprockets (4.1.1)
156182
concurrent-ruby (~> 1.0)
157183
rack (> 1, < 3)
@@ -163,6 +189,7 @@ GEM
163189
timeout (0.4.1)
164190
tzinfo (2.0.4)
165191
concurrent-ruby (~> 1.0)
192+
unicode-display_width (2.4.2)
166193
websocket-driver (0.7.6)
167194
websocket-extensions (>= 0.1.0)
168195
websocket-extensions (0.1.5)
@@ -177,6 +204,7 @@ DEPENDENCIES
177204
rake (~> 13.0, >= 13.0.6)
178205
rspec-json_api!
179206
rspec-rails (~> 5.0, >= 5.0.2)
207+
rubocop
180208

181209
BUNDLED WITH
182210
2.2.19

lib/rspec/json_api/compare_array.rb

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,13 @@ module CompareArray
88
def compare(actual, expected)
99
if interface?(expected)
1010
actual.all? do |actual_elem|
11-
# Compare actual and expected schema
1211
return false unless actual_elem.deep_keys == expected[0].deep_keys
1312

1413
CompareHash.compare(actual_elem, expected[0])
1514
end
1615
else
1716
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)
2218
end
2319
end
2420
end
@@ -28,6 +24,16 @@ def compare(actual, expected)
2824
def interface?(expected_value)
2925
expected_value.size == 1 && expected_value[0].is_a?(Hash)
3026
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
3137
end
3238
end
3339
end

lib/rspec/json_api/compare_hash.rb

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,16 @@ def compare(actual, expected)
1515
compare_key_paths_and_values(keys, actual, expected)
1616
end
1717

18-
private
19-
2018
def compare_key_paths_and_values(keys, actual, expected)
2119
keys.all? do |key_path|
2220
actual_value = actual.dig(*key_path)
2321
expected_value = expected.dig(*key_path)
2422

25-
compare_hash_values(actual_value, expected_value)
23+
compare_values(actual_value, expected_value)
2624
end
2725
end
2826

29-
def compare_hash_values(actual_value, expected_value)
27+
def compare_values(actual_value, expected_value)
3028
case expected_value
3129
when Class
3230
compare_class(actual_value, expected_value)
@@ -37,7 +35,7 @@ def compare_hash_values(actual_value, expected_value)
3735
when Array
3836
compare_array(actual_value, expected_value)
3937
else
40-
compare_value(actual_value, expected_value)
38+
compare_simple_value(actual_value, expected_value)
4139
end
4240
end
4341

@@ -63,7 +61,7 @@ def compare_proc(actual_value, expected_value)
6361
when :type
6462
compare_class(actual_value, condition_value)
6563
when :value
66-
compare_value(actual_value, condition_value)
64+
compare_simple_value(actual_value, condition_value)
6765
when :inclusion
6866
condition_value.include?(actual_value)
6967
when :min
@@ -95,12 +93,12 @@ def compare_array(actual_value, expected_value)
9593
return false if actual_value&.size != expected_value&.size
9694

9795
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)
9997
end
10098
end
10199
end
102100

103-
def compare_value(actual_value, expected_value)
101+
def compare_simple_value(actual_value, expected_value)
104102
actual_value == expected_value
105103
end
106104

lib/rspec/json_api/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
module RSpec
44
module JsonApi
5-
VERSION = "1.2.0"
5+
VERSION = "1.2.1"
66
end
77
end

spec/rspec/json_api/matchers/match_json_schema_spec.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -987,4 +987,30 @@
987987
end
988988
end
989989
end
990+
991+
context "when JSON schema is array of primitive types" do
992+
context "when correct match" do
993+
let(:actual) do
994+
["string", 1].to_json
995+
end
996+
997+
let(:expected) do
998+
["string", 1]
999+
end
1000+
1001+
include_examples "correct-match"
1002+
end
1003+
1004+
context "when incorrect match" do
1005+
let(:actual) do
1006+
["string", 1].to_json
1007+
end
1008+
1009+
let(:expected) do
1010+
["string2", 1]
1011+
end
1012+
1013+
include_examples "incorrect-match"
1014+
end
1015+
end
9901016
end

0 commit comments

Comments
 (0)