adyen 2.2.0 → 2.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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.travis.yml +12 -5
  4. data/CHANGELOG.md +5 -2
  5. data/CONTRIBUTING.md +1 -1
  6. data/Gemfile +4 -0
  7. data/README.md +0 -2
  8. data/Rakefile +2 -8
  9. data/adyen.gemspec +4 -5
  10. data/lib/adyen/api.rb +14 -10
  11. data/lib/adyen/api/payment_service.rb +35 -4
  12. data/lib/adyen/api/templates/payment_service.rb +5 -0
  13. data/lib/adyen/form.rb +1 -1
  14. data/lib/adyen/hpp/request.rb +8 -6
  15. data/lib/adyen/rest.rb +21 -8
  16. data/lib/adyen/rest/client.rb +13 -0
  17. data/lib/adyen/templates/notification_migration.rb +1 -1
  18. data/lib/adyen/templates/notification_model.rb +2 -2
  19. data/lib/adyen/version.rb +1 -1
  20. data/{spec/functional/api_spec.rb → test/functional/api_test.rb} +38 -33
  21. data/{spec → test}/functional/initializer.rb.ci +0 -0
  22. data/{spec → test}/functional/initializer.rb.sample +0 -0
  23. data/test/helpers/views/hpp.erb +15 -15
  24. data/test/test_helper.rb +1 -0
  25. data/{spec/api/api_spec.rb → test/unit/api/api_test.rb} +7 -7
  26. data/{spec/api/payment_service_spec.rb → test/unit/api/payment_service_test.rb} +149 -117
  27. data/{spec/api/recurring_service_spec.rb → test/unit/api/recurring_service_test.rb} +49 -46
  28. data/{spec/api/response_spec.rb → test/unit/api/response_test.rb} +12 -12
  29. data/{spec/api/simple_soap_client_spec.rb → test/unit/api/simple_soap_client_test.rb} +27 -30
  30. data/{spec/api/spec_helper.rb → test/unit/api/test_helper.rb} +44 -35
  31. data/{spec/api/test_helpers_spec.rb → test/unit/api/test_helpers_test.rb} +11 -11
  32. data/test/{form_test.rb → unit/form_test.rb} +0 -0
  33. data/test/unit/hpp/request_test.rb +68 -0
  34. data/test/{hpp → unit/hpp}/signature_test.rb +0 -0
  35. data/test/{hpp_test.rb → unit/hpp_test.rb} +0 -0
  36. data/test/{rest → unit/rest}/signature_test.rb +0 -0
  37. data/test/{rest_list_recurring_details_response_test.rb → unit/rest_list_recurring_details_response_test.rb} +0 -0
  38. data/test/{rest_request_test.rb → unit/rest_request_test.rb} +0 -0
  39. data/test/{rest_response_test.rb → unit/rest_response_test.rb} +0 -0
  40. data/test/{signature_test.rb → unit/signature_test.rb} +0 -0
  41. data/test/{util_test.rb → unit/util_test.rb} +0 -0
  42. metadata +53 -61
  43. data/spec/spec_helper.rb +0 -8
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
- require 'api/spec_helper'
2
+ require 'unit/api/test_helper'
3
3
  require 'date'
4
4
 
5
5
  describe Adyen::API::RecurringService do
@@ -46,15 +46,15 @@ describe Adyen::API::RecurringService do
46
46
  :shopper => [:reference]
47
47
 
48
48
  it "includes the merchant account handle" do
49
- text('./recurring:merchantAccount').should == 'SuperShopper'
49
+ text('./recurring:merchantAccount').must_equal 'SuperShopper'
50
50
  end
51
51
 
52
- it "includes the shoppers reference" do
53
- text('./recurring:shopperReference').should == 'user-id'
52
+ it "includes the shopper's reference" do
53
+ text('./recurring:shopperReference').must_equal 'user-id'
54
54
  end
55
55
 
56
56
  it "includes the type of contract, which is always `RECURRING'" do
57
- text('./recurring:recurring/payment:contract').should == 'RECURRING'
57
+ text('./recurring:recurring/payment:contract').must_equal 'RECURRING'
58
58
  end
59
59
  end
60
60
 
@@ -104,17 +104,17 @@ describe Adyen::API::RecurringService do
104
104
  })
105
105
 
106
106
  it "returns an array with just the detail references" do
107
- @response.references.should == %w{ RecurringDetailReference1 RecurringDetailReference2 RecurringDetailReference3 }
107
+ @response.references.must_equal %w{ RecurringDetailReference1 RecurringDetailReference2 RecurringDetailReference3 }
108
108
  end
109
109
  end
110
110
 
111
111
  describe_response_from :list, LIST_EMPTY_RESPONSE, 'listRecurringDetails' do
112
112
  it "returns an empty hash when there are no details" do
113
- @recurring.list.params.should == {}
113
+ @recurring.list.params.must_equal({})
114
114
  end
115
115
 
116
116
  it "returns an empty array when there are no references" do
117
- @response.references.should == []
117
+ @response.references.must_equal []
118
118
  end
119
119
  end
120
120
 
@@ -123,29 +123,32 @@ describe Adyen::API::RecurringService do
123
123
  :shopper => [:reference]
124
124
 
125
125
  it "includes the merchant account handle" do
126
- text('./recurring:merchantAccount').should == 'SuperShopper'
126
+ text('./recurring:merchantAccount').must_equal 'SuperShopper'
127
127
  end
128
128
 
129
- it "includes the shoppers reference" do
130
- text('./recurring:shopperReference').should == 'user-id'
129
+ it "includes the shopper's reference" do
130
+ text('./recurring:shopperReference').must_equal 'user-id'
131
131
  end
132
132
 
133
- it "includes the shopper’s recurring detail reference if it is given" do
134
- xpath('./recurring:recurringDetailReference').should be_empty
133
+ it "does not provide a recurring details reference by default" do
134
+ xpath('./recurring:recurringDetailReference').must_be :empty?
135
+ end
136
+
137
+ it "includes the shopper's recurring detail reference if it is given" do
135
138
  @recurring.params[:recurring_detail_reference] = 'RecurringDetailReference1'
136
- text('./recurring:recurringDetailReference').should == 'RecurringDetailReference1'
139
+ text('./recurring:recurringDetailReference').must_equal 'RecurringDetailReference1'
137
140
  end
138
141
  end
139
142
 
140
143
  describe_response_from :disable, (DISABLE_RESPONSE % '[detail-successfully-disabled]'), 'disable' do
141
144
  it "returns whether or not it was disabled" do
142
- @response.should be_success
143
- @response.should be_disabled
145
+ @response.must_be :success?
146
+ @response.must_be :disabled?
144
147
 
145
148
  stub_net_http(DISABLE_RESPONSE % '[all-details-successfully-disabled]')
146
149
  @response = @recurring.disable
147
- @response.should be_success
148
- @response.should be_disabled
150
+ @response.must_be :success?
151
+ @response.must_be :disabled?
149
152
  end
150
153
 
151
154
  it_should_return_params_for_each_xml_backend(:response => '[detail-successfully-disabled]')
@@ -156,35 +159,35 @@ describe Adyen::API::RecurringService do
156
159
  :shopper => [:email, :reference]
157
160
 
158
161
  it "includes the merchant account handle" do
159
- text('./recurring:merchantAccount').should == 'SuperShopper'
162
+ text('./recurring:merchantAccount').must_equal 'SuperShopper'
160
163
  end
161
164
 
162
- it "includes the shoppers reference" do
163
- text('./recurring:shopperReference').should == 'user-id'
165
+ it "includes the shopper's reference" do
166
+ text('./recurring:shopperReference').must_equal 'user-id'
164
167
  end
165
168
 
166
- it "includes the shoppers email" do
167
- text('./recurring:shopperEmail').should == 's.hopper@example.com'
169
+ it "includes the shopper's email" do
170
+ text('./recurring:shopperEmail').must_equal 's.hopper@example.com'
168
171
  end
169
172
 
170
173
  it "includes the creditcard details" do
171
174
  xpath('./recurring:card') do |card|
172
175
  # there's no reason why Nokogiri should escape these characters, but as long as they're correct
173
- card.text('./payment:holderName').should == 'Simon わくわく Hopper'
174
- card.text('./payment:number').should == '4444333322221111'
175
- card.text('./payment:cvc').should == '737'
176
- card.text('./payment:expiryMonth').should == '12'
177
- card.text('./payment:expiryYear').should == '2012'
176
+ card.text('./payment:holderName').must_equal 'Simon わくわく Hopper'
177
+ card.text('./payment:number').must_equal '4444333322221111'
178
+ card.text('./payment:cvc').must_equal '737'
179
+ card.text('./payment:expiryMonth').must_equal '12'
180
+ card.text('./payment:expiryYear').must_equal '2012'
178
181
  end
179
182
  end
180
183
 
181
- it "formats the creditcards expiry month as a two digit number" do
184
+ it "formats the creditcard's expiry month as a two digit number" do
182
185
  @recurring.params[:card][:expiry_month] = 6
183
- text('./recurring:card/payment:expiryMonth').should == '06'
186
+ text('./recurring:card/payment:expiryMonth').must_equal '06'
184
187
  end
185
188
 
186
189
  it "includes the necessary recurring and one-click contract info if the `:recurring' param is truthful" do
187
- text('./recurring:recurring/payment:contract').should == 'RECURRING'
190
+ text('./recurring:recurring/payment:contract').must_equal 'RECURRING'
188
191
  end
189
192
  end
190
193
 
@@ -193,42 +196,42 @@ describe Adyen::API::RecurringService do
193
196
  :shopper => [:email, :reference]
194
197
 
195
198
  it "includes the merchant account handle" do
196
- text('./recurring:merchantAccount').should == 'SuperShopper'
199
+ text('./recurring:merchantAccount').must_equal 'SuperShopper'
197
200
  end
198
201
 
199
- it "includes the shoppers reference" do
200
- text('./recurring:shopperReference').should == 'user-id'
202
+ it "includes the shopper's reference" do
203
+ text('./recurring:shopperReference').must_equal 'user-id'
201
204
  end
202
205
 
203
- it "includes the shoppers email" do
204
- text('./recurring:shopperEmail').should == 's.hopper@example.com'
206
+ it "includes the shopper's email" do
207
+ text('./recurring:shopperEmail').must_equal 's.hopper@example.com'
205
208
  end
206
209
 
207
210
  it "includes the ELV details" do
208
211
  xpath('./recurring:elv') do |elv|
209
212
  # there's no reason why Nokogiri should escape these characters, but as long as they're correct
210
- elv.text('./payment:accountHolderName').should == 'Simon わくわく Hopper'
211
- elv.text('./payment:bankAccountNumber').should == '1234567890'
212
- elv.text('./payment:bankLocation').should == 'Berlin'
213
- elv.text('./payment:bankLocationId').should == '12345678'
214
- elv.text('./payment:bankName').should == 'TestBank'
213
+ elv.text('./payment:accountHolderName').must_equal 'Simon わくわく Hopper'
214
+ elv.text('./payment:bankAccountNumber').must_equal '1234567890'
215
+ elv.text('./payment:bankLocation').must_equal 'Berlin'
216
+ elv.text('./payment:bankLocationId').must_equal '12345678'
217
+ elv.text('./payment:bankName').must_equal 'TestBank'
215
218
  end
216
219
  end
217
220
 
218
221
  it "includes the necessary recurring and one-click contract info if the `:recurring' param is truthful" do
219
- text('./recurring:recurring/payment:contract').should == 'RECURRING'
222
+ text('./recurring:recurring/payment:contract').must_equal 'RECURRING'
220
223
  end
221
224
  end
222
225
 
223
226
  describe_response_from :disable, (DISABLE_RESPONSE % '[detail-successfully-disabled]'), 'disable' do
224
227
  it "returns whether or not it was disabled" do
225
- @response.should be_success
226
- @response.should be_disabled
228
+ @response.must_be :success?
229
+ @response.must_be :disabled?
227
230
 
228
231
  stub_net_http(DISABLE_RESPONSE % '[all-details-successfully-disabled]')
229
232
  @response = @recurring.disable
230
- @response.should be_success
231
- @response.should be_disabled
233
+ @response.must_be :success?
234
+ @response.must_be :disabled?
232
235
  end
233
236
 
234
237
  it_should_return_params_for_each_xml_backend(:response => '[detail-successfully-disabled]')
@@ -1,23 +1,23 @@
1
1
  # encoding: UTF-8
2
- require 'api/spec_helper'
2
+ require 'unit/api/test_helper'
3
3
 
4
4
  describe Adyen::API::Response do
5
5
  before do
6
6
  http_response = Net::HTTPOK.new('1.1', '200', 'OK')
7
7
  http_response.add_field('Content-type', 'text/xml')
8
- http_response.stub(:body).and_return(AUTHORISE_RESPONSE)
8
+ http_response.stubs(:body).returns(AUTHORISE_RESPONSE)
9
9
  @response = Adyen::API::Response.new(http_response)
10
10
  end
11
11
 
12
12
  it "returns a XMLQuerier instance with the response body" do
13
- @response.xml_querier.should be_instance_of(Adyen::API::XMLQuerier)
14
- @response.xml_querier.to_s.rstrip.should == AUTHORISE_RESPONSE.rstrip
13
+ @response.xml_querier.must_be_instance_of(Adyen::API::XMLQuerier)
14
+ @response.xml_querier.to_s.rstrip.must_equal AUTHORISE_RESPONSE.rstrip
15
15
  end
16
16
 
17
17
  describe "with a successful HTTP response" do
18
18
  it "returns that the (HTTP) request was a success" do
19
- @response.should_not be_a_http_failure
20
- @response.should be_a_success
19
+ @response.wont_be :http_failure?
20
+ @response.must_be :success?
21
21
  end
22
22
  end
23
23
 
@@ -28,32 +28,32 @@ describe Adyen::API::Response do
28
28
  end
29
29
 
30
30
  it "returns that the (HTTP) request was not a success" do
31
- @response.should be_a_http_failure
32
- @response.should_not be_a_success
31
+ @response.must_be :http_failure?
32
+ @response.wont_be :success?
33
33
  end
34
34
  end
35
35
 
36
36
  describe "with a server error HTTP response and _no_ SOAP fault message" do
37
37
  before do
38
38
  http_response = Net::HTTPServerError.new('1.1', '500', 'Internal Server Error')
39
- http_response.stub(:body).and_return(%{<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body></soap:Body></soap:Envelope>})
39
+ http_response.stubs(:body).returns(%{<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body></soap:Body></soap:Envelope>})
40
40
  @response = Adyen::API::Response.new(http_response)
41
41
  end
42
42
 
43
43
  it "`server_error?` returns that the (HTTP) request did cause a server error" do
44
- @response.server_error?.should be true
44
+ @response.must_be :server_error?
45
45
  end
46
46
  end
47
47
 
48
48
  describe "with a server error HTTP response _and_ SOAP fault message" do
49
49
  before do
50
50
  http_response = Net::HTTPServerError.new('1.1', '500', 'Internal Server Error')
51
- http_response.stub(:body).and_return(%{<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Illegal argument. For input string: "100.0"</faultstring></soap:Fault></soap:Body></soap:Envelope>})
51
+ http_response.stubs(:body).returns(%{<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Illegal argument. For input string: "100.0"</faultstring></soap:Fault></soap:Body></soap:Envelope>})
52
52
  @response = Adyen::API::Response.new(http_response)
53
53
  end
54
54
 
55
55
  it "`server_error?` returns that the (HTTP) request did not cause a server error" do
56
- @response.server_error?.should be false
56
+ @response.wont_be :server_error?
57
57
  end
58
58
  end
59
59
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
- require 'api/spec_helper'
2
+ require 'unit/api/test_helper'
3
3
 
4
4
  module APISpecHelper
5
5
  class SOAPClient < Adyen::API::SimpleSOAPClient
@@ -16,17 +16,17 @@ describe Adyen::API::SimpleSOAPClient do
16
16
 
17
17
  it "returns the endpoint, for the current environment, from the ENDPOINT_URI constant" do
18
18
  uri = APISpecHelper::SOAPClient.endpoint
19
- uri.scheme.should == 'https'
20
- uri.host.should == 'test.example.com'
21
- uri.path.should == '/soap/Action'
19
+ uri.scheme.must_equal 'https'
20
+ uri.host.must_equal 'test.example.com'
21
+ uri.path.must_equal '/soap/Action'
22
22
  end
23
23
 
24
24
  it "initializes with the given parameters" do
25
- @client.params[:reference].should == 'order-id'
25
+ @client.params[:reference].must_equal 'order-id'
26
26
  end
27
27
 
28
28
  it "merges the default parameters with the given ones" do
29
- @client.params[:merchant_account].should == 'SuperShopper'
29
+ @client.params[:merchant_account].must_equal 'SuperShopper'
30
30
  end
31
31
 
32
32
  describe "call_webservice_action" do
@@ -42,38 +42,36 @@ describe Adyen::API::SimpleSOAPClient do
42
42
 
43
43
  it "posts to the class's endpoint" do
44
44
  endpoint = APISpecHelper::SOAPClient.endpoint
45
- @request.host.should == endpoint.host
46
- @request.port.should == endpoint.port
47
- @post.path.should == endpoint.path
45
+ @request.host.must_equal endpoint.host
46
+ @request.port.must_equal endpoint.port
47
+ @post.path.must_equal endpoint.path
48
48
  end
49
49
 
50
50
  it "makes a request over SSL" do
51
- @request.use_ssl?.should be true
51
+ @request.must_be :use_ssl?
52
52
  end
53
53
 
54
54
  it "verifies certificates" do
55
- File.should exist(Adyen::API::SimpleSOAPClient::CACERT)
56
- @request.ca_file.should == Adyen::API::SimpleSOAPClient::CACERT
57
- @request.verify_mode.should == OpenSSL::SSL::VERIFY_PEER
55
+ File.must_be :exist?, Adyen::API::SimpleSOAPClient::CACERT
56
+ @request.ca_file.must_equal Adyen::API::SimpleSOAPClient::CACERT
57
+ @request.verify_mode.must_equal OpenSSL::SSL::VERIFY_PEER
58
58
  end
59
59
 
60
60
  it "uses basic-authentication with the credentials set on the Adyen::API module" do
61
61
  username, password = @post.assigned_basic_auth
62
- username.should == 'SuperShopper'
63
- password.should == 'secret'
62
+ username.must_equal 'SuperShopper'
63
+ password.must_equal 'secret'
64
64
  end
65
65
 
66
66
  it "sends the proper headers" do
67
- @post.header.should include(
68
- 'accept' => ['text/xml'],
69
- 'content-type' => ['text/xml; charset=utf-8'],
70
- 'soapaction' => ['Action']
71
- )
67
+ @post.header.
68
+ values_at('accept', 'content-type', 'soapaction').
69
+ must_equal([['text/xml'], ['text/xml; charset=utf-8'], ['Action']])
72
70
  end
73
71
 
74
72
  it "returns an Adyen::API::Response instance" do
75
- @response.should be_instance_of(Adyen::API::Response)
76
- @response.xml_querier.to_s.rstrip.should == AUTHORISE_RESPONSE.rstrip
73
+ @response.must_be_instance_of(Adyen::API::Response)
74
+ @response.xml_querier.to_s.rstrip.must_equal AUTHORISE_RESPONSE.rstrip
77
75
  end
78
76
 
79
77
  [
@@ -84,7 +82,7 @@ describe Adyen::API::SimpleSOAPClient do
84
82
  ]
85
83
  ].each do |label, response, expected_exception|
86
84
  it "raises when the HTTP response is a subclass of #{response.class.name}" do
87
- response.stub(:body).and_return(%{<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Illegal argument. For input string: "100.0"</faultstring></soap:Fault></soap:Body></soap:Envelope>})
85
+ response.stubs(:body).returns(%{<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Illegal argument. For input string: "100.0"</faultstring></soap:Fault></soap:Body></soap:Envelope>})
88
86
  Net::HTTP.stubbed_response = response
89
87
 
90
88
  exception = nil
@@ -93,7 +91,7 @@ describe Adyen::API::SimpleSOAPClient do
93
91
  rescue expected_exception => e
94
92
  exception = e
95
93
  end
96
- exception.message.should == %{#{label} error occurred while calling SOAP action `Action' on endpoint `https://test.example.com/soap/Action'. Fault message: Illegal argument. For input string: "100.0".}
94
+ exception.message.must_equal %{#{label} error occurred while calling SOAP action `Action' on endpoint `https://test.example.com/soap/Action'. Fault message: Illegal argument. For input string: "100.0".}
97
95
  end
98
96
  end
99
97
 
@@ -107,7 +105,7 @@ describe Adyen::API::SimpleSOAPClient do
107
105
  ["[505 HTTP Version Not Supported] A server", Net::HTTPBadGateway.new('1.1', '505', 'HTTP Version Not Supported')],
108
106
  ].each do |label, response|
109
107
  it "is raised when the HTTP response is a `real` server error by status code" do
110
- response.stub(:body).and_return(%{<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body></soap:Body></soap:Envelope>})
108
+ response.stubs(:body).returns(%{<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body></soap:Body></soap:Envelope>})
111
109
  Net::HTTP.stubbed_response = response
112
110
 
113
111
  exception = nil
@@ -116,17 +114,16 @@ describe Adyen::API::SimpleSOAPClient do
116
114
  rescue Adyen::API::SimpleSOAPClient::ServerError => e
117
115
  exception = e
118
116
  end
119
- exception.message.should == %{#{label} error occurred while calling SOAP action `Action' on endpoint `https://test.example.com/soap/Action'.}
117
+ exception.message.must_equal %{#{label} error occurred while calling SOAP action `Action' on endpoint `https://test.example.com/soap/Action'.}
120
118
  end
121
119
  end
122
120
 
123
121
  it "is not raised when the HTTP response has a 500 status code with a fault message" do
124
122
  response = Net::HTTPServerError.new('1.1', '500', 'Internal Server Error')
125
- response.stub(:body).and_return(%{<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Illegal argument. For input string: "100.0"</faultstring></soap:Fault></soap:Body></soap:Envelope>})
123
+ response.stubs(:body).returns(%{<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>Illegal argument. For input string: "100.0"</faultstring></soap:Fault></soap:Body></soap:Envelope>})
126
124
 
127
- lambda do
128
- @client.call_webservice_action('Action', '<bananas>Yes, please</bananas>', Adyen::API::Response)
129
- end.should_not raise_error
125
+ @client.call_webservice_action('Action', '<bananas>Yes, please</bananas>', Adyen::API::Response)
126
+ pass
130
127
  end
131
128
  end
132
129
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
- require 'spec_helper'
2
+ require 'test_helper'
3
3
 
4
4
  require 'adyen/api'
5
5
 
@@ -31,7 +31,8 @@ module Net
31
31
  end
32
32
 
33
33
  class << self
34
- attr_accessor :stubbing_enabled, :posted, :stubbed_response
34
+ attr_accessor :posted, :stubbed_response
35
+ attr_reader :stubbing_enabled
35
36
 
36
37
  def stubbing_enabled=(enabled)
37
38
  reset! if @stubbing_enabled = enabled
@@ -53,12 +54,12 @@ module Net
53
54
  end
54
55
 
55
56
  alias old_request request
56
- def request(request)
57
+ def request(request, body = nil, &block)
57
58
  if Net::HTTP.stubbing_enabled
58
59
  self.class.posted = [self, request]
59
60
  self.class.stubbed_response
60
61
  else
61
- old_request(request)
62
+ old_request(request, body, &block)
62
63
  end
63
64
  end
64
65
  end
@@ -82,10 +83,6 @@ module Adyen
82
83
  end
83
84
 
84
85
  module APISpecHelper
85
- def node_for_current_object_and_method
86
- Adyen::API::XMLQuerier.xml(@object.send(@method))
87
- end
88
-
89
86
  def xpath(query, &block)
90
87
  node_for_current_method.xpath(query, &block)
91
88
  end
@@ -97,7 +94,7 @@ module APISpecHelper
97
94
  def stub_net_http(response_body)
98
95
  Net::HTTP.stubbing_enabled = true
99
96
  response = Net::HTTPOK.new('1.1', '200', 'OK')
100
- response.stub(:body).and_return(response_body)
97
+ response.stubs(:body).returns response_body
101
98
  Net::HTTP.stubbed_response = response
102
99
  end
103
100
 
@@ -110,24 +107,18 @@ module APISpecHelper
110
107
  backends = [Adyen::API::XMLQuerier::NokogiriBackend, Adyen::API::XMLQuerier::REXMLBackend]
111
108
  backends.each do |xml_backend|
112
109
  describe "with a #{xml_backend} backend" do
113
- before { Adyen::API::XMLQuerier.stub(:default_backend => xml_backend.new) }
110
+ before do
111
+ Adyen::API::XMLQuerier.stubs(:default_backend).returns xml_backend.new
112
+ end
114
113
  instance_eval(&block)
115
114
  end
116
115
  end
117
116
  end
118
117
 
119
- def it_should_have_shortcut_methods_for_params_on_the_response
120
- it "provides shortcut methods, on the response object, for all entries in the #params hash" do
121
- @response.params.each do |key, value|
122
- @response.send(key).should == value
123
- end
124
- end
125
- end
126
-
127
118
  def it_should_return_params_for_each_xml_backend(params)
128
119
  for_each_xml_backend do
129
120
  it "returns a hash with parsed response details" do
130
- @object.send(@method).params.should == params
121
+ @object.send(@method).params.must_equal params
131
122
  end
132
123
  end
133
124
  end
@@ -150,8 +141,8 @@ module APISpecHelper
150
141
 
151
142
  def it_should_validate_request_param(name, &block)
152
143
  it "validates the `#{name}' request parameter" do
153
- instance_eval &block
154
- lambda { @object.send(@method) }.should raise_error(ArgumentError)
144
+ instance_eval(&block)
145
+ lambda { current_object_method_result }.must_raise(ArgumentError)
155
146
  end
156
147
  end
157
148
 
@@ -170,14 +161,18 @@ module APISpecHelper
170
161
  end
171
162
 
172
163
  it "posts the body generated for the given parameters" do
173
- @post.body.should == Adyen::API::SimpleSOAPClient::ENVELOPE % @object.send("#{@method}_request_body")
164
+ @post.body.must_equal Adyen::API::SimpleSOAPClient::ENVELOPE % @object.send("#{@method}_request_body")
174
165
  end
175
166
 
176
167
  it "posts to the correct SOAP action" do
177
- @post.soap_action.should == soap_action
168
+ @post.soap_action.must_equal soap_action
178
169
  end
179
170
 
180
- it_should_have_shortcut_methods_for_params_on_the_response
171
+ it "provides shortcut methods, on the response object, for all entries in the #params hash" do
172
+ params = @response.params
173
+ result = params.keys.map { |key| @response.send(key) }
174
+ result.must_equal params.values
175
+ end
181
176
 
182
177
  instance_eval(&block)
183
178
  end
@@ -186,33 +181,49 @@ module APISpecHelper
186
181
  def describe_request_body_of(method, xpath = nil, &block)
187
182
  method = "#{method}_request_body"
188
183
  describe(method) do
184
+ prepare_request_body_specs(method, xpath)
189
185
  before { @method = method }
190
- if xpath
191
- define_method(:node_for_current_method) do
192
- node_for_current_object_and_method.xpath(xpath)
193
- end
194
- end
195
186
  instance_eval(&block)
196
187
  end
197
188
  end
198
189
 
199
190
  def describe_modification_request_body_of(method, camelized_method = nil, &block)
200
- describe_request_body_of method, "//payment:#{camelized_method || method}/payment:modificationRequest" do
191
+ xpath = "//payment:#{camelized_method || method}/payment:modificationRequest"
192
+ method = "#{method}_request_body"
193
+ describe method do
194
+ prepare_request_body_specs(method, xpath)
195
+
201
196
  before do
197
+ @method = method
202
198
  @payment.params[:psp_reference] = 'original-psp-reference'
203
199
  end
204
200
 
205
201
  it "includes the merchant account" do
206
- text('./payment:merchantAccount').should == 'SuperShopper'
202
+ text('./payment:merchantAccount').must_equal 'SuperShopper'
207
203
  end
208
204
 
209
205
  it "includes the payment (PSP) reference of the payment to refund" do
210
- text('./payment:originalReference').should == 'original-psp-reference'
206
+ text('./payment:originalReference').must_equal 'original-psp-reference'
211
207
  end
212
208
 
213
209
  instance_eval(&block) if block_given?
214
210
  end
215
211
  end
212
+
213
+ def prepare_request_body_specs(method, xpath)
214
+ let(:current_object_method_result) { @object.send(method) }
215
+
216
+ let(:node_for_current_object_and_method) do
217
+ Adyen::API::XMLQuerier.xml(current_object_method_result)
218
+ end
219
+
220
+ if xpath
221
+ let(:node_for_current_method) do
222
+ node_for_current_object_and_method.xpath(xpath)
223
+ end
224
+ end
225
+ end
226
+
216
227
  end
217
228
  end
218
229
 
@@ -452,9 +463,7 @@ EOS
452
463
 
453
464
  BILLET_RECEIVED_RESPONSE = <<EOS
454
465
  <?xml version="1.0"?>
455
- <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
456
- <soap:Body>
457
- <ns1:authoriseResponse xmlns:ns1="http://payment.services.adyen.com"><ns1:paymentResult><additionalData xmlns="http://payment.services.adyen.com"><entry><key xsi:type="xsd:string">boletobancario.url</key><value xsi:type="xsd:string">https://test.adyen.com/hpp/generationBoleto.shtml?data=AgABAQBdYDe9OqdseA79Rfexm2Lz8fRQ1bWqkLhBCf1fHhQEif7bsRKi0otq%2B1ekMAdMIZUiVXeR3QFrAOA8Zy4tpiNLhkMq6f7W2zFqYhVWrByqxQnbQTYuX2FWI7tsu7Vb0MnyOvFfFdFtaxzImZYCli%2BMrqaAJ5HI9ap3egeqBQIsRI%2Fj0zWsu2EGN16lGbwFOLyxl%2By0Pc5jazTo8rnBA7OVPGDIu7Qt%2F2DYIMcB6PXou5W3aJoTC4SldhNdobVqgWUtES8NsWdOYbLGa6I%2BjSwEFXvxyTXwtw4J2E%2BE7ux1UhBiZRj66lMbcvaYlfnR2xWbA%2BKmdLrVvuXTroEHKQ%2B1C%2FuyGuiOk3SmGq6TMgOyCEt%2BmG%2Bq6z5jDi%2BnYLtlLQU4ccMOujgWMfGkViC%2FXDUlqYjKbn8NHwPwoPcelpf1zCDCe%2Fvu6NBTVQbEXbE0oV0j2MT1tLlMdf08iUsDThuQ3MlJbE8VbTMlttOFqoyXhBjepQ42C1eXfswSz1gsZlHanBCTiw1pB69vkvfWPf5IdUSx1cpEr9LJ9PSz%2FeHxEhq%2B8ZdWzrybXqRbEl2mUjLeyhMNuiE%3D</value></entry><entry><key xsi:type="xsd:string">boletobancario.data</key><value xsi:type="xsd:string">AgABAQBdYDe9OqdseA79Rfexm2Lz8fRQ1bWqkLhBCf1fHhQEif7bsRKi0otq+1ekMAdMIZUiVXeR3QFrAOA8Zy4tpiNLhkMq6f7W2zFqYhVWrByqxQnbQTYuX2FWI7tsu7Vb0MnyOvFfFdFtaxzImZYCli+MrqaAJ5HI9ap3egeqBQIsRI/j0zWsu2EGN16lGbwFOLyxl+y0Pc5jazTo8rnBA7OVPGDIu7Qt/2DYIMcB6PXou5W3aJoTC4SldhNdobVqgWUtES8NsWdOYbLGa6I+jSwEFXvxyTXwtw4J2E+E7ux1UhBiZRj66lMbcvaYlfnR2xWbA+KmdLrVvuXTroEHKQ+1C/uyGuiOk3SmGq6TMgOyCEt+mG+q6z5jDi+nYLtlLQU4ccMOujgWMfGkViC/XDUlqYjKbn8NHwPwoPcelpf1zCDCe/vu6NBTVQbEXbE0oV0j2MT1tLlMdf08iUsDThuQ3MlJbE8VbTMlttOFqoyXhBjepQ42C1eXfswSz1gsZlHanBCTiw1pB69vkvfWPf5IdUSx1cpEr9LJ9PSz/eHxEhq+8ZdWzrybXqRbEl2mUjLeyhMNuiE=</value></entry><entry><key xsi:type="xsd:string">boletobancario.expirationDate</key><value xsi:type="xsd:string">2014-07-17</value></entry><entry><key xsi:type="xsd:string">boletobancario.dueDate</key><value xsi:type="xsd:string">2014-07-02</value></entry></additionalData><authCode xmlns="http://payment.services.adyen.com" xsi:nil="true" /><dccAmount xmlns="http://payment.services.adyen.com" xsi:nil="true" /><dccSignature xmlns="http://payment.services.adyen.com" xsi:nil="true" /><fraudResult xmlns="http://payment.services.adyen.com" xsi:nil="true" /><issuerUrl xmlns="http://payment.services.adyen.com" xsi:nil="true" /><md xmlns="http://payment.services.adyen.com" xsi:nil="true" /><paRequest xmlns="http://payment.services.adyen.com" xsi:nil="true" /><pspReference xmlns="http://payment.services.adyen.com">8814038837489129</pspReference><refusalReason xmlns="http://payment.services.adyen.com" xsi:nil="true" /><resultCode xmlns="http://payment.services.adyen.com">Received</resultCode></ns1:paymentResult></ns1:authoriseResponse></soap:Body></soap:Envelope>
466
+ <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><ns1:authoriseResponse xmlns:ns1="http://payment.services.adyen.com"><ns1:paymentResult><additionalData xmlns="http://payment.services.adyen.com"><entry><key xsi:type="xsd:string">boletobancario.barCodeReference</key><value xsi:type="xsd:string">03399.33335 33887.371731 37772.301026 8 69200000009314</value></entry><entry><key xsi:type="xsd:string">boletobancario.data</key><value xsi:type="xsd:string">BQABAQA8M3ewKqDwrdIK+q9mDvlF+X0IszPCAG9Tg2jmOJn0/m6T+PABVpyI8/hFeY3xTN3B7yEffj6ehx0ADQh5sLT9ndkqu1UuHTZjlxBiJ9UcMOAl8rkPSLEJU1Dw1tLWGQ7PKRqB8bv3k/VbPGliXZVxEvzxAOZdZ1dpHeVZfA1XT8a9+ZQtJFPAHOhgYpPBmYkiVnavJfwbNMKddQY0CZxC1V2Hndx9yDl/S0IJ1hLgiwxr8eE6QkeDBYZ5uKKyiIVpPxKwDe1o3sq2v76s7cQvdfGn/mAr6jWiNl+rQU92/YlFuR4rHhZdOyUkNofTeTRcpuSaTsK1L9MS1UNqTAWbEMmlqUgNZ6B7HtiYP61sbMIAAECcYbKVpl+RN3hpP3HqHc0/xkOShfnE4bYOtDGVDMf4dt9kAM6+XDOyk8iu//dbHvrZnenLFsKhcdDEjiXRrLHMVxQI9BN/5Yy4hnGN7k/XI1mANMhNpKWLdPBCt94GzaiI830xKsh5KlgFrenU+4x2p0pbeAQUokTLKHEUUzmNmlplxhADBHmTAEwC0vbbGjWFh3PS0zGRwas2TpLNRtQznTmdfoI7j0dlSVHCQQ==</value></entry><entry><key xsi:type="xsd:string">boletobancario.dueDate</key><value xsi:type="xsd:string">2016-09-17</value></entry><entry><key xsi:type="xsd:string">boletobancario.url</key><value xsi:type="xsd:string">https://test.adyen.com/hpp/generationBoleto.shtml?data=BQABAQA8M3ewKqDwrdIK%2Bq9mDvlF%2BX0IszPCAG9Tg2jmOJn0%2Fm6T%2BPABVpyI8%2FhFeY3xTN3B7yEffj6ehx0ADQh5sLT9ndkqu1UuHTZjlxBiJ9UcMOAl8rkPSLEJU1Dw1tLWGQ7PKRqB8bv3k%2FVbPGliXZVxEvzxAOZdZ1dpHeVZfA1XT8a9%2BZQtJFPAHOhgYpPBmYkiVnavJfwbNMKddQY0CZxC1V2Hndx9yDl%2FS0IJ1hLgiwxr8eE6QkeDBYZ5uKKyiIVpPxKwDe1o3sq2v76s7cQvdfGn%2FmAr6jWiNl%2BrQU92%2FYlFuR4rHhZdOyUkNofTeTRcpuSaTsK1L9MS1UNqTAWbEMmlqUgNZ6B7HtiYP61sbMIAAECcYbKVpl%2BRN3hpP3HqHc0%2FxkOShfnE4bYOtDGVDMf4dt9kAM6%2BXDOyk8iu%2F%2FdbHvrZnenLFsKhcdDEjiXRrLHMVxQI9BN%2F5Yy4hnGN7k%2FXI1mANMhNpKWLdPBCt94GzaiI830xKsh5KlgFrenU%2B4x2p0pbeAQUokTLKHEUUzmNmlplxhADBHmTAEwC0vbbGjWFh3PS0zGRwas2TpLNRtQznTmdfoI7j0dlSVHCQQ%3D%3D</value></entry><entry><key xsi:type="xsd:string">boletobancario.expirationDate</key><value xsi:type="xsd:string">2016-10-02</value></entry></additionalData><authCode xmlns="http://payment.services.adyen.com" xsi:nil="true"/><dccAmount xmlns="http://payment.services.adyen.com" xsi:nil="true"/><dccSignature xmlns="http://payment.services.adyen.com" xsi:nil="true"/><fraudResult xmlns="http://payment.services.adyen.com" xsi:nil="true"/><issuerUrl xmlns="http://payment.services.adyen.com" xsi:nil="true"/><md xmlns="http://payment.services.adyen.com" xsi:nil="true"/><paRequest xmlns="http://payment.services.adyen.com" xsi:nil="true"/><pspReference xmlns="http://payment.services.adyen.com">8814737173377729</pspReference><refusalReason xmlns="http://payment.services.adyen.com" xsi:nil="true"/><resultCode xmlns="http://payment.services.adyen.com">Received</resultCode></ns1:paymentResult></ns1:authoriseResponse></soap:Body></soap:Envelope>
458
467
  EOS
459
468
 
460
469
  BILLET_REFUSED_RESPONSE = <<EOS