adyen 1.5.0 → 1.6.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.
@@ -1,5 +1,5 @@
1
1
  module Adyen
2
2
  # Version constant for the Adyen plugin.
3
3
  # Set it & commit the change before running rake release.
4
- VERSION = "1.5.0"
4
+ VERSION = "1.6.0"
5
5
  end
@@ -22,7 +22,8 @@ describe Adyen::API do
22
22
  :shopper => { :reference => 'user-id', :email => 's.hopper@example.com' },
23
23
  :card => { :expiry_month => 12, :expiry_year => 2012, :holder_name => "Simon Hopper", :number => '4444333322221111', :cvc => '737' },
24
24
  :recurring => false,
25
- :fraud_offset => nil
25
+ :fraud_offset => nil,
26
+ :instant_capture => false
26
27
  )
27
28
  Adyen::API.authorise_payment('order-id',
28
29
  { :currency => 'EUR', :value => 1234 },
@@ -38,14 +39,16 @@ describe Adyen::API do
38
39
  :shopper => { :reference => 'user-id', :email => 's.hopper@example.com' },
39
40
  :card => { :expiry_month => 12, :expiry_year => 2012, :holder_name => "Simon Hopper", :number => '4444333322221111', :cvc => '737' },
40
41
  :recurring => false,
41
- :fraud_offset => -100
42
+ :fraud_offset => -100,
43
+ :instant_capture => false
42
44
  )
43
45
  Adyen::API.authorise_payment('order-id',
44
46
  { :currency => 'EUR', :value => 1234 },
45
47
  { :reference => 'user-id', :email => 's.hopper@example.com' },
46
48
  { :expiry_month => 12, :expiry_year => 2012, :holder_name => "Simon Hopper", :number => '4444333322221111', :cvc => '737' },
47
49
  false,
48
- -100
50
+ -100,
51
+ false
49
52
  )
50
53
  end
51
54
 
@@ -56,13 +59,16 @@ describe Adyen::API do
56
59
  :shopper => { :reference => 'user-id', :email => 's.hopper@example.com' },
57
60
  :card => { :expiry_month => 12, :expiry_year => 2012, :holder_name => "Simon Hopper", :number => '4444333322221111', :cvc => '737' },
58
61
  :recurring => true,
59
- :fraud_offset => nil
62
+ :fraud_offset => nil,
63
+ :instant_capture => false,
60
64
  )
61
65
  Adyen::API.authorise_payment('order-id',
62
66
  { :currency => 'EUR', :value => 1234 },
63
67
  { :reference => 'user-id', :email => 's.hopper@example.com' },
64
68
  { :expiry_month => 12, :expiry_year => 2012, :holder_name => "Simon Hopper", :number => '4444333322221111', :cvc => '737' },
65
- true
69
+ true,
70
+ nil,
71
+ false
66
72
  )
67
73
  end
68
74
 
@@ -72,6 +78,7 @@ describe Adyen::API do
72
78
  :amount => { :currency => 'EUR', :value => 1234 },
73
79
  :shopper => { :reference => 'user-id', :email => 's.hopper@example.com' },
74
80
  :recurring_detail_reference => 'LATEST',
81
+ :instant_capture => false,
75
82
  :fraud_offset => nil
76
83
  )
77
84
  Adyen::API.authorise_recurring_payment('order-id',
@@ -86,6 +93,7 @@ describe Adyen::API do
86
93
  :amount => { :currency => 'EUR', :value => 1234 },
87
94
  :shopper => { :reference => 'user-id', :email => 's.hopper@example.com' },
88
95
  :recurring_detail_reference => 'recurring-detail-reference',
96
+ :instant_capture => false,
89
97
  :fraud_offset => nil
90
98
  )
91
99
  Adyen::API.authorise_recurring_payment('order-id',
@@ -101,13 +109,15 @@ describe Adyen::API do
101
109
  :amount => { :currency => 'EUR', :value => 1234 },
102
110
  :shopper => { :reference => 'user-id', :email => 's.hopper@example.com' },
103
111
  :recurring_detail_reference => 'recurring-detail-reference',
104
- :fraud_offset => 50
112
+ :fraud_offset => 50,
113
+ :instant_capture => false
105
114
  )
106
115
  Adyen::API.authorise_recurring_payment('order-id',
107
116
  { :currency => 'EUR', :value => 1234 },
108
117
  { :reference => 'user-id', :email => 's.hopper@example.com' },
109
118
  'recurring-detail-reference',
110
- 50
119
+ 50,
120
+ false
111
121
  )
112
122
  end
113
123
 
@@ -118,7 +128,8 @@ describe Adyen::API do
118
128
  :shopper => { :reference => 'user-id', :email => 's.hopper@example.com' },
119
129
  :card => { :cvc => '737' },
120
130
  :recurring_detail_reference => 'recurring-detail-reference',
121
- :fraud_offset => nil
131
+ :fraud_offset => nil,
132
+ :instant_capture => false
122
133
  )
123
134
  Adyen::API.authorise_one_click_payment('order-id',
124
135
  { :currency => 'EUR', :value => 1234 },
@@ -135,14 +146,16 @@ describe Adyen::API do
135
146
  :shopper => { :reference => 'user-id', :email => 's.hopper@example.com' },
136
147
  :card => { :cvc => '737' },
137
148
  :recurring_detail_reference => 'recurring-detail-reference',
138
- :fraud_offset => -10
149
+ :fraud_offset => -10,
150
+ :instant_capture => false,
139
151
  )
140
152
  Adyen::API.authorise_one_click_payment('order-id',
141
153
  { :currency => 'EUR', :value => 1234 },
142
154
  { :reference => 'user-id', :email => 's.hopper@example.com' },
143
155
  { :cvc => '737' },
144
156
  'recurring-detail-reference',
145
- -10
157
+ -10,
158
+ false
146
159
  )
147
160
  end
148
161
 
@@ -121,7 +121,7 @@ describe Adyen::API::PaymentService do
121
121
  it_should_validate_request_parameters :merchant_account,
122
122
  :reference,
123
123
  :amount => [:currency, :value],
124
- :card => [:holder_name, :number, :cvc, :expiry_year, :expiry_month]
124
+ :card => [:holder_name, :number, :expiry_year, :expiry_month]
125
125
 
126
126
  it_should_validate_request_param(:shopper) do
127
127
  @payment.params[:recurring] = true
@@ -162,6 +162,34 @@ describe Adyen::API::PaymentService do
162
162
  end
163
163
  end
164
164
 
165
+ describe_response_from :generate_billet, BILLET_RECEIVED_RESPONSE do
166
+ it_should_return_params_for_each_xml_backend({
167
+ :psp_reference => "8814038837489129",
168
+ :result_code => "Received",
169
+ :billet_url => "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"
170
+ })
171
+
172
+ describe "with a received billet" do
173
+ it "returns that the request was successful" do
174
+ @response.should be_success
175
+ end
176
+ end
177
+ end
178
+
179
+ describe_response_from :generate_billet, BILLET_REFUSED_RESPONSE do
180
+ it_should_return_params_for_each_xml_backend({
181
+ :psp_reference => "8514038928235061",
182
+ :result_code => "Refused",
183
+ :billet_url => ""
184
+ })
185
+
186
+ describe "with a received billet" do
187
+ it "returns that the request was successful" do
188
+ @response.should_not be_success
189
+ end
190
+ end
191
+ end
192
+
165
193
  describe_response_from :authorise_payment, AUTHORISE_RESPONSE do
166
194
  it_should_return_params_for_each_xml_backend({
167
195
  :psp_reference => '9876543210987654',
@@ -41,7 +41,7 @@ describe Adyen::API::Response do
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.server_error?.should be true
45
45
  end
46
46
  end
47
47
 
@@ -53,7 +53,7 @@ describe Adyen::API::Response do
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.server_error?.should be false
57
57
  end
58
58
  end
59
59
  end
@@ -48,7 +48,7 @@ describe Adyen::API::SimpleSOAPClient do
48
48
  end
49
49
 
50
50
  it "makes a request over SSL" do
51
- @request.use_ssl?.should be_true
51
+ @request.use_ssl?.should be true
52
52
  end
53
53
 
54
54
  it "verifies certificates" do
@@ -449,3 +449,15 @@ CAPTURE_RESPONSE = <<EOS
449
449
  </soap:Body>
450
450
  </soap:Envelope>
451
451
  EOS
452
+
453
+ BILLET_RECEIVED_RESPONSE = <<EOS
454
+ <?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>
458
+ EOS
459
+
460
+ BILLET_REFUSED_RESPONSE = <<EOS
461
+ <?xml version="1.0"?>
462
+ <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' xsi:nil='true' /><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'>8514038928235061</pspReference><refusalReason xmlns='http://payment.services.adyen.com'>102 Unable to determine variant</refusalReason><resultCode xmlns='http://payment.services.adyen.com'>Refused</resultCode></ns1:paymentResult></ns1:authoriseResponse></soap:Body></soap:Envelope>
463
+ EOS
@@ -19,64 +19,67 @@ if File.exist?(API_SPEC_INITIALIZER)
19
19
  Net::HTTP.stubbing_enabled = true
20
20
  end
21
21
 
22
+ it "performs a payment request" do
23
+ @payment_response.should be_authorized
24
+ @payment_response.psp_reference.should_not be_empty
25
+ end
26
+
22
27
  def perform_payment_request
23
28
  Adyen::API.authorise_payment(
24
29
  @order_id,
25
30
  { :currency => 'EUR', :value => '1234' },
26
31
  { :email => "#{@user_id}@example.com", :reference => @user_id },
27
- { :expiry_month => 12, :expiry_year => 2012, :holder_name => "Simon #{@user_id} Hopper", :number => '4444333322221111', :cvc => '737' },
32
+ { :expiry_month => '08', :expiry_year => '2018', :holder_name => "Simon #{@user_id} Hopper", :number => '4111111111111111', :cvc => '737' },
28
33
  true
29
34
  )
30
35
  end
31
36
 
32
- # TODO disabled for now: https://github.com/wvanbergen/adyen/issues/29
33
- # it "performs a payment request" do
34
- # @payment_response.should be_authorized
35
- # @payment_response.psp_reference.should_not be_empty
36
- # end
37
-
38
- # TODO disabled for now: https://github.com/wvanbergen/adyen/issues/29
39
- # it "performs a recurring payment request" do
40
- # response = Adyen::API.authorise_recurring_payment(
41
- # @order_id,
42
- # { :currency => 'EUR', :value => '1234' },
43
- # { :email => "#{@user_id}@example.com", :reference => @user_id }
44
- # )
45
- # response.should be_authorized
46
- # response.psp_reference.should_not be_empty
47
- # end
48
-
49
- # TODO disabled for now: https://github.com/wvanbergen/adyen/issues/29
50
- # it "performs a one-click payment request" do
51
- # detail = Adyen::API.list_recurring_details(@user_id).references.last
52
- # response = Adyen::API.authorise_one_click_payment(
53
- # @order_id,
54
- # { :currency => 'EUR', :value => '1234' },
55
- # { :email => "#{@user_id}@example.com", :reference => @user_id },
56
- # '737',
57
- # detail
58
- # )
59
- # response.should be_authorized
60
- # response.psp_reference.should_not be_empty
61
- # end
62
-
63
- # TODO disabled for now: https://github.com/wvanbergen/adyen/issues/29
64
- #it "stores the provided ELV account details" do
65
- #response = Adyen::API.store_recurring_token(
66
- #{ :email => "#{@user_id}@example.com", :reference => @user_id },
67
- #{ :bank_location => "Berlin", :bank_name => "TestBank", :bank_location_id => "12345678", :holder_name => "Simon #{@user_id} Hopper", :number => "1234567890" }
68
- #)
69
- #response.should be_stored
70
- #response.recurring_detail_reference.should_not be_empty
71
- #end
72
- #it "stores the provided creditcard details" do
73
- #response = Adyen::API.store_recurring_token(
74
- #{ :email => "#{@user_id}@example.com", :reference => @user_id },
75
- #{ :expiry_month => 12, :expiry_year => 2012, :holder_name => "Simon #{@user_id} Hopper", :number => '4111111111111111' }
76
- #)
77
- #response.should be_stored
78
- #response.recurring_detail_reference.should_not be_empty
79
- #end
37
+ it "performs a recurring payment request" do
38
+ response = Adyen::API.authorise_recurring_payment(
39
+ @order_id,
40
+ { :currency => 'EUR', :value => '1234' },
41
+ { :email => "#{@user_id}@example.com", :reference => @user_id }
42
+ )
43
+ response.should be_authorized
44
+ response.psp_reference.should_not be_empty
45
+ end
46
+
47
+ it "performs a one-click payment request" do
48
+ detail = Adyen::API.list_recurring_details(@user_id).references.last
49
+ response = Adyen::API.authorise_one_click_payment(
50
+ @order_id,
51
+ { :currency => 'EUR', :value => '1234' },
52
+ { :email => "#{@user_id}@example.com", :reference => @user_id },
53
+ { :cvc => '737' },
54
+ detail
55
+ )
56
+ response.should be_authorized
57
+ response.psp_reference.should_not be_empty
58
+ end
59
+
60
+ it "stores the provided ELV account details" do
61
+ response = Adyen::API.store_recurring_token(
62
+ { :email => "#{@user_id}@example.com", :reference => @user_id },
63
+ { :bank_location => "Berlin", :bank_name => "TestBank", :bank_location_id => "12345678", :holder_name => "Simon #{@user_id} Hopper", :number => "1234567890" }
64
+ )
65
+ response.should be_stored
66
+ response.recurring_detail_reference.should_not be_empty
67
+ end
68
+
69
+ it "stores the provided creditcard details" do
70
+ response = Adyen::API.store_recurring_token(
71
+ { :email => "#{@user_id}@example.com", :reference => @user_id },
72
+ { :expiry_month => '08', :expiry_year => '2018', :holder_name => "Simon #{@user_id} Hopper", :number => '4111111111111111' }
73
+ )
74
+ response.should be_stored
75
+ response.recurring_detail_reference.should_not be_empty
76
+ end
77
+
78
+ it "disables a recurring contract" do
79
+ response = Adyen::API.disable_recurring_contract(@user_id)
80
+ response.should be_success
81
+ response.should be_disabled
82
+ end
80
83
 
81
84
  it "captures a payment" do
82
85
  response = Adyen::API.capture_payment(@payment_response.psp_reference, { :currency => 'EUR', :value => '1234' })
@@ -98,12 +101,15 @@ if File.exist?(API_SPEC_INITIALIZER)
98
101
  response.should be_success
99
102
  end
100
103
 
101
- # TODO disabled for now: https://github.com/wvanbergen/adyen/issues/29
102
- # it "disables a recurring contract" do
103
- # response = Adyen::API.disable_recurring_contract(@user_id)
104
- # response.should be_success
105
- # response.should be_disabled
106
- # end
104
+ it "generates a billet" do
105
+ response = Adyen::API.generate_billet("{\"user_id\":66722,\"order_id\":6863}#signup",
106
+ { currency: "BRL", value: 1000 },
107
+ { first_name: "Jow", last_name: "Silver" },
108
+ "19762003691",
109
+ "boletobancario_santander",
110
+ "2014-07-16T18:16:11Z")
111
+ response.should be_success
112
+ end
107
113
  end
108
114
 
109
115
  else
@@ -0,0 +1,31 @@
1
+ # encoding: UTF-8
2
+ require 'test_helper'
3
+
4
+ class AdyenTest < Minitest::Test
5
+ def test_hmac_base64_encoding
6
+ encoded_str = Adyen::Encoding.hmac_base64('bla', 'bla')
7
+ assert_equal '6nItEkVpIYF+i1RwrEyQ7RHmrfU=', encoded_str
8
+ end
9
+
10
+ def test_gzip_base64_encoding
11
+ encoded_str = Adyen::Encoding.gzip_base64('bla')
12
+ assert_equal 32, encoded_str.length
13
+ end
14
+
15
+ def test_date_formatting
16
+ assert_match /^\d{4}-\d{2}-\d{2}$/, Adyen::Formatter::DateTime.fmt_date(Date.today)
17
+ assert_equal '2009-01-01', Adyen::Formatter::DateTime.fmt_date('2009-01-01')
18
+
19
+ assert_raises(ArgumentError) { Adyen::Formatter::DateTime.fmt_date('2009-1-1') }
20
+ assert_raises(ArgumentError) { Adyen::Formatter::DateTime.fmt_time(20090101) }
21
+ end
22
+
23
+ def test_timestamp_formatting
24
+ assert_match /^\d{4}-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}Z$/, Adyen::Formatter::DateTime.fmt_time(Time.now)
25
+ assert_match /^\d{4}-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}Z$/, Adyen::Formatter::DateTime.fmt_time(DateTime.now)
26
+ assert_equal '2009-01-01T11:11:11Z', Adyen::Formatter::DateTime.fmt_time('2009-01-01T11:11:11Z')
27
+
28
+ assert_raises(ArgumentError) { Adyen::Formatter::DateTime.fmt_time('2009-01-01 11:11:11') }
29
+ assert_raises(ArgumentError) { Adyen::Formatter::DateTime.fmt_time(20090101111111) }
30
+ end
31
+ end
@@ -0,0 +1,220 @@
1
+ require 'test_helper'
2
+
3
+ class FormTest < Minitest::Test
4
+ include Adyen::Matchers
5
+ include Adyen::Test::EachXMLBackend
6
+
7
+ def setup
8
+ Adyen.configuration.default_form_params[:merchant_account] = 'TestMerchant'
9
+ Adyen.configuration.register_form_skin(:testing, '4aD37dJA', 'Kah942*$7sdp0)')
10
+ Adyen.configuration.register_form_skin(:other, 'sk1nC0de', 'shared_secret', merchant_account: 'OtherMerchant')
11
+
12
+ # Use autodetection for the environment unless otherwise specified
13
+ Adyen.configuration.environment = nil
14
+ Adyen.configuration.payment_flow = :select
15
+ Adyen.configuration.payment_flow_domain = nil
16
+
17
+ @payment_attributes = {
18
+ :skin => :testing,
19
+ :currency_code => 'GBP',
20
+ :payment_amount => 10000,
21
+ :merchant_reference => 'Internet Order 12345',
22
+ :ship_before_date => '2007-10-20',
23
+ :session_validity => '2007-10-11T11:00:00Z',
24
+ :billing_address => {
25
+ :street => 'Alexanderplatz',
26
+ :house_number_or_name => '0815',
27
+ :city => 'Berlin',
28
+ :postal_code => '10119',
29
+ :state_or_province => 'Berlin',
30
+ :country => 'Germany',
31
+ },
32
+ :shopper => {
33
+ :telephone_number => '1234512345',
34
+ :first_name => 'John',
35
+ :last_name => 'Doe',
36
+ :social_security_number => '123-45-1234'
37
+ }
38
+ }
39
+
40
+ @recurring_payment_attributes = @payment_attributes.merge(
41
+ :skin => :other,
42
+ :recurring_contract => 'DEFAULT',
43
+ :shopper_reference => 'grasshopper52',
44
+ :shopper_email => 'gras.shopper@somewhere.org'
45
+ )
46
+
47
+ Adyen::Form.do_parameter_transformations!(@payment_attributes)
48
+ Adyen::Form.do_parameter_transformations!(@recurring_payment_attributes)
49
+ end
50
+
51
+ def test_autodetected_redirect_url
52
+ assert_equal 'https://test.adyen.com/hpp/select.shtml', Adyen::Form.url
53
+
54
+ Adyen.configuration.stubs(:autodetect_environment).returns('live')
55
+ assert_equal 'https://live.adyen.com/hpp/select.shtml', Adyen::Form.url
56
+ end
57
+
58
+ def test_explicit_redirect_url
59
+ assert_equal 'https://live.adyen.com/hpp/select.shtml', Adyen::Form.url(:live)
60
+ assert_equal 'https://test.adyen.com/hpp/select.shtml', Adyen::Form.url(:test)
61
+
62
+ Adyen.configuration.environment = :live
63
+ assert_equal 'https://live.adyen.com/hpp/select.shtml', Adyen::Form.url
64
+ end
65
+
66
+ def test_redirect_url_for_different_payment_flows
67
+ Adyen.configuration.payment_flow = :select
68
+ assert_equal 'https://test.adyen.com/hpp/select.shtml', Adyen::Form.url
69
+
70
+ Adyen.configuration.payment_flow = :pay
71
+ assert_equal 'https://test.adyen.com/hpp/pay.shtml', Adyen::Form.url
72
+
73
+ Adyen.configuration.payment_flow = :details
74
+ assert_equal 'https://test.adyen.com/hpp/details.shtml', Adyen::Form.url
75
+ end
76
+
77
+ def test_redirect_url_for_custom_domain
78
+ Adyen.configuration.payment_flow_domain = "checkout.mydomain.com"
79
+ assert_equal 'https://checkout.mydomain.com/hpp/select.shtml', Adyen::Form.url
80
+ end
81
+
82
+ def test_redirect_url_generation
83
+ attributes = {
84
+ :currency_code => 'GBP', :payment_amount => 10000, :ship_before_date => Date.today,
85
+ :merchant_reference => 'Internet Order 12345', :skin => :testing, :session_validity => Time.now + 3600
86
+ }
87
+
88
+ redirect_uri = URI(Adyen::Form.redirect_url(attributes))
89
+ assert_match %r[^#{Adyen::Form.url}], redirect_uri.to_s
90
+
91
+ params = CGI.parse(redirect_uri.query)
92
+ attributes.each do |key, value|
93
+ assert_equal value.to_s, params[Adyen::Form.camelize(key).to_s].first
94
+ end
95
+
96
+ assert params.key?('merchantSig'), "Expected a merchantSig parameter to be set"
97
+ end
98
+
99
+ def test_payment_methods_url_generation
100
+ attributes = {
101
+ :currency_code => 'GBP', :payment_amount => 10000, :ship_before_date => Date.today,
102
+ :merchant_reference => 'Internet Order 12345', :skin => :testing, :session_validity => Time.now + 3600
103
+ }
104
+
105
+ redirect_uri = URI(Adyen::Form.payment_methods_url(attributes))
106
+ assert_match %r[^#{Adyen::Form.url(nil, :directory)}], redirect_uri.to_s
107
+
108
+ params = CGI.parse(redirect_uri.query)
109
+ attributes.each do |key, value|
110
+ assert_equal value.to_s, params[Adyen::Form.camelize(key).to_s].first
111
+ end
112
+
113
+ assert params.key?('merchantSig'), "Expected a merchantSig parameter to be set"
114
+ end
115
+
116
+ def test_redirect_signature_string
117
+ signature_string = Adyen::Form.calculate_signature_string(@payment_attributes)
118
+ assert_equal "10000GBP2007-10-20Internet Order 123454aD37dJATestMerchant2007-10-11T11:00:00Z", signature_string
119
+
120
+ signature_string = Adyen::Form.calculate_signature_string(@payment_attributes.merge(:merchant_return_data => 'testing123'))
121
+ assert_equal "10000GBP2007-10-20Internet Order 123454aD37dJATestMerchant2007-10-11T11:00:00Ztesting123", signature_string
122
+
123
+ signature_string = Adyen::Form.calculate_signature_string(@recurring_payment_attributes)
124
+ assert_equal "10000GBP2007-10-20Internet Order 12345sk1nC0deOtherMerchant2007-10-11T11:00:00Zgras.shopper@somewhere.orggrasshopper52DEFAULT", signature_string
125
+ end
126
+
127
+ def test_redirect_signature
128
+ assert_equal 'x58ZcRVL1H6y+XSeBGrySJ9ACVo=', Adyen::Form.calculate_signature(@payment_attributes)
129
+ assert_equal 'EZtZS/33I6qsXptTfRIFMJxeKFE=', Adyen::Form.calculate_signature(@recurring_payment_attributes)
130
+
131
+ @payment_attributes.delete(:shared_secret)
132
+ assert_raises(ArgumentError) { Adyen::Form.calculate_signature(@payment_attributes) }
133
+ end
134
+
135
+ def test_shopper_signature
136
+ signature_string = Adyen::Form.calculate_shopper_signature_string(@payment_attributes[:shopper])
137
+ assert_equal "JohnDoe1234512345", signature_string
138
+ assert_equal 'rb2GEs1kGKuLh255a3QRPBYXmsQ=', Adyen::Form.calculate_shopper_signature(@payment_attributes)
139
+
140
+ @payment_attributes.delete(:shared_secret)
141
+ assert_raises(ArgumentError) { Adyen::Form.calculate_shopper_signature(@payment_attributes) }
142
+ end
143
+
144
+ def test_billing_address_signature
145
+ signature_string = Adyen::Form.calculate_billing_address_signature_string(@payment_attributes[:billing_address])
146
+ assert_equal "Alexanderplatz0815Berlin10119BerlinGermany", signature_string
147
+ assert_equal '5KQb7VJq4cz75cqp11JDajntCY4=', Adyen::Form.calculate_billing_address_signature(@payment_attributes)
148
+
149
+ @payment_attributes.delete(:shared_secret)
150
+ assert_raises(ArgumentError) { Adyen::Form.calculate_billing_address_signature(@payment_attributes) }
151
+ end
152
+
153
+ def test_billing_address_and_shopper_signature_in_redirect_url
154
+ get_params = CGI.parse(URI(Adyen::Form.redirect_url(@payment_attributes)).query)
155
+ assert_equal '5KQb7VJq4cz75cqp11JDajntCY4=', get_params['billingAddressSig'].first
156
+ assert_equal 'rb2GEs1kGKuLh255a3QRPBYXmsQ=', get_params['shopperSig'].first
157
+ end
158
+
159
+ def test_redirect_signature_check
160
+ params = {
161
+ :authResult => 'AUTHORISED', :pspReference => '1211992213193029',
162
+ :merchantReference => 'Internet Order 12345', :skinCode => '4aD37dJA',
163
+ :merchantSig => 'ytt3QxWoEhAskUzUne0P5VA9lPw='
164
+ }
165
+
166
+ assert_equal params[:merchantSig], Adyen::Form.redirect_signature(params)
167
+
168
+ assert Adyen::Form.redirect_signature_check(params) # shared secret from registered skin
169
+ assert Adyen::Form.redirect_signature_check(params, 'Kah942*$7sdp0)') # explicitly provided shared secret
170
+
171
+ refute Adyen::Form.redirect_signature_check(params.merge(skinCode: 'sk1nC0de'))
172
+ refute Adyen::Form.redirect_signature_check(params, 'wrong_shared_secret')
173
+
174
+ refute Adyen::Form.redirect_signature_check(params.merge(pspReference: 'tampered'))
175
+ refute Adyen::Form.redirect_signature_check(params.merge(merchantSig: 'tampered'))
176
+
177
+ assert_raises(ArgumentError) { Adyen::Form.redirect_signature_check(nil) }
178
+ assert_raises(ArgumentError) { Adyen::Form.redirect_signature_check({}) }
179
+ assert_raises(ArgumentError) { Adyen::Form.redirect_signature_check(params.delete(:skinCode)) }
180
+ end
181
+
182
+ def test_flatten
183
+ parameters = { 'billingAddress.street' => 'My Street' }
184
+ assert_equal parameters, Adyen::Form.flatten(:billing_address => { :street => 'My Street'})
185
+ assert_equal Hash.new, Adyen::Form.flatten(nil)
186
+ end
187
+
188
+ def test_hidden_payment_form_fields
189
+ payment_snippet = <<-HTML
190
+ <form action="#{CGI.escapeHTML(Adyen::Form.url)}" method="post">
191
+ #{Adyen::Form.hidden_fields(@payment_attributes)}
192
+ </form>
193
+ HTML
194
+
195
+ for_each_xml_backend do
196
+ assert_adyen_single_payment_form payment_snippet,
197
+ merchantAccount: 'TestMerchant',
198
+ currencyCode: 'GBP',
199
+ paymentAmount: '10000',
200
+ skinCode: '4aD37dJA'
201
+ end
202
+ end
203
+
204
+ def test_hidden_recurring_payment_form_fields
205
+ recurring_snippet = <<-HTML
206
+ <form action="#{CGI.escapeHTML(Adyen::Form.url)}" method="post">
207
+ #{Adyen::Form.hidden_fields(@recurring_payment_attributes)}
208
+ </form>
209
+ HTML
210
+
211
+ for_each_xml_backend do
212
+ assert_adyen_recurring_payment_form recurring_snippet,
213
+ merchantAccount: 'OtherMerchant',
214
+ currencyCode: 'GBP',
215
+ paymentAmount: '10000',
216
+ recurringContract: 'DEFAULT',
217
+ skinCode: 'sk1nC0de'
218
+ end
219
+ end
220
+ end