workarea-cyber_source 1.0.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.
- checksums.yaml +7 -0
- data/.editorconfig +20 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
- data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.gitignore +14 -0
- data/.rails-rubocop.yml +140 -0
- data/.rubocop.yml +8 -0
- data/CHANGELOG.md +39 -0
- data/CODE_OF_CONDUCT.md +3 -0
- data/CONTRIBUTING.md +3 -0
- data/Gemfile +11 -0
- data/LICENSE +52 -0
- data/README.md +27 -0
- data/Rakefile +59 -0
- data/app/models/workarea/payment/authorize/credit_card.decorator +45 -0
- data/app/models/workarea/payment/capture/credit_card.decorator +14 -0
- data/app/models/workarea/payment/purchase/credit_card.decorator +48 -0
- data/app/models/workarea/payment/refund/credit_card.decorator +14 -0
- data/app/models/workarea/payment/store_credit_card.decorator +13 -0
- data/bin/rails +20 -0
- data/config/initializers/gateway.rb +1 -0
- data/lib/active_merchant/billing/bogus_cyber_source_gateway.rb +97 -0
- data/lib/active_merchant/billing/cyber_source_fix.rb +34 -0
- data/lib/workarea/cyber_source.rb +36 -0
- data/lib/workarea/cyber_source/engine.rb +8 -0
- data/lib/workarea/cyber_source/version.rb +5 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +38 -0
- data/test/dummy/bin/update +29 -0
- data/test/dummy/bin/yarn +11 -0
- data/test/dummy/config.ru +5 -0
- data/test/dummy/config/application.rb +28 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/cable.yml +10 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +56 -0
- data/test/dummy/config/environments/production.rb +91 -0
- data/test/dummy/config/environments/test.rb +44 -0
- data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
- data/test/dummy/config/initializers/assets.rb +14 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/workarea.rb +5 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +33 -0
- data/test/dummy/config/puma.rb +56 -0
- data/test/dummy/config/routes.rb +5 -0
- data/test/dummy/config/secrets.yml +32 -0
- data/test/dummy/config/spring.rb +6 -0
- data/test/dummy/db/seeds.rb +2 -0
- data/test/dummy/log/.keep +0 -0
- data/test/dummy/package.json +5 -0
- data/test/integration/workarea/cyber_source_integration_test.rb +191 -0
- data/test/models/workarea/payment/authorize/credit_card_test.decorator +68 -0
- data/test/models/workarea/payment/capture/credit_card_test.decorator +17 -0
- data/test/models/workarea/payment/purchase/credit_card_test.decorator +60 -0
- data/test/models/workarea/payment/refund/credit_card_test.decorator +17 -0
- data/test/models/workarea/payment/store_credit_card_test.decorator +15 -0
- data/test/support/workarea/cyber_source_support_vcr_config.rb +23 -0
- data/test/support/workarea/workarea_3_2_backports.rb +57 -0
- data/test/teaspoon_env.rb +6 -0
- data/test/test_helper.rb +11 -0
- data/test/vcr_cassettes/cyber_source/auth_capture.yml +254 -0
- data/test/vcr_cassettes/cyber_source/auth_capture_refund.yml +323 -0
- data/test/vcr_cassettes/cyber_source/auth_void.yml +250 -0
- data/test/vcr_cassettes/cyber_source/purchase_refund.yml +251 -0
- data/test/vcr_cassettes/cyber_source/purchase_void.yml +247 -0
- data/test/vcr_cassettes/cyber_source/store_auth.yml +179 -0
- data/test/vcr_cassettes/cyber_source/store_purchase.yml +180 -0
- data/workarea-cyber_source.gemspec +19 -0
- metadata +133 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
# Be sure to restart your server when you modify this file.
|
2
|
+
|
3
|
+
# Your secret key is used for verifying the integrity of signed cookies.
|
4
|
+
# If you change this key, all old signed cookies will become invalid!
|
5
|
+
|
6
|
+
# Make sure the secret is at least 30 characters and all random,
|
7
|
+
# no regular words or you'll be exposed to dictionary attacks.
|
8
|
+
# You can use `rails secret` to generate a secure secret key.
|
9
|
+
|
10
|
+
# Make sure the secrets in this file are kept private
|
11
|
+
# if you're sharing your code publicly.
|
12
|
+
|
13
|
+
# Shared secrets are available across all environments.
|
14
|
+
|
15
|
+
# shared:
|
16
|
+
# api_key: a1B2c3D4e5F6
|
17
|
+
|
18
|
+
# Environmental secrets are only available for that specific environment.
|
19
|
+
|
20
|
+
development:
|
21
|
+
secret_key_base: d1e887ea8d9002168c32984e1482dc8b510069ccc81acdbfc4b81fe3ab90dc67acc561c3adcb882ad7f7d2aa2c4319d8335db386aa9e6cb995b91409c108ebf8
|
22
|
+
|
23
|
+
test:
|
24
|
+
secret_key_base: a37f41f01b2793e0352b2d89dee00a847e1afc6e4c97f9e62f60bc46641815da3ed1f30d03d61d6dea465159d8f8b78c3c6ae16cf949fd876fd840f15517f44b
|
25
|
+
|
26
|
+
# Do not keep production secrets in the unencrypted secrets file.
|
27
|
+
# Instead, either read values from the environment.
|
28
|
+
# Or, use `bin/rails secrets:setup` to configure encrypted secrets
|
29
|
+
# and move the `production:` environment over there.
|
30
|
+
|
31
|
+
production:
|
32
|
+
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
|
File without changes
|
@@ -0,0 +1,191 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
class CyberSourceIntegrationTest < Workarea::TestCase
|
5
|
+
include CyberSourceGatewayVCRConfig
|
6
|
+
|
7
|
+
def test_store_auth
|
8
|
+
VCR.use_cassette "cyber_source/store_auth" do
|
9
|
+
Payment::StoreCreditCard.new(tender).perform!
|
10
|
+
|
11
|
+
transaction = tender.build_transaction(action: "authorize", amount: 5.to_m)
|
12
|
+
operation = Payment::Authorize::CreditCard.new(tender, transaction)
|
13
|
+
operation.complete!
|
14
|
+
assert(transaction.success?)
|
15
|
+
transaction.save!
|
16
|
+
|
17
|
+
assert(tender.token.present?)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_store_purchase
|
22
|
+
VCR.use_cassette "cyber_source/store_purchase" do
|
23
|
+
Payment::StoreCreditCard.new(tender).perform!
|
24
|
+
|
25
|
+
transaction = tender.build_transaction(action: "purchase", amount: 5.to_m)
|
26
|
+
operation = Payment::Purchase::CreditCard.new(tender, transaction)
|
27
|
+
operation.complete!
|
28
|
+
assert(transaction.success?)
|
29
|
+
transaction.save!
|
30
|
+
|
31
|
+
assert(tender.token.present?)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_auth_capture
|
36
|
+
VCR.use_cassette "cyber_source/auth_capture" do
|
37
|
+
transaction = tender.build_transaction(action: "authorize", amount: 5.to_m)
|
38
|
+
operation = Payment::Authorize::CreditCard.new(tender, transaction)
|
39
|
+
operation.complete!
|
40
|
+
assert(transaction.success?, "expected authorization to be successful")
|
41
|
+
transaction.save!
|
42
|
+
|
43
|
+
assert(tender.token.present?)
|
44
|
+
|
45
|
+
capture = Payment::Capture.new(payment: payment)
|
46
|
+
capture.allocate_amounts!(total: 5.to_m)
|
47
|
+
assert(capture.valid?)
|
48
|
+
capture.complete!
|
49
|
+
|
50
|
+
capture_transaction = payment.transactions.detect(&:captures)
|
51
|
+
assert(capture_transaction.valid?)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_auth_void
|
56
|
+
VCR.use_cassette "cyber_source/auth_void" do
|
57
|
+
transaction = tender.build_transaction(action: "authorize", amount: 5.to_m)
|
58
|
+
operation = Payment::Authorize::CreditCard.new(tender, transaction)
|
59
|
+
operation.complete!
|
60
|
+
assert(transaction.success?)
|
61
|
+
transaction.save!
|
62
|
+
|
63
|
+
assert(tender.token.present?)
|
64
|
+
|
65
|
+
void = gateway.void(transaction.response.authorization)
|
66
|
+
|
67
|
+
assert(void.success?)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_purchase_void
|
72
|
+
VCR.use_cassette "cyber_source/purchase_void" do
|
73
|
+
transaction = tender.build_transaction(action: "purchase", amount: 5.to_m)
|
74
|
+
operation = Payment::Purchase::CreditCard.new(tender, transaction)
|
75
|
+
operation.complete!
|
76
|
+
assert(transaction.success?)
|
77
|
+
transaction.save!
|
78
|
+
|
79
|
+
assert(tender.token.present?)
|
80
|
+
|
81
|
+
void = gateway.void(transaction.response.authorization)
|
82
|
+
|
83
|
+
assert(void.success?)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_auth_capture_refund
|
88
|
+
VCR.use_cassette "cyber_source/auth_capture_refund" do
|
89
|
+
transaction = tender.build_transaction(action: "authorize", amount: 5.to_m)
|
90
|
+
operation = Payment::Authorize::CreditCard.new(tender, transaction)
|
91
|
+
operation.complete!
|
92
|
+
assert(transaction.success?)
|
93
|
+
transaction.save!
|
94
|
+
|
95
|
+
assert(tender.token.present?)
|
96
|
+
|
97
|
+
capture = Payment::Capture.new(payment: payment)
|
98
|
+
capture.allocate_amounts!(total: 5.to_m)
|
99
|
+
assert(capture.valid?)
|
100
|
+
capture.complete!
|
101
|
+
|
102
|
+
capture_transaction = payment.transactions.detect(&:captures)
|
103
|
+
assert(capture_transaction.valid?)
|
104
|
+
|
105
|
+
refund = Payment::Refund.new(payment: payment)
|
106
|
+
refund.allocate_amounts!(total: 5.to_m)
|
107
|
+
|
108
|
+
assert(refund.valid?)
|
109
|
+
refund.complete!
|
110
|
+
|
111
|
+
refund_transaction = payment.credit_card.transactions.refunds.first
|
112
|
+
assert(refund_transaction.valid?)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_purchase_refund
|
117
|
+
VCR.use_cassette "cyber_source/purchase_refund" do
|
118
|
+
transaction = tender.build_transaction(action: "purchase", amount: 5.to_m)
|
119
|
+
operation = Payment::Purchase::CreditCard.new(tender, transaction)
|
120
|
+
operation.complete!
|
121
|
+
assert(transaction.success?)
|
122
|
+
transaction.save!
|
123
|
+
|
124
|
+
assert(tender.token.present?)
|
125
|
+
|
126
|
+
refund = Payment::Refund.new(payment: payment)
|
127
|
+
refund.allocate_amounts!(total: 5.to_m)
|
128
|
+
|
129
|
+
assert(refund.valid?)
|
130
|
+
refund.complete!
|
131
|
+
|
132
|
+
refund_transaction = payment.credit_card.transactions.refunds.first
|
133
|
+
assert(refund_transaction.valid?)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
138
|
+
def email
|
139
|
+
"bcrouse@weblinc.com"
|
140
|
+
end
|
141
|
+
|
142
|
+
def order
|
143
|
+
@order ||= Order.new(email: email)
|
144
|
+
end
|
145
|
+
|
146
|
+
def payment_profile
|
147
|
+
@payment_profile ||= Payment::Profile.lookup(
|
148
|
+
PaymentReference.new(nil, order)
|
149
|
+
)
|
150
|
+
end
|
151
|
+
|
152
|
+
def gateway
|
153
|
+
Workarea.config.gateways.credit_card
|
154
|
+
end
|
155
|
+
|
156
|
+
def payment
|
157
|
+
@payment ||=
|
158
|
+
begin
|
159
|
+
result = create_payment(
|
160
|
+
address: {
|
161
|
+
first_name: "Ben",
|
162
|
+
last_name: "Crouse",
|
163
|
+
street: "22 s. 3rd st.",
|
164
|
+
city: "Philadelphia",
|
165
|
+
region: "PA",
|
166
|
+
postal_code: "19106",
|
167
|
+
country: Country["US"]
|
168
|
+
}
|
169
|
+
)
|
170
|
+
result.profile = payment_profile
|
171
|
+
result
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def tender
|
176
|
+
@tender ||=
|
177
|
+
begin
|
178
|
+
payment.set_address(first_name: "Ben", last_name: "Crouse")
|
179
|
+
|
180
|
+
payment.build_credit_card(
|
181
|
+
number: 4111111111111111,
|
182
|
+
month: 1,
|
183
|
+
year: Time.current.year + 1,
|
184
|
+
cvv: 999
|
185
|
+
)
|
186
|
+
|
187
|
+
payment.credit_card
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Workarea
|
2
|
+
decorate Payment::Authorize::CreditCardTest, with: :cyber_source do
|
3
|
+
def test_complete_does_nothing_if_gateway_storage_fails
|
4
|
+
# cyber_source authorizes and tokenizes in one call; nullifying this test
|
5
|
+
end
|
6
|
+
|
7
|
+
def test_cancel_voids_with_the_authorization_from_the_transaction
|
8
|
+
transaction.response = ActiveMerchant::Billing::Response.new(
|
9
|
+
true,
|
10
|
+
'Message',
|
11
|
+
{},
|
12
|
+
{ authorization: authorization }
|
13
|
+
)
|
14
|
+
|
15
|
+
operation = Payment::Authorize::CreditCard.new(tender, transaction)
|
16
|
+
|
17
|
+
original_void = operation.gateway.method(:void)
|
18
|
+
operation.gateway.expects(:void)
|
19
|
+
.with(authorization)
|
20
|
+
.returns(original_void.call(authorization))
|
21
|
+
|
22
|
+
operation.cancel!
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_cancel_sets_cancellation_params_on_the_transaction
|
26
|
+
transaction.response = ActiveMerchant::Billing::Response.new(
|
27
|
+
true,
|
28
|
+
'Message',
|
29
|
+
{},
|
30
|
+
{ authorization: authorization }
|
31
|
+
)
|
32
|
+
|
33
|
+
operation = Payment::Authorize::CreditCard.new(tender, transaction)
|
34
|
+
operation.cancel!
|
35
|
+
|
36
|
+
assert_instance_of(
|
37
|
+
ActiveMerchant::Billing::Response,
|
38
|
+
transaction.cancellation
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def tender
|
45
|
+
@tender ||=
|
46
|
+
begin
|
47
|
+
payment.set_address(
|
48
|
+
first_name: 'Ben',
|
49
|
+
last_name: 'Crouse',
|
50
|
+
street: '22 s 3rd st',
|
51
|
+
city: 'Philadelphia',
|
52
|
+
region: 'PA',
|
53
|
+
country: Country['US'],
|
54
|
+
postal_code: '19106'
|
55
|
+
)
|
56
|
+
|
57
|
+
payment.build_credit_card(
|
58
|
+
number: 4111111111111111,
|
59
|
+
month: 1,
|
60
|
+
year: Time.now.year + 1,
|
61
|
+
cvv: 999
|
62
|
+
)
|
63
|
+
|
64
|
+
payment.credit_card
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Workarea
|
2
|
+
decorate Payment::Capture::CreditCardTest, with: :cyber_source do
|
3
|
+
private
|
4
|
+
|
5
|
+
def reference
|
6
|
+
@reference ||= Payment::Transaction.new(
|
7
|
+
amount: 5.to_m,
|
8
|
+
response: ActiveMerchant::Billing::Response.new(
|
9
|
+
true,
|
10
|
+
'Message',
|
11
|
+
{},
|
12
|
+
{ authorization: authorization }
|
13
|
+
)
|
14
|
+
)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Workarea
|
2
|
+
decorate Payment::Purchase::CreditCardTest, with: :cyber_source do
|
3
|
+
def test_complete_does_nothing_if_gateway_storage_fails
|
4
|
+
# cyber_source captures and tokenizes in one call; nullifying this test
|
5
|
+
end
|
6
|
+
|
7
|
+
def test_cancel_voids_with_the_authorization_from_the_transaction
|
8
|
+
transaction.response = ActiveMerchant::Billing::Response.new(
|
9
|
+
true,
|
10
|
+
'Message',
|
11
|
+
{},
|
12
|
+
{ authorization: authorization }
|
13
|
+
)
|
14
|
+
|
15
|
+
operation = Payment::Authorize::CreditCard.new(tender, transaction)
|
16
|
+
|
17
|
+
original_void = operation.gateway.method(:void)
|
18
|
+
operation.gateway.expects(:void)
|
19
|
+
.with(authorization)
|
20
|
+
.returns(original_void.call(authorization))
|
21
|
+
|
22
|
+
operation.cancel!
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_cancel_sets_the_cancellation_params_on_the_transaction
|
26
|
+
transaction.response = ActiveMerchant::Billing::Response.new(
|
27
|
+
true,
|
28
|
+
'Message',
|
29
|
+
{},
|
30
|
+
{ authorization: authorization }
|
31
|
+
)
|
32
|
+
|
33
|
+
operation = Payment::Authorize::CreditCard.new(tender, transaction)
|
34
|
+
operation.cancel!
|
35
|
+
|
36
|
+
assert_instance_of(
|
37
|
+
ActiveMerchant::Billing::Response,
|
38
|
+
transaction.cancellation
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def tender
|
45
|
+
@tender ||=
|
46
|
+
begin
|
47
|
+
payment.set_address(first_name: 'Ben', last_name: 'Crouse')
|
48
|
+
|
49
|
+
payment.build_credit_card(
|
50
|
+
number: 4111111111111111,
|
51
|
+
month: 1,
|
52
|
+
year: Time.now.year + 1,
|
53
|
+
cvv: 999
|
54
|
+
)
|
55
|
+
|
56
|
+
payment.credit_card
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Workarea
|
2
|
+
decorate Payment::Refund::CreditCardTest, with: :cyber_source do
|
3
|
+
private
|
4
|
+
|
5
|
+
def reference
|
6
|
+
@reference ||= Payment::Transaction.new(
|
7
|
+
amount: 5.to_m,
|
8
|
+
response: ActiveMerchant::Billing::Response.new(
|
9
|
+
true,
|
10
|
+
'Message',
|
11
|
+
{},
|
12
|
+
{ authorization: authorization }
|
13
|
+
)
|
14
|
+
)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Workarea
|
2
|
+
decorate Payment::StoreCreditCardTest, with: :cyber_source do
|
3
|
+
def test_save_persists_the_token
|
4
|
+
# cyber_source doesn't issue the same token for the same card
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def credit_card
|
10
|
+
@credit_card ||= VCR.use_cassette 'cyber_source/store_without_token' do
|
11
|
+
create_saved_credit_card(number: '4111111111111111')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Workarea
|
2
|
+
module CyberSourceGatewayVCRConfig
|
3
|
+
def self.included(test)
|
4
|
+
test.setup :setup_gateway
|
5
|
+
test.teardown :reset_gateway
|
6
|
+
end
|
7
|
+
|
8
|
+
def setup_gateway
|
9
|
+
@_old_gateway = Workarea.config.gateways.credit_card
|
10
|
+
Workarea.config.gateways.credit_card = ActiveMerchant::Billing::CyberSourceGateway.new(
|
11
|
+
login: "a",
|
12
|
+
password: "b",
|
13
|
+
ignore_avs: true,
|
14
|
+
ignore_cvv: true,
|
15
|
+
test: true
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
def reset_gateway
|
20
|
+
Workarea.config.gateways.credit_card = @_old_gateway
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|