json-schema-rspec 0.0.2 → 0.0.3
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/CHANGELOG.md +6 -0
- data/README.md +14 -3
- data/lib/json-schema-rspec/matchers/json_schema_matcher.rb +24 -8
- data/lib/json-schema-rspec/version.rb +1 -1
- data/spec/json-schema-rspec/matchers/json_schema_matcher_spec.rb +51 -1
- data/spec/spec_helper.rb +24 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf7ece58f4187556a3ef1ec8d53ba2154518a57b
|
4
|
+
data.tar.gz: c05ef489dab2371dca40d13c4dba36cc623e2968
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45bafafc48779ae37292c05209f497ce1be413acfac7888d9eb9b9b9918b89ef285a70450bd8de2c5bbc6cb691eba1f6a7a667b934a5a85c1efc2a9e7b633ca5
|
7
|
+
data.tar.gz: 74dcb86009906ac8edc7fdd72248f9c64be523b9d2107285a1a2db89358cca74d0ba601dc63c75f923616a721d612783d1dbebaed5c7ed7fa025c7a73eab9128
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -28,15 +28,26 @@ In your `spec_helper.rb`:
|
|
28
28
|
config.json_schemas[:my_schema] = "path/to/schema.json"
|
29
29
|
#inline
|
30
30
|
config.json_schemas[:inline_schema] = '{"type": "string"}'
|
31
|
-
|
31
|
+
|
32
32
|
You can then write tests such as:
|
33
33
|
|
34
34
|
#passing spec
|
35
35
|
expect('"hello world"').to match_json_schema(:inline_schema)
|
36
|
-
|
36
|
+
|
37
37
|
#failing spec
|
38
38
|
expect('[1, 2, 3]').to match_json_schema(:inline_schema)
|
39
39
|
|
40
|
+
It also works as an argument matcher:
|
41
|
+
|
42
|
+
expect(some_object).to receive(:some_method).with(object_matching_schema(:inline_schema))
|
43
|
+
|
44
|
+
The argument matcher will match anything that the underlying JSON-Schema validator knows how to validate, so if you want to
|
45
|
+
limit your argument to a certain class, you'll need to add a compound matcher for that.
|
46
|
+
|
47
|
+
expect(some_object).to receive(:some_method)
|
48
|
+
.with(an_instance_of(String).and(object_matching_schema(:inline_schema)))
|
49
|
+
|
50
|
+
|
40
51
|
#### Strict schema validation
|
41
52
|
|
42
53
|
If you wish to use strict schema validation you can do so by passing an additional argument to the matcher.
|
@@ -46,7 +57,7 @@ those explicitly defined in your schema
|
|
46
57
|
```
|
47
58
|
expect(response.body).to match_json_schema(:my_schema, strict: true)
|
48
59
|
```
|
49
|
-
|
60
|
+
|
50
61
|
### Schema in a file
|
51
62
|
You can also use rails path utilities such as `Rails.root.join("spec/support/schemas/my_business_object.schema.json").to_s` when defining schema locations. This gem is backed by the [json-schema](http://github.com/hoxworth/json-schema) gem, so whatever that validator accepts for paths should work.
|
52
63
|
|
@@ -15,15 +15,10 @@ module JSON
|
|
15
15
|
|
16
16
|
def matches?(actual)
|
17
17
|
@actual = actual
|
18
|
+
|
18
19
|
schema = schema_for_name(@schema_name)
|
19
20
|
if schema.nil?
|
20
|
-
@errors = [
|
21
|
-
"No schema defined for #{@schema_name}",
|
22
|
-
"Add a line to your RSpec.configure block to define the schema:",
|
23
|
-
" RSpec.configure do |config|",
|
24
|
-
" config.json_schemas[:my_remote_schema] = 'path/to/schema'",
|
25
|
-
" config.json_schemas[:my_inline_schema] = '{\"json\": \"schema\"}'",
|
26
|
-
" end"]
|
21
|
+
@errors = [ "No schema defined for #{@schema_name}. Available schemas are #{RSpec.configuration.json_schemas.keys}." ]
|
27
22
|
return false
|
28
23
|
end
|
29
24
|
@errors = JSON::Validator.fully_validate(schema_for_name(@schema_name), @actual, @validation_opts)
|
@@ -36,6 +31,20 @@ module JSON
|
|
36
31
|
end
|
37
32
|
end
|
38
33
|
|
34
|
+
def inspect
|
35
|
+
if @errors.any?
|
36
|
+
failure_message
|
37
|
+
else
|
38
|
+
super
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
alias_method :to_s, :inspect
|
43
|
+
|
44
|
+
def ===(other)
|
45
|
+
matches?(other)
|
46
|
+
end
|
47
|
+
|
39
48
|
def failure_message
|
40
49
|
@errors.join("\n")
|
41
50
|
end
|
@@ -45,7 +54,12 @@ module JSON
|
|
45
54
|
end
|
46
55
|
|
47
56
|
def description
|
48
|
-
|
57
|
+
if @errors.any?
|
58
|
+
# ignore the preamble in a diff
|
59
|
+
@errors[1..-1].join("\n")
|
60
|
+
else
|
61
|
+
"match JSON schema identified by #{@schema_name}"
|
62
|
+
end
|
49
63
|
end
|
50
64
|
|
51
65
|
def schema_for_name(schema)
|
@@ -56,5 +70,7 @@ module JSON
|
|
56
70
|
def match_json_schema(schema_name, validation_opts = {})
|
57
71
|
MatchJsonSchemaMatcher.new(schema_name, validation_opts)
|
58
72
|
end
|
73
|
+
|
74
|
+
alias_method :object_matching_schema, :match_json_schema
|
59
75
|
end
|
60
76
|
end
|
@@ -18,7 +18,57 @@ describe JSON::SchemaMatchers::MatchJsonSchemaMatcher do
|
|
18
18
|
specify 'assigns a failure message' do
|
19
19
|
matcher = match_json_schema(unconfigured_schema)
|
20
20
|
expect(matcher.matches?(valid_json)).to eq(false)
|
21
|
-
expect(matcher.failure_message)
|
21
|
+
expect(matcher.failure_message)
|
22
|
+
.to match(/^No schema defined for #{unconfigured_schema}/)
|
23
|
+
.and match(/Available schemas are/)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when being used as a argument matcher' do
|
28
|
+
before :each do
|
29
|
+
RSpec.configuration.json_schemas[:inline_schema] = inline_schema
|
30
|
+
end
|
31
|
+
|
32
|
+
let(:dummy) { double }
|
33
|
+
|
34
|
+
# prevent the mock verify from saying we didn't call the method
|
35
|
+
# BECAUSE IT LIES
|
36
|
+
after(:each) { RSpec::Mocks.space.proxy_for(dummy).reset }
|
37
|
+
|
38
|
+
context 'when the argument is a hash' do
|
39
|
+
let(:inline_schema) { '{"type": "object", "properties": { "name" : { "type" : "string" } } }' }
|
40
|
+
let(:valid_hash) { { name: 'bob' } }
|
41
|
+
|
42
|
+
it 'still succeeds' do
|
43
|
+
expect(dummy).to receive(:method_call).with(object_matching_schema(:inline_schema))
|
44
|
+
dummy.method_call(valid_hash)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'can filter with compound matchers' do
|
48
|
+
expect {
|
49
|
+
expect(dummy).to receive(:method_call).with(an_instance_of(String).and(object_matching_schema(:inline_schema)))
|
50
|
+
dummy.method_call(valid_hash)
|
51
|
+
}.to fail_including("unexpected arguments")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'works as an argument matcher' do
|
56
|
+
expect(dummy).to receive(:method_call).with(object_matching_schema(:inline_schema))
|
57
|
+
dummy.method_call(valid_json)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'does something useful as an argument matcher when it does not match' do
|
61
|
+
expect {
|
62
|
+
expect(dummy).to receive(:method_call).with(object_matching_schema(:inline_schema))
|
63
|
+
dummy.method_call(invalid_json)
|
64
|
+
}.to fail_including("The property '#/' of type Hash did not match the following type: string in schema")
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'can be used as a deeply nested matcher' do
|
68
|
+
expect {
|
69
|
+
expect(dummy).to receive(:method_call).with({a: 1, b: 2, c: object_matching_schema(:inline_schema)})
|
70
|
+
dummy.method_call(a:1, b:2, c: invalid_json)
|
71
|
+
}.to fail_including("The property '#/' of type Hash did not match the following type: string in schema")
|
22
72
|
end
|
23
73
|
end
|
24
74
|
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
require 'json-schema-rspec'
|
2
2
|
|
3
|
+
# Copyright (c) 2012 David Chelimsky, Myron Marston
|
4
|
+
# Copyright (c) 2006 David Chelimsky, The RSpec Development Team
|
5
|
+
# Copyright (c) 2005 Steven Baker
|
6
|
+
# Shamelessly stolen from rspec-mocks
|
7
|
+
module RSpec
|
8
|
+
module ExpectationFailMatchers
|
9
|
+
def fail(&block)
|
10
|
+
raise_error(RSpec::Mocks::MockExpectationError, &block)
|
11
|
+
end
|
12
|
+
|
13
|
+
def fail_with(*args, &block)
|
14
|
+
raise_error(RSpec::Mocks::MockExpectationError, *args, &block)
|
15
|
+
end
|
16
|
+
|
17
|
+
def fail_including(*snippets)
|
18
|
+
raise_error(
|
19
|
+
RSpec::Mocks::MockExpectationError,
|
20
|
+
a_string_including(*snippets)
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
3
26
|
Dir[File.expand_path("../../spec/support/**/*.rb",__FILE__)].each { |f| require f }
|
4
27
|
|
5
28
|
RSpec.configure do |config|
|
@@ -11,4 +34,5 @@ RSpec.configure do |config|
|
|
11
34
|
config.filter_run_excluding wip: true
|
12
35
|
|
13
36
|
config.include JSON::SchemaMatchers
|
37
|
+
config.include RSpec::ExpectationFailMatchers
|
14
38
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json-schema-rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sharethrough Engineering
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-09-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -78,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
78
|
version: '0'
|
79
79
|
requirements: []
|
80
80
|
rubyforge_project:
|
81
|
-
rubygems_version: 2.
|
81
|
+
rubygems_version: 2.4.8
|
82
82
|
signing_key:
|
83
83
|
specification_version: 4
|
84
84
|
summary: JSON Schema RSpec matchers
|