json-matchers 0.2.2 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3eb4da42712b9d05834e8600bbae9834c1f306ae
4
- data.tar.gz: 247f1f80aad4fe545c6437c6b08a69dbd47a176b
3
+ metadata.gz: b2bc10af4131d3f0ed42c314a9a9647547051e6f
4
+ data.tar.gz: bd823542ce64cab597d9f9689a7b49bce21494e8
5
5
  SHA512:
6
- metadata.gz: 1986b67043756ddbae800c9e6f6b593461bd8a32000cc2ac5091eaba72c8f77d0ee46d5d3554c4db7975ff9b8b952864811f0f828a7224d93398edfa599ae0ec
7
- data.tar.gz: a418df00dd43112eceefceff27e35367daba2bba642318a8696c428d124722aeaa2bd45800e323e44e45fdd55297b8e09d57a9f305f0cc5e1e28938e707b0cc1
6
+ metadata.gz: 8ce7b02e972556b4d961a245b4766e537d21b7adef732c4f0cab6aecc990ca01258a062acbb73a6773fc051769f374ead55a474aeb402a4d8311fdc2f52a4a30
7
+ data.tar.gz: e8b8f5c80dfe722447f5bea3cf95c369b23c1eab49439383e5a31a87d2ab27126a5ac1d6b38d685f31883629aa4e558e4d4bce06d3589c384323b419b6ee19ac
@@ -1,4 +1,7 @@
1
+ cache: bundler
2
+ sudo: false
1
3
  language: ruby
4
+ notifications:
5
+ email: false
2
6
  rvm:
3
- - 2.0.0
4
- - jruby-19mode
7
+ - 2.2.0
@@ -1,6 +1,11 @@
1
1
  master
2
2
  ------
3
3
 
4
+ 0.3.0
5
+ -----
6
+
7
+ * Pass options from matcher to `JSON::Validator`
8
+
4
9
  0.2.2
5
10
  -----
6
11
 
@@ -0,0 +1,10 @@
1
+ Contributing to json-matchers:
2
+
3
+ 1. Fork the [official repository](https://github.com/thoughtbot/json-matchers/tree/master).
4
+ 2. Make your changes in a topic branch.
5
+ 3. Send a pull request.
6
+
7
+ Notes:
8
+
9
+ * Contributions without tests won't be accepted.
10
+ * Please don't update the Gem version.
@@ -1,4 +1,5 @@
1
1
  Copyright (c) 2014 Sean Doyle
2
+ Copyright (c) 2015 Sean Doyle and thoughtbot, inc.
2
3
 
3
4
  MIT License
4
5
 
data/README.md CHANGED
@@ -65,6 +65,27 @@ describe "GET /posts" do
65
65
  end
66
66
  ```
67
67
 
68
+ ### Passing options to the validator
69
+
70
+ The matcher accepts options, which it'll pass to the validator:
71
+
72
+ ```ruby
73
+ # spec/requests/posts_spec.rb
74
+
75
+ describe "GET /posts" do
76
+ it "returns Posts" do
77
+ get posts_path, format: :json
78
+
79
+ expect(response.status).to eq 200
80
+ expect(response).to match_response_schema("posts", strict: false)
81
+ end
82
+ end
83
+ ```
84
+
85
+ A list of available options can be found [here][options]
86
+
87
+ [options]: https://github.com/ruby-json-schema/json-schema/blob/2.2.4/lib/json-schema/validator.rb#L160-L162
88
+
68
89
  ### Embedding other Schemas
69
90
 
70
91
  To DRY up your schema definitions, use JSON schema's `$ref`.
@@ -124,8 +145,38 @@ JSON::Matchers.schema_root = "docs/api/schemas"
124
145
 
125
146
  ## Contributing
126
147
 
127
- 1. Fork it ( https://github.com/[my-github-username]/json-matchers/fork )
128
- 2. Create your feature branch (`git checkout -b my-new-feature`)
129
- 3. Commit your changes (`git commit -am 'Add some feature'`)
130
- 4. Push to the branch (`git push origin my-new-feature`)
131
- 5. Create a new Pull Request
148
+ Please see [CONTRIBUTING].
149
+
150
+ `json-matchers` was inspired by [Validating JSON Schemas with an
151
+ RSpec Matcher][blog post] by Laila Winner.
152
+
153
+ `json-matchers` was written and is maintained by Sean Doyle.
154
+
155
+ Many improvements and bugfixes were contributed by the [open source community].
156
+
157
+ [blog post]: https://robots.thoughtbot.com/validating-json-schemas-with-an-rspec-matcher
158
+ [CONTRIBUTING]: https://github.com/thoughtbot/json-matchers/blob/master/CONTRIBUTING.md
159
+ [open source community]: https://github.com/thoughtbot/json-matchers/graphs/contributors
160
+
161
+ ## License
162
+
163
+ json-matchers is Copyright © 2015 Sean Doyle and thoughtbot.
164
+
165
+ It is free software, and may be redistributed under the terms specified in the
166
+ [LICENSE] file.
167
+
168
+ [LICENSE]: LICENSE.txt
169
+
170
+ ## About thoughtbot
171
+
172
+ ![thoughtbot](https://thoughtbot.com/logo.png)
173
+
174
+ `json-matchers` is maintained and funded by thoughtbot, inc.
175
+ The names and logos for thoughtbot are trademarks of thoughtbot, inc.
176
+
177
+ We love open source software!
178
+ See [our other projects][community].
179
+ We are [available for hire][hire].
180
+
181
+ [community]: https://thoughtbot.com/community?utm_source=github
182
+ [hire]: https://thoughtbot.com?utm_source=github
@@ -7,10 +7,10 @@ Gem::Specification.new do |spec|
7
7
  spec.name = "json-matchers"
8
8
  spec.version = JSON::Matchers::VERSION
9
9
  spec.authors = ["Sean Doyle"]
10
- spec.email = ["seandoyle@thoughtbot.com"]
10
+ spec.email = ["sean.p.doyle24@gmail.com"]
11
11
  spec.summary = %q{Validate your Rails JSON API's JSON}
12
12
  spec.description = %q{Validate your Rails JSON API's JSON}
13
- spec.homepage = "https://github.com/seanpdoyle/json-matchers"
13
+ spec.homepage = "https://github.com/thoughtbot/json-matchers"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
@@ -2,11 +2,24 @@ require "json-schema"
2
2
 
3
3
  module JSON
4
4
  module Matchers
5
- Matcher = Struct.new(:schema_path) do
5
+ class Matcher
6
+ def initialize(schema_path, **options)
7
+ @schema_path = schema_path
8
+ @options = options
9
+ end
10
+
6
11
  def matches?(response)
7
12
  @response = response
8
13
 
9
- JSON::Validator.validate!(schema_path.to_s, response.body, strict: true)
14
+ validator_options = {
15
+ strict: true,
16
+ }.merge(options)
17
+
18
+ JSON::Validator.validate!(
19
+ schema_path.to_s,
20
+ response.body,
21
+ validator_options,
22
+ )
10
23
  rescue JSON::Schema::ValidationError => ex
11
24
  @validation_failure_message = ex.message
12
25
  false
@@ -17,6 +30,10 @@ module JSON
17
30
  def validation_failure_message
18
31
  @validation_failure_message.to_s
19
32
  end
33
+
34
+ private
35
+
36
+ attr_reader :schema_path, :options
20
37
  end
21
38
  end
22
39
  end
@@ -3,10 +3,10 @@ module JSON
3
3
  class RSpec < SimpleDelegator
4
4
  attr_reader :schema_name
5
5
 
6
- def initialize(schema_name)
6
+ def initialize(schema_name, **options)
7
7
  @schema_name = schema_name
8
8
 
9
- super(JSON::Matchers::Matcher.new(schema_path))
9
+ super(JSON::Matchers::Matcher.new(schema_path, options))
10
10
  end
11
11
 
12
12
  def failure_message(response)
@@ -55,8 +55,8 @@ module JSON
55
55
  end
56
56
 
57
57
  if RSpec.respond_to?(:configure)
58
- RSpec::Matchers.define :match_response_schema do |schema_name|
59
- matcher = JSON::Matchers::RSpec.new(schema_name)
58
+ RSpec::Matchers.define :match_response_schema do |schema_name, **options|
59
+ matcher = JSON::Matchers::RSpec.new(schema_name, options)
60
60
 
61
61
  match do |response|
62
62
  matcher.matches?(response)
@@ -1,5 +1,5 @@
1
1
  module JSON
2
2
  module Matchers
3
- VERSION = "0.2.2"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -15,34 +15,52 @@ describe JSON::Matchers, "#match_response_schema" do
15
15
 
16
16
  it "fails when the body is missing a required property" do
17
17
  create_schema("foo_schema", {
18
- type: "object",
19
- required: ["foo"],
18
+ "type" => "object",
19
+ "required" => ["foo"],
20
20
  })
21
21
 
22
22
  expect(response_for({})).not_to match_response_schema("foo_schema")
23
23
  end
24
24
 
25
+ it "accepts options for the validator" do
26
+ create_schema("foo_schema", {
27
+ "type" => "object",
28
+ "required" => [
29
+ "id",
30
+ ],
31
+ "properties" => {
32
+ "id" => { "type" => "number" },
33
+ "title" => {"type" => "string"},
34
+ },
35
+ "additionalProperties" => false,
36
+ })
37
+
38
+ expect(response_for({ "id" => 1, "title" => "bar" })).
39
+ to match_response_schema("foo_schema", strict: false)
40
+ end
41
+
25
42
  it "fails when the body contains a property with the wrong type" do
26
43
  create_schema("foo_schema", {
27
- type: "object",
28
- properties: {
29
- foo: { type: "string" }
44
+ "type" => "object",
45
+ "properties" => {
46
+ "foo" => { "type" => "string" },
30
47
  }
31
48
  })
32
49
 
33
- expect(response_for({foo: 1})).not_to match_response_schema("foo_schema")
50
+ expect(response_for("foo" => 1)).
51
+ not_to match_response_schema("foo_schema")
34
52
  end
35
53
 
36
54
  it "contains the body in the failure message" do
37
- create_schema("foo", { type: "array" })
55
+ create_schema("foo", { "type" => "array" })
38
56
 
39
57
  expect {
40
- expect(response_for(bar: 5)).to match_response_schema("foo")
58
+ expect(response_for("bar" => 5)).to match_response_schema("foo")
41
59
  }.to raise_error(/{"bar":5}/)
42
60
  end
43
61
 
44
62
  it "contains the body in the failure message when negated" do
45
- create_schema("foo", { type: "array" })
63
+ create_schema("foo", { "type" => "array" })
46
64
 
47
65
  expect {
48
66
  expect(response_for([])).not_to match_response_schema("foo")
@@ -50,16 +68,16 @@ describe JSON::Matchers, "#match_response_schema" do
50
68
  end
51
69
 
52
70
  it "contains the schema in the failure message" do
53
- schema = { type: "array" }
71
+ schema = { "type" => "array" }
54
72
  create_schema("foo", schema)
55
73
 
56
74
  expect {
57
- expect(response_for(bar: 5)).to match_response_schema("foo")
75
+ expect(response_for("bar" => 5)).to match_response_schema("foo")
58
76
  }.to raise_error(/#{schema.to_json}/)
59
77
  end
60
78
 
61
79
  it "contains the schema in the failure message when negated" do
62
- schema = { type: "array" }
80
+ schema = { "type" => "array" }
63
81
  create_schema("foo", schema)
64
82
 
65
83
  expect {
@@ -69,8 +87,8 @@ describe JSON::Matchers, "#match_response_schema" do
69
87
 
70
88
  it "does not fail when the schema matches" do
71
89
  create_schema("array_schema", {
72
- type: "array",
73
- items: { type: "string" }
90
+ "type" => "array",
91
+ "items" => { "type" => "string" },
74
92
  })
75
93
 
76
94
  expect(response_for(["valid"])).to match_response_schema("array_schema")
@@ -81,16 +99,16 @@ describe JSON::Matchers, "#match_response_schema" do
81
99
  "type" => "object",
82
100
  "required" => ["foo"],
83
101
  "properties" => {
84
- "foo" => { "type" => "string" }
102
+ "foo" => { "type" => "string" },
85
103
  }
86
104
  })
87
105
  create_schema("collection", {
88
106
  "type" => "array",
89
- "items" => { "$ref" => "single.json" }
107
+ "items" => { "$ref" => "single.json" },
90
108
  })
91
109
 
92
- valid_response = response_for([{foo: "is a string"}])
93
- invalid_response = response_for([{foo: 0}])
110
+ valid_response = response_for([{ "foo" => "is a string" }])
111
+ invalid_response = response_for([{ "foo" => 0 }])
94
112
 
95
113
  expect(valid_response).to match_response_schema("collection")
96
114
  expect(invalid_response).not_to match_response_schema("collection")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json-matchers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Doyle
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-19 00:00:00.000000000 Z
11
+ date: 2015-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json-schema
@@ -96,7 +96,7 @@ dependencies:
96
96
  version: '2.0'
97
97
  description: Validate your Rails JSON API's JSON
98
98
  email:
99
- - seandoyle@thoughtbot.com
99
+ - sean.p.doyle24@gmail.com
100
100
  executables: []
101
101
  extensions: []
102
102
  extra_rdoc_files: []
@@ -105,6 +105,7 @@ files:
105
105
  - ".rspec"
106
106
  - ".travis.yml"
107
107
  - CHANGELOG.md
108
+ - CONTRIBUTING.md
108
109
  - Gemfile
109
110
  - LICENSE.txt
110
111
  - NEWS.md
@@ -119,7 +120,7 @@ files:
119
120
  - spec/json/matchers/match_response_schema_spec.rb
120
121
  - spec/spec_helper.rb
121
122
  - spec/support/file_helpers.rb
122
- homepage: https://github.com/seanpdoyle/json-matchers
123
+ homepage: https://github.com/thoughtbot/json-matchers
123
124
  licenses:
124
125
  - MIT
125
126
  metadata: {}
@@ -139,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
140
  version: '0'
140
141
  requirements: []
141
142
  rubyforge_project:
142
- rubygems_version: 2.4.5
143
+ rubygems_version: 2.4.8
143
144
  signing_key:
144
145
  specification_version: 4
145
146
  summary: Validate your Rails JSON API's JSON
@@ -147,3 +148,4 @@ test_files:
147
148
  - spec/json/matchers/match_response_schema_spec.rb
148
149
  - spec/spec_helper.rb
149
150
  - spec/support/file_helpers.rb
151
+ has_rdoc: