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,364 @@
1
+ require_relative 'browser_helpers'
2
+
3
+ module Killbill
4
+ module PaypalExpress
5
+ module HppSpecHelpers
6
+
7
+ include ::Killbill::PaypalExpress::BrowserHelpers
8
+
9
+ def hpp_setup
10
+ @call_context = build_call_context
11
+ @amount = BigDecimal.new('100')
12
+ @currency = 'USD'
13
+ @form_fields = @plugin.hash_to_properties(
14
+ :order_id => '1234',
15
+ :amount => @amount,
16
+ :currency => @currency
17
+ )
18
+ kb_account_id = SecureRandom.uuid
19
+ create_kb_account(kb_account_id, @plugin.kb_apis.proxied_services[:account_user_api])
20
+ @pm = create_payment_method(::Killbill::PaypalExpress::PaypalExpressPaymentMethod, kb_account_id, @call_context.tenant_id)
21
+ verify_payment_method kb_account_id
22
+ end
23
+
24
+ def validate_form(form)
25
+ form.kb_account_id.should == @pm.kb_account_id
26
+ form.form_url.should start_with('https://www.sandbox.paypal.com/cgi-bin/webscr')
27
+ form.form_method.should == 'GET'
28
+ end
29
+
30
+ def validate_nil_form_property(form, key)
31
+ key_properties = form.properties.select { |prop| prop.key == key }
32
+ key_properties.size.should == 0
33
+ end
34
+
35
+ def validate_form_property(form, key, value=nil)
36
+ key_properties = form.properties.select { |prop| prop.key == key }
37
+ key_properties.size.should == 1
38
+ key = key_properties.first.value
39
+ value.nil? ? key.should_not(be_nil) : key.should == value
40
+ key
41
+ end
42
+
43
+ def validate_token(form)
44
+ login_and_confirm form.form_url
45
+ end
46
+
47
+ def purchase_and_refund(kb_payment_id, purchase_payment_external_key, purchase_properties)
48
+ # Trigger the purchase
49
+ 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)
50
+ payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
51
+ payment_response.amount.should == @amount
52
+ payment_response.transaction_type.should == :PURCHASE
53
+
54
+ # Verify GET API
55
+ payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, [], @call_context)
56
+ payment_infos.size.should == 1
57
+ payment_infos[0].kb_payment_id.should == kb_payment_id
58
+ payment_infos[0].transaction_type.should == :PURCHASE
59
+ payment_infos[0].amount.should == @amount
60
+ payment_infos[0].currency.should == @currency
61
+ payment_infos[0].status.should == :PROCESSED
62
+ payment_infos[0].gateway_error.should == 'Success'
63
+ payment_infos[0].gateway_error_code.should be_nil
64
+
65
+ # Try a full refund
66
+ refund_response = @plugin.refund_payment(@pm.kb_account_id, kb_payment_id, SecureRandom.uuid, @pm.kb_payment_method_id, @amount, @currency, [], @call_context)
67
+ refund_response.status.should eq(:PROCESSED), refund_response.gateway_error
68
+ refund_response.amount.should == @amount
69
+ refund_response.transaction_type.should == :REFUND
70
+
71
+ # Verify GET API
72
+ payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, [], @call_context)
73
+ payment_infos.size.should == 2
74
+ payment_infos[0].kb_payment_id.should == kb_payment_id
75
+ payment_infos[0].transaction_type.should == :PURCHASE
76
+ payment_infos[0].amount.should == @amount
77
+ payment_infos[0].currency.should == @currency
78
+ payment_infos[0].status.should == :PROCESSED
79
+ payment_infos[0].gateway_error.should == 'Success'
80
+ payment_infos[0].gateway_error_code.should be_nil
81
+ payment_infos[1].kb_payment_id.should.should == kb_payment_id
82
+ payment_infos[1].transaction_type.should == :REFUND
83
+ payment_infos[1].amount.should == @amount
84
+ payment_infos[1].currency.should == @currency
85
+ payment_infos[1].status.should == :PROCESSED
86
+ payment_infos[1].gateway_error.should == 'Success'
87
+ payment_infos[1].gateway_error_code.should be_nil
88
+ end
89
+
90
+ def authorize_capture_and_refund(kb_payment_id, payment_external_key, properties, payment_processor_account_id)
91
+ # Trigger the authorize
92
+ payment_response = @plugin.authorize_payment(@pm.kb_account_id, kb_payment_id, payment_external_key, @pm.kb_payment_method_id, @amount, @currency, properties, @call_context)
93
+ payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
94
+ payment_response.amount.should == @amount
95
+ payment_response.transaction_type.should == :AUTHORIZE
96
+
97
+ # Verify GET AUTHORIZED PAYMENT
98
+ payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, properties, @call_context)
99
+ payment_infos.size.should == 1
100
+ payment_infos[0].kb_payment_id.should == kb_payment_id
101
+ payment_infos[0].transaction_type.should == :AUTHORIZE
102
+ payment_infos[0].amount.should == @amount
103
+ payment_infos[0].currency.should == @currency
104
+ payment_infos[0].status.should == :PROCESSED
105
+ payment_infos[0].gateway_error.should == 'Success'
106
+ payment_infos[0].gateway_error_code.should be_nil
107
+ find_value_from_properties(payment_infos[0].properties, 'paymentInfoPaymentStatus').should == 'Pending'
108
+ find_value_from_properties(payment_infos[0].properties, 'paymentInfoPendingReason').should == 'authorization'
109
+ find_value_from_properties(payment_infos[0].properties, 'payment_processor_account_id').should == payment_processor_account_id
110
+
111
+ # Trigger the capture
112
+ payment_response = @plugin.capture_payment(@pm.kb_account_id, kb_payment_id, payment_external_key, @pm.kb_payment_method_id, @amount, @currency, properties, @call_context)
113
+ payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
114
+ payment_response.amount.should == @amount
115
+ payment_response.transaction_type.should == :CAPTURE
116
+
117
+ # Verify GET CAPTURED PAYMENT
118
+ payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, properties, @call_context)
119
+ # Two expected transactions: one auth and one capture
120
+ payment_infos.size.should == 2
121
+ payment_infos[0].kb_payment_id.should == kb_payment_id
122
+ payment_infos[0].transaction_type.should == :AUTHORIZE
123
+ payment_infos[0].amount.should == @amount
124
+ payment_infos[0].currency.should == @currency
125
+ payment_infos[0].status.should == :PROCESSED
126
+ payment_infos[0].gateway_error.should == 'Success'
127
+ payment_infos[0].gateway_error_code.should be_nil
128
+ find_value_from_properties(payment_infos[0].properties, 'payment_processor_account_id').should == payment_processor_account_id
129
+ payment_infos[1].kb_payment_id.should == kb_payment_id
130
+ payment_infos[1].transaction_type.should == :CAPTURE
131
+ payment_infos[1].amount.should == @amount
132
+ payment_infos[1].currency.should == @currency
133
+ payment_infos[1].status.should == :PROCESSED
134
+ payment_infos[1].gateway_error.should == 'Success'
135
+ payment_infos[1].gateway_error_code.should be_nil
136
+ find_value_from_properties(payment_infos[1].properties, 'paymentInfoPaymentStatus').should == 'Completed'
137
+ find_value_from_properties(payment_infos[1].properties, 'payment_processor_account_id').should == payment_processor_account_id
138
+
139
+ # Try a full refund
140
+ refund_response = @plugin.refund_payment(@pm.kb_account_id, kb_payment_id, SecureRandom.uuid, @pm.kb_payment_method_id, @amount, @currency, [], @call_context)
141
+ refund_response.status.should eq(:PROCESSED), refund_response.gateway_error
142
+ refund_response.amount.should == @amount
143
+ refund_response.transaction_type.should == :REFUND
144
+
145
+ # Verify GET API
146
+ payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, properties, @call_context)
147
+ payment_infos.size.should == 3
148
+ payment_infos[0].kb_payment_id.should == kb_payment_id
149
+ payment_infos[0].transaction_type.should == :AUTHORIZE
150
+ payment_infos[0].amount.should == @amount
151
+ payment_infos[0].currency.should == @currency
152
+ payment_infos[0].status.should == :PROCESSED
153
+ payment_infos[0].gateway_error.should == 'Success'
154
+ payment_infos[0].gateway_error_code.should be_nil
155
+ find_value_from_properties(payment_infos[0].properties, 'payment_processor_account_id').should == payment_processor_account_id
156
+ payment_infos[1].kb_payment_id.should == kb_payment_id
157
+ payment_infos[1].transaction_type.should == :CAPTURE
158
+ payment_infos[1].amount.should == @amount
159
+ payment_infos[1].currency.should == @currency
160
+ payment_infos[1].status.should == :PROCESSED
161
+ payment_infos[1].gateway_error.should == 'Success'
162
+ payment_infos[1].gateway_error_code.should be_nil
163
+ find_value_from_properties(payment_infos[1].properties, 'payment_processor_account_id').should == payment_processor_account_id
164
+ payment_infos[2].kb_payment_id.should.should == kb_payment_id
165
+ payment_infos[2].transaction_type.should == :REFUND
166
+ payment_infos[2].amount.should == @amount
167
+ payment_infos[2].currency.should == @currency
168
+ payment_infos[2].status.should == :PROCESSED
169
+ payment_infos[2].gateway_error.should == 'Success'
170
+ payment_infos[2].gateway_error_code.should be_nil
171
+ find_value_from_properties(payment_infos[2].properties, 'payment_processor_account_id').should == payment_processor_account_id
172
+ end
173
+
174
+ def authorize_and_double_capture(kb_payment_id, payment_external_key, properties)
175
+ # Trigger the authorize
176
+ payment_response = @plugin.authorize_payment(@pm.kb_account_id, kb_payment_id, payment_external_key, @pm.kb_payment_method_id, @amount, @currency, properties, @call_context)
177
+ payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
178
+ payment_response.amount.should == @amount
179
+ payment_response.transaction_type.should == :AUTHORIZE
180
+
181
+ payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, properties, @call_context)
182
+ payment_infos.size.should == 1
183
+ payment_infos[0].kb_payment_id.should == kb_payment_id
184
+ payment_infos[0].transaction_type.should == :AUTHORIZE
185
+ payment_infos[0].amount.should == @amount
186
+ payment_infos[0].currency.should == @currency
187
+ payment_infos[0].status.should == :PROCESSED
188
+ payment_infos[0].gateway_error.should == 'Success'
189
+ payment_infos[0].gateway_error_code.should be_nil
190
+
191
+ # Trigger the capture
192
+ payment_response = @plugin.capture_payment(@pm.kb_account_id, kb_payment_id, payment_external_key, @pm.kb_payment_method_id, @amount, @currency, properties, @call_context)
193
+ payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
194
+ payment_response.amount.should == @amount
195
+ payment_response.transaction_type.should == :CAPTURE
196
+
197
+ payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, properties, @call_context)
198
+ payment_infos.size.should == 2
199
+ payment_infos[0].kb_payment_id.should == kb_payment_id
200
+ payment_infos[0].transaction_type.should == :AUTHORIZE
201
+ payment_infos[0].amount.should == @amount
202
+ payment_infos[0].currency.should == @currency
203
+ payment_infos[0].status.should == :PROCESSED
204
+ payment_infos[0].gateway_error.should == 'Success'
205
+ payment_infos[0].gateway_error_code.should be_nil
206
+ payment_infos[1].kb_payment_id.should == kb_payment_id
207
+ payment_infos[1].transaction_type.should == :CAPTURE
208
+ payment_infos[1].amount.should == @amount
209
+ payment_infos[1].currency.should == @currency
210
+ payment_infos[1].status.should == :PROCESSED
211
+ payment_infos[1].gateway_error.should == 'Success'
212
+ payment_infos[1].gateway_error_code.should be_nil
213
+
214
+ # Trigger a capture again with full amount
215
+ payment_response = @plugin.capture_payment(@pm.kb_account_id, kb_payment_id, payment_external_key, @pm.kb_payment_method_id, @amount, @currency, properties, @call_context)
216
+ payment_response.status.should eq(:ERROR), payment_response.gateway_error
217
+ payment_response.amount.should == nil
218
+ payment_response.transaction_type.should == :CAPTURE
219
+
220
+ payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, properties, @call_context)
221
+ payment_infos.size.should == 3
222
+ payment_infos[0].kb_payment_id.should == kb_payment_id
223
+ payment_infos[0].transaction_type.should == :AUTHORIZE
224
+ payment_infos[0].amount.should == @amount
225
+ payment_infos[0].currency.should == @currency
226
+ payment_infos[0].status.should == :PROCESSED
227
+ payment_infos[0].gateway_error.should == 'Success'
228
+ payment_infos[0].gateway_error_code.should be_nil
229
+ payment_infos[1].kb_payment_id.should == kb_payment_id
230
+ payment_infos[1].transaction_type.should == :CAPTURE
231
+ payment_infos[1].amount.should == @amount
232
+ payment_infos[1].currency.should == @currency
233
+ payment_infos[1].status.should == :PROCESSED
234
+ payment_infos[1].gateway_error.should == 'Success'
235
+ payment_infos[1].gateway_error_code.should be_nil
236
+ payment_infos[2].kb_payment_id.should.should == kb_payment_id
237
+ payment_infos[2].transaction_type.should == :CAPTURE
238
+ payment_infos[2].amount.should be_nil
239
+ payment_infos[2].currency.should be_nil
240
+ payment_infos[2].status.should == :ERROR
241
+ payment_infos[2].gateway_error.should == 'Authorization has already been completed.'
242
+ payment_infos[2].gateway_error_code.should be_nil
243
+ end
244
+
245
+ def authorize_and_void(kb_payment_id, payment_external_key, properties, payment_processor_account_id)
246
+ # Trigger the authorize
247
+ payment_response = @plugin.authorize_payment(@pm.kb_account_id, kb_payment_id, payment_external_key, @pm.kb_payment_method_id, @amount, @currency, properties, @call_context)
248
+ payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
249
+ payment_response.amount.should == @amount
250
+ payment_response.transaction_type.should == :AUTHORIZE
251
+
252
+ # Verify get_payment_info
253
+ payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, properties, @call_context)
254
+ payment_infos.size.should == 1
255
+ payment_infos[0].kb_payment_id.should == kb_payment_id
256
+ payment_infos[0].transaction_type.should == :AUTHORIZE
257
+ payment_infos[0].amount.should == @amount
258
+ payment_infos[0].currency.should == @currency
259
+ payment_infos[0].status.should == :PROCESSED
260
+ payment_infos[0].gateway_error.should == 'Success'
261
+ payment_infos[0].gateway_error_code.should be_nil
262
+ find_value_from_properties(payment_infos[0].properties, 'payment_processor_account_id').should == payment_processor_account_id
263
+
264
+ # Trigger the void
265
+ payment_response = @plugin.void_payment(@pm.kb_account_id, kb_payment_id, payment_external_key, @pm.kb_payment_method_id, properties, @call_context)
266
+ payment_response.status.should eq(:PROCESSED), payment_response.gateway_error
267
+ payment_response.transaction_type.should == :VOID
268
+
269
+ # Verify get_payment_info
270
+ payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, properties, @call_context)
271
+ # Two expected transactions: one auth and one capture
272
+ payment_infos.size.should == 2
273
+ payment_infos[0].kb_payment_id.should == kb_payment_id
274
+ payment_infos[0].transaction_type.should == :AUTHORIZE
275
+ payment_infos[0].amount.should == @amount
276
+ payment_infos[0].currency.should == @currency
277
+ payment_infos[0].status.should == :PROCESSED
278
+ payment_infos[0].gateway_error.should == 'Success'
279
+ payment_infos[0].gateway_error_code.should be_nil
280
+ find_value_from_properties(payment_infos[0].properties, 'payment_processor_account_id').should == payment_processor_account_id
281
+ payment_infos[1].kb_payment_id.should == kb_payment_id
282
+ payment_infos[1].transaction_type.should == :VOID
283
+ payment_infos[1].status.should == :PROCESSED
284
+ payment_infos[1].gateway_error.should == 'Success'
285
+ payment_infos[1].gateway_error_code.should be_nil
286
+ find_value_from_properties(payment_infos[1].properties, 'payment_processor_account_id').should == payment_processor_account_id
287
+ end
288
+
289
+ def purchase_with_missing_token
290
+ failed_purchase([], :CANCELED, 'Could not find the payer_id: the token is missing', 'RuntimeError')
291
+ end
292
+
293
+ def authorize_with_missing_token
294
+ failed_authorize([], :CANCELED, 'Could not find the payer_id: the token is missing', 'RuntimeError')
295
+ end
296
+
297
+ def purchase_with_invalid_token(purchase_properties)
298
+ failed_purchase(purchase_properties, :CANCELED, "Could not find the payer_id for token #{properties_to_hash(purchase_properties)[:token]}", 'RuntimeError')
299
+ end
300
+
301
+ def authorize_with_invalid_token(authorize_properties)
302
+ failed_authorize(authorize_properties, :CANCELED, "Could not find the payer_id for token #{properties_to_hash(authorize_properties)[:token]}", 'RuntimeError')
303
+ end
304
+
305
+ def subsequent_purchase(purchase_properties)
306
+ failed_purchase(purchase_properties, :ERROR, 'A successful transaction has already been completed for this token.')
307
+ end
308
+
309
+ def failed_authorize(authorize_properties, status, msg, gateway_error_code=nil)
310
+ kb_payment_id = SecureRandom.uuid
311
+
312
+ payment_response = @plugin.authorize_payment(@pm.kb_account_id, kb_payment_id, SecureRandom.uuid, @pm.kb_payment_method_id, @amount, @currency, authorize_properties, @call_context)
313
+ payment_response.status.should eq(status), payment_response.gateway_error
314
+ payment_response.amount.should be_nil
315
+ payment_response.transaction_type.should == :AUTHORIZE
316
+
317
+ # Verify GET API
318
+ payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, [], @call_context)
319
+ payment_infos.size.should == 1
320
+ payment_infos[0].kb_payment_id.should == kb_payment_id
321
+ payment_infos[0].transaction_type.should == :AUTHORIZE
322
+ payment_infos[0].amount.should be_nil
323
+ payment_infos[0].currency.should be_nil
324
+ payment_infos[0].status.should == status
325
+ payment_infos[0].gateway_error.should == msg
326
+ payment_infos[0].gateway_error_code.should == gateway_error_code
327
+ end
328
+
329
+ def failed_purchase(purchase_properties, status, msg, gateway_error_code=nil)
330
+ kb_payment_id = SecureRandom.uuid
331
+
332
+ 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)
333
+ payment_response.status.should eq(status), payment_response.gateway_error
334
+ payment_response.amount.should be_nil
335
+ payment_response.transaction_type.should == :PURCHASE
336
+
337
+ # Verify GET API
338
+ payment_infos = @plugin.get_payment_info(@pm.kb_account_id, kb_payment_id, [], @call_context)
339
+ payment_infos.size.should == 1
340
+ payment_infos[0].kb_payment_id.should == kb_payment_id
341
+ payment_infos[0].transaction_type.should == :PURCHASE
342
+ payment_infos[0].amount.should be_nil
343
+ payment_infos[0].currency.should be_nil
344
+ payment_infos[0].status.should == status
345
+ payment_infos[0].gateway_error.should == msg
346
+ payment_infos[0].gateway_error_code.should == gateway_error_code
347
+ end
348
+
349
+ private
350
+
351
+ def verify_payment_method(kb_account_id = nil)
352
+ # Verify our table directly
353
+ kb_account_id = @pm.kb_account_id if kb_account_id.nil?
354
+ payment_methods = ::Killbill::PaypalExpress::PaypalExpressPaymentMethod.from_kb_account_id(kb_account_id, @call_context.tenant_id)
355
+ payment_methods.size.should == 1
356
+ payment_method = payment_methods.first
357
+ payment_method.should_not be_nil
358
+ payment_method.paypal_express_payer_id.should be_nil
359
+ payment_method.token.should be_nil
360
+ payment_method.kb_payment_method_id.should == @pm.kb_payment_method_id
361
+ end
362
+ end
363
+ end
364
+ end
data/spec/spec_helper.rb CHANGED
@@ -18,7 +18,7 @@ ActiveRecord::Base.establish_connection(
18
18
  :database => 'test.db'
19
19
  )
20
20
  # For debugging
21
- #ActiveRecord::Base.logger = Logger.new(STDOUT)
21
+ # ActiveRecord::Base.logger = Logger.new(STDOUT)
22
22
  # Create the schema
23
23
  require File.expand_path(File.dirname(__FILE__) + '../../db/schema.rb')
24
24
 
@@ -41,4 +41,17 @@ class PaypalExpressJavaPaymentApi < ::Killbill::Plugin::ActiveMerchant::RSpec::F
41
41
 
42
42
  kb_payment
43
43
  end
44
+
45
+ def create_authorization(kb_account, kb_payment_method_id, kb_payment_id, amount, currency, payment_external_key, payment_transaction_external_key, properties, context)
46
+ kb_payment = add_payment(kb_payment_id || SecureRandom.uuid, SecureRandom.uuid, payment_transaction_external_key, :AUTHORIZE)
47
+
48
+ rcontext = context.to_ruby(context)
49
+ @plugin.authorize_payment(kb_account.id, kb_payment.id, kb_payment.transactions.last.id, kb_payment_method_id, amount, currency, properties, rcontext)
50
+
51
+ kb_payment
52
+ end
53
+
54
+ def delete_all_payments
55
+ @payments = []
56
+ end
44
57
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: killbill-paypal-express
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.2
4
+ version: 4.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kill Bill core team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-11 00:00:00.000000000 Z
11
+ date: 2016-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: killbill
@@ -240,6 +240,20 @@ dependencies:
240
240
  version: 2.12.0
241
241
  prerelease: false
242
242
  type: :development
243
+ - !ruby/object:Gem::Dependency
244
+ name: selenium-webdriver
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ~>
248
+ - !ruby/object:Gem::Version
249
+ version: 2.53.0
250
+ requirement: !ruby/object:Gem::Requirement
251
+ requirements:
252
+ - - ~>
253
+ - !ruby/object:Gem::Version
254
+ version: 2.53.0
255
+ prerelease: false
256
+ type: :development
243
257
  - !ruby/object:Gem::Dependency
244
258
  name: jdbc-sqlite3
245
259
  version_requirements: !ruby/object:Gem::Requirement
@@ -320,7 +334,11 @@ files:
320
334
  - release.sh
321
335
  - spec/paypal_express/base_plugin_spec.rb
322
336
  - spec/paypal_express/remote/baid_spec.rb
337
+ - spec/paypal_express/remote/baid_spec_helpers.rb
338
+ - spec/paypal_express/remote/browser_helpers.rb
339
+ - spec/paypal_express/remote/build_plugin_helpers.rb
323
340
  - spec/paypal_express/remote/hpp_spec.rb
341
+ - spec/paypal_express/remote/hpp_spec_helpers.rb
324
342
  - spec/spec_helper.rb
325
343
  homepage: http://killbill.io
326
344
  licenses: