json_matchers 0.7.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  require "json_matchers/rspec"
2
2
 
3
- Dir["./spec/support/*"].each { |file| require file }
3
+ Dir["./spec/support/**/*.rb"].each { |file| require file }
4
4
 
5
5
  RSpec.configure do |config|
6
6
  config.expect_with :rspec do |expectations|
@@ -0,0 +1,9 @@
1
+ require "factory_bot"
2
+
3
+ RSpec.configure do |config|
4
+ config.include FactoryBot::Syntax::Methods
5
+
6
+ config.before(:suite) do
7
+ FactoryBot.find_definitions
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ FakeResponse = Struct.new(:body) do
2
+ def to_h
3
+ JSON.parse(body)
4
+ end
5
+
6
+ def to_json
7
+ body
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ FakeSchema = Struct.new(:name, :json) do
2
+ def to_h
3
+ json
4
+ end
5
+
6
+ def to_s
7
+ name
8
+ end
9
+ end
@@ -1,32 +1,6 @@
1
1
  require "fileutils"
2
- require "json"
3
2
 
4
3
  module FileHelpers
5
- FakeResponse = Struct.new(:body)
6
-
7
- def create_schema(name, json)
8
- path = File.join(JsonMatchers.schema_root, "#{name}.json")
9
-
10
- File.open(path, "w") do |file|
11
- case json
12
- when NilClass, String
13
- file.write(json.to_s)
14
- else
15
- file.write(JSON.generate(json))
16
- end
17
- end
18
- end
19
-
20
- def response_for(json)
21
- response_body = case json
22
- when String, NilClass
23
- json.to_s
24
- else
25
- json.to_json
26
- end
27
- FakeResponse.new(response_body)
28
- end
29
-
30
4
  def setup_fixtures(*pathnames)
31
5
  JSON::Validator.clear_cache
32
6
  original_schema_root = JsonMatchers.schema_root
@@ -0,0 +1,177 @@
1
+ require_relative "../../test_helper"
2
+ require "active_support/core_ext/string"
3
+
4
+ class AssertResponseMatchesSchemaTest < JsonMatchers::TestCase
5
+ test "fails with an invalid JSON schema" do
6
+ schema = create(:schema, :invalid)
7
+
8
+ json = build(:response)
9
+
10
+ assert_raises JsonMatchers::InvalidSchemaError do
11
+ assert_matches_json_schema(json, schema)
12
+ end
13
+ end
14
+
15
+ test "does not fail with an empty JSON body" do
16
+ schema = create(:schema, {})
17
+
18
+ json = build(:response, {})
19
+
20
+ assert_matches_json_schema(json, schema)
21
+ end
22
+
23
+ test "fails when the body contains a property with the wrong type" do
24
+ schema = create(:schema, :object)
25
+
26
+ json = build(:response, :invalid_object)
27
+
28
+ refute_matches_json_schema(json, schema)
29
+ end
30
+
31
+ test "fails when the body is missing a required property" do
32
+ schema = create(:schema, :object)
33
+
34
+ json = build(:response, {})
35
+
36
+ refute_matches_json_schema(json, schema)
37
+ end
38
+
39
+ test "when passed a Hash, validates that the schema matches" do
40
+ schema = create(:schema, :object)
41
+
42
+ json = build(:response, :object)
43
+ json_as_hash = json.to_h
44
+
45
+ assert_matches_json_schema(json_as_hash, schema)
46
+ end
47
+
48
+ test "when passed a Hash, fails with message when negated" do
49
+ schema = create(:schema, :object)
50
+
51
+ json = build(:response, :invalid_object)
52
+ json_as_hash = json.to_h
53
+
54
+ assert_raises_error_containing(schema) do
55
+ assert_matches_json_schema(json_as_hash, schema)
56
+ end
57
+ end
58
+
59
+ test "when passed a Array, validates a root-level Array in the JSON" do
60
+ schema = create(:schema, :array_of, :objects)
61
+
62
+ json = build(:response, :object)
63
+ json_as_array = [json.to_h]
64
+
65
+ assert_matches_json_schema(json_as_array, schema)
66
+ end
67
+
68
+ test "when passed a Array, refutes a root-level Array in the JSON" do
69
+ schema = create(:schema, :array_of, :objects)
70
+
71
+ json = build(:response, :invalid_object)
72
+ json_as_array = [json.to_h]
73
+
74
+ refute_matches_json_schema(json_as_array, schema)
75
+ end
76
+
77
+ test "when passed a Array, fails with message when negated" do
78
+ schema = create(:schema, :array_of, :object)
79
+
80
+ json = build(:response, :invalid_object)
81
+ json_as_array = [json.to_h]
82
+
83
+ assert_raises_error_containing(schema) do
84
+ assert_matches_json_schema(json_as_array, schema)
85
+ end
86
+ end
87
+
88
+ test "when JSON is a string, validates that the schema matches" do
89
+ schema = create(:schema, :object)
90
+
91
+ json = build(:response, :object)
92
+ json_as_string = json.to_json
93
+
94
+ assert_matches_json_schema(json_as_string, schema)
95
+ end
96
+
97
+ test "when JSON is a string, fails with message when negated" do
98
+ schema = create(:schema, :object)
99
+
100
+ json = build(:response, :invalid_object)
101
+ json_as_string = json.to_json
102
+
103
+ assert_raises_error_containing(schema) do
104
+ assert_matches_json_schema(json_as_string, schema)
105
+ end
106
+ end
107
+
108
+ test "the failure message contains the body" do
109
+ schema = create(:schema, :object)
110
+
111
+ json = build(:response, :invalid_object)
112
+
113
+ assert_raises_error_containing(json) do
114
+ assert_matches_json_schema(json, schema)
115
+ end
116
+ end
117
+
118
+ test "the failure message contains the schema" do
119
+ schema = create(:schema, :object)
120
+
121
+ json = build(:response, :invalid_object)
122
+
123
+ assert_raises_error_containing(schema) do
124
+ assert_matches_json_schema(json, schema)
125
+ end
126
+ end
127
+
128
+ test "the failure message when negated, contains the body" do
129
+ schema = create(:schema, :object)
130
+
131
+ json = build(:response, :object)
132
+
133
+ assert_raises_error_containing(json) do
134
+ refute_matches_json_schema(json, schema)
135
+ end
136
+ end
137
+
138
+ test "the failure message when negated, contains the schema" do
139
+ schema = create(:schema, :object)
140
+
141
+ json = build(:response, :object)
142
+
143
+ assert_raises_error_containing(schema) do
144
+ refute_matches_json_schema(json, schema)
145
+ end
146
+ end
147
+
148
+ test "asserts valid JSON against a schema that uses $ref" do
149
+ schema = create(:schema, :referencing_objects)
150
+
151
+ json = build(:response, :object)
152
+ json_as_array = [json.to_h]
153
+
154
+ assert_matches_json_schema(json_as_array, schema)
155
+ end
156
+
157
+ test "refutes valid JSON against a schema that uses $ref" do
158
+ schema = create(:schema, :referencing_objects)
159
+
160
+ json = build(:response, :invalid_object)
161
+ json_as_array = [json.to_h]
162
+
163
+ refute_matches_json_schema(json_as_array, schema)
164
+ end
165
+
166
+ def assert_raises_error_containing(schema_or_body)
167
+ raised_error = assert_raises(Minitest::Assertion) do
168
+ yield
169
+ end
170
+
171
+ sanitized_message = raised_error.message.squish
172
+ json = JSON.pretty_generate(schema_or_body.to_h)
173
+ error_message = json.squish
174
+
175
+ assert_includes sanitized_message, error_message
176
+ end
177
+ end
@@ -0,0 +1,5 @@
1
+ require "factory_bot"
2
+
3
+ FactoryBot.find_definitions
4
+
5
+ Minitest::Test.send(:include, FactoryBot::Syntax::Methods)
@@ -0,0 +1,18 @@
1
+ require "active_support/testing/declarative"
2
+ require_relative "../../../spec/support/file_helpers"
3
+
4
+ module JsonMatchers
5
+ class TestCase < ::Minitest::Test
6
+ extend ActiveSupport::Testing::Declarative
7
+
8
+ include FileHelpers
9
+
10
+ def setup
11
+ @original_schema_root = setup_fixtures("test", "fixtures", "schemas")
12
+ end
13
+
14
+ def teardown
15
+ teardown_fixtures(@original_schema_root)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,8 @@
1
+ require "minitest/autorun"
2
+ require "json_matchers/minitest/assertions"
3
+
4
+ JsonMatchers.schema_root = "/test/support/api/schemas"
5
+
6
+ Minitest::Test.send(:include, JsonMatchers::Minitest::Assertions)
7
+
8
+ Dir["./test/support/**/*.rb"].each { |file| require file }
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.7.3
4
+ version: 0.8.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: 2018-03-16 00:00:00.000000000 Z
11
+ date: 2018-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json-schema
@@ -80,6 +80,48 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '2.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: factory_bot
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '4.8'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '4.8'
111
+ - !ruby/object:Gem::Dependency
112
+ name: activesupport
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
83
125
  description: Validate your Rails JSON API's JSON
84
126
  email:
85
127
  - sean.p.doyle24@gmail.com
@@ -102,18 +144,28 @@ files:
102
144
  - Rakefile
103
145
  - json_matchers.gemspec
104
146
  - lib/json_matchers.rb
147
+ - lib/json_matchers/assertion.rb
105
148
  - lib/json_matchers/configuration.rb
106
149
  - lib/json_matchers/errors.rb
107
150
  - lib/json_matchers/matcher.rb
151
+ - lib/json_matchers/minitest/assertions.rb
108
152
  - lib/json_matchers/payload.rb
109
153
  - lib/json_matchers/rspec.rb
110
154
  - lib/json_matchers/validator.rb
111
155
  - lib/json_matchers/version.rb
156
+ - spec/factories.rb
112
157
  - spec/json_matchers/configuration_spec.rb
113
158
  - spec/json_matchers/match_json_schema_spec.rb
114
159
  - spec/spec_helper.rb
115
160
  - spec/support/configuration.rb
161
+ - spec/support/factory_bot.rb
162
+ - spec/support/fake_response.rb
163
+ - spec/support/fake_schema.rb
116
164
  - spec/support/file_helpers.rb
165
+ - test/json_matchers/minitest/assertions_test.rb
166
+ - test/support/factory_bot.rb
167
+ - test/support/json_matchers/test_case.rb
168
+ - test/test_helper.rb
117
169
  homepage: https://github.com/thoughtbot/json_matchers
118
170
  licenses:
119
171
  - MIT
@@ -134,13 +186,21 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
186
  version: '0'
135
187
  requirements: []
136
188
  rubyforge_project:
137
- rubygems_version: 2.5.1
189
+ rubygems_version: 2.7.3
138
190
  signing_key:
139
191
  specification_version: 4
140
192
  summary: Validate your Rails JSON API's JSON
141
193
  test_files:
194
+ - spec/factories.rb
142
195
  - spec/json_matchers/configuration_spec.rb
143
196
  - spec/json_matchers/match_json_schema_spec.rb
144
197
  - spec/spec_helper.rb
145
198
  - spec/support/configuration.rb
199
+ - spec/support/factory_bot.rb
200
+ - spec/support/fake_response.rb
201
+ - spec/support/fake_schema.rb
146
202
  - spec/support/file_helpers.rb
203
+ - test/json_matchers/minitest/assertions_test.rb
204
+ - test/support/factory_bot.rb
205
+ - test/support/json_matchers/test_case.rb
206
+ - test/test_helper.rb