killbill-paypal-express 4.1.2 → 4.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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