workarea-forter 1.2.2
Sign up to get free protection for your applications and to get access to all the features.
- 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 +17 -0
- data/CHANGELOG.md +63 -0
- data/CODE_OF_CONDUCT.md +3 -0
- data/CONTRIBUTING.md +3 -0
- data/Gemfile +25 -0
- data/LICENSE +52 -0
- data/LICENSE.md +3 -0
- data/README.md +113 -0
- data/Rakefile +60 -0
- data/app/controllers/workarea/admin/orders_controller.decorator +6 -0
- data/app/controllers/workarea/storefront/application_controller.decorator +10 -0
- data/app/models/search/admin/order.decorator +7 -0
- data/app/models/workarea/checkout/collect_payment.decorator +75 -0
- data/app/models/workarea/forter/decision.rb +18 -0
- data/app/models/workarea/forter/response.rb +15 -0
- data/app/models/workarea/fulfillment.decorator +77 -0
- data/app/models/workarea/order/status/suspected_fraud.rb +13 -0
- data/app/models/workarea/order.decorator +14 -0
- data/app/models/workarea/payment/saved_credit_card.decorator +14 -0
- data/app/models/workarea/payment/status/suspected_fraud.rb +13 -0
- data/app/models/workarea/payment/tender/credit_card.decorator +25 -0
- data/app/models/workarea/payment.decorator +13 -0
- data/app/services/workarea/forter/account.rb +42 -0
- data/app/services/workarea/forter/order.rb +145 -0
- data/app/services/workarea/forter/payment.rb +80 -0
- data/app/services/workarea/forter/tender/credit_card.rb +73 -0
- data/app/services/workarea/forter/tender/general.rb +29 -0
- data/app/services/workarea/forter/tender/gift_card.rb +23 -0
- data/app/services/workarea/forter/tender/paypal.rb +38 -0
- data/app/services/workarea/forter/tender/store_credit.rb +23 -0
- data/app/view_models/workarea/admin/order_view_model.decorator +7 -0
- data/app/views/workarea/admin/orders/_forter.html.haml +18 -0
- data/app/views/workarea/admin/orders/forter.html.haml +57 -0
- data/app/views/workarea/storefront/_forter_tracking.html.haml +4 -0
- data/app/workers/forter/update_status.rb +21 -0
- data/app/workers/workarea/save_user_order_details.decorator +34 -0
- data/bin/rails +20 -0
- data/config/initializers/appends.rb +9 -0
- data/config/initializers/workarea.rb +22 -0
- data/config/locales/en.yml +26 -0
- data/config/routes.rb +7 -0
- data/lib/workarea/forter/bogus_gateway.rb +62 -0
- data/lib/workarea/forter/decision_response.rb +60 -0
- data/lib/workarea/forter/engine.rb +8 -0
- data/lib/workarea/forter/gateway.rb +66 -0
- data/lib/workarea/forter/version.rb +5 -0
- data/lib/workarea/forter.rb +50 -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 +30 -0
- data/test/dummy/bin/update +26 -0
- data/test/dummy/bin/yarn +11 -0
- data/test/dummy/config/application.rb +30 -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 +51 -0
- data/test/dummy/config/environments/production.rb +88 -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 +9 -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/config.ru +5 -0
- data/test/dummy/db/seeds.rb +2 -0
- data/test/dummy/log/.keep +0 -0
- data/test/factories/forter.rb +132 -0
- data/test/integration/workarea/admin/forter_order_integration_test.rb +36 -0
- data/test/integration/workarea/forter_authorize_cim_response_code_integration_test.rb +69 -0
- data/test/integration/workarea/forter_braintree_response_code_integration_test.rb +69 -0
- data/test/integration/workarea/forter_checkoutdotcom_integration_test.rb +71 -0
- data/test/integration/workarea/forter_cybersource_response_code_integration_test.rb +69 -0
- data/test/integration/workarea/forter_moneris_response_code_integration_test.rb +69 -0
- data/test/integration/workarea/forter_payflow_pro_response_code_test.rb +69 -0
- data/test/integration/workarea/storefront/forter_integration_test.rb +138 -0
- data/test/lib/workarea/forter/gateway_test.rb +47 -0
- data/test/models/workarea/checkout/forter_collect_payment_test.rb +60 -0
- data/test/models/workarea/forter_payment_test.rb +58 -0
- data/test/models/workarea/payment/forter_credit_card_test.rb +19 -0
- data/test/models/workarea/payment/forter_saved_credit_card_test.rb +32 -0
- data/test/services/workarea/forter/order_test.rb +82 -0
- data/test/support/workarea/forter_api_config.rb +27 -0
- data/test/system/workarea/admin/forter_system_test.rb +31 -0
- data/test/system/workarea/storefront/forter_braintree_checkout_system_test.rb +79 -0
- data/test/system/workarea/storefront/forter_tracking_system_test.rb +20 -0
- data/test/system/workarea/storefront/guest_checkout_system_test.decorator +43 -0
- data/test/teaspoon_env.rb +6 -0
- data/test/test_helper.rb +11 -0
- data/test/vcr_cassettes/forter/get_decision.yml +66 -0
- data/test/vcr_cassettes/forter/integration/authorize_net_response_code.yml +410 -0
- data/test/vcr_cassettes/forter/integration/braintree_response_code.yml +231 -0
- data/test/vcr_cassettes/forter/integration/checkoutdotcom_response_code.yml +129 -0
- data/test/vcr_cassettes/forter/integration/cyber_response_code.yml +199 -0
- data/test/vcr_cassettes/forter/integration/moneris_response_code.yml +84 -0
- data/test/vcr_cassettes/forter/integration/payflow_pro_response_code.yml +60 -0
- data/test/vcr_cassettes/forter/system/braintree_approved.yml +293 -0
- data/test/vcr_cassettes/forter/system/braintree_declined.yml +485 -0
- data/test/vcr_cassettes/forter/system/braintree_not_reviewed.yml +293 -0
- data/test/vcr_cassettes/forter/update_status.yml +182 -0
- data/test/view_models/workarea/storefront/order_view_model_test.decorator +10 -0
- data/test/workers/forter/update_status_test.rb +22 -0
- data/workarea-forter.gemspec +18 -0
- metadata +195 -0
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
class ForterCybersourceResponseCodeIntegrationTest < Workarea::IntegrationTest
|
5
|
+
if Workarea::Plugin.installed?(:CyberSource)
|
6
|
+
include ForterApiConfig
|
7
|
+
include CyberSourceGatewayVCRConfig
|
8
|
+
|
9
|
+
def test_response_code
|
10
|
+
VCR.use_cassette 'forter/integration/cyber_response_code' do
|
11
|
+
|
12
|
+
tender.amount = 5.to_m
|
13
|
+
transaction = tender.build_transaction(action: 'authorize')
|
14
|
+
operation = Payment::Authorize::CreditCard.new(tender, transaction)
|
15
|
+
operation.complete!
|
16
|
+
transaction.save!
|
17
|
+
|
18
|
+
response_code = Workarea.config.forter.response_code[gateway_class].call(transaction)
|
19
|
+
assert_equal('100', response_code)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def gateway_class
|
26
|
+
gateway.class.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def gateway
|
30
|
+
Workarea.config.gateways.credit_card
|
31
|
+
end
|
32
|
+
|
33
|
+
def payment
|
34
|
+
@payment ||=
|
35
|
+
begin
|
36
|
+
profile = create_payment_profile
|
37
|
+
create_payment(
|
38
|
+
profile_id: profile.id,
|
39
|
+
address: {
|
40
|
+
first_name: 'Ben',
|
41
|
+
last_name: 'Crouse',
|
42
|
+
street: '22 s. 3rd st.',
|
43
|
+
city: 'Philadelphia',
|
44
|
+
region: 'PA',
|
45
|
+
postal_code: '19106',
|
46
|
+
country: Country['US']
|
47
|
+
}
|
48
|
+
)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def tender
|
53
|
+
@tender ||=
|
54
|
+
begin
|
55
|
+
payment.set_address(first_name: 'Ben', last_name: 'Crouse')
|
56
|
+
|
57
|
+
payment.build_credit_card(
|
58
|
+
number: 4111111111111111,
|
59
|
+
month: 1,
|
60
|
+
year: Time.current.year + 1,
|
61
|
+
cvv: 999
|
62
|
+
)
|
63
|
+
|
64
|
+
payment.credit_card
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
class ForterMonerisResponseCodeIntegrationTest < Workarea::IntegrationTest
|
5
|
+
if Workarea::Plugin.installed?(:moneris)
|
6
|
+
include ForterApiConfig
|
7
|
+
include MonerisGatewayVCRConfig
|
8
|
+
|
9
|
+
def test_response_code
|
10
|
+
VCR.use_cassette 'forter/integration/moneris_response_code' do
|
11
|
+
|
12
|
+
tender.amount = 10.10.to_m
|
13
|
+
transaction = tender.build_transaction(action: 'authorize')
|
14
|
+
operation = Payment::Authorize::CreditCard.new(tender, transaction)
|
15
|
+
operation.complete!
|
16
|
+
transaction.save!
|
17
|
+
|
18
|
+
response_code = Workarea.config.forter.response_code[gateway_class].call(transaction)
|
19
|
+
assert_equal('027', response_code)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def gateway_class
|
26
|
+
gateway.class.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def gateway
|
30
|
+
Workarea.config.gateways.credit_card
|
31
|
+
end
|
32
|
+
|
33
|
+
def payment
|
34
|
+
@payment ||=
|
35
|
+
begin
|
36
|
+
profile = create_payment_profile
|
37
|
+
create_payment(
|
38
|
+
profile_id: profile.id,
|
39
|
+
address: {
|
40
|
+
first_name: 'Ben',
|
41
|
+
last_name: 'Crouse',
|
42
|
+
street: '22 s. 3rd st.',
|
43
|
+
city: 'Philadelphia',
|
44
|
+
region: 'PA',
|
45
|
+
postal_code: '19106',
|
46
|
+
country: Country['US']
|
47
|
+
}
|
48
|
+
)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def tender
|
53
|
+
@tender ||=
|
54
|
+
begin
|
55
|
+
payment.set_address(first_name: 'Ben', last_name: 'Crouse')
|
56
|
+
|
57
|
+
payment.build_credit_card(
|
58
|
+
number: 4111111111111111,
|
59
|
+
month: 1,
|
60
|
+
year: Time.current.year + 1,
|
61
|
+
cvv: 999
|
62
|
+
)
|
63
|
+
|
64
|
+
payment.credit_card
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
class ForterPayFlowProResponseCodeIntegrationTest < Workarea::IntegrationTest
|
5
|
+
if Workarea::Plugin.installed?(:PayflowPro)
|
6
|
+
include ForterApiConfig
|
7
|
+
include PayflowProGatewayVCRConfig
|
8
|
+
|
9
|
+
def test_response_code
|
10
|
+
VCR.use_cassette 'forter/integration/payflow_pro_response_code' do
|
11
|
+
|
12
|
+
tender.amount = 5.to_m
|
13
|
+
transaction = tender.build_transaction(action: 'authorize')
|
14
|
+
operation = Payment::Authorize::CreditCard.new(tender, transaction)
|
15
|
+
operation.complete!
|
16
|
+
transaction.save!
|
17
|
+
|
18
|
+
response_code = Workarea.config.forter.response_code[gateway_class].call(transaction)
|
19
|
+
assert_equal('0', response_code)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def gateway_class
|
26
|
+
gateway.class.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def gateway
|
30
|
+
Workarea.config.gateways.credit_card
|
31
|
+
end
|
32
|
+
|
33
|
+
def payment
|
34
|
+
@payment ||=
|
35
|
+
begin
|
36
|
+
profile = create_payment_profile
|
37
|
+
create_payment(
|
38
|
+
profile_id: profile.id,
|
39
|
+
address: {
|
40
|
+
first_name: 'Ben',
|
41
|
+
last_name: 'Crouse',
|
42
|
+
street: '22 s. 3rd st.',
|
43
|
+
city: 'Philadelphia',
|
44
|
+
region: 'PA',
|
45
|
+
postal_code: '19106',
|
46
|
+
country: Country['US']
|
47
|
+
}
|
48
|
+
)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def tender
|
53
|
+
@tender ||=
|
54
|
+
begin
|
55
|
+
payment.set_address(first_name: 'Ben', last_name: 'Crouse')
|
56
|
+
|
57
|
+
payment.build_credit_card(
|
58
|
+
number: 4111111111111111,
|
59
|
+
month: 1,
|
60
|
+
year: Time.current.year + 1,
|
61
|
+
cvv: 999
|
62
|
+
)
|
63
|
+
|
64
|
+
payment.credit_card
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
module Storefront
|
5
|
+
class ForterIntegrationTest < Workarea::IntegrationTest
|
6
|
+
|
7
|
+
def test_decision_approved
|
8
|
+
complete_checkout("approved@workarea.com", 'W3blinc1')
|
9
|
+
|
10
|
+
order = Workarea::Order.last
|
11
|
+
payment = Workarea::Payment.last
|
12
|
+
|
13
|
+
decision = Workarea::Forter::Decision.find(order.id)
|
14
|
+
|
15
|
+
refute(decision.response.suspected_fraud?)
|
16
|
+
|
17
|
+
order.reload
|
18
|
+
refute(order.flagged_for_fraud?)
|
19
|
+
refute(payment.flagged_for_fraud?)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_decision_not_reviewed
|
23
|
+
user = create_user(email: "notreviewed@workarea.com", password: 'W3blinc1')
|
24
|
+
complete_checkout("notreviewed@workarea.com", 'W3blinc1')
|
25
|
+
|
26
|
+
order = Workarea::Order.last
|
27
|
+
payment = Workarea::Payment.last
|
28
|
+
decision = Workarea::Forter::Decision.find(order.id)
|
29
|
+
|
30
|
+
refute(payment.flagged_for_fraud?)
|
31
|
+
refute(decision.response.suspected_fraud?)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_decision_declined
|
35
|
+
user = create_user(email: "decline@workarea.com", password: 'W3blinc1')
|
36
|
+
complete_checkout("decline@workarea.com", 'W3blinc1')
|
37
|
+
|
38
|
+
order = Workarea::Order.last
|
39
|
+
decision = Workarea::Forter::Decision.find(order.id)
|
40
|
+
assert(decision.response.suspected_fraud?)
|
41
|
+
|
42
|
+
payment = Workarea::Payment.last
|
43
|
+
transaction = payment.tenders.first.transactions.first
|
44
|
+
|
45
|
+
assert(transaction.cancellation.present?)
|
46
|
+
|
47
|
+
order.reload
|
48
|
+
payment.reload
|
49
|
+
|
50
|
+
assert(order.flagged_for_fraud?)
|
51
|
+
assert_equal(:suspected_fraud, order.status)
|
52
|
+
|
53
|
+
assert(payment.flagged_for_fraud?)
|
54
|
+
assert_equal(:suspected_fraud, payment.status)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_gateway_error
|
58
|
+
user = create_user(email: "error@workarea.com", password: 'W3blinc1')
|
59
|
+
complete_checkout("error@workarea.com", 'W3blinc1')
|
60
|
+
|
61
|
+
order = Workarea::Order.last
|
62
|
+
payment = Workarea::Payment.last
|
63
|
+
decision = Workarea::Forter::Decision.find(order.id)
|
64
|
+
|
65
|
+
refute(payment.flagged_for_fraud?)
|
66
|
+
refute(decision.response.suspected_fraud?)
|
67
|
+
assert(decision.response.errors.present?)
|
68
|
+
end
|
69
|
+
|
70
|
+
def product
|
71
|
+
@product ||= create_product(
|
72
|
+
name: 'Integration Product',
|
73
|
+
variants: [
|
74
|
+
{ sku: 'SKU1', tax_code: '001', regular: 5.to_m }
|
75
|
+
]
|
76
|
+
)
|
77
|
+
end
|
78
|
+
|
79
|
+
def complete_checkout(email = nil, password = nil)
|
80
|
+
if Shipping::Service.blank?
|
81
|
+
create_shipping_service(
|
82
|
+
name: 'Ground',
|
83
|
+
tax_code: '001',
|
84
|
+
rates: [{ price: 7.to_m }]
|
85
|
+
)
|
86
|
+
end
|
87
|
+
|
88
|
+
post storefront.cart_items_path,
|
89
|
+
params: {
|
90
|
+
product_id: product.id,
|
91
|
+
sku: product.skus.first,
|
92
|
+
quantity: 2
|
93
|
+
}
|
94
|
+
|
95
|
+
if email.present? && password.present?
|
96
|
+
post storefront.login_path,
|
97
|
+
params: { email: email, password: password }
|
98
|
+
end
|
99
|
+
|
100
|
+
patch storefront.checkout_addresses_path,
|
101
|
+
params: {
|
102
|
+
email: email,
|
103
|
+
billing_address: {
|
104
|
+
first_name: 'Ben',
|
105
|
+
last_name: 'Crouse',
|
106
|
+
street: '12 N. 3rd St.',
|
107
|
+
city: 'Philadelphia',
|
108
|
+
region: 'PA',
|
109
|
+
postal_code: '19106',
|
110
|
+
country: 'US',
|
111
|
+
phone_number: '2159251800'
|
112
|
+
},
|
113
|
+
shipping_address: {
|
114
|
+
first_name: 'Ben',
|
115
|
+
last_name: 'Crouse',
|
116
|
+
street: '22 S. 3rd St.',
|
117
|
+
city: 'Philadelphia',
|
118
|
+
region: 'PA',
|
119
|
+
postal_code: '19106',
|
120
|
+
country: 'US',
|
121
|
+
phone_number: '2159251800'
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
patch storefront.checkout_place_order_path,
|
126
|
+
params: {
|
127
|
+
payment: 'new_card',
|
128
|
+
credit_card: {
|
129
|
+
number: '1',
|
130
|
+
month: 1,
|
131
|
+
year: 2020,
|
132
|
+
cvv: '999'
|
133
|
+
}
|
134
|
+
}
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
module Forter
|
5
|
+
class GatewayTest < Workarea::TestCase
|
6
|
+
include ForterApiConfig
|
7
|
+
|
8
|
+
def gateway
|
9
|
+
Workarea::Forter::Gateway.new(
|
10
|
+
secret_key: Rails.application.secrets.forter[:secret_key],
|
11
|
+
site_id: site_id
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_get_decision
|
16
|
+
VCR.use_cassette("forter/get_decision", match_requests_on: [:method, :uri]) do
|
17
|
+
order = create_placed_forter_order(id: "fortertest1234", email: "approve@forter.com")
|
18
|
+
|
19
|
+
forter_decision = Forter::Decision.find order.id
|
20
|
+
response = forter_decision.responses.first
|
21
|
+
assert response.decision_response.success?
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_update_order_status
|
26
|
+
VCR.use_cassette("forter/update_status", match_requests_on: [:method, :uri]) do
|
27
|
+
order = create_placed_forter_order(id: "statusfortertest12345", email: "approve@forter.com")
|
28
|
+
|
29
|
+
hsh = Forter::Order.new(order).to_h
|
30
|
+
|
31
|
+
response = gateway.create_decision(order.id, hsh)
|
32
|
+
assert(response.success?)
|
33
|
+
|
34
|
+
|
35
|
+
hsh = {
|
36
|
+
orderId: order.id,
|
37
|
+
eventTime: Time.new.to_i * 1000,
|
38
|
+
updatedStatus: "CANCELED_BY_MERCHANT"
|
39
|
+
}
|
40
|
+
|
41
|
+
update_status_response = gateway.update_order_status(order.id, hsh)
|
42
|
+
assert(update_status_response.success?)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
class Checkout
|
5
|
+
class ForterCollectPaymentTest < TestCase
|
6
|
+
setup :create_models
|
7
|
+
|
8
|
+
def test_rescuing_timeout_errors
|
9
|
+
Workarea::Forter::BogusGateway
|
10
|
+
.any_instance
|
11
|
+
.stubs(:create_decision)
|
12
|
+
.raises(Faraday::Error::TimeoutError)
|
13
|
+
refute(@collect_payment.purchase)
|
14
|
+
|
15
|
+
forter_decision = Forter::Decision.find(@order.id)
|
16
|
+
assert_equal(2, forter_decision.responses.size)
|
17
|
+
forter_decision.responses.each do |response|
|
18
|
+
assert response.timed_out
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_with_one_timeout
|
23
|
+
normal_response = Forter.gateway.create_decision(@order.id, Forter::Order.new(@order).to_h)
|
24
|
+
Workarea::Forter::BogusGateway
|
25
|
+
.any_instance
|
26
|
+
.stubs(:create_decision)
|
27
|
+
.raises(Faraday::Error::TimeoutError)
|
28
|
+
.then
|
29
|
+
.returns(normal_response)
|
30
|
+
|
31
|
+
refute(@collect_payment.purchase)
|
32
|
+
forter_decision = Forter::Decision.find(@order.id)
|
33
|
+
assert_equal(2, forter_decision.responses.size)
|
34
|
+
|
35
|
+
assert(forter_decision.responses.first.timed_out)
|
36
|
+
refute(forter_decision.responses.second.timed_out)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def create_models
|
42
|
+
@order = Order.create!(email: 'test@workarea.com', total_price: 5.to_m)
|
43
|
+
@checkout = Checkout.new(@order)
|
44
|
+
@payment = Payment.create!(
|
45
|
+
id: @order.id,
|
46
|
+
address: {
|
47
|
+
first_name: "Ben",
|
48
|
+
last_name: "Crouse",
|
49
|
+
street: "22 S 3rd St",
|
50
|
+
city: "Philadelphia",
|
51
|
+
region: "PA",
|
52
|
+
country: Country['US'],
|
53
|
+
postal_code: 19106
|
54
|
+
}
|
55
|
+
)
|
56
|
+
@collect_payment = CollectPayment.new(@checkout)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
class ForterPaymentTest < TestCase
|
5
|
+
|
6
|
+
def response
|
7
|
+
ActiveMerchant::Billing::Response.new(
|
8
|
+
true,
|
9
|
+
'Message',
|
10
|
+
{},
|
11
|
+
{ authorization: 'ABCDEFG' }
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_rollback
|
16
|
+
payment = Payment.new(
|
17
|
+
address: {
|
18
|
+
first_name: 'Ben',
|
19
|
+
last_name: 'Crouse',
|
20
|
+
street: '22 S. 3rd St.',
|
21
|
+
street_2: 'Second Floor',
|
22
|
+
city: 'Philadelphia',
|
23
|
+
region: 'PA',
|
24
|
+
postal_code: '19106',
|
25
|
+
country: 'US',
|
26
|
+
phone_number: '2159251800'
|
27
|
+
}
|
28
|
+
)
|
29
|
+
payment.profile = create_payment_profile(
|
30
|
+
email: 'test@workarea.com',
|
31
|
+
store_credit: 1.to_m
|
32
|
+
)
|
33
|
+
payment.build_store_credit
|
34
|
+
|
35
|
+
payment.build_credit_card(
|
36
|
+
number: '4111111111111111',
|
37
|
+
month: 1,
|
38
|
+
year: Time.current.year + 1,
|
39
|
+
cvv: 999,
|
40
|
+
amount: 9.to_m
|
41
|
+
)
|
42
|
+
|
43
|
+
payment.save!
|
44
|
+
|
45
|
+
tender = payment.credit_card
|
46
|
+
tender.build_transaction(amount: 10.to_m, success: true, action: 'authorize', response: response).save!
|
47
|
+
|
48
|
+
store_credit_tender = payment.store_credit
|
49
|
+
store_credit_tender.build_transaction(amount: 1.to_m, success: true, action: 'authorize', response: response).save!
|
50
|
+
|
51
|
+
payment.rollback!
|
52
|
+
|
53
|
+
transactions = payment.tenders.flat_map(&:transactions)
|
54
|
+
|
55
|
+
assert(transactions.all? { |t| t.canceled_at.present? })
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
module Workarea
|
3
|
+
class Payment
|
4
|
+
class ForterCreditCardTest < TestCase
|
5
|
+
|
6
|
+
def credit_card
|
7
|
+
@credit_card ||= Workarea::Payment::Tender::CreditCard.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_valid?
|
11
|
+
credit_card.number = 4111111111111111
|
12
|
+
credit_card.valid?
|
13
|
+
assert(credit_card.display_number.present?)
|
14
|
+
assert(credit_card.issuer.present?)
|
15
|
+
assert(credit_card.bin.present?)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
class Payment::ForterSavedCreditCardTest < TestCase
|
5
|
+
def test_save
|
6
|
+
card = Workarea::Payment::SavedCreditCard.new(
|
7
|
+
profile: create_payment_profile(reference: '234'),
|
8
|
+
number: '4111111111111111',
|
9
|
+
cvv: '123',
|
10
|
+
month: 12,
|
11
|
+
year: Time.current.year + 1,
|
12
|
+
first_name: 'Robert',
|
13
|
+
last_name: 'Clams'
|
14
|
+
)
|
15
|
+
|
16
|
+
card.save
|
17
|
+
assert(card.tokenized?)
|
18
|
+
assert(card.bin.present?)
|
19
|
+
assert_equal('411111', card.bin)
|
20
|
+
|
21
|
+
profile = create_payment_profile
|
22
|
+
current_default = create_saved_credit_card(profile: profile, default: true)
|
23
|
+
new_default = create_saved_credit_card(profile: profile, default: true)
|
24
|
+
|
25
|
+
current_default.reload
|
26
|
+
new_default.reload
|
27
|
+
|
28
|
+
refute(current_default.default?)
|
29
|
+
assert(new_default.default?)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
module Foter
|
5
|
+
class OrderTest < Workarea::TestCase
|
6
|
+
def test_to_h
|
7
|
+
user = create_user(id: 'u-1234', first_name: 'jeffy', last_name: 'tester')
|
8
|
+
order = create_placed_forter_order(overrides = { id: '1234', user_id: user.id })
|
9
|
+
hsh = Forter::Order.new(order).to_h
|
10
|
+
|
11
|
+
payment = Workarea::Payment.find('1234')
|
12
|
+
shipping = Workarea::Shipping.find_by_order('1234')
|
13
|
+
|
14
|
+
assert_equal(order.id, hsh[:orderId])
|
15
|
+
assert_equal("WEB", hsh[:orderType])
|
16
|
+
|
17
|
+
assert_equal(payment.address.first_name, hsh[:primaryRecipient][:personalDetails][:firstName])
|
18
|
+
assert_equal(payment.address.last_name, hsh[:primaryRecipient][:personalDetails][:lastName])
|
19
|
+
|
20
|
+
assert_equal(shipping.address.street, hsh[:primaryRecipient][:address][:address1])
|
21
|
+
assert_equal(shipping.address.city, hsh[:primaryRecipient][:address][:city])
|
22
|
+
assert_equal(shipping.address.country.alpha2, hsh[:primaryRecipient][:address][:country])
|
23
|
+
|
24
|
+
assert_equal(order.total_price.to_s, hsh[:totalAmount][:amountUSD])
|
25
|
+
|
26
|
+
assert_equal(1, hsh[:cartItems].size)
|
27
|
+
|
28
|
+
assert_equal(1, hsh[:payment].size)
|
29
|
+
assert_equal(order.total_price.to_s, hsh[:payment].first[:amount][:amountUSD])
|
30
|
+
|
31
|
+
assert_equal(user.first_name, hsh[:accountOwner][:firstName])
|
32
|
+
assert_equal(user.last_name, hsh[:accountOwner][:lastName])
|
33
|
+
assert_equal(user.email, hsh[:accountOwner][:email])
|
34
|
+
assert_equal(user.id, hsh[:accountOwner][:accountId])
|
35
|
+
|
36
|
+
assert_equal("123ABC", hsh[:connectionInformation][:forterTokenCookie])
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_to_h_with_no_shipping_address
|
40
|
+
order = create_placed_forter_order(overrides = { id: '1234' })
|
41
|
+
payment = Workarea::Payment.find('1234')
|
42
|
+
|
43
|
+
#remove the shipping so it falls back to payment address
|
44
|
+
shipping = Workarea::Shipping.find_by_order('1234')
|
45
|
+
shipping.delete
|
46
|
+
|
47
|
+
hsh = Forter::Order.new(order).to_h
|
48
|
+
assert_equal(payment.address.street, hsh[:primaryRecipient][:address][:address1])
|
49
|
+
assert_equal(payment.address.city, hsh[:primaryRecipient][:address][:city])
|
50
|
+
assert_equal(payment.address.country.alpha2, hsh[:primaryRecipient][:address][:country])
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_to_h_multiple_tenders
|
54
|
+
user = create_user(id: 'u-12345', first_name: 'jeffy', last_name: 'tester')
|
55
|
+
order = create_placed_forter_order(overrides = { id: '1234', user_id: user.id }, options = { store_credit_amount: 5.00 })
|
56
|
+
hsh = Forter::Order.new(order).to_h
|
57
|
+
|
58
|
+
assert_equal(2, hsh[:payment].size)
|
59
|
+
assert(hsh[:payment].all? { |p| p[:billingDetails].present? })
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_to_h_guest_order
|
63
|
+
order = create_placed_order(id: '1234')
|
64
|
+
payment = Workarea::Payment.find('1234')
|
65
|
+
|
66
|
+
hsh = Forter::Order.new(order).to_h
|
67
|
+
|
68
|
+
assert_equal(payment.address.first_name, hsh[:accountOwner][:firstName])
|
69
|
+
assert_equal(payment.address.last_name, hsh[:accountOwner][:lastName])
|
70
|
+
assert_equal(order.email, hsh[:accountOwner][:email])
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_to_h_promo_code
|
74
|
+
order = create_placed_order(id: '1234')
|
75
|
+
order.promo_codes = ['1234']
|
76
|
+
|
77
|
+
hsh = Forter::Order.new(order).to_h
|
78
|
+
assert_equal('1234', hsh[:totalDiscount][:couponCodeUsed])
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Workarea
|
2
|
+
module ForterApiConfig
|
3
|
+
def self.included(test)
|
4
|
+
super
|
5
|
+
test.setup :set_key
|
6
|
+
test.teardown :reset_key
|
7
|
+
end
|
8
|
+
|
9
|
+
def site_id
|
10
|
+
"4d12ac5d794c"
|
11
|
+
end
|
12
|
+
|
13
|
+
def set_key
|
14
|
+
@_old_secrets = Rails.application.secrets.forter
|
15
|
+
@old_site_id = Workarea.config.forter.site_id
|
16
|
+
Workarea.config.forter.site_id = site_id
|
17
|
+
Rails.application.secrets.forter = {
|
18
|
+
secret_key: 'a'
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def reset_key
|
23
|
+
Rails.application.secrets.forter = @_old_secrets
|
24
|
+
Workarea.config.forter.site_id = @old_site_id
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|