json_spec 0.2.0 → 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.
- data/README.md +36 -0
- data/features/memory.feature +184 -0
- data/lib/json_spec.rb +2 -0
- data/lib/json_spec/cucumber.rb +13 -5
- data/lib/json_spec/memory.rb +20 -0
- data/lib/json_spec/version.rb +1 -1
- metadata +87 -50
data/README.md
CHANGED
@@ -183,6 +183,42 @@ versatile and can be used in plenty of different formats:
|
|
183
183
|
|
184
184
|
_All instances of "should" above could be followed by "not" and all instances of "JSON" could be downcased and/or followed by "response."_
|
185
185
|
|
186
|
+
### JSON Memory
|
187
|
+
|
188
|
+
There's one more Cucumber step that json_spec provides which hasn't been used above. It's used to
|
189
|
+
memorize JSON for reuse in later steps. You can "keep" all or a portion of the JSON by giving a
|
190
|
+
name by which to remember it.
|
191
|
+
|
192
|
+
Feature: User API
|
193
|
+
Scenario: Index action includes full user JSON
|
194
|
+
Given the following user exists:
|
195
|
+
| id | first_name | last_name |
|
196
|
+
| 1 | Steve | Richert |
|
197
|
+
And I visit "/users/1.json"
|
198
|
+
And I keep the JSON response as "USER_1"
|
199
|
+
When I visit "/users.json"
|
200
|
+
Then the JSON response should be:
|
201
|
+
"""
|
202
|
+
[
|
203
|
+
%{USER_1}
|
204
|
+
]
|
205
|
+
"""
|
206
|
+
|
207
|
+
You can memorize JSON at a path:
|
208
|
+
|
209
|
+
Given I keep the JSON response at "first_name" as "FIRST_NAME"
|
210
|
+
|
211
|
+
You can remember JSON at a path:
|
212
|
+
|
213
|
+
Then the JSON response at "0/first_name" should be:
|
214
|
+
"""
|
215
|
+
%{FIRST_NAME}
|
216
|
+
"""
|
217
|
+
|
218
|
+
You can also remember JSON inline:
|
219
|
+
|
220
|
+
Then the JSON response at "0/first_name" should be %{FIRST_NAME}
|
221
|
+
|
186
222
|
Contributing
|
187
223
|
------------
|
188
224
|
In the spirit of [free software](http://www.fsf.org/licensing/essays/free-sw.html), **everyone** is encouraged to help improve this project.
|
@@ -0,0 +1,184 @@
|
|
1
|
+
Feature: Memory
|
2
|
+
Background:
|
3
|
+
Given the JSON is:
|
4
|
+
"""
|
5
|
+
{
|
6
|
+
"array": [
|
7
|
+
|
8
|
+
],
|
9
|
+
"false": false,
|
10
|
+
"float": 10.0,
|
11
|
+
"hash": {
|
12
|
+
},
|
13
|
+
"integer": 10,
|
14
|
+
"null": null,
|
15
|
+
"string": "json_spec",
|
16
|
+
"true": true
|
17
|
+
}
|
18
|
+
"""
|
19
|
+
And I get the JSON
|
20
|
+
|
21
|
+
Scenario: Entire JSON
|
22
|
+
When I keep the JSON as "JSON"
|
23
|
+
Then the JSON should be %{JSON}
|
24
|
+
And the JSON should be:
|
25
|
+
"""
|
26
|
+
%{JSON}
|
27
|
+
"""
|
28
|
+
|
29
|
+
Scenario: String
|
30
|
+
When I keep the JSON at "string" as "STRING"
|
31
|
+
Then the JSON at "string" should be %{STRING}
|
32
|
+
And the JSON should be:
|
33
|
+
"""
|
34
|
+
{
|
35
|
+
"array": [
|
36
|
+
|
37
|
+
],
|
38
|
+
"false": false,
|
39
|
+
"float": 10.0,
|
40
|
+
"hash": {
|
41
|
+
},
|
42
|
+
"integer": 10,
|
43
|
+
"null": null,
|
44
|
+
"string": %{STRING},
|
45
|
+
"true": true
|
46
|
+
}
|
47
|
+
"""
|
48
|
+
|
49
|
+
Scenario: Integer
|
50
|
+
When I keep the JSON at "integer" as "INTEGER"
|
51
|
+
Then the JSON at "integer" should be %{INTEGER}
|
52
|
+
And the JSON should be:
|
53
|
+
"""
|
54
|
+
{
|
55
|
+
"array": [
|
56
|
+
|
57
|
+
],
|
58
|
+
"false": false,
|
59
|
+
"float": 10.0,
|
60
|
+
"hash": {
|
61
|
+
},
|
62
|
+
"integer": %{INTEGER},
|
63
|
+
"null": null,
|
64
|
+
"string": "json_spec",
|
65
|
+
"true": true
|
66
|
+
}
|
67
|
+
"""
|
68
|
+
|
69
|
+
Scenario: Float
|
70
|
+
When I keep the JSON at "float" as "FLOAT"
|
71
|
+
Then the JSON at "float" should be %{FLOAT}
|
72
|
+
And the JSON should be:
|
73
|
+
"""
|
74
|
+
{
|
75
|
+
"array": [
|
76
|
+
|
77
|
+
],
|
78
|
+
"false": false,
|
79
|
+
"float": %{FLOAT},
|
80
|
+
"hash": {
|
81
|
+
},
|
82
|
+
"integer": 10,
|
83
|
+
"null": null,
|
84
|
+
"string": "json_spec",
|
85
|
+
"true": true
|
86
|
+
}
|
87
|
+
"""
|
88
|
+
|
89
|
+
Scenario: Array
|
90
|
+
When I keep the JSON at "array" as "ARRAY"
|
91
|
+
Then the JSON at "array" should be %{ARRAY}
|
92
|
+
And the JSON should be:
|
93
|
+
"""
|
94
|
+
{
|
95
|
+
"array": %{ARRAY},
|
96
|
+
"false": false,
|
97
|
+
"float": 10.0,
|
98
|
+
"hash": {
|
99
|
+
},
|
100
|
+
"integer": 10,
|
101
|
+
"null": null,
|
102
|
+
"string": "json_spec",
|
103
|
+
"true": true
|
104
|
+
}
|
105
|
+
"""
|
106
|
+
|
107
|
+
Scenario: Hash
|
108
|
+
When I keep the JSON at "hash" as "HASH"
|
109
|
+
Then the JSON at "hash" should be %{HASH}
|
110
|
+
And the JSON should be:
|
111
|
+
"""
|
112
|
+
{
|
113
|
+
"array": [
|
114
|
+
|
115
|
+
],
|
116
|
+
"false": false,
|
117
|
+
"float": 10.0,
|
118
|
+
"hash": %{HASH},
|
119
|
+
"integer": 10,
|
120
|
+
"null": null,
|
121
|
+
"string": "json_spec",
|
122
|
+
"true": true
|
123
|
+
}
|
124
|
+
"""
|
125
|
+
|
126
|
+
Scenario: True
|
127
|
+
When I keep the JSON at "true" as "TRUE"
|
128
|
+
Then the JSON at "true" should be %{TRUE}
|
129
|
+
And the JSON should be:
|
130
|
+
"""
|
131
|
+
{
|
132
|
+
"array": [
|
133
|
+
|
134
|
+
],
|
135
|
+
"false": false,
|
136
|
+
"float": 10.0,
|
137
|
+
"hash": {
|
138
|
+
},
|
139
|
+
"integer": 10,
|
140
|
+
"null": null,
|
141
|
+
"string": "json_spec",
|
142
|
+
"true": %{TRUE}
|
143
|
+
}
|
144
|
+
"""
|
145
|
+
|
146
|
+
Scenario: False
|
147
|
+
When I keep the JSON at "false" as "FALSE"
|
148
|
+
Then the JSON at "false" should be %{FALSE}
|
149
|
+
And the JSON should be:
|
150
|
+
"""
|
151
|
+
{
|
152
|
+
"array": [
|
153
|
+
|
154
|
+
],
|
155
|
+
"false": %{FALSE},
|
156
|
+
"float": 10.0,
|
157
|
+
"hash": {
|
158
|
+
},
|
159
|
+
"integer": 10,
|
160
|
+
"null": null,
|
161
|
+
"string": "json_spec",
|
162
|
+
"true": true
|
163
|
+
}
|
164
|
+
"""
|
165
|
+
|
166
|
+
Scenario: Null
|
167
|
+
When I keep the JSON at "null" as "NULL"
|
168
|
+
Then the JSON at "null" should be %{NULL}
|
169
|
+
And the JSON should be:
|
170
|
+
"""
|
171
|
+
{
|
172
|
+
"array": [
|
173
|
+
|
174
|
+
],
|
175
|
+
"false": false,
|
176
|
+
"float": 10.0,
|
177
|
+
"hash": {
|
178
|
+
},
|
179
|
+
"integer": 10,
|
180
|
+
"null": %{NULL},
|
181
|
+
"string": "json_spec",
|
182
|
+
"true": true
|
183
|
+
}
|
184
|
+
"""
|
data/lib/json_spec.rb
CHANGED
data/lib/json_spec/cucumber.rb
CHANGED
@@ -2,19 +2,27 @@ require File.expand_path("../../json_spec", __FILE__)
|
|
2
2
|
|
3
3
|
World(JsonSpec::Helpers)
|
4
4
|
|
5
|
+
After do
|
6
|
+
JsonSpec.forget
|
7
|
+
end
|
8
|
+
|
9
|
+
When /^(?:I )?keep the (?:JSON|json)(?: response)?(?: at "(.*)")? as "(.*)"$/ do |path, key|
|
10
|
+
JsonSpec.memorize(key, path ? json_at_path(last_json, path) : last_json)
|
11
|
+
end
|
12
|
+
|
5
13
|
Then /^the (?:JSON|json)(?: response)?(?: at "(.*)")? should( not)? be:$/ do |path, negative, json|
|
6
14
|
if negative
|
7
|
-
last_json.should_not be_json_eql(json).at_path(path)
|
15
|
+
last_json.should_not be_json_eql(JsonSpec.remember(json)).at_path(path)
|
8
16
|
else
|
9
|
-
last_json.should be_json_eql(json).at_path(path)
|
17
|
+
last_json.should be_json_eql(JsonSpec.remember(json)).at_path(path)
|
10
18
|
end
|
11
19
|
end
|
12
20
|
|
13
|
-
Then /^the (?:JSON|json)(?: response)?(?: at "(.*)")? should( not)? be (".*"|\-?\d+(?:\.\d+)?(?:[eE][\+\-]?\d+)?|\[.*\]
|
21
|
+
Then /^the (?:JSON|json)(?: response)?(?: at "(.*)")? should( not)? be (".*"|\-?\d+(?:\.\d+)?(?:[eE][\+\-]?\d+)?|\[.*\]|%?\{.*\}|true|false|null)$/ do |path, negative, value|
|
14
22
|
if negative
|
15
|
-
last_json.should_not be_json_eql(value).at_path(path)
|
23
|
+
last_json.should_not be_json_eql(JsonSpec.remember(value)).at_path(path)
|
16
24
|
else
|
17
|
-
last_json.should be_json_eql(value).at_path(path)
|
25
|
+
last_json.should be_json_eql(JsonSpec.remember(value)).at_path(path)
|
18
26
|
end
|
19
27
|
end
|
20
28
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module JsonSpec
|
2
|
+
module Memory
|
3
|
+
def memory
|
4
|
+
@memory ||= {}
|
5
|
+
end
|
6
|
+
|
7
|
+
def memorize(key, value)
|
8
|
+
memory[key] = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def remember(json)
|
12
|
+
return json if memory.empty?
|
13
|
+
json.gsub(/%\{(#{memory.keys.map{|k| Regexp.quote(k) }.join("|")})\}/){ memory[$1] }
|
14
|
+
end
|
15
|
+
|
16
|
+
def forget
|
17
|
+
memory.clear
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/json_spec/version.rb
CHANGED
metadata
CHANGED
@@ -1,68 +1,93 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: json_spec
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 19
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Steve Richert
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
17
|
+
|
18
|
+
date: 2011-07-08 00:00:00 -04:00
|
13
19
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
16
22
|
name: json
|
17
|
-
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
18
25
|
none: false
|
19
|
-
requirements:
|
26
|
+
requirements:
|
20
27
|
- - ~>
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 15
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 0
|
33
|
+
version: "1.0"
|
23
34
|
type: :runtime
|
24
|
-
|
25
|
-
|
26
|
-
- !ruby/object:Gem::Dependency
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
27
37
|
name: rspec
|
28
|
-
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
29
40
|
none: false
|
30
|
-
requirements:
|
41
|
+
requirements:
|
31
42
|
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 2
|
47
|
+
- 0
|
48
|
+
version: "2.0"
|
34
49
|
type: :runtime
|
35
|
-
|
36
|
-
|
37
|
-
- !ruby/object:Gem::Dependency
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
38
52
|
name: rake
|
39
|
-
|
53
|
+
prerelease: false
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
55
|
none: false
|
41
|
-
requirements:
|
56
|
+
requirements:
|
42
57
|
- - ~>
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 25
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
- 9
|
63
|
+
version: "0.9"
|
45
64
|
type: :development
|
46
|
-
|
47
|
-
|
48
|
-
- !ruby/object:Gem::Dependency
|
65
|
+
version_requirements: *id003
|
66
|
+
- !ruby/object:Gem::Dependency
|
49
67
|
name: cucumber
|
50
|
-
|
68
|
+
prerelease: false
|
69
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
51
70
|
none: false
|
52
|
-
requirements:
|
71
|
+
requirements:
|
53
72
|
- - ~>
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 15
|
75
|
+
segments:
|
76
|
+
- 1
|
77
|
+
- 0
|
78
|
+
version: "1.0"
|
56
79
|
type: :development
|
57
|
-
|
58
|
-
version_requirements: *2155990380
|
80
|
+
version_requirements: *id004
|
59
81
|
description: Easily handle JSON in RSpec and Cucumber
|
60
|
-
email:
|
82
|
+
email:
|
61
83
|
- steve.richert@gmail.com
|
62
84
|
executables: []
|
85
|
+
|
63
86
|
extensions: []
|
87
|
+
|
64
88
|
extra_rdoc_files: []
|
65
|
-
|
89
|
+
|
90
|
+
files:
|
66
91
|
- .gitignore
|
67
92
|
- .travis.yml
|
68
93
|
- Gemfile
|
@@ -70,6 +95,7 @@ files:
|
|
70
95
|
- README.md
|
71
96
|
- Rakefile
|
72
97
|
- features/equivalence.feature
|
98
|
+
- features/memory.feature
|
73
99
|
- features/paths.feature
|
74
100
|
- features/sizes.feature
|
75
101
|
- features/step_definitions/steps.rb
|
@@ -82,6 +108,7 @@ files:
|
|
82
108
|
- lib/json_spec/errors.rb
|
83
109
|
- lib/json_spec/helpers.rb
|
84
110
|
- lib/json_spec/matchers.rb
|
111
|
+
- lib/json_spec/memory.rb
|
85
112
|
- lib/json_spec/version.rb
|
86
113
|
- spec/json_spec/configuration_spec.rb
|
87
114
|
- spec/json_spec/matchers_spec.rb
|
@@ -90,30 +117,40 @@ files:
|
|
90
117
|
has_rdoc: true
|
91
118
|
homepage: https://github.com/collectiveidea/json_spec
|
92
119
|
licenses: []
|
120
|
+
|
93
121
|
post_install_message:
|
94
122
|
rdoc_options: []
|
95
|
-
|
123
|
+
|
124
|
+
require_paths:
|
96
125
|
- lib
|
97
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
126
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
127
|
none: false
|
99
|
-
requirements:
|
100
|
-
- -
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
|
103
|
-
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
hash: 3
|
132
|
+
segments:
|
133
|
+
- 0
|
134
|
+
version: "0"
|
135
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
136
|
none: false
|
105
|
-
requirements:
|
106
|
-
- -
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
hash: 3
|
141
|
+
segments:
|
142
|
+
- 0
|
143
|
+
version: "0"
|
109
144
|
requirements: []
|
145
|
+
|
110
146
|
rubyforge_project: json_spec
|
111
|
-
rubygems_version: 1.
|
147
|
+
rubygems_version: 1.3.7
|
112
148
|
signing_key:
|
113
149
|
specification_version: 3
|
114
150
|
summary: Easily handle JSON in RSpec and Cucumber
|
115
|
-
test_files:
|
151
|
+
test_files:
|
116
152
|
- features/equivalence.feature
|
153
|
+
- features/memory.feature
|
117
154
|
- features/paths.feature
|
118
155
|
- features/sizes.feature
|
119
156
|
- features/step_definitions/steps.rb
|