fingertips-adyen 0.3.8.20100929 → 0.3.8.20100930

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 (5) hide show
  1. data/adyen.gemspec +9 -8
  2. data/lib/adyen/api.rb +169 -22
  3. data/lib/adyen.rb +1 -1
  4. data/spec/api_spec.rb +206 -131
  5. metadata +4 -4
data/adyen.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
- s.name = 'fingertips-adyen'
3
- s.version = "0.3.8.20100929"
4
- s.date = "2010-09-29"
2
+ s.name = 'adyen'
3
+ s.version = "0.3.8"
4
+ s.date = "2010-09-23"
5
5
 
6
6
  s.summary = "Integrate Adyen payment services in your Ruby on Rails application."
7
7
  s.description = <<-EOS
@@ -13,22 +13,23 @@ Gem::Specification.new do |s|
13
13
 
14
14
  s.authors = ['Willem van Bergen', 'Michel Barbosa', 'Stefan Borsje', 'Eloy Duran']
15
15
  s.email = ['willem@vanbergen.org', 'cicaboo@gmail.com', 'mail@sborsje.nl', 'eloy.de.enige@gmail.com']
16
- s.homepage = 'http://wiki.github.com/wvanbergen/adyen'
16
+ s.homepage = 'http://github.com/wvanbergen/adyen/wiki'
17
17
 
18
18
  s.add_development_dependency('rake')
19
19
  s.add_development_dependency('rspec', '>= 1.1.4')
20
- s.add_development_dependency('git', '>= 1.1.0')
21
- s.add_development_dependency('gemcutter')
22
20
 
23
21
  # Drop or make runtime dependency.
24
22
  s.add_development_dependency('activerecord')
23
+ s.add_development_dependency('handsoap')
25
24
  s.add_development_dependency('nokogiri')
26
25
 
26
+ s.requirements << 'Handsoap is required for accessing the SOAP services. See http://github.com/troelskn/handsoap.'
27
27
  s.requirements << 'ActiveRecord is required for storing the notifications in your database.'
28
28
 
29
29
  s.rdoc_options << '--title' << s.name << '--main' << 'README.rdoc' << '--line-numbers' << '--inline-source'
30
30
  s.extra_rdoc_files = ['README.rdoc']
31
31
 
32
- s.files = %w(spec/spec_helper.rb spec/adyen_spec.rb lib/adyen/form.rb .gitignore spec/notification_spec.rb lib/adyen/api.rb LICENSE spec/api_spec.rb init.rb adyen.gemspec Rakefile spec/form_spec.rb README.rdoc lib/adyen/notification.rb lib/adyen/formatter.rb tasks/github-gem.rake lib/adyen/encoding.rb TODO lib/adyen/matchers.rb lib/adyen.rb)
33
- s.test_files = %w(spec/adyen_spec.rb spec/notification_spec.rb spec/api_spec.rb spec/form_spec.rb)
32
+ s.files = %w(spec/spec_helper.rb spec/adyen_spec.rb lib/adyen/form.rb .gitignore spec/notification_spec.rb lib/adyen/soap.rb LICENSE spec/soap_spec.rb init.rb adyen.gemspec Rakefile spec/form_spec.rb README.rdoc lib/adyen/notification.rb lib/adyen/formatter.rb tasks/github-gem.rake lib/adyen/encoding.rb TODO lib/adyen/matchers.rb lib/adyen.rb)
33
+ s.test_files = %w(spec/adyen_spec.rb spec/notification_spec.rb spec/soap_spec.rb spec/form_spec.rb)
34
34
  end
35
+
data/lib/adyen/api.rb CHANGED
@@ -22,16 +22,19 @@ module Adyen
22
22
  # Shortcut methods
23
23
  #
24
24
 
25
- def self.authorise_payment(params = {})
25
+ def self.authorise_payment(params)
26
26
  PaymentService.new(params).authorise_payment
27
27
  end
28
28
 
29
- def self.authorise_recurring_payment(params = {})
29
+ def self.authorise_recurring_payment(params)
30
30
  PaymentService.new(params).authorise_recurring_payment
31
31
  end
32
32
 
33
- def self.disable_recurring_contract(params = {})
34
- RecurringService.new(params).disable
33
+ def self.disable_recurring_contract(shopper_reference, recurring_detail_reference = nil)
34
+ RecurringService.new({
35
+ :shopper => { :reference => shopper_reference },
36
+ :recurring_detail_reference => recurring_detail_reference
37
+ }).disable
35
38
  end
36
39
 
37
40
  # TODO: the rest
@@ -44,8 +47,12 @@ module Adyen
44
47
  # from http://curl.haxx.se/ca/cacert.pem
45
48
  CACERT = File.expand_path('../../../support/cacert.pem', __FILE__)
46
49
 
47
- def self.endpoint
48
- @endpoint ||= URI.parse(const_get('ENDPOINT_URI') % Adyen.environment)
50
+ class << self
51
+ attr_accessor :stubbed_response
52
+
53
+ def endpoint
54
+ @endpoint ||= URI.parse(const_get('ENDPOINT_URI') % Adyen.environment)
55
+ end
49
56
  end
50
57
 
51
58
  attr_reader :params
@@ -55,19 +62,24 @@ module Adyen
55
62
  end
56
63
 
57
64
  def call_webservice_action(action, data, response_class)
58
- endpoint = self.class.endpoint
59
-
60
- post = Net::HTTP::Post.new(endpoint.path, 'Accept' => 'text/xml', 'Content-Type' => 'text/xml; charset=utf-8', 'SOAPAction' => action)
61
- post.basic_auth(API.username, API.password)
62
- post.body = data
63
-
64
- request = Net::HTTP.new(endpoint.host, endpoint.port)
65
- request.use_ssl = true
66
- request.ca_file = CACERT
67
- request.verify_mode = OpenSSL::SSL::VERIFY_PEER
68
-
69
- request.start do |http|
70
- response_class.new(http.request(post))
65
+ if response = self.class.stubbed_response
66
+ self.class.stubbed_response = nil
67
+ response
68
+ else
69
+ endpoint = self.class.endpoint
70
+
71
+ post = Net::HTTP::Post.new(endpoint.path, 'Accept' => 'text/xml', 'Content-Type' => 'text/xml; charset=utf-8', 'SOAPAction' => action)
72
+ post.basic_auth(API.username, API.password)
73
+ post.body = data
74
+
75
+ request = Net::HTTP.new(endpoint.host, endpoint.port)
76
+ request.use_ssl = true
77
+ request.ca_file = CACERT
78
+ request.verify_mode = OpenSSL::SSL::VERIFY_PEER
79
+
80
+ request.start do |http|
81
+ response_class.new(http.request(post))
82
+ end
71
83
  end
72
84
  end
73
85
  end
@@ -179,6 +191,38 @@ module Adyen
179
191
  class PaymentService < SimpleSOAPClient
180
192
  ENDPOINT_URI = 'https://pal-%s.adyen.com/pal/servlet/soap/Payment'
181
193
 
194
+ class << self
195
+ def success_stub
196
+ http_response = Net::HTTPOK.new('1.1', '200', 'OK')
197
+ def http_response.body; AUTHORISE_RESPONSE; end
198
+ AuthorizationResponse.new(http_response)
199
+ end
200
+
201
+ def refused_stub
202
+ http_response = Net::HTTPOK.new('1.1', '200', 'OK')
203
+ def http_response.body; AUTHORISATION_REFUSED_RESPONSE; end
204
+ AuthorizationResponse.new(http_response)
205
+ end
206
+
207
+ def invalid_stub
208
+ http_response = Net::HTTPOK.new('1.1', '200', 'OK')
209
+ def http_response.body; AUTHORISATION_REQUEST_INVALID_RESPONSE; end
210
+ AuthorizationResponse.new(http_response)
211
+ end
212
+
213
+ def stub_success!
214
+ @stubbed_response = success_stub
215
+ end
216
+
217
+ def stub_refused!
218
+ @stubbed_response = refused_stub
219
+ end
220
+
221
+ def stub_invalid!
222
+ @stubbed_response = invalid_stub
223
+ end
224
+ end
225
+
182
226
  def authorise_payment
183
227
  make_payment_request(authorise_payment_request_body)
184
228
  end
@@ -255,8 +299,12 @@ module Adyen
255
299
  !fault_message.nil?
256
300
  end
257
301
 
258
- def error
259
- ERRORS[fault_message] || [:base, fault_message]
302
+ def error(prefix = nil)
303
+ if error = ERRORS[fault_message]
304
+ prefix ? ["#{prefix}_#{error[0]}".to_sym, error[1]] : error
305
+ else
306
+ [:base, fault_message]
307
+ end
260
308
  end
261
309
 
262
310
  def params
@@ -273,7 +321,10 @@ module Adyen
273
321
  private
274
322
 
275
323
  def fault_message
276
- @fault_message ||= xml_querier.text('//soap:Fault/faultstring')
324
+ @fault_message ||= begin
325
+ message = xml_querier.text('//soap:Fault/faultstring')
326
+ message unless message.empty?
327
+ end
277
328
  end
278
329
  end
279
330
  end
@@ -281,6 +332,18 @@ module Adyen
281
332
  class RecurringService < SimpleSOAPClient
282
333
  ENDPOINT_URI = 'https://pal-%s.adyen.com/pal/servlet/soap/Recurring'
283
334
 
335
+ class << self
336
+ def disabled_stub
337
+ http_response = Net::HTTPOK.new('1.1', '200', 'OK')
338
+ def http_response.body; DISABLE_RESPONSE % DisableResponse::DISABLED_RESPONSES.first; end
339
+ DisableResponse.new(http_response)
340
+ end
341
+
342
+ def stub_disabled!
343
+ @stubbed_response = disabled_stub
344
+ end
345
+ end
346
+
284
347
  # TODO: rename to list_details and make shortcut method take the only necessary param
285
348
  def list
286
349
  call_webservice_action('listRecurringDetails', list_request_body, ListResponse)
@@ -304,8 +367,16 @@ module Adyen
304
367
  end
305
368
 
306
369
  class DisableResponse < Response
370
+ DISABLED_RESPONSES = %w{ [detail-successfully-disabled] [all-details-successfully-disabled] }
371
+
307
372
  response_attrs :response
308
373
 
374
+ def success?
375
+ super && DISABLED_RESPONSES.include?(params[:response])
376
+ end
377
+
378
+ alias disabled? success?
379
+
309
380
  def params
310
381
  @params ||= { :response => xml_querier.text('//recurring:disableResponse/recurring:result/recurring:response') }
311
382
  end
@@ -429,6 +500,65 @@ EOS
429
500
  :email => ' <payment:shopperEmail>%s</payment:shopperEmail>',
430
501
  :ip => ' <payment:shopperIP>%s</payment:shopperIP>',
431
502
  }
503
+
504
+ # Test responses
505
+
506
+ AUTHORISE_RESPONSE = <<EOS
507
+ <?xml version="1.0" encoding="UTF-8"?>
508
+ <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">
509
+ <soap:Body>
510
+ <ns1:authoriseResponse xmlns:ns1="http://payment.services.adyen.com">
511
+ <ns1:paymentResult>
512
+ <additionalData xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
513
+ <authCode xmlns="http://payment.services.adyen.com">1234</authCode>
514
+ <dccAmount xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
515
+ <dccSignature xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
516
+ <fraudResult xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
517
+ <issuerUrl xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
518
+ <md xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
519
+ <paRequest xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
520
+ <pspReference xmlns="http://payment.services.adyen.com">9876543210987654</pspReference>
521
+ <refusalReason xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
522
+ <resultCode xmlns="http://payment.services.adyen.com">Authorised</resultCode>
523
+ </ns1:paymentResult>
524
+ </ns1:authoriseResponse>
525
+ </soap:Body>
526
+ </soap:Envelope>
527
+ EOS
528
+
529
+ AUTHORISATION_REFUSED_RESPONSE = <<EOS
530
+ <?xml version="1.0" encoding="UTF-8"?>
531
+ <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">
532
+ <soap:Body>
533
+ <ns1:authoriseResponse xmlns:ns1="http://payment.services.adyen.com">
534
+ <ns1:paymentResult>
535
+ <additionalData xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
536
+ <authCode xmlns="http://payment.services.adyen.com">1234</authCode>
537
+ <dccAmount xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
538
+ <dccSignature xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
539
+ <fraudResult xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
540
+ <issuerUrl xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
541
+ <md xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
542
+ <paRequest xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
543
+ <pspReference xmlns="http://payment.services.adyen.com">9876543210987654</pspReference>
544
+ <refusalReason xmlns="http://payment.services.adyen.com">You need to actually own money.</refusalReason>
545
+ <resultCode xmlns="http://payment.services.adyen.com">Refused</resultCode>
546
+ </ns1:paymentResult>
547
+ </ns1:authoriseResponse>
548
+ </soap:Body>
549
+ </soap:Envelope>
550
+ EOS
551
+
552
+ AUTHORISATION_REQUEST_INVALID_RESPONSE = <<EOS
553
+ <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">
554
+ <soap:Body>
555
+ <soap:Fault>
556
+ <faultcode>soap:Server</faultcode>
557
+ <faultstring>validation 101 Invalid card number</faultstring>
558
+ </soap:Fault>
559
+ </soap:Body>
560
+ </soap:Envelope>
561
+ EOS
432
562
  end
433
563
 
434
564
  class RecurringService
@@ -466,6 +596,23 @@ EOS
466
596
 
467
597
  RECURRING_DETAIL_PARTIAL = <<EOS
468
598
  <recurring:recurringDetailReference>%s</recurring:recurringDetailReference>
599
+ EOS
600
+
601
+ # Test responses
602
+
603
+ DISABLE_RESPONSE = <<EOS
604
+ <?xml version="1.0"?>
605
+ <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">
606
+ <soap:Body>
607
+ <ns1:disableResponse xmlns:ns1="http://recurring.services.adyen.com">
608
+ <ns1:result>
609
+ <response xmlns="http://recurring.services.adyen.com">
610
+ %s
611
+ </response>
612
+ </ns1:result>
613
+ </ns1:disableResponse>
614
+ </soap:Body>
615
+ </soap:Envelope>
469
616
  EOS
470
617
  end
471
618
  end
data/lib/adyen.rb CHANGED
@@ -13,7 +13,7 @@ module Adyen
13
13
  # Version constant for the Adyen plugin.
14
14
  # DO NOT CHANGE THIS VALUE BY HAND. It will be updated automatically by
15
15
  # the gem:release rake task.
16
- VERSION = "0.3.8.20100929"
16
+ VERSION = "0.3.8.20100930"
17
17
 
18
18
  # Loads configuration settings from a Hash.
19
19
  #
data/spec/api_spec.rb CHANGED
@@ -285,175 +285,193 @@ describe Adyen::API do
285
285
  Adyen::API.authorise_recurring_payment(:reference => 'order-id')
286
286
  end
287
287
 
288
- it "performs a `disable recurring contract' request" do
288
+ it "performs a `disable recurring contract' request for all details" do
289
289
  recurring = mock('RecurringService')
290
- Adyen::API::RecurringService.should_receive(:new).with(:shopper => { :reference => 'user-id' }).and_return(recurring)
290
+ Adyen::API::RecurringService.should_receive(:new).
291
+ with(:shopper => { :reference => 'user-id' }, :recurring_detail_reference => nil).
292
+ and_return(recurring)
291
293
  recurring.should_receive(:disable)
292
- Adyen::API.disable_recurring_contract(:shopper => { :reference => 'user-id' })
294
+ Adyen::API.disable_recurring_contract('user-id')
295
+ end
296
+
297
+ it "performs a `disable recurring contract' request for a specific detail" do
298
+ recurring = mock('RecurringService')
299
+ Adyen::API::RecurringService.should_receive(:new).
300
+ with(:shopper => { :reference => 'user-id' }, :recurring_detail_reference => 'detail-id').
301
+ and_return(recurring)
302
+ recurring.should_receive(:disable)
303
+ Adyen::API.disable_recurring_contract('user-id', 'detail-id')
293
304
  end
294
305
  end
295
306
 
296
307
  describe Adyen::API::PaymentService do
297
- describe "for a normal payment request" do
298
- before do
299
- @params = {
300
- :reference => 'order-id',
301
- :amount => {
302
- :currency => 'EUR',
303
- :value => '1234',
304
- },
305
- :shopper => {
306
- :email => 's.hopper@example.com',
307
- :reference => 'user-id',
308
- :ip => '61.294.12.12',
309
- },
310
- :card => {
311
- :expiry_month => 12,
312
- :expiry_year => 2012,
313
- :holder_name => 'Simon わくわく Hopper',
314
- :number => '4444333322221111',
315
- :cvc => '737',
316
- # Maestro UK/Solo only
317
- #:issue_number => ,
318
- #:start_month => ,
319
- #:start_year => ,
320
- }
308
+ before do
309
+ @params = {
310
+ :reference => 'order-id',
311
+ :amount => {
312
+ :currency => 'EUR',
313
+ :value => '1234',
314
+ },
315
+ :shopper => {
316
+ :email => 's.hopper@example.com',
317
+ :reference => 'user-id',
318
+ :ip => '61.294.12.12',
319
+ },
320
+ :card => {
321
+ :expiry_month => 12,
322
+ :expiry_year => 2012,
323
+ :holder_name => 'Simon わくわく Hopper',
324
+ :number => '4444333322221111',
325
+ :cvc => '737',
326
+ # Maestro UK/Solo only
327
+ #:issue_number => ,
328
+ #:start_month => ,
329
+ #:start_year => ,
321
330
  }
322
- @payment = Adyen::API::PaymentService.new(@params)
331
+ }
332
+ @payment = Adyen::API::PaymentService.new(@params)
333
+ end
334
+
335
+ describe "authorise_payment_request_body" do
336
+ before :all do
337
+ @method = :authorise_payment_request_body
323
338
  end
324
339
 
325
- describe "authorise_payment_request_body" do
326
- before :all do
327
- @method = :authorise_payment_request_body
340
+ it_should_behave_like "payment requests"
341
+
342
+ it "includes the creditcard details" do
343
+ xpath('./payment:card') do |card|
344
+ # there's no reason why Nokogiri should escape these characters, but as long as they're correct
345
+ card.text('./payment:holderName').should == 'Simon &#x308F;&#x304F;&#x308F;&#x304F; Hopper'
346
+ card.text('./payment:number').should == '4444333322221111'
347
+ card.text('./payment:cvc').should == '737'
348
+ card.text('./payment:expiryMonth').should == '12'
349
+ card.text('./payment:expiryYear').should == '2012'
328
350
  end
351
+ end
329
352
 
330
- it_should_behave_like "payment requests"
353
+ it "formats the creditcard’s expiry month as a two digit number" do
354
+ @payment.params[:card][:expiry_month] = 6
355
+ text('./payment:card/payment:expiryMonth').should == '06'
356
+ end
331
357
 
332
- it "includes the creditcard details" do
333
- xpath('./payment:card') do |card|
334
- # there's no reason why Nokogiri should escape these characters, but as long as they're correct
335
- card.text('./payment:holderName').should == 'Simon &#x308F;&#x304F;&#x308F;&#x304F; Hopper'
336
- card.text('./payment:number').should == '4444333322221111'
337
- card.text('./payment:cvc').should == '737'
338
- card.text('./payment:expiryMonth').should == '12'
339
- card.text('./payment:expiryYear').should == '2012'
340
- end
341
- end
358
+ it "includes the necessary recurring contract info if the `:recurring' param is truthful" do
359
+ xpath('./payment:recurring/payment:contract').should be_empty
360
+ @payment.params[:recurring] = true
361
+ text('./payment:recurring/payment:contract').should == 'RECURRING'
362
+ end
363
+ end
364
+
365
+ describe "authorise_payment" do
366
+ before do
367
+ stub_net_http(AUTHORISE_RESPONSE)
368
+ @response = @payment.authorise_payment
369
+ @request, @post = Net::HTTP.posted
370
+ end
371
+
372
+ after do
373
+ Net::HTTP.stubbing_enabled = false
374
+ end
342
375
 
343
- it "formats the creditcard’s expiry month as a two digit number" do
344
- @payment.params[:card][:expiry_month] = 6
345
- text('./payment:card/payment:expiryMonth').should == '06'
376
+ it "posts the body generated for the given parameters" do
377
+ @post.body.should == @payment.authorise_payment_request_body
378
+ end
379
+
380
+ it "posts to the correct SOAP action" do
381
+ @post.soap_action.should == 'authorise'
382
+ end
383
+
384
+ for_each_xml_backend do
385
+ it "returns a hash with parsed response details" do
386
+ @payment.authorise_payment.params.should == {
387
+ :psp_reference => '9876543210987654',
388
+ :result_code => 'Authorised',
389
+ :auth_code => '1234',
390
+ :refusal_reason => ''
391
+ }
346
392
  end
393
+ end
347
394
 
348
- it "includes the necessary recurring contract info if the `:recurring' param is truthful" do
349
- xpath('./payment:recurring/payment:contract').should be_empty
350
- @payment.params[:recurring] = true
351
- text('./payment:recurring/payment:contract').should == 'RECURRING'
395
+ it_should_have_shortcut_methods_for_params_on_the_response
396
+
397
+ describe "with a authorized response" do
398
+ it "returns that the request was authorised" do
399
+ @response.should be_success
400
+ @response.should be_authorized
352
401
  end
353
402
  end
354
403
 
355
- describe "authorise_payment" do
404
+ describe "with a `declined' response" do
356
405
  before do
357
- stub_net_http(AUTHORISE_RESPONSE)
406
+ stub_net_http(AUTHORISATION_DECLINED_RESPONSE)
358
407
  @response = @payment.authorise_payment
359
- @request, @post = Net::HTTP.posted
360
408
  end
361
409
 
362
- after do
363
- Net::HTTP.stubbing_enabled = false
410
+ it "returns that the request was not authorised" do
411
+ @response.should_not be_success
412
+ @response.should_not be_authorized
364
413
  end
414
+ end
365
415
 
366
- it "posts the body generated for the given parameters" do
367
- @post.body.should == @payment.authorise_payment_request_body
416
+ describe "with a `invalid' response" do
417
+ before do
418
+ stub_net_http(AUTHORISE_REQUEST_INVALID_RESPONSE % 'validation 101 Invalid card number')
419
+ @response = @payment.authorise_payment
368
420
  end
369
421
 
370
- it "posts to the correct SOAP action" do
371
- @post.soap_action.should == 'authorise'
422
+ it "returns that the request was not authorised" do
423
+ @response.should_not be_success
424
+ @response.should_not be_authorized
372
425
  end
373
426
 
374
- for_each_xml_backend do
375
- it "returns a hash with parsed response details" do
376
- @payment.authorise_payment.params.should == {
377
- :psp_reference => '9876543210987654',
378
- :result_code => 'Authorised',
379
- :auth_code => '1234',
380
- :refusal_reason => ''
381
- }
382
- end
427
+ it "it returns that the request was invalid" do
428
+ @response.should be_invalid_request
383
429
  end
384
430
 
385
- it_should_have_shortcut_methods_for_params_on_the_response
386
-
387
- describe "with a authorized response" do
388
- it "returns that the request was authorised" do
389
- @response.should be_success
390
- @response.should be_authorized
431
+ it "returns creditcard validation errors" do
432
+ [
433
+ ["validation 101 Invalid card number", [:number, 'is not a valid creditcard number']],
434
+ ["validation 103 CVC is not the right length", [:cvc, 'is not the right length']],
435
+ ["validation 128 Card Holder Missing", [:holder_name, 'can’t be blank']],
436
+ ["validation Couldn't parse expiry year", [:expiry_year, 'could not be recognized']],
437
+ ["validation Expiry month should be between 1 and 12 inclusive", [:expiry_month, 'could not be recognized']],
438
+ ].each do |message, error|
439
+ response_with_fault_message(message).error.should == error
391
440
  end
392
441
  end
393
442
 
394
- describe "with a `declined' response" do
395
- before do
396
- stub_net_http(AUTHORISATION_DECLINED_RESPONSE)
397
- @response = @payment.authorise_payment
398
- end
399
-
400
- it "returns that the request was not authorised" do
401
- @response.should_not be_success
402
- @response.should_not be_authorized
403
- end
443
+ it "returns any other fault messages on `base'" do
444
+ message = "validation 130 Reference Missing"
445
+ response_with_fault_message(message).error.should == [:base, message]
404
446
  end
405
447
 
406
- describe "with a `invalid' response" do
407
- before do
408
- stub_net_http(AUTHORISE_REQUEST_INVALID_RESPONSE % 'validation 101 Invalid card number')
409
- @response = @payment.authorise_payment
410
- end
411
-
412
- it "returns that the request was not authorised" do
413
- @response.should_not be_success
414
- @response.should_not be_authorized
415
- end
416
-
417
- it "it returns that the request was invalid" do
418
- @response.should be_invalid_request
419
- end
420
-
421
- it "returns creditcard validation errors" do
422
- [
423
- ["validation 101 Invalid card number", [:number, 'is not a valid creditcard number']],
424
- ["validation 103 CVC is not the right length", [:cvc, 'is not the right length']],
425
- ["validation 128 Card Holder Missing", [:holder_name, 'can’t be blank']],
426
- ["validation Couldn't parse expiry year", [:expiry_year, 'could not be recognized']],
427
- ["validation Expiry month should be between 1 and 12 inclusive", [:expiry_month, 'could not be recognized']],
428
- ].each do |message, error|
429
- response_with_fault_message(message).error.should == error
430
- end
431
- end
432
-
433
- it "returns any other fault messages on `base'" do
434
- message = "validation 130 Reference Missing"
435
- response_with_fault_message(message).error.should == [:base, message]
448
+ it "prepends the error attribute with the given prefix, except for :base" do
449
+ [
450
+ ["validation 101 Invalid card number", [:card_number, 'is not a valid creditcard number']],
451
+ ["validation 130 Reference Missing", [:base, "validation 130 Reference Missing"]],
452
+ ].each do |message, error|
453
+ response_with_fault_message(message).error(:card).should == error
436
454
  end
455
+ end
437
456
 
438
- it "returns the original message corresponding to the given attribute and message" do
439
- [
440
- ["validation 101 Invalid card number", [:number, 'is not a valid creditcard number']],
441
- ["validation 103 CVC is not the right length", [:cvc, 'is not the right length']],
442
- ["validation 128 Card Holder Missing", [:holder_name, 'can’t be blank']],
443
- ["validation Couldn't parse expiry year", [:expiry_year, 'could not be recognized']],
444
- ["validation Expiry month should be between 1 and 12 inclusive", [:expiry_month, 'could not be recognized']],
445
- ["validation 130 Reference Missing", [:base, 'validation 130 Reference Missing']],
446
- ].each do |expected, attr_and_message|
447
- Adyen::API::PaymentService::AuthorizationResponse.original_fault_message_for(*attr_and_message).should == expected
448
- end
457
+ it "returns the original message corresponding to the given attribute and message" do
458
+ [
459
+ ["validation 101 Invalid card number", [:number, 'is not a valid creditcard number']],
460
+ ["validation 103 CVC is not the right length", [:cvc, 'is not the right length']],
461
+ ["validation 128 Card Holder Missing", [:holder_name, 'can’t be blank']],
462
+ ["validation Couldn't parse expiry year", [:expiry_year, 'could not be recognized']],
463
+ ["validation Expiry month should be between 1 and 12 inclusive", [:expiry_month, 'could not be recognized']],
464
+ ["validation 130 Reference Missing", [:base, 'validation 130 Reference Missing']],
465
+ ].each do |expected, attr_and_message|
466
+ Adyen::API::PaymentService::AuthorizationResponse.original_fault_message_for(*attr_and_message).should == expected
449
467
  end
468
+ end
450
469
 
451
- private
470
+ private
452
471
 
453
- def response_with_fault_message(message)
454
- stub_net_http(AUTHORISE_REQUEST_INVALID_RESPONSE % message)
455
- @response = @payment.authorise_payment
456
- end
472
+ def response_with_fault_message(message)
473
+ stub_net_http(AUTHORISE_REQUEST_INVALID_RESPONSE % message)
474
+ @response = @payment.authorise_payment
457
475
  end
458
476
  end
459
477
 
@@ -520,6 +538,40 @@ describe Adyen::API do
520
538
  end
521
539
  end
522
540
 
541
+ describe "test helpers that stub responses" do
542
+ after do
543
+ Net::HTTP.stubbing_enabled = false
544
+ end
545
+
546
+ it "returns an `authorized' response" do
547
+ stub_net_http(AUTHORISATION_DECLINED_RESPONSE)
548
+ Adyen::API::PaymentService.stub_success!
549
+ @payment.authorise_payment.should be_authorized
550
+
551
+ @payment.authorise_payment.should_not be_authorized
552
+ end
553
+
554
+ it "returns a `refused' response" do
555
+ stub_net_http(AUTHORISE_RESPONSE)
556
+ Adyen::API::PaymentService.stub_refused!
557
+ response = @payment.authorise_payment
558
+ response.should_not be_authorized
559
+ response.should_not be_invalid_request
560
+
561
+ @payment.authorise_payment.should be_authorized
562
+ end
563
+
564
+ it "returns a `invalid request' response" do
565
+ stub_net_http(AUTHORISE_RESPONSE)
566
+ Adyen::API::PaymentService.stub_invalid!
567
+ response = @payment.authorise_payment
568
+ response.should_not be_authorized
569
+ response.should be_invalid_request
570
+
571
+ @payment.authorise_payment.should be_authorized
572
+ end
573
+ end
574
+
523
575
  private
524
576
 
525
577
  def node_for_current_method
@@ -642,7 +694,7 @@ describe Adyen::API do
642
694
 
643
695
  describe "disable" do
644
696
  before do
645
- stub_net_http(DISABLE_RESPONSE)
697
+ stub_net_http(DISABLE_RESPONSE % '[detail-successfully-disabled]')
646
698
  @response = @recurring.disable
647
699
  @request, @post = Net::HTTP.posted
648
700
  end
@@ -659,6 +711,16 @@ describe Adyen::API do
659
711
  @post.soap_action.should == 'disable'
660
712
  end
661
713
 
714
+ it "returns whether or not it was disabled" do
715
+ @response.should be_success
716
+ @response.should be_disabled
717
+
718
+ stub_net_http(DISABLE_RESPONSE % '[all-details-successfully-disabled]')
719
+ @response = @recurring.disable
720
+ @response.should be_success
721
+ @response.should be_disabled
722
+ end
723
+
662
724
  for_each_xml_backend do
663
725
  it "returns a hash with parsed response details" do
664
726
  @recurring.disable.params.should == { :response => '[detail-successfully-disabled]' }
@@ -668,6 +730,19 @@ describe Adyen::API do
668
730
  it_should_have_shortcut_methods_for_params_on_the_response
669
731
  end
670
732
  end
733
+
734
+ describe "test helpers that stub responses" do
735
+ after do
736
+ Net::HTTP.stubbing_enabled = false
737
+ end
738
+
739
+ it "returns a `disabled' response" do
740
+ stub_net_http(DISABLE_RESPONSE % 'nope')
741
+ Adyen::API::RecurringService.stub_disabled!
742
+ @recurring.disable.should be_disabled
743
+ @recurring.disable.should_not be_disabled
744
+ end
745
+ end
671
746
  end
672
747
  end
673
748
 
@@ -787,7 +862,7 @@ DISABLE_RESPONSE = <<EOS
787
862
  <ns1:disableResponse xmlns:ns1="http://recurring.services.adyen.com">
788
863
  <ns1:result>
789
864
  <response xmlns="http://recurring.services.adyen.com">
790
- [detail-successfully-disabled]
865
+ %s
791
866
  </response>
792
867
  </ns1:result>
793
868
  </ns1:disableResponse>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fingertips-adyen
3
3
  version: !ruby/object:Gem::Version
4
- hash: 40201973
4
+ hash: 40201971
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
9
  - 8
10
- - 20100929
11
- version: 0.3.8.20100929
10
+ - 20100930
11
+ version: 0.3.8.20100930
12
12
  platform: ruby
13
13
  authors:
14
14
  - Willem van Bergen
@@ -19,7 +19,7 @@ autorequire:
19
19
  bindir: bin
20
20
  cert_chain: []
21
21
 
22
- date: 2010-09-29 00:00:00 +02:00
22
+ date: 2010-09-30 00:00:00 +02:00
23
23
  default_executable:
24
24
  dependencies:
25
25
  - !ruby/object:Gem::Dependency