api_matchers 0.1.0 → 0.1.1

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/.gitignore CHANGED
@@ -15,3 +15,4 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ *.DS_Store
data/History.markdown CHANGED
@@ -1,3 +1,8 @@
1
+ ## v0.1.1
2
+
3
+ 1) Support Datetime, Date and Time comparison (Thanks to Stephen Orens).
4
+ 2) The have_node should accept boolean values (Thanks to Stephen Orens).
5
+
1
6
  ## v0.1.0
2
7
 
3
8
  1) Add the #including_text for have_json_node and have_xml_node matcher:
data/README.markdown CHANGED
@@ -26,94 +26,165 @@ Collection of RSpec matchers for create your API.
26
26
 
27
27
  To include all this matchers you need to include the APIMatchers::RSpecMatchers module:
28
28
 
29
+ ```ruby
29
30
  RSpec.configure do |config|
30
31
  config.include APIMatchers::RSpecMatchers
31
32
  end
33
+ ```
32
34
 
33
35
  ### Have Node Matcher
34
36
 
35
37
  The have_node matcher parse the actual and see if have the expcted node with the expected value.
36
38
  **The default that have_node will parse is JSON.**
37
39
 
40
+ You can verify if node exists:
41
+
42
+ ```ruby
38
43
  "{ 'transaction': { 'id': '54', 'status': 'paid' } }".should have_node(:transaction)
44
+ ```
45
+
46
+ Or if node exist with a value:
47
+
48
+ ```ruby
49
+ "{ 'transaction': { 'id': '54', 'status': 'paid' } }".should have_node(:id).with(54)
50
+ ```
51
+
52
+ ```ruby
53
+ "{ 'error': 'not_authorized', 'transaction': { 'id': '55' } }".should have_node(:error).with('not_authorized')
54
+ ```
39
55
 
40
- "{ 'transaction': { 'id': '54', 'status': 'paid' } }".should have_node(:id).with(54)
56
+ ```ruby
57
+ '{"parcels":1 }'.should have_node(:parcels).with(1)
58
+ ```
41
59
 
42
- "{ 'error': 'not_authorized', 'transaction': { 'id': '55' } }".should have_node(:error).with('not_authorized')
60
+ To see the json node and see if include a text, you can do this:
61
+
62
+ ```ruby
63
+ '{"error": "Transaction error: Name cant be blank"}'.should have_node(:error).including_text("Transaction error")
64
+ ```
65
+
66
+ You can verify boolean values too:
67
+
68
+ ```ruby
69
+ '{"creditcard":true}'.should have_node(:creditcard).with(true)
70
+ ```
43
71
 
44
72
  ### HAVE NODE Matcher Configuration
45
73
 
46
74
  You can configure if you want xml(**JSON is the default**):
47
75
 
76
+ ```ruby
48
77
  APIMatchers.setup do |config|
49
78
  config.content_type = :xml
50
79
  end
80
+ ```ruby
81
+
82
+ ```ruby
83
+ '<transaction><id>200</id><status>paid</status></transaction>'.should have_node(:status)
84
+ ```
51
85
 
52
- '<transaction><id>200</id><status>paid</status></transaction>'.should have_node(:status).with('paid')
86
+ Using the with method:
87
+
88
+ ```ruby
89
+ '<transaction><id>200</id><status>paid</status></transaction>'.should have_node(:status).with('paid')
90
+ ```
91
+
92
+ Or you can use the **have_xml_node** matcher:
93
+
94
+ ```ruby
95
+ "<error>Transaction error: Name can't be blank</error>".should have_xml_node(:error).with("Transaction error: Name can't be blank")
96
+ ```
97
+
98
+ To see the xml node and see if include a text, you can do this:
99
+
100
+ ```ruby
101
+ "<error>Transaction error: Name can't be blank</error>".should have_xml_node(:error).including_text("Transaction error")
102
+ ```
53
103
 
54
104
  **If you work with xml and json in the same API, I recommend that you check the have_json_node and have_xml_node matchers.**
55
105
 
56
106
  You can configure the name of the method for example:
57
107
 
108
+ ```ruby
58
109
  ## Instead of this
59
110
  response.body.should have_node(:foo)
111
+ ```
60
112
 
113
+ ```ruby
61
114
  ## YOU can do this
62
115
  APIMatchers.setup do |config|
63
116
  config.body_method = :body
64
117
  end
118
+ ```
65
119
 
66
- Then you can use without call the **#body** method:
120
+ Then you can use *without* call the **#body** method:
67
121
 
122
+ ```ruby
68
123
  response.should have_node(:foo).with('bar')
124
+ ```
69
125
 
70
126
  ### Have JSON Node Matcher
71
127
 
128
+ ```ruby
72
129
  "{ 'transaction': { 'id': '54', 'status': 'paid' } }".should have_json_node(:id).with(54)
130
+ ```
73
131
 
74
132
  ### Have XML Node Matcher
75
133
 
134
+ ```ruby
76
135
  "<product><name>gateway</name></product>".should have_xml_node(:name).with('gateway')
77
-
136
+ ```
78
137
 
79
138
  ### Create Resource Matcher
80
139
 
81
140
  This matchers see the HTTP STATUS CODE is equal to 201.
82
141
 
142
+ ```ruby
83
143
  response.status.should create_resource
144
+ ```
84
145
 
85
146
  ### BAD REQUEST Matcher
86
147
 
87
148
  This BAD REQUEST is a matcher that see if the HTTP STATUS code is equal to 400.
88
149
 
150
+ ```ruby
89
151
  response.status.should be_a_bad_request
90
152
  response.status.should be_bad_request
153
+ ```
91
154
 
92
155
  ### UNAUTHORIZED Matcher
93
156
 
94
157
  This UNAUTHORIZED is a matcher that see if the HTTP STATUS code is equal to 401.
95
158
 
159
+ ```ruby
96
160
  response.status.should be_unauthorized
97
161
  response.body.should have_node(:message).with('Invalid Credentials')
162
+ ```
98
163
 
99
164
  ### INTERNAL SERVER ERROR Matcher
100
165
 
101
166
  This INTERNAL SERVER Error is a matcher that see if the HTTP STATUS code is equal to 500.
102
167
 
168
+ ```ruby
103
169
  response.status.should be_internal_server_error
104
170
  response.body.should have_node(:message).with('An Internal Error Occurs in our precious app. :S')
171
+ ```
105
172
 
106
173
  ### HTTP STATUS CODE Configuration
107
174
 
108
175
  You can configure the name method to call the http status code:
109
176
 
177
+ ```ruby
110
178
  APIMatchers.setup do |config|
111
179
  config.http_status_method = :status
112
180
  end
181
+ ```
113
182
 
114
183
  Then you can use without call the **#status** method:
115
184
 
185
+ ```ruby
116
186
  response.should create_resource
187
+ ```
117
188
 
118
189
  This configurations affects this matchers:
119
190
 
@@ -126,28 +197,40 @@ This configurations affects this matchers:
126
197
 
127
198
  This is a matcher that see if the content type is xml:
128
199
 
200
+ ```ruby
129
201
  response.headers['Content-Type'].should be_in_xml
202
+ ```
130
203
 
131
204
  ### Be in JSON Matcher
132
205
 
133
206
  This is a matcher that see if the content type is in JSON:
134
207
 
208
+ ```ruby
135
209
  response.headers['Content-Type'].should be_in_json
210
+ ```
136
211
 
137
212
  ### Headers Configuration
138
213
 
139
214
  You can configure the name method to call the headers and content type:
140
215
 
216
+ ```ruby
141
217
  APIMatchers.setup do |config|
142
218
  config.header_method = :headers
143
219
  config.header_content_type_key = 'Content-Type'
144
220
  end
221
+ ```
145
222
 
146
223
  Then you can use without call the **#headers** calling the **#['Content-Type']** method:
147
224
 
225
+ ```ruby
148
226
  response.should be_in_json
149
227
  response.should be_in_xml
228
+ ```
150
229
 
151
230
  ### Acknowlegments
152
231
 
153
- * Special thanks to Daniel Konishi to contribute in the product that I extracted the matchers to this gem.
232
+ * Special thanks to Daniel Konishi to contribute in the product that I extracted the matchers to this gem.
233
+
234
+ ### Contributors
235
+
236
+ * Stephen Orens
data/lib/api_matchers.rb CHANGED
@@ -37,6 +37,7 @@ module APIMatchers
37
37
  module Core
38
38
  autoload :FindInJSON, 'api_matchers/core/find_in_json'
39
39
  autoload :Setup, 'api_matchers/core/setup'
40
+ autoload :Exceptions, 'api_matchers/core/exceptions'
40
41
  end
41
42
 
42
43
  def self.setup
@@ -0,0 +1,8 @@
1
+ module APIMatchers
2
+ module Core
3
+ module Exceptions
4
+ class KeyNotFound < StandardError
5
+ end
6
+ end
7
+ end
8
+ end
@@ -9,16 +9,39 @@ module APIMatchers
9
9
 
10
10
  def find(options={})
11
11
  expected_key = options.fetch(:node).to_s
12
+ expected_value = options[:value]
12
13
 
13
14
  @json.each do |key, value|
14
15
  if key == expected_key
15
- return value
16
+ unless expected_value.nil?
17
+ if expected_value.is_a? DateTime or expected_value.is_a? Date
18
+ expected_value = expected_value.to_s
19
+ elsif expected_value.is_a? Time
20
+ expected_value = expected_value.to_datetime.to_s
21
+ end
22
+ end
23
+
24
+ return value if value == expected_value or expected_value.nil?
25
+ end
26
+ # do we have more to recurse through?
27
+ keep_going = nil
28
+ if value.is_a? Hash or value.is_a? Array
29
+ keep_going = value # hash or array, keep going
30
+ elsif value.nil? and key.is_a? Hash
31
+ keep_going = key # the array was passed in and now in the key, keep going
16
32
  end
17
- if value.is_a? Hash
18
- return FindInJSON.new(value).find(node: expected_key)
33
+
34
+ if keep_going
35
+ begin
36
+ # ignore nodes where the key doesn't match
37
+ return FindInJSON.new(keep_going).find(node: expected_key, value: expected_value)
38
+ rescue ::APIMatchers::Core::Exceptions::KeyNotFound
39
+ end
19
40
  end
41
+
20
42
  end
21
- nil # Don't find anything!
43
+ # we did not find the requested key
44
+ raise ::APIMatchers::Core::Exceptions::KeyNotFound.new("key was not found")
22
45
  end
23
46
  end
24
47
  end
@@ -12,14 +12,24 @@ module APIMatchers
12
12
  {}
13
13
  end
14
14
 
15
- node = Core::FindInJSON.new(json).find(node: @expected_node.to_s)
15
+ begin
16
+ options = {}
17
+ options[:node] = @expected_node.to_s
18
+ unless @with_value.nil?
19
+ options[:value] = @with_value
20
+ end
16
21
 
17
- if @with_value
18
- node.to_s == @with_value.to_s
19
- elsif @expected_including_text
20
- node.to_s.include?(@expected_including_text)
21
- else
22
- node.present?
22
+ node = Core::FindInJSON.new(json).find( options )
23
+
24
+ if @expected_including_text
25
+ node.to_s.include?(@expected_including_text)
26
+ else
27
+ # the node is present
28
+ true
29
+ end
30
+ rescue ::APIMatchers::Core::Exceptions::KeyNotFound
31
+ # the key was not found
32
+ false
23
33
  end
24
34
  end
25
35
  end
@@ -1,3 +1,3 @@
1
1
  module APIMatchers
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -15,11 +15,11 @@ module APIMatchers::Core
15
15
 
16
16
  context 'when node do not exists' do
17
17
  it "should return nil if don't find the expected node" do
18
- FindInJSON.new('product' => 'pabx').find(node: 'developers').should be nil
18
+ expect{ FindInJSON.new('product' => 'pabx').find(node: 'developers').should raise_error( ::APIMatchers::Core::Exceptions::KeyNotFound ) }
19
19
  end
20
20
 
21
21
  it "should return nil if don't find the expected node in the deep JSON" do
22
- FindInJSON.new('transaction' => { 'id' => 150, 'error' => {} }).find(node: 'code').should be nil
22
+ expect{ FindInJSON.new('transaction' => { 'id' => 150, 'error' => {} }).find(node: 'code').should raise_error( ::APIMatchers::Core::Exceptions::KeyNotFound ) }
23
23
  end
24
24
  end
25
25
  end
@@ -9,7 +9,7 @@ describe APIMatchers::ResponseBody::HaveJsonNode do
9
9
 
10
10
  it "should fail when the expected key does not exist" do
11
11
  expect {
12
- { :product => 'pabx' }.to_json.should have_json_node(:developers)
12
+ { :product => 'pabx' }.to_json.should have_json_node(:developers)
13
13
  }.to fail_with(%Q{expected to have node called: 'developers'. Got: '{"product":"pabx"}'})
14
14
  end
15
15
 
@@ -17,9 +17,44 @@ describe APIMatchers::ResponseBody::HaveJsonNode do
17
17
  { :product => 'payment-gateway' }.to_json.should have_json_node(:product).with('payment-gateway')
18
18
  end
19
19
 
20
+ it "should pass when the expected key exist with the expected value (as integer)" do
21
+ { :number => 1 }.to_json.should have_json_node(:number).with(1)
22
+ end
23
+
24
+ it "should pass when the expected key exist with the expected value (as boolean, true)" do
25
+ { :number => true }.to_json.should have_json_node(:number).with(true)
26
+ end
27
+
28
+ it "should pass when the expected key exist with the expected value (as boolean, false)" do
29
+ { :number => false }.to_json.should have_json_node(:number).with(false)
30
+ end
31
+
32
+ it "should pass when the expected key exist but the expected value is wrong (as boolean, true)" do
33
+ { :number => true }.to_json.should_not have_json_node(:number).with(false)
34
+ end
35
+
36
+ it "should pass when the expected key exist but the expected value is wrong (as boolean, false)" do
37
+ { :number => false }.to_json.should_not have_json_node(:number).with(true)
38
+ end
39
+
40
+ it "should pass when the expected key exists with the expected value (as DateTime)" do
41
+ now = DateTime.now
42
+ { :date => now }.to_json.should have_json_node(:date).with(now)
43
+ end
44
+
45
+ it "should pass when the expected key exists with the expected value (as Date)" do
46
+ now = Date.today
47
+ { :date => now }.to_json.should have_json_node(:date).with(now)
48
+ end
49
+
50
+ it "should pass when the expected key exists with the expected value (as Time)" do
51
+ now = Time.now
52
+ { :time => now }.to_json.should have_json_node(:time).with(now)
53
+ end
54
+
20
55
  it "should fail when the expected key exist but the expected value don't exist" do
21
56
  expect {
22
- { :product => 'payment-gateway' }.to_json.should have_json_node(:product).with('email-marketing')
57
+ { :product => 'payment-gateway' }.to_json.should have_json_node(:product).with('email-marketing')
23
58
  }.to fail_with(%Q{expected to have node called: 'product' with value: 'email-marketing'. Got: '{"product":"payment-gateway"}'})
24
59
  end
25
60
 
@@ -30,25 +65,111 @@ describe APIMatchers::ResponseBody::HaveJsonNode do
30
65
  end
31
66
  end
32
67
 
33
- context 'expected key and value in more deep in the JSON' do
34
- it "should pass when the expected key exist" do
35
- { :transaction => { :id => 150 } }.to_json.should have_json_node(:id)
68
+ context 'expected key and nil value' do
69
+ it "should pass when the expected key exists" do
70
+ { :product => nil }.to_json.should have_json_node(:product)
36
71
  end
37
72
 
38
- it "should pass when the expected key and expected value exist" do
39
- { :transaction => { :error => { :code => '999' } } }.to_json.should have_json_node(:code).with('999')
73
+ it "should pass when the expected key exists and the expected value is nil" do
74
+ { :product => nil }.to_json.should have_json_node(:product).with( nil )
40
75
  end
41
76
 
42
- it "should fail when the expected key does not exist" do
77
+ it "should fail when the expected key exist but the expected value don't exist" do
43
78
  expect {
44
- { :transaction => { :id => 150, :error => {} } }.to_json.should have_json_node(:code)
45
- }.to fail_with(%Q{expected to have node called: 'code'. Got: '{"transaction":{"id":150,"error":{}}}'})
79
+ { :product => nil }.to_json.should have_json_node(:product).with('email-marketing')
80
+ }.to fail_with(%Q{expected to have node called: 'product' with value: 'email-marketing'. Got: '{"product":null}'})
46
81
  end
82
+ end
47
83
 
48
- it "should fail when the expected key exist but don't exist the expected value" do
49
- expect {
50
- { :transaction => { :id => 150, :error => { :code => '999' } } }.to_json.should have_json_node(:code).with('001')
51
- }.to fail_with(%Q{expected to have node called: 'code' with value: '001'. Got: '{"transaction":{"id":150,"error":{"code":"999"}}}'})
84
+ context 'expected key and value in more deep in the JSON' do
85
+ context '.to_json used' do
86
+ it "should pass when the expected key exist" do
87
+ { :transaction => { :id => 150 } }.to_json.should have_json_node(:id)
88
+ end
89
+
90
+ it "should pass when the expected key and expected value exist" do
91
+ { :transaction => { :error => { :code => '999' } } }.to_json.should have_json_node(:code).with('999')
92
+ end
93
+
94
+ it "should pass when the expected key and expected value exist in very deep" do
95
+ { :first=>"A", :second=>nil, :third=>{ :stuff => { :first_stuff=>{ :color=>"green", :size=>"small", :shape=>"circle", :uid=>"first_stuff"}, :second_stuff=>{ :color=>"blue", :size=>"large", :shape=>"square", :uid=>"second_stuff"}}, :junk=>[{"name"=>"junk_one", :uid=>"junk_one", :stuff_uid=>"first_stuff"}, { :name=>"junk_two", :uid=>"junk_two", :stuff_uid=>"second_stuff"}]}}.to_json.should have_json_node( :junk )
96
+ end
97
+
98
+ it "should pass when the expected key and expected value exist in very deep" do
99
+ { :first=>"A", :second=>nil, :third=>{ :stuff => { :first_stuff=>{ :color=>"green", :size=>"small", :shape=>"circle", :uid=>"first_stuff"}, :second_stuff=>{ :color=>"blue", :size=>"large", :shape=>"square", :uid=>"second_stuff"}}, :junk=>[{"name"=>"junk_one", :uid=>"junk_one", :stuff_uid=>"first_stuff"}, { :name=>"junk_two", :uid=>"junk_two", :stuff_uid=>"second_stuff"}]}}.to_json.should have_json_node( :name ).with( "junk_two" )
100
+ end
101
+
102
+ it "should fail when the expected key does not exist" do
103
+ expect {
104
+ { :transaction => { :id => 150, :error => {} } }.to_json.should have_json_node(:code)
105
+ }.to fail_with(%Q{expected to have node called: 'code'. Got: '{"transaction":{"id":150,"error":{}}}'})
106
+ end
107
+
108
+ it "should fail when the expected key exist but don't exist the expected value" do
109
+ expect {
110
+ { :transaction => { :id => 150, :error => { :code => '999' } } }.to_json.should have_json_node(:code).with('001')
111
+ }.to fail_with(%Q{expected to have node called: 'code' with value: '001'. Got: '{"transaction":{"id":150,"error":{"code":"999"}}}'})
112
+ end
113
+ end
114
+ context 'json string used' do
115
+ it "should pass when the expected key exist" do
116
+ '{ "transaction": {"id": 150 } }'.should have_json_node(:id)
117
+ end
118
+
119
+ it "should pass when the expected key and expected value exist" do
120
+ '{ "transaction": {"error": { "code": "999" } } }'.should have_json_node(:code).with('999')
121
+ end
122
+
123
+ it "should pass when the expected key exist with the expected value (as integer)" do
124
+ '{"number":1 }'.should have_json_node(:number).with(1)
125
+ end
126
+
127
+ it "should pass when the expected key exist with the expected value (as boolean)" do
128
+ '{"boolean":true}'.should have_json_node(:boolean).with(true)
129
+ end
130
+
131
+ it "should pass when the expected key exists with the expected value (as DateTime)" do
132
+ now = DateTime.parse( "2012-09-18T15:42:12-07:00" )
133
+ '{"date": "2012-09-18T15:42:12-07:00"}'.should have_json_node(:date).with(now)
134
+ end
135
+
136
+ it "should pass when the expected key exists with the expected value (as Date)" do
137
+ now = Date.parse( "2012-09-18" )
138
+ '{"date": "2012-09-18"}'.should have_json_node(:date).with(now)
139
+ end
140
+
141
+ it "should pass when the expected key exists with the expected value (as Time)" do
142
+ now = Time.parse("2012-09-18T15:42:12Z")
143
+ '{"time": "2012-09-18T15:42:12+00:00"}'.should have_json_node(:time).with(now)
144
+ end
145
+
146
+ it "should pass when the expected key exist with the expected value (as boolean) in a multi node" do
147
+ '{"uid":"123456","boolean":true}'.should have_json_node(:boolean).with(true)
148
+ end
149
+
150
+ it "should pass when the expected key and expected value exist in very deep" do
151
+ '{"first":"A","second":null,"third":{"stuff":{"first_stuff":{"color":"green","size":"small","shape":"circle","uid":"first_stuff"},"second_stuff":{"color":"blue","size":"large","shape":"square","uid":"second_stuff"}},"junk":[{"name":"junk_one","uid":"junk_one","stuff_uid":"first_stuff"},{"name":"junk_two","uid":"junk_two","stuff_uid":"second_stuff"}]}}'.should have_json_node( :junk )
152
+ end
153
+
154
+ it "should pass when the expected key and expected value exist in very deep" do
155
+ '{"first":"A","second":null,"third":{"stuff":{"first_stuff":{"color":"green","size":"small","shape":"circle","uid":"first_stuff"},"second_stuff":{"color":"blue","size":"large","shape":"square","uid":"second_stuff"}},"junk":[{"name":"junk_one","uid":"junk_one","stuff_uid":"first_stuff"},{"name":"junk_two","uid":"junk_two","stuff_uid":"second_stuff"}]}}'.should have_json_node( :name ).with( "junk_two" )
156
+ end
157
+
158
+ it "should pass when the expected key and including text exist" do
159
+ '{"Key":"A=123456-abcdef-09876-ghijkl; path=/; expires=Sun, 05-Sep-2032 05:50:39 GMT\nB=ABCDEF123456; path=/; expires=Sun, 05-Sep-2032 05:50:39 GMT", "Content-Type":"application/json; charset=utf-8"}'.should have_json_node( "Key" ).including_text( "123456-abcdef-09876-ghijkl" )
160
+ end
161
+
162
+ it "should fail when the expected key does not exist" do
163
+ expect {
164
+ '{"transaction":{"id":150,"error":{}}}'.should have_json_node(:code)
165
+ }.to fail_with(%Q{expected to have node called: 'code'. Got: '{"transaction":{"id":150,"error":{}}}'})
166
+ end
167
+
168
+ it "should fail when the expected key exist but don't exist the expected value" do
169
+ expect {
170
+ '{"transaction":{"id":150,"error":{"code":"999"}}}'.should have_json_node(:code).with('001')
171
+ }.to fail_with(%Q{expected to have node called: 'code' with value: '001'. Got: '{"transaction":{"id":150,"error":{"code":"999"}}}'})
172
+ end
52
173
  end
53
174
  end
54
175
 
@@ -76,7 +197,7 @@ describe APIMatchers::ResponseBody::HaveJsonNode do
76
197
 
77
198
  it "should fail when the expected key exist" do
78
199
  expect {
79
- { :status => 'paid' }.to_json.should_not have_json_node(:status)
200
+ { :status => 'paid' }.to_json.should_not have_json_node(:status)
80
201
  }.to fail_with(%Q{expected to NOT have node called: 'status'. Got: '{"status":"paid"}'})
81
202
  end
82
203
 
@@ -86,7 +207,7 @@ describe APIMatchers::ResponseBody::HaveJsonNode do
86
207
 
87
208
  it "should fail when have the expected key and have the expected value" do
88
209
  expect {
89
- { :status => 'paid' }.to_json.should_not have_json_node(:status).with('paid')
210
+ { :status => 'paid' }.to_json.should_not have_json_node(:status).with('paid')
90
211
  }.to fail_with(%Q{expected to NOT have node called: 'status' with value: 'paid'. Got: '{"status":"paid"}'})
91
212
  end
92
213
 
@@ -30,7 +30,7 @@ describe APIMatchers::ResponseBody::HaveXmlNode do
30
30
  end
31
31
  end
32
32
 
33
- context 'expected key and value in more deep in the JSON' do
33
+ context 'expected key and value in more deep in the XML' do
34
34
  it "should pass when the expected key exist" do
35
35
  "<transaction><id>150</id></transaction>".should have_xml_node(:id)
36
36
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api_matchers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-02 00:00:00.000000000Z
12
+ date: 2012-10-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &2160643300 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: 2.10.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2160643300
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 2.10.0
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: activesupport
27
- requirement: &2160642800 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: 3.2.5
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *2160642800
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 3.2.5
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: nokogiri
38
- requirement: &2160642340 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,7 +53,12 @@ dependencies:
43
53
  version: 1.5.2
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *2160642340
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.5.2
47
62
  description: Collection of RSpec matchers for create your API.
48
63
  email:
49
64
  - tomas_stefano@successoft.com
@@ -61,6 +76,7 @@ files:
61
76
  - Rakefile
62
77
  - api_matchers.gemspec
63
78
  - lib/api_matchers.rb
79
+ - lib/api_matchers/core/exceptions.rb
64
80
  - lib/api_matchers/core/find_in_json.rb
65
81
  - lib/api_matchers/core/rspec_matchers.rb
66
82
  - lib/api_matchers/core/setup.rb
@@ -112,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
112
128
  version: '0'
113
129
  requirements: []
114
130
  rubyforge_project:
115
- rubygems_version: 1.8.17
131
+ rubygems_version: 1.8.24
116
132
  signing_key:
117
133
  specification_version: 3
118
134
  summary: Collection of RSpec matchers for create your API.