assert_json 0.2.3 → 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: 84984fa4a3256eeeb0fd478682aaac73edf8ce6e
4
- data.tar.gz: 735eb857f7c81ee55bfe0d24bc7283713768396c
3
+ metadata.gz: 9c2af8b07b97f74fe288a7a3aebe27d2686e62f3
4
+ data.tar.gz: 66167cec3df9aa3c630735e9c0c8cda0780d341b
5
5
  SHA512:
6
- metadata.gz: 065d1b029be8512f5f6676e91b4596aa2e41f1ff220d8d35c9b2e45e11ed0ddfe3b61988c7afeebf8484ff3f12eabb9b579d895fdd75cda8063762810f178597
7
- data.tar.gz: ee97759d3a65474fce2ce15f43cd3bf2b10025437136167c07d638a0a18b319e47095559825561089dc42a8e09a02f1ec0b1ff606d569593786414963d8bbf54
6
+ metadata.gz: c05feb7f9aeb5302113627b02123ba240438143e7f38b4ffa48b84db5ff2a083214b7d40fada36841819ec39c3cc16acf63bdb15b9a1fda11632ec280436a135
7
+ data.tar.gz: a88d567254d842c0778c789609cbc65a7b3f08e90bd64dcc357d44bbf9520e7491eb24f73d284578d122a4ad11204282713aee5f7b0811aa8454c219d90ca402
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.3.0
4
+
5
+ * add support for `has_only` (to test that objects have the declared set of properties and nothing more) (thanks to [@derek-watson](https://github.com/derek-watson), see [issue 8](https://github.com/alto/assert_json/pull/8))
6
+
3
7
  ## 0.2.3
4
8
 
5
9
  * bugfix for itemised nested arrays (see [issue 7](https://github.com/alto/assert_json/issues/7))
data/README.md CHANGED
@@ -58,6 +58,26 @@ assert_json '[{"id":1, "key":"test", "name":"test"}, {"id":2, "key":"test", "nam
58
58
  end
59
59
  ```
60
60
 
61
+ To test that objects have the declared set of properties and nothing more,
62
+ include `has_only` at any level, like this
63
+
64
+ ```ruby
65
+ assert_json '[{"id":1, "key":"test", "name":"test"}, {"id":2, "key":"test", "name":"test"}, {"id":3, "key":"test", "name":"test"}]' do
66
+ has_only
67
+ item 0 do
68
+ has :id, 1
69
+ has :key, 'test'
70
+ has :name, 'test'
71
+ end
72
+ item 1 do
73
+ has 'id', 2
74
+ has 'key', 'test'
75
+ end
76
+ end
77
+
78
+ # Failure: element 1 has unexpected keys: name
79
+ ```
80
+
61
81
 
62
82
  ## Changelog ##
63
83
 
@@ -5,6 +5,7 @@ module AssertJson
5
5
  @json = AssertJson::Json.new(json_string)
6
6
  # json.instance_exec(json, &block)
7
7
  yield @json
8
+ @json.test_for_unexpected_keys('root')
8
9
  end
9
10
  end
10
11
 
@@ -20,19 +21,31 @@ module AssertJson
20
21
  @json.has_not(*args, &block)
21
22
  end
22
23
 
24
+ def has_only
25
+ @json.has_only
26
+ end
27
+
23
28
  class Json
24
29
 
25
30
  def initialize(json_string)
26
31
  @decoded_json = ActiveSupport::JSON.decode(json_string)
32
+ @expected_keys = []
33
+ @only = false
27
34
  end
28
35
 
29
36
  def item(index, &block)
37
+ only_in_scope = @only
38
+ expected_keys_in_scope = @expected_keys
39
+ @expected_keys = []
30
40
  decoded_json_in_scope = @decoded_json
31
41
  @decoded_json = @decoded_json[index]
32
42
  begin
33
43
  yield if block_given?
44
+ test_for_unexpected_keys(index)
34
45
  ensure
35
46
  @decoded_json = decoded_json_in_scope
47
+ @expected_keys = expected_keys_in_scope
48
+ @only = only_in_scope
36
49
  end
37
50
  end
38
51
 
@@ -79,8 +92,13 @@ module AssertJson
79
92
  flunk
80
93
  end
81
94
 
95
+ @expected_keys.push arg
96
+
82
97
  if block_given?
83
98
  begin
99
+ only_in_scope = @only
100
+ expected_keys_in_scope = @expected_keys
101
+ @expected_keys = []
84
102
  decoded_json_in_scope = @decoded_json
85
103
  @decoded_json = case token
86
104
  when Hash
@@ -89,11 +107,13 @@ module AssertJson
89
107
  token
90
108
  end
91
109
  yield
110
+ test_for_unexpected_keys(arg)
92
111
  ensure
112
+ @expected_keys = expected_keys_in_scope
113
+ @only = only_in_scope
93
114
  @decoded_json = decoded_json_in_scope
94
115
  end
95
116
  end
96
-
97
117
  end
98
118
  alias has element
99
119
 
@@ -109,6 +129,22 @@ module AssertJson
109
129
  end
110
130
  alias has_not not_element
111
131
 
132
+ def only
133
+ @only = true
134
+ end
135
+ alias has_only only
136
+
137
+ def test_for_unexpected_keys(name = 'root')
138
+ return unless @only
139
+
140
+ if @decoded_json.is_a?(Hash)
141
+ unexpected_keys = @decoded_json.keys - @expected_keys
142
+ if unexpected_keys.count > 0
143
+ raise_error("element #{name} has unexpected keys: #{unexpected_keys.join(', ')}")
144
+ end
145
+ end
146
+ end
147
+
112
148
  private
113
149
 
114
150
  def raise_error(message)
@@ -1,3 +1,3 @@
1
1
  module AssertJson
2
- VERSION = "0.2.3"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -0,0 +1,94 @@
1
+ require_relative './test_helper'
2
+
3
+ class AssertJsonHasNoUnexpectedKeysTest < Minitest::Test
4
+ include AssertJson
5
+
6
+ def test_on_root_object
7
+ assert_json '{"keyA":"value","keyB":"value"}' do
8
+ has_only
9
+ has 'keyA'
10
+ has 'keyB'
11
+ end
12
+ end
13
+
14
+ def test_on_root_object_failure
15
+ err = assert_raises(MiniTest::Assertion) do
16
+ assert_json '{"keyA":"value","keyB":"value"}' do
17
+ has_only
18
+ has 'keyA', 'value'
19
+ end
20
+ end
21
+ assert_equal 'element root has unexpected keys: keyB', err.message
22
+ end
23
+
24
+ def test_on_root_object_with_sub_object
25
+ assert_json '{"keyA":{"subKeyA":"value","subKeyB":"value"},"keyB":"value"}' do
26
+ has_only
27
+ has 'keyA' do
28
+ has 'subKeyA'
29
+ has 'subKeyB'
30
+ end
31
+ has 'keyB'
32
+ end
33
+ end
34
+
35
+ def test_on_root_object_with_sub_object_failure
36
+ err = assert_raises(MiniTest::Assertion) do
37
+ assert_json '{"keyA":{"subKeyA":"value","subKeyB":"value"},"keyB":"value"}' do
38
+ has_only
39
+ has 'keyA' do
40
+ has 'subKeyA'
41
+ has 'subKeyB'
42
+ end
43
+ end
44
+ end
45
+ assert_equal 'element root has unexpected keys: keyB', err.message
46
+ end
47
+
48
+ def test_on_sub_object
49
+ assert_json '{"keyA":{"subKeyA":"value","subKeyB":"value"},"keyB":"value"}' do
50
+ has 'keyA' do
51
+ has_only
52
+ has 'subKeyA'
53
+ has 'subKeyB'
54
+ end
55
+ end
56
+ end
57
+
58
+ def test_on_sub_object_failure
59
+ err = assert_raises(MiniTest::Assertion) do
60
+ assert_json '{"keyA":{"subKeyA":"value","subKeyB":"value"},"keyB":"value"}' do
61
+ has 'keyA' do
62
+ has_only
63
+ has 'subKeyA'
64
+ end
65
+ end
66
+ end
67
+ assert_equal 'element keyA has unexpected keys: subKeyB', err.message
68
+ end
69
+
70
+ def test_on_root_array_of_objects
71
+ assert_json '[{"id":1, "key":"test", "name":"test"}, {"id":2, "key":"test", "name":"test"}, {"id":3, "key":"test", "name":"test"}]' do
72
+ has_only
73
+ item 0 do
74
+ has :id, 1
75
+ has :key, 'test'
76
+ has :name, 'test'
77
+ end
78
+ end
79
+ end
80
+
81
+ def test_on_root_array_of_objects_failure
82
+ err = assert_raises(MiniTest::Assertion) do
83
+ assert_json '[{"id":1, "key":"test", "name":"test"}, {"id":2, "key":"test", "name":"test"}, {"id":3, "key":"test", "name":"test"}]' do
84
+ has_only
85
+ item 0 do
86
+ has :id, 1
87
+ has :key, 'test'
88
+ end
89
+ end
90
+ end
91
+ assert_equal 'element 0 has unexpected keys: name', err.message
92
+ end
93
+
94
+ end
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: assert_json
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thorsten Böttger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-14 00:00:00.000000000 Z
11
+ date: 2015-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description: A gem to test JSON strings.
@@ -58,8 +58,8 @@ executables: []
58
58
  extensions: []
59
59
  extra_rdoc_files: []
60
60
  files:
61
- - .gitignore
62
- - .travis.yml
61
+ - ".gitignore"
62
+ - ".travis.yml"
63
63
  - CHANGELOG.md
64
64
  - Gemfile
65
65
  - MIT-LICENSE
@@ -69,6 +69,7 @@ files:
69
69
  - lib/assert_json.rb
70
70
  - lib/assert_json/assert_json.rb
71
71
  - lib/assert_json/version.rb
72
+ - test/assert_json_has_only_test.rb
72
73
  - test/assert_json_new_dsl_test.rb
73
74
  - test/assert_json_test.rb
74
75
  - test/test_helper.rb
@@ -82,21 +83,22 @@ require_paths:
82
83
  - lib
83
84
  required_ruby_version: !ruby/object:Gem::Requirement
84
85
  requirements:
85
- - - '>='
86
+ - - ">="
86
87
  - !ruby/object:Gem::Version
87
88
  version: '0'
88
89
  required_rubygems_version: !ruby/object:Gem::Requirement
89
90
  requirements:
90
- - - '>='
91
+ - - ">="
91
92
  - !ruby/object:Gem::Version
92
93
  version: '0'
93
94
  requirements: []
94
95
  rubyforge_project:
95
- rubygems_version: 2.1.11
96
+ rubygems_version: 2.4.6
96
97
  signing_key:
97
98
  specification_version: 4
98
99
  summary: A gem to test JSON strings.
99
100
  test_files:
101
+ - test/assert_json_has_only_test.rb
100
102
  - test/assert_json_new_dsl_test.rb
101
103
  - test/assert_json_test.rb
102
104
  - test/test_helper.rb