killbill-paypal-express 4.1.2 → 4.1.3

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.
@@ -0,0 +1,55 @@
1
+ require_relative 'browser_helpers'
2
+
3
+ module Killbill
4
+ module PaypalExpress
5
+ module BaidSpecHelpers
6
+
7
+ include ::Killbill::PaypalExpress::BrowserHelpers
8
+
9
+ def baid_setup(payment_processor_account_id = nil)
10
+ @call_context = build_call_context
11
+
12
+ options = {:payment_processor_account_id => payment_processor_account_id}
13
+
14
+ @amount = BigDecimal.new('100')
15
+ @currency = 'USD'
16
+
17
+ kb_account_id = SecureRandom.uuid
18
+ external_key, kb_account_id = create_kb_account(kb_account_id, @plugin.kb_apis.proxied_services[:account_user_api])
19
+
20
+ # Initiate the setup process
21
+ response = create_token(kb_account_id, @call_context.tenant_id, options)
22
+ token = response.token
23
+
24
+ login_and_confirm @plugin.to_express_checkout_url(response, @call_context.tenant_id)
25
+
26
+ # Complete the setup process
27
+ @properties = []
28
+ @properties << build_property('token', token)
29
+ @pm = create_payment_method(::Killbill::PaypalExpress::PaypalExpressPaymentMethod, kb_account_id, @call_context.tenant_id, @properties)
30
+
31
+ verify_payment_method kb_account_id
32
+ end
33
+
34
+ private
35
+
36
+ def create_token(kb_account_id, kb_tenant_id, options)
37
+ private_plugin = ::Killbill::PaypalExpress::PrivatePaymentPlugin.new
38
+ response = private_plugin.initiate_express_checkout(kb_account_id, kb_tenant_id, @amount, @currency, true, options)
39
+ response.success.should be_true
40
+ response
41
+ end
42
+
43
+ def verify_payment_method(kb_account_id)
44
+ # Verify our table directly. Note that @pm.token is the baid
45
+ payment_methods = ::Killbill::PaypalExpress::PaypalExpressPaymentMethod.from_kb_account_id_and_token(@pm.token, kb_account_id, @call_context.tenant_id)
46
+ payment_methods.size.should == 1
47
+ payment_method = payment_methods.first
48
+ payment_method.should_not be_nil
49
+ payment_method.paypal_express_payer_id.should_not be_nil
50
+ payment_method.token.should == @pm.token
51
+ payment_method.kb_payment_method_id.should == @pm.kb_payment_method_id
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,72 @@
1
+ require 'selenium-webdriver'
2
+
3
+ module Killbill
4
+ module PaypalExpress
5
+ module BrowserHelpers
6
+ def login_and_confirm(url)
7
+ if ENV['BUYER_USERNAME'].blank? || ENV['BUYER_PASSWORD'].blank?
8
+ print "\nPlease go to #{url} to proceed and press any key to continue... Note: you need to log-in with a paypal sandbox account (create one here: https://developer.paypal.com/webapps/developer/applications/accounts)\n"
9
+ $stdin.gets
10
+ else
11
+ driver = Selenium::WebDriver.for :firefox
12
+ # Login page
13
+ driver.get url
14
+
15
+ wait = Selenium::WebDriver::Wait.new(:timeout => 15)
16
+ wait.until {
17
+ driver.switch_to.frame('injectedUl') rescue nil
18
+ }
19
+
20
+ email_element, pwd_element, login_element = wait.until {
21
+ email_element = driver.find_element(:id, 'email') rescue nil
22
+ pwd_element = driver.find_element(:id, 'password') rescue nil
23
+ login_element = driver.find_element(:id, 'btnLogin') rescue nil
24
+ if ready?(email_element, pwd_element, login_element)
25
+ [email_element, pwd_element, login_element]
26
+ else
27
+ # Find the element ids from the old UI
28
+ old_email_element = driver.find_element(:id, 'login_email') rescue nil
29
+ old_pwd_element = driver.find_element(:id, 'login_password') rescue nil
30
+ old_login_element = driver.find_element(:id, 'submitLogin') rescue nil
31
+ if ready?(old_email_element, old_pwd_element, old_login_element)
32
+ [old_email_element, old_pwd_element, old_login_element]
33
+ else
34
+ false
35
+ end
36
+ end
37
+ }
38
+ email_element.send_keys(ENV['BUYER_USERNAME'])
39
+ pwd_element.send_keys(ENV['BUYER_PASSWORD'])
40
+ login_element.click
41
+
42
+ # Confirmation page
43
+ driver.switch_to.default_content
44
+ confirm_element = wait.until {
45
+ confirm_element = driver.find_element(:id, 'confirmButtonTop') rescue nil
46
+ if ready?(confirm_element)
47
+ confirm_element
48
+ else
49
+ old_confirm_element = driver.find_element(:id, 'continue_abovefold') rescue nil
50
+ ready?(old_confirm_element) ? old_confirm_element : false
51
+ end
52
+ }
53
+
54
+ # Wait for page to load. Even if it is displayed and enabled, sometimes the element is still not clickable.
55
+ sleep 2
56
+ confirm_element.click
57
+
58
+ driver.quit
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def ready?(*elements)
65
+ elements.each do |element|
66
+ return false unless element && element.displayed? && element.enabled?
67
+ end
68
+ true
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,33 @@
1
+ module Killbill
2
+ module PaypalExpress
3
+ module BuildPluginHelpers
4
+ def build_start_paypal_plugin(account_id = nil)
5
+ if account_id.nil?
6
+ plugin = build_plugin(::Killbill::PaypalExpress::PaymentPlugin, 'paypal_express')
7
+ start_plugin plugin
8
+ else
9
+ config = YAML.load_file('paypal_express.yml')
10
+ existing_credential = {:account_id => account_id}.merge config[:paypal_express]
11
+ second_credential = {:account_id => "#{account_id}_duplicate"}.merge config[:paypal_express]
12
+ config[:paypal_express] = [second_credential, existing_credential]
13
+ Dir.mktmpdir do |dir|
14
+ file_name = File.join(dir, 'paypal_express.yml')
15
+ File.open(file_name, 'w+') do |file|
16
+ YAML.dump(config, file)
17
+ end
18
+ plugin = build_plugin(::Killbill::PaypalExpress::PaymentPlugin, 'paypal_express', File.dirname(file_name))
19
+ start_plugin plugin
20
+ end
21
+ end
22
+ end
23
+
24
+ def start_plugin(plugin)
25
+ svcs = plugin.kb_apis.proxied_services
26
+ svcs[:payment_api] = PaypalExpressJavaPaymentApi.new(plugin)
27
+ plugin.kb_apis = ::Killbill::Plugin::KillbillApi.new('paypal_express', svcs)
28
+ plugin.start_plugin
29
+ plugin
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,38 +1,16 @@
1
1
  require 'spec_helper'
2
+ require_relative 'hpp_spec_helpers'
3
+ require_relative 'build_plugin_helpers'
2
4
 
3
5
  ActiveMerchant::Billing::Base.mode = :test
4
6
 
5
- describe Killbill::PaypalExpress::PaymentPlugin do
6
-
7
- include ::Killbill::Plugin::ActiveMerchant::RSpec
8
-
9
- before(:all) do
10
- @plugin = build_plugin(::Killbill::PaypalExpress::PaymentPlugin, 'paypal_express')
11
- svcs = @plugin.kb_apis.proxied_services
12
- svcs[:payment_api] = PaypalExpressJavaPaymentApi.new(@plugin)
13
- @plugin.kb_apis = ::Killbill::Plugin::KillbillApi.new('paypal_express', svcs)
14
- @plugin.start_plugin
15
-
16
- @call_context = build_call_context
17
-
18
- @amount = BigDecimal.new('100')
19
- @currency = 'USD'
20
- @form_fields = @plugin.hash_to_properties(
21
- :order_id => '1234',
22
- :amount => @amount,
23
- :currency => @currency
24
- )
25
-
26
- kb_account_id = SecureRandom.uuid
27
- create_kb_account(kb_account_id, @plugin.kb_apis.proxied_services[:account_user_api])
28
-
29
- @pm = create_payment_method(::Killbill::PaypalExpress::PaypalExpressPaymentMethod, kb_account_id, @call_context.tenant_id)
30
- verify_payment_method
31
- end
7
+ shared_examples 'hpp_spec_common' do
32
8
 
33
9
  before(:each) do
34
10
  ::Killbill::PaypalExpress::PaypalExpressTransaction.delete_all
35
11
  ::Killbill::PaypalExpress::PaypalExpressResponse.delete_all
12
+ # clean the payments before each spec to avoid one influences each other
13
+ @plugin.kb_apis.proxied_services[:payment_api].delete_all_payments
36
14
  end
37
15
 
38
16
  it 'should generate forms correctly' do
@@ -141,116 +119,204 @@ describe Killbill::PaypalExpress::PaymentPlugin do
141
119
  ::Killbill::PaypalExpress::PaypalExpressResponse.count.should == 1 + 9 * n
142
120
  end
143
121
 
144
- private
122
+ it 'should generate forms and perform auth, capture and refund correctly' do
123
+ ::Killbill::PaypalExpress::PaypalExpressTransaction.count.should == 0
124
+ ::Killbill::PaypalExpress::PaypalExpressResponse.count.should == 0
145
125
 
146
- def validate_form(form)
147
- form.kb_account_id.should == @pm.kb_account_id
148
- form.form_url.should start_with('https://www.sandbox.paypal.com/cgi-bin/webscr')
149
- form.form_method.should == 'GET'
150
- end
126
+ # Verify the authorization cannot go through without the token
127
+ authorize_with_missing_token
151
128
 
152
- def validate_nil_form_property(form, key)
153
- key_properties = form.properties.select { |prop| prop.key == key }
154
- key_properties.size.should == 0
155
- end
129
+ # Verify multiple payments can be triggered for the same payment method
130
+ n = 2
131
+ 1.upto(n) do |i|
132
+ payment_external_key = SecureRandom.uuid
133
+ is_pending_payment_test = i % 2 == 1 ? false : true
134
+ properties = @plugin.hash_to_properties(
135
+ :transaction_external_key => payment_external_key,
136
+ # test both with and without pending payments
137
+ :create_pending_payment => is_pending_payment_test,
138
+ :payment_processor_account_id => @payment_processor_account_id,
139
+ :auth_mode => true
140
+ )
141
+ form = @plugin.build_form_descriptor(@pm.kb_account_id, @form_fields, properties, @call_context)
142
+ validate_form(form)
143
+ token = validate_form_property(form, 'token')
144
+ # Verify payments were created when create_pending_payment is true
145
+ @plugin.kb_apis.proxied_services[:payment_api].payments.size.should == i / 2
146
+ if is_pending_payment_test
147
+ kb_payment_id = validate_form_property(form, 'kb_payment_id')
148
+ validate_form_property(form, 'kb_transaction_external_key', payment_external_key)
149
+ @plugin.kb_apis.proxied_services[:payment_api].get_payment(kb_payment_id).transactions.first.external_key.should == payment_external_key
150
+ # Verify GET API
151
+ payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, properties, @call_context)
152
+ payment_infos.size.should == 1
153
+ payment_infos[0].kb_payment_id.should == kb_payment_id
154
+ payment_infos[0].transaction_type.should == :AUTHORIZE
155
+ payment_infos[0].amount.should be_nil
156
+ payment_infos[0].currency.should be_nil
157
+ payment_infos[0].status.should == :PENDING
158
+ payment_infos[0].gateway_error.should == '{"payment_plugin_status":"PENDING"}'
159
+ payment_infos[0].gateway_error_code.should be_nil
160
+ find_value_from_properties(payment_infos[0].properties, :payment_processor_account_id).should == @payment_processor_account_id
161
+ else
162
+ kb_payment_id = SecureRandom.uuid
163
+ validate_nil_form_property(form, 'kb_payment_id')
164
+ validate_nil_form_property(form, 'kb_transaction_external_key')
165
+ end
156
166
 
157
- def validate_form_property(form, key, value=nil)
158
- key_properties = form.properties.select { |prop| prop.key == key }
159
- key_properties.size.should == 1
160
- key = key_properties.first.value
161
- value.nil? ? key.should_not(be_nil) : key.should == value
162
- key
163
- end
167
+ properties = []
168
+ properties << build_property(:token, token)
169
+ # Verify the payment cannot be authorized without the token being validated
170
+ authorize_with_invalid_token(properties)
171
+ # Go to PayPal to validate the token
172
+ validate_token(form)
164
173
 
165
- def validate_token(form)
166
- print "\nPlease go to #{form.form_url} to proceed and press any key to continue...
167
- Note: you need to log-in with a paypal sandbox account (create one here: https://developer.paypal.com/webapps/developer/applications/accounts)\n"
168
- $stdin.gets
169
- end
174
+ # Verify auth, capture and refund
175
+ authorize_capture_and_refund(kb_payment_id, payment_external_key, properties, @payment_processor_account_id)
176
+
177
+ # Verify no extra payment was created in Kill Bill by the plugin
178
+ @plugin.kb_apis.proxied_services[:payment_api].payments.size.should == (i / 2)
179
+
180
+ # Verify no token/baid was stored
181
+ verify_payment_method
182
+ end
170
183
 
171
- def purchase_and_refund(kb_payment_id, purchase_payment_external_key, purchase_properties)
172
- # Trigger the purchase
173
- payment_response = @plugin.purchase_payment(@pm.kb_account_id, kb_payment_id, purchase_payment_external_key, @pm.kb_payment_method_id, @amount, @currency, purchase_properties, @call_context)
174
- payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
175
- payment_response.amount.should == @amount
176
- payment_response.transaction_type.should == :PURCHASE
177
-
178
- # Verify GET API
179
- payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, [], @call_context)
180
- payment_infos.size.should == 1
181
- payment_infos[0].kb_payment_id.should == kb_payment_id
182
- payment_infos[0].transaction_type.should == :PURCHASE
183
- payment_infos[0].amount.should == @amount
184
- payment_infos[0].currency.should == @currency
185
- payment_infos[0].status.should == :PROCESSED
186
- payment_infos[0].gateway_error.should == 'Success'
187
- payment_infos[0].gateway_error_code.should be_nil
188
-
189
- # Try a full refund
190
- refund_response = @plugin.refund_payment(@pm.kb_account_id, kb_payment_id, SecureRandom.uuid, @pm.kb_payment_method_id, @amount, @currency, [], @call_context)
191
- refund_response.status.should eq(:PROCESSED), refund_response.gateway_error
192
- refund_response.amount.should == @amount
193
- refund_response.transaction_type.should == :REFUND
194
-
195
- # Verify GET API
196
- payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, [], @call_context)
197
- payment_infos.size.should == 2
198
- payment_infos[0].kb_payment_id.should == kb_payment_id
199
- payment_infos[0].transaction_type.should == :PURCHASE
200
- payment_infos[0].amount.should == @amount
201
- payment_infos[0].currency.should == @currency
202
- payment_infos[0].status.should == :PROCESSED
203
- payment_infos[0].gateway_error.should == 'Success'
204
- payment_infos[0].gateway_error_code.should be_nil
205
- payment_infos[1].kb_payment_id.should.should == kb_payment_id
206
- payment_infos[1].transaction_type.should == :REFUND
207
- payment_infos[1].amount.should == @amount
208
- payment_infos[1].currency.should == @currency
209
- payment_infos[1].status.should == :PROCESSED
210
- payment_infos[1].gateway_error.should == 'Success'
211
- payment_infos[1].gateway_error_code.should be_nil
184
+ # Each loop triggers one successful auth, one successful capture and one successful refund
185
+ ::Killbill::PaypalExpress::PaypalExpressTransaction.count.should == 3 * n
186
+ ::Killbill::PaypalExpress::PaypalExpressResponse.count.should == 1 + 15 * n / 2 + 7 * n % 2
212
187
  end
213
188
 
214
- def purchase_with_missing_token
215
- failed_purchase([], :CANCELED, 'Could not find the payer_id: the token is missing', 'RuntimeError')
189
+ it 'should perform auth and void correctly' do
190
+ ::Killbill::PaypalExpress::PaypalExpressTransaction.count.should == 0
191
+ ::Killbill::PaypalExpress::PaypalExpressResponse.count.should == 0
192
+
193
+ # Verify multiple payments can be triggered for the same payment method
194
+ n = 2
195
+ 1.upto(n) do |i|
196
+ payment_external_key = SecureRandom.uuid
197
+ is_pending_payment_test = i % 2 == 1 ? false : true
198
+ properties = @plugin.hash_to_properties(
199
+ :transaction_external_key => payment_external_key,
200
+ :create_pending_payment => is_pending_payment_test,
201
+ :auth_mode => true,
202
+ :payment_processor_account_id => @payment_processor_account_id
203
+ )
204
+ form = @plugin.build_form_descriptor(@pm.kb_account_id, @form_fields, properties, @call_context)
205
+ validate_form(form)
206
+ token = validate_form_property(form, 'token')
207
+ if is_pending_payment_test
208
+ kb_payment_id = validate_form_property(form, 'kb_payment_id')
209
+ else
210
+ kb_payment_id = SecureRandom.uuid
211
+ end
212
+
213
+ # Go to PayPal to validate the token
214
+ validate_token(form)
215
+
216
+ properties = []
217
+ properties << build_property('token', token)
218
+
219
+ authorize_and_void(kb_payment_id, payment_external_key, properties, @payment_processor_account_id)
220
+
221
+ # Verify no extra payment was created in Kill Bill by the plugin
222
+ @plugin.kb_apis.proxied_services[:payment_api].payments.size.should == i / 2
223
+ end
224
+
225
+ # Each loop triggers one successful authorize and one successful void
226
+ ::Killbill::PaypalExpress::PaypalExpressTransaction.count.should == 2 * n
227
+ ::Killbill::PaypalExpress::PaypalExpressResponse.count.should == 9 * n / 2 + 5 * n % 2
216
228
  end
217
229
 
218
- def purchase_with_invalid_token(purchase_properties)
219
- failed_purchase(purchase_properties, :CANCELED, "Could not find the payer_id for token #{properties_to_hash(purchase_properties)[:token]}", 'RuntimeError')
230
+ it 'should not capture the same transaction twice with full amount' do
231
+ ::Killbill::PaypalExpress::PaypalExpressTransaction.count.should == 0
232
+ ::Killbill::PaypalExpress::PaypalExpressResponse.count.should == 0
233
+
234
+ payment_external_key = SecureRandom.uuid
235
+ properties = @plugin.hash_to_properties(
236
+ :transaction_external_key => payment_external_key,
237
+ :create_pending_payment => true,
238
+ :auth_mode => true
239
+ )
240
+
241
+ form = @plugin.build_form_descriptor(@pm.kb_account_id, @form_fields, properties, @call_context)
242
+ validate_form(form)
243
+ kb_payment_id = validate_form_property(form, 'kb_payment_id')
244
+ validate_form_property(form, 'kb_transaction_external_key', payment_external_key)
245
+ token = validate_form_property(form, 'token')
246
+
247
+ properties = []
248
+ properties << build_property('token', token)
249
+ properties << build_property('auth_mode', 'true')
250
+
251
+ validate_token(form)
252
+
253
+ authorize_and_double_capture(kb_payment_id, payment_external_key, properties)
220
254
  end
221
255
 
222
- def subsequent_purchase(purchase_properties)
223
- failed_purchase(purchase_properties, :ERROR, 'A successful transaction has already been completed for this token.')
256
+ it 'should find the payment processor id from the initial_express_call' do
257
+ ::Killbill::PaypalExpress::PaypalExpressTransaction.count.should == 0
258
+ ::Killbill::PaypalExpress::PaypalExpressResponse.count.should == 0
259
+
260
+ properties = @plugin.hash_to_properties(
261
+ :transaction_external_key => SecureRandom.uuid,
262
+ :create_pending_payment => true,
263
+ :auth_mode => true,
264
+ :payment_processor_account_id => @payment_processor_account_id
265
+ )
266
+ form = @plugin.build_form_descriptor(@pm.kb_account_id, @form_fields, properties, @call_context)
267
+ token = validate_form_property(form, 'token')
268
+ @plugin.send(:find_payment_processor_id_from_initial_call, @pm.kb_account_id, @call_context.tenant_id, token).should == @payment_processor_account_id
269
+
270
+ properties = @plugin.hash_to_properties(
271
+ :transaction_external_key => SecureRandom.uuid,
272
+ :auth_mode => true,
273
+ :payment_processor_account_id => @payment_processor_account_id
274
+ )
275
+ form = @plugin.build_form_descriptor(@pm.kb_account_id, @form_fields, properties, @call_context)
276
+ token = validate_form_property(form, 'token')
277
+ @plugin.send(:find_payment_processor_id_from_initial_call, @pm.kb_account_id, @call_context.tenant_id, token).should == @payment_processor_account_id
278
+
279
+ properties = @plugin.hash_to_properties(
280
+ :transaction_external_key => SecureRandom.uuid,
281
+ :create_pending_payment => true,
282
+ :payment_processor_account_id => @payment_processor_account_id
283
+ )
284
+ form = @plugin.build_form_descriptor(@pm.kb_account_id, @form_fields, properties, @call_context)
285
+ token = validate_form_property(form, 'token')
286
+ @plugin.send(:find_payment_processor_id_from_initial_call, @pm.kb_account_id, @call_context.tenant_id, token).should == @payment_processor_account_id
287
+
288
+ properties = @plugin.hash_to_properties(
289
+ :transaction_external_key => SecureRandom.uuid,
290
+ :payment_processor_account_id => @payment_processor_account_id
291
+ )
292
+ form = @plugin.build_form_descriptor(@pm.kb_account_id, @form_fields, properties, @call_context)
293
+ token = validate_form_property(form, 'token')
294
+ @plugin.send(:find_payment_processor_id_from_initial_call, @pm.kb_account_id, @call_context.tenant_id, token).should == @payment_processor_account_id
224
295
  end
296
+ end
225
297
 
226
- def failed_purchase(purchase_properties, status, msg, gateway_error_code=nil)
227
- kb_payment_id = SecureRandom.uuid
228
-
229
- payment_response = @plugin.purchase_payment(@pm.kb_account_id, kb_payment_id, SecureRandom.uuid, @pm.kb_payment_method_id, @amount, @currency, purchase_properties, @call_context)
230
- payment_response.status.should eq(status), payment_response.gateway_error
231
- payment_response.amount.should be_nil
232
- payment_response.transaction_type.should == :PURCHASE
233
-
234
- # Verify GET API
235
- payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, [], @call_context)
236
- payment_infos.size.should == 1
237
- payment_infos[0].kb_payment_id.should == kb_payment_id
238
- payment_infos[0].transaction_type.should == :PURCHASE
239
- payment_infos[0].amount.should be_nil
240
- payment_infos[0].currency.should be_nil
241
- payment_infos[0].status.should == status
242
- payment_infos[0].gateway_error.should == msg
243
- payment_infos[0].gateway_error_code.should == gateway_error_code
298
+ describe Killbill::PaypalExpress::PaymentPlugin do
299
+ include ::Killbill::Plugin::ActiveMerchant::RSpec
300
+ include ::Killbill::PaypalExpress::BuildPluginHelpers
301
+ include ::Killbill::PaypalExpress::HppSpecHelpers
302
+
303
+ context 'hpp test with a single account' do
304
+ before(:all) do
305
+ @payment_processor_account_id = 'default'
306
+ @plugin = build_start_paypal_plugin
307
+ hpp_setup
308
+ end
309
+
310
+ include_examples 'hpp_spec_common'
244
311
  end
245
312
 
246
- def verify_payment_method
247
- # Verify our table directly
248
- payment_methods = ::Killbill::PaypalExpress::PaypalExpressPaymentMethod.from_kb_account_id(@pm.kb_account_id, @call_context.tenant_id)
249
- payment_methods.size.should == 1
250
- payment_method = payment_methods.first
251
- payment_method.should_not be_nil
252
- payment_method.paypal_express_payer_id.should be_nil
253
- payment_method.token.should be_nil
254
- payment_method.kb_payment_method_id.should == @pm.kb_payment_method_id
313
+ context 'hpp test with multiple accounts' do
314
+ before(:all) do
315
+ @payment_processor_account_id = 'paypal_test_account'
316
+ @plugin = build_start_paypal_plugin @payment_processor_account_id
317
+ hpp_setup
318
+ end
319
+
320
+ include_examples 'hpp_spec_common'
255
321
  end
256
322
  end