workarea-payware_connect 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +20 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  4. data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
  5. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  6. data/.github/workflows/ci.yml +54 -0
  7. data/.gitignore +13 -0
  8. data/.rubocop.yml +2 -0
  9. data/CHANGELOG.md +63 -0
  10. data/CODE_OF_CONDUCT.md +3 -0
  11. data/CONTRIBUTING.md +3 -0
  12. data/Gemfile +9 -0
  13. data/LICENSE.md +3 -0
  14. data/README.md +53 -0
  15. data/Rakefile +54 -0
  16. data/app/models/workarea/payment/authorize/credit_card.decorator +37 -0
  17. data/app/models/workarea/payment/capture/credit_card.decorator +14 -0
  18. data/app/models/workarea/payment/payware_credit_card.decorator +24 -0
  19. data/app/models/workarea/payment/purchase/credit_card.decorator +37 -0
  20. data/app/models/workarea/payment/refund/credit_card.decorator +14 -0
  21. data/app/models/workarea/payment/store_credit_card.decorator +13 -0
  22. data/app/workers/workarea/save_user_order_details.decorator +33 -0
  23. data/bin/rails +18 -0
  24. data/config/initializers/00_defaults.rb +1 -0
  25. data/doc/PWCTestAccount_WorldPay ecom.pages +0 -0
  26. data/doc/validation/(Completed v2)PAYware Connect Validation Worksheet 2015 V2 .doc +0 -0
  27. data/doc/validation/(Completed v3)PAYware Connect Validation Worksheet 2015 V2 .doc +0 -0
  28. data/doc/validation/PAYware Connect Validation Letter Weblinc 09-11-2015.pdf +0 -0
  29. data/doc/validation/PAYware Connect Validation Letter Weblinc 10-21-2015.pdf +0 -0
  30. data/lib/active_merchant/billing/bogus_payware_connect_gateway.rb +130 -0
  31. data/lib/active_merchant/billing/payware_connect_gateway.rb +137 -0
  32. data/lib/active_merchant/billing/payware_connect_gateway/actions/authorize.rb +63 -0
  33. data/lib/active_merchant/billing/payware_connect_gateway/actions/capture.rb +26 -0
  34. data/lib/active_merchant/billing/payware_connect_gateway/actions/purchase.rb +59 -0
  35. data/lib/active_merchant/billing/payware_connect_gateway/actions/refund.rb +29 -0
  36. data/lib/active_merchant/billing/payware_connect_gateway/actions/void.rb +20 -0
  37. data/lib/active_merchant/billing/payware_connect_gateway/admin_actions/add_contract.rb +9 -0
  38. data/lib/active_merchant/billing/payware_connect_gateway/admin_actions/add_customer.rb +9 -0
  39. data/lib/active_merchant/billing/payware_connect_gateway/admin_actions/add_customer_and_contract.rb +10 -0
  40. data/lib/active_merchant/billing/payware_connect_gateway/admin_actions/update_contract.rb +9 -0
  41. data/lib/active_merchant/billing/payware_connect_gateway/admin_actions/update_customer.rb +9 -0
  42. data/lib/active_merchant/billing/payware_connect_gateway/admin_xml_builder.rb +105 -0
  43. data/lib/active_merchant/billing/payware_connect_gateway/xml_builder.rb +35 -0
  44. data/lib/active_merchant/billing/payware_response.rb +9 -0
  45. data/lib/validation.rb +25 -0
  46. data/lib/workarea/payware_connect.rb +43 -0
  47. data/lib/workarea/payware_connect/engine.rb +8 -0
  48. data/lib/workarea/payware_connect/version.rb +5 -0
  49. data/test/dummy/Rakefile +6 -0
  50. data/test/dummy/app/assets/config/manifest.js +4 -0
  51. data/test/dummy/app/assets/images/.keep +0 -0
  52. data/test/dummy/app/assets/javascripts/application.js +13 -0
  53. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  54. data/test/dummy/app/controllers/application_controller.rb +3 -0
  55. data/test/dummy/app/controllers/concerns/.keep +0 -0
  56. data/test/dummy/app/helpers/application_helper.rb +2 -0
  57. data/test/dummy/app/jobs/application_job.rb +2 -0
  58. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  59. data/test/dummy/app/models/concerns/.keep +0 -0
  60. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  61. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  62. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  63. data/test/dummy/bin/bundle +3 -0
  64. data/test/dummy/bin/rails +4 -0
  65. data/test/dummy/bin/rake +4 -0
  66. data/test/dummy/bin/setup +34 -0
  67. data/test/dummy/bin/update +29 -0
  68. data/test/dummy/config.ru +5 -0
  69. data/test/dummy/config/application.rb +24 -0
  70. data/test/dummy/config/boot.rb +5 -0
  71. data/test/dummy/config/cable.yml +9 -0
  72. data/test/dummy/config/environment.rb +5 -0
  73. data/test/dummy/config/environments/development.rb +56 -0
  74. data/test/dummy/config/environments/production.rb +86 -0
  75. data/test/dummy/config/environments/test.rb +44 -0
  76. data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
  77. data/test/dummy/config/initializers/assets.rb +11 -0
  78. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  79. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  80. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  81. data/test/dummy/config/initializers/inflections.rb +16 -0
  82. data/test/dummy/config/initializers/mime_types.rb +4 -0
  83. data/test/dummy/config/initializers/new_framework_defaults.rb +23 -0
  84. data/test/dummy/config/initializers/workarea.rb +3 -0
  85. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  86. data/test/dummy/config/locales/en.yml +23 -0
  87. data/test/dummy/config/puma.rb +47 -0
  88. data/test/dummy/config/routes.rb +5 -0
  89. data/test/dummy/config/secrets.yml +22 -0
  90. data/test/dummy/config/spring.rb +6 -0
  91. data/test/dummy/db/seeds.rb +3 -0
  92. data/test/dummy/lib/assets/.keep +0 -0
  93. data/test/dummy/log/.keep +0 -0
  94. data/test/dummy/public/404.html +67 -0
  95. data/test/dummy/public/422.html +67 -0
  96. data/test/dummy/public/500.html +66 -0
  97. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  98. data/test/dummy/public/apple-touch-icon.png +0 -0
  99. data/test/dummy/public/favicon.ico +0 -0
  100. data/test/integration/workarea/storefront/checkout_side_effects_integration_test.decorator +44 -0
  101. data/test/lib/active_merchant/billing/payware_connect_gateway_test.rb +280 -0
  102. data/test/models/workarea/payment/authorize/credit_card_test.decorator +47 -0
  103. data/test/models/workarea/payment/capture/credit_card_test.decorator +33 -0
  104. data/test/models/workarea/payment/credit_card_integration_test.decorator +25 -0
  105. data/test/models/workarea/payment/payware_credit_card_test.rb +44 -0
  106. data/test/models/workarea/payment/purchase/credit_card_test.decorator +54 -0
  107. data/test/models/workarea/payment/refund/credit_card_test.decorator +33 -0
  108. data/test/models/workarea/payment/store_credit_card_test.decorator +10 -0
  109. data/test/support/workarea/payware_connect_gateway_vcr_config.rb +24 -0
  110. data/test/system/workarea/admin/payment_transactions_system_test.decorator +37 -0
  111. data/test/test_helper.rb +12 -0
  112. data/test/vcr_cassettes/credit_card/auth_capture.yml +127 -0
  113. data/test/vcr_cassettes/credit_card/auth_void.yml +126 -0
  114. data/test/vcr_cassettes/credit_card/purchase_void.yml +126 -0
  115. data/test/vcr_cassettes/credit_card/store_auth.yml +67 -0
  116. data/test/vcr_cassettes/credit_card/store_purchase.yml +67 -0
  117. data/test/vcr_cassettes/payware/add_contract.yml +99 -0
  118. data/test/vcr_cassettes/payware/add_customer.yml +52 -0
  119. data/test/vcr_cassettes/payware/authorize_credit_card.yml +67 -0
  120. data/test/vcr_cassettes/payware/authorize_customer_and_contract.yml +161 -0
  121. data/test/vcr_cassettes/payware/authorize_for_0_credit_card.yml +67 -0
  122. data/test/vcr_cassettes/payware/authorize_for_0_troutd.yml +130 -0
  123. data/test/vcr_cassettes/payware/authorize_troutd.yml +130 -0
  124. data/test/vcr_cassettes/payware/capture.yml +127 -0
  125. data/test/vcr_cassettes/payware/refund.yml +223 -0
  126. data/test/vcr_cassettes/payware/refund_troutd.yml +128 -0
  127. data/test/vcr_cassettes/payware/void_authorization.yml +126 -0
  128. data/test/workers/workarea/save_user_order_details_test.decorator +56 -0
  129. data/workarea-payware_connect.gemspec +18 -0
  130. metadata +190 -0
@@ -0,0 +1,280 @@
1
+ require "test_helper"
2
+
3
+ module ActiveMerchant
4
+ module Billing
5
+ class PaywareConnectGatewayTest < Workarea::TestCase
6
+ def test_add_customer
7
+ customer_id = generate_id
8
+ response = VCR.use_cassette("payware/add_customer") do
9
+ gateway.add_customer(
10
+ customer_id: customer_id,
11
+ email: email,
12
+ billing_address: billing_address
13
+ )
14
+ end
15
+
16
+ assert(response.success?)
17
+ assert_equal("SUCCESS", response.message)
18
+ assert_equal("1", response.params["AdminResponse"]["Status_Code"])
19
+ end
20
+
21
+ def test_add_contract
22
+ customer_id = generate_id
23
+ contract_id = generate_id
24
+
25
+ response = VCR.use_cassette("payware/add_contract") do
26
+ gateway.add_customer(
27
+ customer_id: customer_id,
28
+ email: email,
29
+ billing_address: billing_address
30
+ )
31
+ gateway.add_contract(
32
+ customer_id: customer_id,
33
+ contract_id: contract_id,
34
+ credit_card: credit_card
35
+ )
36
+ end
37
+
38
+ assert(response.success?)
39
+ assert_equal("SUCCESS", response.message)
40
+ assert_equal("1", response.params["AdminResponse"]["Status_Code"])
41
+ end
42
+
43
+ def test_authorize_customer_and_contract
44
+ customer_id = generate_id
45
+ contract_id = generate_id
46
+
47
+ response = VCR.use_cassette("payware/authorize_customer_and_contract") do
48
+ gateway.add_customer(
49
+ customer_id: customer_id,
50
+ email: email,
51
+ billing_address: billing_address
52
+ )
53
+ gateway.add_contract(
54
+ customer_id: customer_id,
55
+ contract_id: contract_id,
56
+ credit_card: credit_card
57
+ )
58
+ gateway.authorize(
59
+ 1000,
60
+ customer_id: customer_id,
61
+ contract_id: contract_id
62
+ )
63
+ end
64
+
65
+ assert(response.success?)
66
+ assert_equal("TAS584", response.authorization)
67
+ assert_equal("10.00", response.params["RESPONSE"]["TRANS_AMOUNT"])
68
+ assert_equal("95860", response.troutd)
69
+ end
70
+
71
+ def test_authorize_credit_card
72
+ response = VCR.use_cassette("payware/authorize_credit_card") do
73
+ gateway.authorize(
74
+ 1000,
75
+ credit_card: credit_card,
76
+ billing_address: billing_address
77
+ )
78
+ end
79
+
80
+ assert(response.success?)
81
+ assert(response.authorization.present?)
82
+ assert_equal("10.00", response.params["RESPONSE"]["TRANS_AMOUNT"])
83
+ assert(response.troutd.present?)
84
+ end
85
+
86
+ def test_authorize_zero_dollar_credit_card
87
+ response = VCR.use_cassette("payware/authorize_for_0_credit_card") do
88
+ gateway.authorize(
89
+ 0,
90
+ credit_card: credit_card,
91
+ billing_address: billing_address
92
+ )
93
+ end
94
+
95
+ assert(response.success?)
96
+ assert(response.authorization.present?)
97
+ assert(response.troutd.present?)
98
+ assert_equal("0.00", response.params["RESPONSE"]["TRANS_AMOUNT"])
99
+ end
100
+
101
+ def test_authorize_for_troutd
102
+ response = VCR.use_cassette("payware/authorize_troutd") do
103
+ first_response = gateway.authorize(
104
+ 1000,
105
+ credit_card: credit_card,
106
+ billing_address: billing_address
107
+ )
108
+
109
+ troutd = first_response.troutd
110
+ gateway.authorize(
111
+ 500,
112
+ troutd: troutd,
113
+ billing_address: billing_address
114
+ )
115
+ end
116
+
117
+ assert(response.success?)
118
+ assert(response.authorization.present?)
119
+ assert(response.troutd.present?)
120
+ assert_equal("5.00", response.params["RESPONSE"]["TRANS_AMOUNT"])
121
+ end
122
+
123
+ def test_authorize_for_zero_dollar_with_troutd
124
+ response = VCR.use_cassette("payware/authorize_for_0_troutd") do
125
+ first_response = gateway.authorize(
126
+ 1000,
127
+ credit_card: credit_card,
128
+ billing_address: billing_address
129
+ )
130
+
131
+ troutd = first_response.troutd
132
+ gateway.authorize(
133
+ 0,
134
+ troutd: troutd,
135
+ billing_address: billing_address
136
+ )
137
+ end
138
+
139
+ assert(response.success?)
140
+ assert(response.authorization.present?)
141
+ assert(response.troutd.present?)
142
+ assert_equal("0.00", response.params["RESPONSE"]["TRANS_AMOUNT"])
143
+ end
144
+
145
+ def test_refund
146
+ customer_id = generate_id
147
+ contract_id = generate_id
148
+
149
+ response = VCR.use_cassette("payware/refund") do
150
+ gateway.add_customer(
151
+ customer_id: customer_id,
152
+ email: email,
153
+ billing_address: billing_address
154
+ )
155
+ gateway.add_contract(
156
+ customer_id: customer_id,
157
+ contract_id: contract_id,
158
+ credit_card: credit_card
159
+ )
160
+ gateway.authorize(
161
+ 1000,
162
+ customer_id: customer_id,
163
+ contract_id: contract_id
164
+ )
165
+ gateway.refund(
166
+ 1000,
167
+ customer_id: customer_id,
168
+ contract_id: contract_id
169
+ )
170
+ end
171
+
172
+ assert(response.success?)
173
+ assert_equal("10.00", response.params["RESPONSE"]["TRANS_AMOUNT"])
174
+ end
175
+
176
+ def test_refund_troutd
177
+ VCR.use_cassette("payware/refund_troutd") do
178
+ authorization = gateway.authorize(
179
+ 1000,
180
+ credit_card: credit_card,
181
+ billing_address: billing_address
182
+ )
183
+
184
+ troutd = authorization.params["RESPONSE"]["TROUTD"]
185
+
186
+ refund = gateway.refund(
187
+ 1000,
188
+ troutd: troutd
189
+ )
190
+
191
+ assert(refund.success?)
192
+ end
193
+ end
194
+
195
+ def test_capture
196
+ VCR.use_cassette("payware/capture") do
197
+ authorization = gateway.authorize(
198
+ 1000,
199
+ credit_card: credit_card,
200
+ billing_address: billing_address
201
+ )
202
+
203
+ troutd = authorization.params["RESPONSE"]["TROUTD"]
204
+
205
+ capture = gateway.capture(1000, troutd)
206
+
207
+ assert(capture.success?)
208
+ end
209
+ end
210
+
211
+ def test_void_authorization
212
+ VCR.use_cassette("payware/void_authorization") do
213
+ authorization = gateway.authorize(
214
+ 100,
215
+ credit_card: credit_card,
216
+ billing_address: billing_address
217
+ )
218
+
219
+ assert(authorization.success?)
220
+
221
+ troutd = authorization.params["RESPONSE"]["TROUTD"]
222
+
223
+ void = gateway.void(troutd)
224
+
225
+ assert(void.success?)
226
+ end
227
+ end
228
+
229
+ private
230
+
231
+ def credit_card_params
232
+ {
233
+ first_name: "Mike",
234
+ last_name: "Dalton",
235
+ month: 12,
236
+ year: Time.now.year + 1,
237
+ verification_value: "999"
238
+ }
239
+ end
240
+
241
+ def credit_card
242
+ params = credit_card_params.merge(
243
+ number: "4111111111111111",
244
+ brand: "visa"
245
+ )
246
+ ActiveMerchant::Billing::CreditCard.new(params)
247
+ end
248
+
249
+ def billing_address
250
+ Workarea::Address.new(
251
+ first_name: "Mike",
252
+ last_name: "Dalton",
253
+ street: "22 S. 3rd St.",
254
+ city: "Philadelphia",
255
+ region: "PA",
256
+ postal_code: "19406",
257
+ phone_number: "215-555-5555"
258
+ )
259
+ end
260
+
261
+ def gateway
262
+ ActiveMerchant::Billing::PaywareConnectGateway.new(
263
+ client_id: "17270300010001",
264
+ login: "apiuser",
265
+ password: "6GHMg7ur",
266
+ merchant_key: "49BC6225-4B49-4585-8D34-07DCA05CF3937FD6C525-8AEE-4916-BEEC-BDB",
267
+ test: true
268
+ )
269
+ end
270
+
271
+ def email
272
+ "mdalton@weblinc.com"
273
+ end
274
+
275
+ def generate_id
276
+ (1 + rand(100000)).to_s
277
+ end
278
+ end
279
+ end
280
+ end
@@ -0,0 +1,47 @@
1
+ module Workarea
2
+ decorate Payment::Authorize::CreditCardTest, with: :payware_connect do
3
+ def test_complete_does_nothing_if_gateway_storage_fails
4
+ # no op tokenize and authorize is one step
5
+ end
6
+
7
+ def test_complete_authorizes_on_the_credit_card_gateway
8
+ operation = Payment::Authorize::CreditCard.new(tender, transaction)
9
+
10
+ original_authorize = Workarea.config.gateways.credit_card.method(:authorize)
11
+ Workarea.config.gateways.credit_card.expects(:authorize)
12
+ .returns(original_authorize.call(transaction.amount.cents, { credit_card: tender.to_active_merchant }))
13
+
14
+ operation.complete!
15
+ end
16
+
17
+ def test_cancel_voids_with_the_authorization_from_the_transaction
18
+ transaction.response = ActiveMerchant::Billing::Response.new(
19
+ true,
20
+ 'Message',
21
+ { 'RESPONSE' => { 'TROUTD' => troutd } },
22
+ { authorization: authorization }
23
+ )
24
+
25
+ operation = Payment::Authorize::CreditCard.new(tender, transaction)
26
+
27
+ original_void = operation.gateway.method(:void)
28
+ operation.gateway.expects(:void)
29
+ .with(authorization)
30
+ .returns(original_void.call(authorization))
31
+
32
+ operation.cancel!
33
+ end
34
+
35
+ def test_complete_saves_the_partial_number
36
+ Payment::Authorize::CreditCard.new(tender, transaction).complete!
37
+
38
+ assert(tender.partial_number.present?)
39
+ end
40
+
41
+ private
42
+
43
+ def troutd
44
+ @authorization ||= ActiveMerchant::Billing::BogusGateway::AUTHORIZATION
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,33 @@
1
+ module Workarea
2
+ decorate Payment::Capture::CreditCardTest, with: :payware_connect do
3
+ def test_complete_captures_on_the_credit_card_gateway
4
+ operation = Payment::Capture::CreditCard.new(payment.credit_card, transaction)
5
+
6
+ original_capture = Workarea.config.gateways.credit_card.method(:capture)
7
+ Workarea.config.gateways.credit_card
8
+ .expects(:capture)
9
+ .with(500, troutd)
10
+ .returns(original_capture.call(500, troutd))
11
+
12
+ operation.complete!
13
+ end
14
+
15
+ private
16
+
17
+ def reference
18
+ @reference ||= Payment::Transaction.new(
19
+ amount: 5.to_m,
20
+ response: ActiveMerchant::Billing::Response.new(
21
+ true,
22
+ 'Message',
23
+ { 'RESPONSE' => { 'TROUTD' => troutd } },
24
+ { authorization: authorization }
25
+ )
26
+ )
27
+ end
28
+
29
+ def troutd
30
+ @troutd ||= ActiveMerchant::Billing::BogusGateway::AUTHORIZATION
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,25 @@
1
+ module Workarea
2
+ decorate Payment::CreditCardIntegrationTest, with: :payware_connect do
3
+ decorated do
4
+ setup :setup_gateway
5
+ teardown :reset_gateway
6
+ end
7
+
8
+ private
9
+
10
+ def setup_gateway
11
+ @_old_gateway = Workarea.config.gateways.credit_card
12
+ Workarea.config.gateways.credit_card = ActiveMerchant::Billing::PaywareConnectGateway.new(
13
+ client_id: "17270300010001",
14
+ login: "apiuser",
15
+ password: "6GHMg7ur",
16
+ merchant_key: "49BC6225-4B49-4585-8D34-07DCA05CF3937FD6C525-8AEE-4916-BEEC-BDB",
17
+ test: true
18
+ )
19
+ end
20
+
21
+ def reset_gateway
22
+ Workarea.config.gateways.credit_card = @_old_gateway
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,44 @@
1
+ require "test_helper"
2
+
3
+ module Workarea
4
+ class Payment
5
+ class PaywareCreditCardTest < Workarea::TestCase
6
+ def test_partial_number
7
+ payment = Payment.new(
8
+ address: {
9
+ first_name: "eric",
10
+ last_name: "pigeon",
11
+ street: "22 s 4rd st weblinc",
12
+ city: "philadelphia",
13
+ country: Country["US"],
14
+ region: "PA",
15
+ postal_code: "19106"
16
+ }
17
+ )
18
+ payment.set_credit_card(number: "4111111111111111", month: "01", year: next_year.to_s, cvv: 111)
19
+ assert payment.credit_card.partial_number.present?
20
+ end
21
+
22
+ def test_partial_number_from_saved_card
23
+ profile = create_payment_profile
24
+ saved_card = create_saved_credit_card(profile: profile)
25
+
26
+ payment = Payment.new(
27
+ profile: profile,
28
+ address: {
29
+ first_name: "eric",
30
+ last_name: "pigeon",
31
+ street: "22 s 4rd st weblinc",
32
+ city: "philadelphia",
33
+ country: Country["US"],
34
+ region: "PA",
35
+ postal_code: "19106"
36
+ }
37
+ )
38
+
39
+ payment.set_credit_card(saved_card_id: saved_card.id)
40
+ assert payment.credit_card.partial_number.present?
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,54 @@
1
+ module Workarea
2
+ decorate Payment::Purchase::CreditCardTest, with: :payware_connect do
3
+ def test_complete_does_nothing_if_gateway_storage_fails
4
+ # no op store and purchase are one transaction
5
+ end
6
+
7
+ def test_complete_purchase_on_the_credit_card_gateway
8
+ operation = Payment::Purchase::CreditCard.new(tender, transaction)
9
+
10
+ original_purchase = Workarea.config.gateways.credit_card.method(:purchase)
11
+ Workarea.config.gateways.credit_card
12
+ .expects(:purchase)
13
+ .returns(
14
+ original_purchase.call(
15
+ transaction.amount.cents,
16
+ { credit_card: tender.to_active_merchant }
17
+ )
18
+ )
19
+
20
+ operation.complete!
21
+ end
22
+
23
+ def test_cancel_voids_with_the_authorization_from_the_transaction
24
+ transaction.response = ActiveMerchant::Billing::Response.new(
25
+ true,
26
+ 'Message',
27
+ { 'RESPONSE' => { 'TROUTD' => troutd } },
28
+ { authorization: authorization }
29
+ )
30
+
31
+ operation = Payment::Purchase::CreditCard.new(tender, transaction)
32
+
33
+ original_void = operation.gateway.method(:void)
34
+ operation.gateway
35
+ .expects(:void)
36
+ .with(authorization)
37
+ .returns(original_void.call(authorization))
38
+
39
+ operation.cancel!
40
+ end
41
+
42
+ def test_complete_saves_the_partial_number
43
+ Payment::Purchase::CreditCard.new(tender, transaction).complete!
44
+
45
+ assert(tender.partial_number.present?)
46
+ end
47
+
48
+ private
49
+
50
+ def troutd
51
+ @troutd ||= ActiveMerchant::Billing::BogusGateway::AUTHORIZATION
52
+ end
53
+ end
54
+ end