json_expressions 0.7.2 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +11 -0
- data/README.md +43 -19
- data/lib/json_expressions.rb +0 -4
- data/lib/json_expressions/minitest.rb +15 -4
- data/lib/json_expressions/minitest/assertions.rb +35 -0
- data/lib/json_expressions/rspec.rb +10 -0
- data/lib/json_expressions/test/unit/helpers.rb +31 -0
- data/lib/json_expressions/testunit.rb +12 -0
- metadata +5 -3
- data/lib/json_expressions/minitest/unit/helpers.rb +0 -39
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
### v0.8.0 [view commit logs](https://github.com/chancancode/json_expressions/compare/0.7.3...0.8.0)
|
2
|
+
|
3
|
+
* Added Test::Unit support.
|
4
|
+
* Added MiniTest::Spec support.
|
5
|
+
* BREAKING: Changed internal structure of MiniTest support code. This shouldn't affect you unless you have been manually requiring and including the MiniTest helpers yourself.
|
6
|
+
* Use of `WILDCARD_MATCHER` (the constant) inside a `MiniTest::Unit::TestCase` is now discouraged. Instead, you are encouraged to use `wildcard_matcher` (the method) instead. README has been updated.
|
7
|
+
|
8
|
+
### v0.7.3 [view commit logs](https://github.com/chancancode/json_expressions/compare/0.7.2...0.7.3)
|
9
|
+
|
10
|
+
* Removed WILDCARD_MATCHER#match and the corresponding test. Since support for Object#match has been removed in v0.7.0, this should no longer be necessary.
|
11
|
+
|
1
12
|
### v0.7.2 [view commit logs](https://github.com/chancancode/json_expressions/compare/0.7.1...0.7.2)
|
2
13
|
|
3
14
|
* Bugfix: Corrected a misbehaving require statement in minitest helpers (Fixes #2)
|
data/README.md
CHANGED
@@ -89,8 +89,8 @@ class UsersControllerTest < MiniTest::Unit::TestCase
|
|
89
89
|
type: 'Administrator',
|
90
90
|
points: Fixnum, # Any integer value
|
91
91
|
homepage: /\Ahttps?\:\/\/.*\z/i, # Let's get serious
|
92
|
-
created_at:
|
93
|
-
updated_at:
|
92
|
+
created_at: wildcard_matcher, # Don't care as long as it exists
|
93
|
+
updated_at: wildcard_matcher,
|
94
94
|
posts: [
|
95
95
|
{
|
96
96
|
id: Fixnum,
|
@@ -119,21 +119,28 @@ class UsersControllerTest < MiniTest::Unit::TestCase
|
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
122
|
-
#
|
122
|
+
# MiniTest::Spec example
|
123
123
|
describe UsersController, "#show" do
|
124
124
|
it "returns a user" do
|
125
125
|
pattern = # See above...
|
126
126
|
|
127
127
|
server_response = get '/users/chancancode.json'
|
128
128
|
|
129
|
-
server_response.body.
|
129
|
+
server_response.body.must_match_json_expression(pattern)
|
130
130
|
end
|
131
131
|
end
|
132
|
-
```
|
133
132
|
|
134
|
-
|
133
|
+
# RSpec example
|
134
|
+
describe UsersController, "#show" do
|
135
|
+
it "returns a user" do
|
136
|
+
pattern = # See above...
|
135
137
|
|
138
|
+
server_response = get '/users/chancancode.json'
|
136
139
|
|
140
|
+
server_response.body.should match_json_expression(pattern)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
```
|
137
144
|
|
138
145
|
### Basic Matching
|
139
146
|
|
@@ -164,11 +171,11 @@ matches the JSON object
|
|
164
171
|
|
165
172
|
### Wildcard Matching
|
166
173
|
|
167
|
-
You can use
|
174
|
+
You can use `wildcard_matcher` to ignore keys that you don't care about (other than the fact that they exist).
|
168
175
|
|
169
176
|
This pattern
|
170
177
|
```ruby
|
171
|
-
[
|
178
|
+
[ wildcard_matcher, wildcard_matcher, wildcard_matcher, wildcard_matcher, wildcard_matcher, wildcard_matcher, wildcard_matcher ]
|
172
179
|
```
|
173
180
|
matches the JSON array
|
174
181
|
```json
|
@@ -177,12 +184,14 @@ matches the JSON array
|
|
177
184
|
|
178
185
|
Furthermore, because the pattern is just plain old Ruby code, you can also write:
|
179
186
|
```ruby
|
180
|
-
[
|
187
|
+
[ wildcard_matcher ] * 7
|
181
188
|
```
|
182
189
|
|
190
|
+
Note: Previously, the examples here uses `WILDCARD_MATCHER` which is a constant defined on `MiniTest::Unit::TestCase`. Since 0.8.0, the use of this constant is discouraged because it doesn't work for `MiniTest::Spec` and `RSpec` due to how Ruby scoping works for blocks. Instead, `wildcard_matcher` (a method) has been added. This is now the preferred way to retrieve the wildcard matcher in order to maintain consistency among the different test frameworks.
|
191
|
+
|
183
192
|
### Object Equality
|
184
193
|
|
185
|
-
By default, json_expressions uses `Object#===` to match against the corresponding value in the target JSON. In most cases, this method behaves exactly the same as `Object#==`. However, certain classes override this method to provide specialized behavior (notably `Regexp` and `
|
194
|
+
By default, json_expressions uses `Object#===` to match against the corresponding value in the target JSON. In most cases, this method behaves exactly the same as `Object#==`. However, certain classes override this method to provide specialized behavior (notably `Regexp`, `Module` and `Range`, see below). If you find this undesirable for certain classes, you can explicitly opt them out and json_expressions will call `Object#==` instead:
|
186
195
|
|
187
196
|
```ruby
|
188
197
|
# This is the default setting
|
@@ -237,6 +246,21 @@ matches the JSON object
|
|
237
246
|
}
|
238
247
|
```
|
239
248
|
|
249
|
+
### Ranges
|
250
|
+
|
251
|
+
`Range` overrides `===` to mean `include?`. Therefore,
|
252
|
+
```ruby
|
253
|
+
{ day: (1..31), month: (1..12) }
|
254
|
+
```
|
255
|
+
matches the JSON object
|
256
|
+
```json
|
257
|
+
{ "day": 3, "month": 11 }
|
258
|
+
```
|
259
|
+
but not
|
260
|
+
```json
|
261
|
+
{ "day": -1, "month": 13 }
|
262
|
+
```
|
263
|
+
|
240
264
|
### Capturing
|
241
265
|
|
242
266
|
Similar to how "captures" work in Regexp, you can capture the value of certain keys for later use:
|
@@ -301,10 +325,10 @@ will match
|
|
301
325
|
You can change this behavior in a case-by-case manner:
|
302
326
|
```ruby
|
303
327
|
{
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
328
|
+
unordered_array: [1,2,3,4,5].unordered!, # calling unordered! is optional as it's the default
|
329
|
+
ordered_array: [1,2,3,4,5].ordered!,
|
330
|
+
unordered_hash: {a: 1, b: 2}.unordered!,
|
331
|
+
ordered_hash: {a: 1, b: 2}.ordered!
|
308
332
|
}
|
309
333
|
```
|
310
334
|
|
@@ -339,8 +363,8 @@ You can change this behavior in a case-by-case manner:
|
|
339
363
|
{
|
340
364
|
strict_array: [1,2,3,4,5].strict!, # calling strict! is optional as it's the default
|
341
365
|
forgiving_array: [1,2,3,4,5].forgiving!,
|
342
|
-
strict_hash: {
|
343
|
-
forgiving_hash: {
|
366
|
+
strict_hash: {a: 1, b: 2}.strict!,
|
367
|
+
forgiving_hash: {a: 1, b: 2}.forgiving!
|
344
368
|
}
|
345
369
|
```
|
346
370
|
|
@@ -349,8 +373,8 @@ They also come with some more sensible aliases:
|
|
349
373
|
{
|
350
374
|
strict_array: [1,2,3,4,5].reject_extra_values!,
|
351
375
|
forgiving_array: [1,2,3,4,5].ignore_extra_values!,
|
352
|
-
strict_hash: {
|
353
|
-
forgiving_hash: {
|
376
|
+
strict_hash: {a: 1, b: 2}.reject_extra_keys!,
|
377
|
+
forgiving_hash: {a: 1, b: 2}.ignore_extra_keys!
|
354
378
|
}
|
355
379
|
```
|
356
380
|
|
@@ -363,7 +387,7 @@ JsonExpressions::Matcher.assume_strict_hashes = false
|
|
363
387
|
|
364
388
|
## Support for `MiniTest::Spec` (and other testing frameworks)
|
365
389
|
|
366
|
-
The `Matcher` class itself is written in a testing-framework-agnostic manner. This allows you to easily write custom helpers/matchers for your favorite testing framework. `MiniTest::Spec` is on my TODO list, but it is not a high priority for me personally, as I
|
390
|
+
The `Matcher` class itself is written in a testing-framework-agnostic manner. This allows you to easily write custom helpers/matchers for your favorite testing framework. `MiniTest::Spec` is on my TODO list, but it is not a high priority for me personally, as I don't use it myself. If you need this now, write it yourself and submit a pull request - it's really easy, I promise (see `lib/json_expressions/minitest/unit/helpers.rb` for inspiration).
|
367
391
|
|
368
392
|
## Contributing
|
369
393
|
|
data/lib/json_expressions.rb
CHANGED
@@ -1,8 +1,19 @@
|
|
1
1
|
require 'minitest/unit'
|
2
|
+
require 'minitest/spec'
|
2
3
|
require 'json_expressions'
|
3
|
-
require 'json_expressions/minitest/
|
4
|
+
require 'json_expressions/minitest/assertions'
|
5
|
+
|
6
|
+
# module MiniTest::Assertions
|
7
|
+
# include JsonExpressions::MiniTest::Assertions
|
8
|
+
# end
|
4
9
|
|
5
10
|
class MiniTest::Unit::TestCase
|
6
|
-
|
7
|
-
|
8
|
-
|
11
|
+
WILDCARD_MATCHER = JsonExpressions::WILDCARD_MATCHER
|
12
|
+
|
13
|
+
def wildcard_matcher
|
14
|
+
::JsonExpressions::WILDCARD_MATCHER
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Object.infect_an_assertion :assert_json_match, :must_match_json_expression
|
19
|
+
Object.infect_an_assertion :refute_json_match, :wont_match_json_expression
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module MiniTest
|
4
|
+
module Assertions
|
5
|
+
def assert_json_match(exp, act, msg = nil)
|
6
|
+
unless JsonExpressions::Matcher === exp
|
7
|
+
exp = JsonExpressions::Matcher.new(exp)
|
8
|
+
end
|
9
|
+
|
10
|
+
if String === act
|
11
|
+
assert act = JSON.parse(act), "Expected #{mu_pp(act)} to be valid JSON"
|
12
|
+
end
|
13
|
+
|
14
|
+
assert exp =~ act, ->{ "Expected #{mu_pp(exp)} to match #{mu_pp(act)}\n" + exp.last_error}
|
15
|
+
|
16
|
+
# Return the matcher
|
17
|
+
return exp
|
18
|
+
end
|
19
|
+
|
20
|
+
def refute_json_match(exp, act, msg = nil)
|
21
|
+
unless JsonExpressions::Matcher === exp
|
22
|
+
exp = JsonExpressions::Matcher.new(exp)
|
23
|
+
end
|
24
|
+
|
25
|
+
if String === act
|
26
|
+
assert act = JSON.parse(act), "Expected #{mu_pp(act)} to be valid JSON"
|
27
|
+
end
|
28
|
+
|
29
|
+
refute exp =~ act, "Expected #{mu_pp(exp)} to not match #{mu_pp(act)}"
|
30
|
+
|
31
|
+
# Return the matcher
|
32
|
+
return exp
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -4,4 +4,14 @@ require 'json_expressions/rspec/matchers'
|
|
4
4
|
|
5
5
|
RSpec::configure do |config|
|
6
6
|
config.include(JsonExpressions::RSpec::Matchers)
|
7
|
+
end
|
8
|
+
|
9
|
+
module RSpec
|
10
|
+
module Core
|
11
|
+
class ExampleGroup
|
12
|
+
def wildcard_matcher
|
13
|
+
::JsonExpressions::WILDCARD_MATCHER
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
7
17
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'pp'
|
3
|
+
|
4
|
+
module JsonExpressions
|
5
|
+
module Test
|
6
|
+
module Unit
|
7
|
+
module Helpers
|
8
|
+
def assert_json_match(exp, act, msg = nil)
|
9
|
+
unless JsonExpressions::Matcher === exp
|
10
|
+
exp = JsonExpressions::Matcher.new(exp)
|
11
|
+
end
|
12
|
+
|
13
|
+
if String === act
|
14
|
+
begin
|
15
|
+
act = JSON.parse(act)
|
16
|
+
rescue
|
17
|
+
assert false, "Expected #{pp(act)} to be valid JSON"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
unless exp =~ act
|
22
|
+
assert false, "Expected #{pp(exp)} to match #{pp(act)}\n #{exp.last_error}"
|
23
|
+
end
|
24
|
+
|
25
|
+
# Return the matcher
|
26
|
+
return exp
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'json_expressions'
|
3
|
+
require 'json_expressions/test/unit/helpers'
|
4
|
+
|
5
|
+
class Test::Unit::TestCase
|
6
|
+
include JsonExpressions::Test::Unit::Helpers
|
7
|
+
WILDCARD_MATCHER = JsonExpressions::WILDCARD_MATCHER
|
8
|
+
|
9
|
+
def wildcard_matcher
|
10
|
+
::JsonExpressions::WILDCARD_MATCHER
|
11
|
+
end
|
12
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json_expressions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07
|
12
|
+
date: 2012-08-07 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: JSON matchmaking for all your API testing needs.
|
15
15
|
email:
|
@@ -20,11 +20,13 @@ extra_rdoc_files: []
|
|
20
20
|
files:
|
21
21
|
- lib/json_expressions/core_extensions.rb
|
22
22
|
- lib/json_expressions/matcher.rb
|
23
|
-
- lib/json_expressions/minitest/
|
23
|
+
- lib/json_expressions/minitest/assertions.rb
|
24
24
|
- lib/json_expressions/minitest.rb
|
25
25
|
- lib/json_expressions/rspec/matchers/match_json_expression.rb
|
26
26
|
- lib/json_expressions/rspec/matchers.rb
|
27
27
|
- lib/json_expressions/rspec.rb
|
28
|
+
- lib/json_expressions/test/unit/helpers.rb
|
29
|
+
- lib/json_expressions/testunit.rb
|
28
30
|
- lib/json_expressions.rb
|
29
31
|
- README.md
|
30
32
|
- CHANGELOG.md
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
|
-
module JsonExpressions
|
4
|
-
module MiniTest
|
5
|
-
module Unit
|
6
|
-
module Helpers
|
7
|
-
def assert_json_match(exp, act, msg = nil)
|
8
|
-
unless JsonExpressions::Matcher === exp
|
9
|
-
exp = JsonExpressions::Matcher.new(exp)
|
10
|
-
end
|
11
|
-
|
12
|
-
if String === act
|
13
|
-
assert act = JSON.parse(act), "Expected #{mu_pp(act)} to be valid JSON"
|
14
|
-
end
|
15
|
-
|
16
|
-
assert exp =~ act, ->{ "Expected #{mu_pp(exp)} to match #{mu_pp(act)}\n" + exp.last_error}
|
17
|
-
|
18
|
-
# Return the matcher
|
19
|
-
return exp
|
20
|
-
end
|
21
|
-
|
22
|
-
def refute_json_match(exp, act, msg = nil)
|
23
|
-
unless JsonExpressions::Matcher === exp
|
24
|
-
exp = JsonExpressions::Matcher.new(exp)
|
25
|
-
end
|
26
|
-
|
27
|
-
if String === act
|
28
|
-
assert act = JSON.parse(act), "Expected #{mu_pp(act)} to be valid JSON"
|
29
|
-
end
|
30
|
-
|
31
|
-
refute exp =~ act, "Expected #{mu_pp(exp)} to not match #{mu_pp(act)}"
|
32
|
-
|
33
|
-
# Return the matcher
|
34
|
-
return exp
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|