workarea-kount 3.3.0
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/.eslintrc +24 -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/.github/workflows/ci.yml +58 -0
- data/.gitignore +14 -0
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +212 -0
- data/CODE_OF_CONDUCT.md +3 -0
- data/CONTRIBUTING.md +3 -0
- data/Gemfile +17 -0
- data/LICENSE.md +3 -0
- data/README.md +98 -0
- data/Rakefile +53 -0
- data/app/controllers/workarea/admin/orders_controller.decorator +5 -0
- data/app/controllers/workarea/storefront/checkout/place_order_controller.decorator +11 -0
- data/app/controllers/workarea/storefront/kount_controller.rb +19 -0
- data/app/controllers/workarea/storefront/kount_orders_controller.rb +40 -0
- data/app/lib/active_shipping/rate_estimate.decorator +10 -0
- data/app/mailers/workarea/storefront/order_mailer.decorator +14 -0
- data/app/models/workarea/checkout.decorator +37 -0
- data/app/models/workarea/checkout/fraud/kount_analyzer.rb +71 -0
- data/app/models/workarea/kount/ens_event.rb +13 -0
- data/app/models/workarea/kount/order.rb +14 -0
- data/app/models/workarea/order.decorator +62 -0
- data/app/models/workarea/order/fraud_decision.decorator +9 -0
- data/app/models/workarea/order/item.decorator +8 -0
- data/app/models/workarea/order/status/review.rb +13 -0
- data/app/models/workarea/payment/credit_card.decorator +13 -0
- data/app/models/workarea/payment/payment.decorator +11 -0
- data/app/models/workarea/payment/status/kount_declined.rb +13 -0
- data/app/models/workarea/payment/status/kount_review.rb +13 -0
- data/app/models/workarea/payment/tender/credit_card.decorator +10 -0
- data/app/models/workarea/search/admin.decorator +12 -0
- data/app/models/workarea/search/admin/order.decorator +7 -0
- data/app/models/workarea/shipping/rate_lookup.decorator +26 -0
- data/app/models/workarea/shipping/service.decorator +9 -0
- data/app/models/workarea/shipping/service_selection.decorator +7 -0
- data/app/models/workarea/shipping_option.decorator +27 -0
- data/app/services/workarea/kount/cancel_order_under_review.rb +28 -0
- data/app/services/workarea/kount/event.rb +43 -0
- data/app/services/workarea/kount/event/dmc_event.rb +9 -0
- data/app/services/workarea/kount/event/risk_change_event.rb +21 -0
- data/app/services/workarea/kount/event/special_alert_event.rb +21 -0
- data/app/services/workarea/kount/event/workflow_event.rb +25 -0
- data/app/services/workarea/kount/event_batch.rb +37 -0
- data/app/services/workarea/kount/order_fraud_update_service.rb +42 -0
- data/app/services/workarea/kount/ris_inquiry.rb +120 -0
- data/app/services/workarea/kount/ris_inquiry/product.rb +53 -0
- data/app/services/workarea/kount/ris_request.rb +84 -0
- data/app/services/workarea/kount/ris_update.rb +39 -0
- data/app/view_models/workarea/admin/order_view_model.decorator +35 -0
- data/app/view_models/workarea/storefront/order_view_model.decorator +11 -0
- data/app/views/workarea/admin/orders/_kount.html.haml +28 -0
- data/app/views/workarea/admin/orders/kount.html.haml +46 -0
- data/app/views/workarea/storefront/checkouts/_kount_data_collector.html.haml +4 -0
- data/app/views/workarea/storefront/order_mailer/hold_denial.html.haml +14 -0
- data/app/workers/workarea/kount/process_review_order.rb +75 -0
- data/app/workers/workarea/kount/update_ris_inquiry.rb +31 -0
- data/bin/rails +18 -0
- data/config/initializers/appends.rb +11 -0
- data/config/initializers/workarea.rb +26 -0
- data/config/locales/en.yml +26 -0
- data/config/routes.rb +14 -0
- data/doc/Kount Technical Specification Guide 5.5.5.pdf +0 -0
- data/lib/workarea/kount.rb +87 -0
- data/lib/workarea/kount/address.rb +39 -0
- data/lib/workarea/kount/bogus_gateway.rb +415 -0
- data/lib/workarea/kount/engine.rb +8 -0
- data/lib/workarea/kount/errors.rb +2 -0
- data/lib/workarea/kount/gateway.rb +50 -0
- data/lib/workarea/kount/mappings.rb +195 -0
- data/lib/workarea/kount/payment_types.rb +50 -0
- data/lib/workarea/kount/response.rb +141 -0
- data/lib/workarea/kount/security_mash.rb +79 -0
- data/lib/workarea/kount/user_defined_fields.rb +16 -0
- data/lib/workarea/kount/version.rb +5 -0
- data/lib/workarea/mailer_previews/storefront/order_mailer_preview.rb +10 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/config/manifest.js +4 -0
- data/test/dummy/app/assets/images/.keep +0 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/concerns/.keep +0 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/jobs/application_job.rb +2 -0
- data/test/dummy/app/mailers/application_mailer.rb +4 -0
- data/test/dummy/app/models/concerns/.keep +0 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/test/dummy/app/views/layouts/mailer.text.erb +1 -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 +34 -0
- data/test/dummy/bin/update +29 -0
- data/test/dummy/config.ru +5 -0
- data/test/dummy/config/application.rb +23 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/cable.yml +9 -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 +86 -0
- data/test/dummy/config/environments/test.rb +44 -0
- data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
- data/test/dummy/config/initializers/assets.rb +11 -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/new_framework_defaults.rb +21 -0
- data/test/dummy/config/initializers/session_store.rb +3 -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 +23 -0
- data/test/dummy/config/puma.rb +47 -0
- data/test/dummy/config/routes.rb +6 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config/spring.rb +6 -0
- data/test/dummy/db/seeds.rb +2 -0
- data/test/dummy/lib/assets/.keep +0 -0
- data/test/dummy/log/.keep +0 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/test/dummy/public/apple-touch-icon.png +0 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/factories/kount.rb +164 -0
- data/test/integration/workarea/api/admin/payment_transactions_integration_test.decorator +29 -0
- data/test/integration/workarea/kount_moneris_integration_test.rb +37 -0
- data/test/integration/workarea/storefront/kount_integration_test.rb +37 -0
- data/test/integration/workarea/storefront/kount_orders_integration_test.rb +89 -0
- data/test/lib/workarea/kount/response_test.rb +95 -0
- data/test/lib/workarea/kount/security_mash_test.rb +62 -0
- data/test/models/workarea/checkout/fraud/kount_analyzer_test.rb +44 -0
- data/test/models/workarea/checkout_test.decorator +22 -0
- data/test/models/workarea/order/queries_test.decorator +28 -0
- data/test/models/workarea/order_test.decorator +25 -0
- data/test/models/workarea/payment/payment_test.rb +106 -0
- data/test/models/workarea/payment/saved_credit_card_test.rb +24 -0
- data/test/models/workarea/payment_test.decorator +54 -0
- data/test/models/workarea/shipping_option_test.rb +29 -0
- data/test/services/workarea/kount/event_batch_test.rb +95 -0
- data/test/services/workarea/kount/event_test.rb +51 -0
- data/test/services/workarea/kount/order_fraud_update_service_test.rb +48 -0
- data/test/support/workarea/kount_api_config.rb +27 -0
- data/test/system/workarea/kount_system_test.rb +72 -0
- data/test/system/workarea/storefront/kount_guest_checkout_system_test.rb +32 -0
- data/test/system/workarea/storefront/kount_logged_in_checkout_system_test.rb +102 -0
- data/test/test_helper.rb +16 -0
- data/test/vcr_cassettes/kount/basic_fraud_test.yml +43 -0
- data/test/vcr_cassettes/kount/integration/moneris_new_credit_card.yml +84 -0
- data/test/vcr_cassettes/kount/integration/moneris_saved_credit_card.yml +84 -0
- data/test/vcr_cassettes/kount/order_fraud_update.yml +82 -0
- data/test/workers/workarea/kount/clean_orders_test.rb +40 -0
- data/test/workers/workarea/kount/process_review_order_test.rb +100 -0
- data/workarea-kount.gemspec +17 -0
- metadata +238 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
module Kount
|
5
|
+
class SecurityMashTest < Workarea::TestCase
|
6
|
+
def test_hash_token
|
7
|
+
fixture_cards = [
|
8
|
+
["7103387671500967", "710338010UCJ25C9JLKG"],
|
9
|
+
["5199185454061655", "5199182QMVHKQ9X56M9X"],
|
10
|
+
["4259344583883", "425934CG9C5L4J9JU6W3"],
|
11
|
+
["6495347478600780", "649534VVS6JHO5CDQFIW"],
|
12
|
+
["4990160432687370", "499016QLDL0OP3SMX0MT"],
|
13
|
+
["2630847576846156", "263084CARRC9W3XDLS8R"]
|
14
|
+
]
|
15
|
+
|
16
|
+
fixture_cards.each do |(card, hashed)|
|
17
|
+
assert_equal(
|
18
|
+
hashed,
|
19
|
+
Kount::SecurityMash.hash_token(card, 'CARD', ksalt)
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_hash_token_when_already_hashed
|
25
|
+
fixture_cards = [
|
26
|
+
["499016QLDL0OP3SMX0MT", "499016QLDL0OP3SMX0MT"],
|
27
|
+
["425934CG9C5L4J9JU6W3", "425934CG9C5L4J9JU6W3"],
|
28
|
+
["710338010UCJ25C9JLKG", "710338010UCJ25C9JLKG"]
|
29
|
+
]
|
30
|
+
|
31
|
+
fixture_cards.each do |(card, hashed)|
|
32
|
+
assert_equal(
|
33
|
+
hashed,
|
34
|
+
Kount::SecurityMash.hash_token(card, 'CARD', ksalt)
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_hash_gift_card
|
40
|
+
merchant_id = '555555'
|
41
|
+
fixture_cards = [
|
42
|
+
["7388460E9D", "555555UF1IG4DV7HRWN3"],
|
43
|
+
["50906199", "5555559JUX7H9KGJYHH8"],
|
44
|
+
["41658068FC266C309", "555555ZFV2XK4ELP9OMJ"]
|
45
|
+
]
|
46
|
+
|
47
|
+
fixture_cards.each do |(card, hashed)|
|
48
|
+
assert_equal(
|
49
|
+
hashed,
|
50
|
+
Kount::SecurityMash.hash_token(card, 'GIFT', ksalt, merchant_id)
|
51
|
+
)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def ksalt
|
58
|
+
'public-test-salt'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
class Checkout
|
5
|
+
module Fraud
|
6
|
+
class KountAnalyzerTest < Workarea::TestCase
|
7
|
+
setup :setup_sandbox_credentials
|
8
|
+
teardown :restore_credentials
|
9
|
+
|
10
|
+
def test_basic_fraud_test
|
11
|
+
checkout = create_purchasable_checkout(order: {
|
12
|
+
kount_session_id: '12345666',
|
13
|
+
ip_address: '170.115.187.68'
|
14
|
+
})
|
15
|
+
|
16
|
+
VCR.use_cassette("kount/basic_fraud_test") do
|
17
|
+
analyzer = KountAnalyzer.new(checkout)
|
18
|
+
response = analyzer.decide!
|
19
|
+
|
20
|
+
assert_equal(:approved, response.decision)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def setup_sandbox_credentials
|
27
|
+
@_old_credentials = Workarea::Kount.credentials
|
28
|
+
|
29
|
+
Rails.application.secrets.kount = {
|
30
|
+
merchant_id: '200755',
|
31
|
+
version: '0630',
|
32
|
+
key: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIyMDA3NTUiLCJhdWQiOiJLb3VudC4xIiwiaWF0IjoxNTAwNDA3NTE1LCJzY3AiOnsia2EiOm51bGwsImtjIjpudWxsLCJhcGkiOnRydWUsInJpcyI6dHJ1ZX19.1YwTR1G8qBQ_TDK8MBYxDB2EhpUD0IlwWdvqHVOnm0o',
|
33
|
+
ksalt: '4077th hawkeye trapper radar section-8',
|
34
|
+
is_test: true
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def restore_credentials
|
39
|
+
Rails.application.secrets.kount = @_old_credentials
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Workarea
|
2
|
+
decorate CheckoutTest, with: :kount do
|
3
|
+
def test_handle_kount_review_fails_if_inventory_fails
|
4
|
+
checkout = Checkout.new(@order)
|
5
|
+
|
6
|
+
@order.update!(kount_decision: :review)
|
7
|
+
checkout.expects(:complete?).returns(true)
|
8
|
+
checkout.expects(:shippable?).returns(true)
|
9
|
+
checkout.expects(:payable?).returns(true)
|
10
|
+
checkout.inventory.expects(:captured?).returns(false)
|
11
|
+
|
12
|
+
refute(checkout.handle_kount_review)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_handle_kount_review_tokenizes_the_card
|
16
|
+
checkout = create_purchasable_checkout(order: { kount_decision: :review })
|
17
|
+
|
18
|
+
assert(checkout.handle_kount_review)
|
19
|
+
assert(checkout.payment.credit_card.present?)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
decorate Order::QueriesTest, with: :kount do
|
5
|
+
def test_kount_orders_do_not_need_reminding
|
6
|
+
kount_review = Order.create!(email: email, checkout_started_at: 2.hours.ago, items: [{ product_id: '1', sku: 2 }], kount_decision: :review)
|
7
|
+
kount_decline = Order.create!(email: email, checkout_started_at: 2.hours.ago, items: [{ product_id: '1', sku: 2 }], kount_decision: :decline)
|
8
|
+
results = Order.need_reminding.to_a
|
9
|
+
|
10
|
+
refute_includes(results, kount_review)
|
11
|
+
refute_includes(results, kount_decline)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_find_current_by_id_excludes_orders_under_review
|
15
|
+
order = create_order(kount_decision: :review)
|
16
|
+
|
17
|
+
result = Order.find_current(id: order.id)
|
18
|
+
refute result.persisted?
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_find_current_by_user_id_excludes_orders_under_review
|
22
|
+
_order = create_order(user_id: 'foo', kount_decision: :review)
|
23
|
+
|
24
|
+
result = Order.find_current(user_id: 'foo')
|
25
|
+
refute result.persisted?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Workarea
|
2
|
+
decorate OrderTest, with: :kount do
|
3
|
+
def test_review_status
|
4
|
+
order = Order.new(
|
5
|
+
email: 'test@workarea.com',
|
6
|
+
created_at: Time.current,
|
7
|
+
kount_decision: :review
|
8
|
+
)
|
9
|
+
order.items.build(product_id: 'PROD', sku: 'SKU1')
|
10
|
+
|
11
|
+
assert_equal(:review, order.status)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_kount_review_orders_are_not_abandoned
|
15
|
+
order = Order.new(
|
16
|
+
email: 'test@workarea.com',
|
17
|
+
created_at: Time.current - 1.day,
|
18
|
+
kount_decision: :review
|
19
|
+
)
|
20
|
+
order.items.build(product_id: 'PROD', sku: 'SKU1')
|
21
|
+
|
22
|
+
refute(order.abandoned?)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
class PaymentIntegrationTest < Workarea::TestCase
|
5
|
+
def test_set_credit_card_sets_the_credit_card_on_the_order
|
6
|
+
payment.set_credit_card(number: '1',
|
7
|
+
month: 1,
|
8
|
+
year: 2012,
|
9
|
+
cvv: 999)
|
10
|
+
|
11
|
+
refute_nil(payment.credit_card)
|
12
|
+
|
13
|
+
assert_equal('1', payment.credit_card.number)
|
14
|
+
assert_equal(1, payment.credit_card.month)
|
15
|
+
assert_equal(2012, payment.credit_card.year)
|
16
|
+
assert_equal(999, payment.credit_card.cvv)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_set_credit_card_resets_saved_card_id_on_the_credit_card_when_resetting
|
20
|
+
card = create_saved_credit_card(profile: profile)
|
21
|
+
card_id = card.id
|
22
|
+
|
23
|
+
payment.set_credit_card(saved_card_id: card_id, cvv: '999')
|
24
|
+
assert_equal(card_id.to_s, payment.credit_card.saved_card_id.to_s)
|
25
|
+
assert_equal('999', payment.credit_card.cvv)
|
26
|
+
|
27
|
+
payment.set_credit_card(
|
28
|
+
number: '1',
|
29
|
+
month: 1,
|
30
|
+
year: 2012,
|
31
|
+
cvv: 999
|
32
|
+
)
|
33
|
+
|
34
|
+
assert_equal('1', payment.credit_card.number)
|
35
|
+
assert_equal(1, payment.credit_card.month)
|
36
|
+
assert_equal(2012, payment.credit_card.year)
|
37
|
+
assert(payment.credit_card.saved_card_id.blank?)
|
38
|
+
assert_equal(999, payment.credit_card.cvv)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_set_credit_card_stores_kount_number
|
42
|
+
travel_to Time.zone.local(2017, 8, 15, 9, 00, 00)
|
43
|
+
profile = create_payment_profile
|
44
|
+
payment = create_payment(profile: profile, address: address)
|
45
|
+
|
46
|
+
payment.set_credit_card(
|
47
|
+
number: '4111111111111111',
|
48
|
+
month: 1,
|
49
|
+
year: Time.now.year + 1,
|
50
|
+
cvv: '123',
|
51
|
+
amount: 1.to_m,
|
52
|
+
saved_card_id: nil
|
53
|
+
)
|
54
|
+
payment.save
|
55
|
+
payment.tenders.first.save
|
56
|
+
|
57
|
+
payment.reload
|
58
|
+
assert_equal('41111193FBKM1EIVIXVP', payment.credit_card.kount_number)
|
59
|
+
travel_back
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_set_credit_card_stores_kount_number_from_saved_credit_card
|
63
|
+
travel_to Time.zone.local(2017, 8, 15, 9, 00, 00)
|
64
|
+
profile = create_payment_profile(email: 'user@workarea.com')
|
65
|
+
payment = create_payment(profile: profile, address: address)
|
66
|
+
|
67
|
+
saved_card = create_saved_credit_card(
|
68
|
+
number: '4111111111111111',
|
69
|
+
profile: profile
|
70
|
+
)
|
71
|
+
|
72
|
+
payment.set_credit_card(
|
73
|
+
saved_card_id: saved_card.id,
|
74
|
+
amount: 1.to_m
|
75
|
+
)
|
76
|
+
|
77
|
+
payment.save!
|
78
|
+
payment.tenders.first.save
|
79
|
+
|
80
|
+
payment.reload
|
81
|
+
assert_equal('41111193FBKM1EIVIXVP', payment.credit_card.kount_number)
|
82
|
+
travel_back
|
83
|
+
end
|
84
|
+
|
85
|
+
def address
|
86
|
+
@address ||= Workarea::Address.new(
|
87
|
+
first_name: 'Mickey',
|
88
|
+
last_name: 'Daltono',
|
89
|
+
street: '22 S. 3rd St.',
|
90
|
+
city: 'Philadelphia',
|
91
|
+
region: 'PA',
|
92
|
+
postal_code: '19106',
|
93
|
+
country: 'US',
|
94
|
+
phone_number: '267-247-2541'
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
98
|
+
def profile
|
99
|
+
@profile ||= create_payment_profile
|
100
|
+
end
|
101
|
+
|
102
|
+
def payment
|
103
|
+
@payment ||= create_payment(profile: profile)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
module Storefront
|
5
|
+
class SavedCreditCardTest < Workarea::TestCase
|
6
|
+
def test_saving_credit_card_stores_kount_number_for_saved_credit_card
|
7
|
+
travel_to Time.zone.local(2017, 8, 15, 9, 00, 00)
|
8
|
+
|
9
|
+
saved_card = Workarea::Payment::SavedCreditCard.create(
|
10
|
+
profile: create_payment_profile(email: 'user@workarea.com'),
|
11
|
+
first_name: 'Ben',
|
12
|
+
last_name: 'Crouse',
|
13
|
+
number: '4111111111111111',
|
14
|
+
month: 1,
|
15
|
+
year: Time.now.year + 1,
|
16
|
+
cvv: '999'
|
17
|
+
)
|
18
|
+
|
19
|
+
assert_equal('41111193FBKM1EIVIXVP', saved_card.kount_number)
|
20
|
+
travel_back
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
decorate PaymentTest, with: :kount do
|
5
|
+
def test_status
|
6
|
+
order = create_order
|
7
|
+
payment = Payment.new(
|
8
|
+
id: order.id,
|
9
|
+
address: {
|
10
|
+
first_name: 'Ben',
|
11
|
+
last_name: 'Crouse',
|
12
|
+
street: '22 S. 3rd St.',
|
13
|
+
street_2: 'Second Floor',
|
14
|
+
city: 'Philadelphia',
|
15
|
+
region: 'PA',
|
16
|
+
postal_code: '19106',
|
17
|
+
country: 'US',
|
18
|
+
phone_number: '2159251800'
|
19
|
+
}
|
20
|
+
)
|
21
|
+
|
22
|
+
assert_equal(:not_applicable, payment.status)
|
23
|
+
|
24
|
+
payment.build_credit_card(
|
25
|
+
number: '4111111111111111',
|
26
|
+
month: 1,
|
27
|
+
year: Time.current.year + 1,
|
28
|
+
cvv: 999,
|
29
|
+
amount: 10.to_m
|
30
|
+
)
|
31
|
+
|
32
|
+
tender = payment.credit_card
|
33
|
+
payment.save!
|
34
|
+
|
35
|
+
assert_equal(:pending, payment.status)
|
36
|
+
|
37
|
+
tender.build_transaction(amount: 10.to_m, success: true, action: 'authorize').save!
|
38
|
+
|
39
|
+
assert_equal(:authorized, payment.reload.status)
|
40
|
+
|
41
|
+
tender.build_transaction(amount: 5.to_m, success: true, action: 'capture').save!
|
42
|
+
assert_equal(:partially_captured, payment.reload.status)
|
43
|
+
|
44
|
+
tender.build_transaction(amount: 5.to_m, success: true, action: 'purchase').save!
|
45
|
+
assert_equal(:captured, payment.status)
|
46
|
+
|
47
|
+
tender.build_transaction(amount: 5.to_m, success: true, action: 'refund').save!
|
48
|
+
assert_equal(:partially_refunded, payment.reload.status)
|
49
|
+
|
50
|
+
tender.build_transaction(amount: 5.to_m, success: true, action: 'refund').save!
|
51
|
+
assert_equal(:refunded, payment.reload.status)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
class ShippingOptionTest < TestCase
|
5
|
+
def order
|
6
|
+
@order ||= Order.create!(email: 'user@workarea.com')
|
7
|
+
end
|
8
|
+
|
9
|
+
def shipping_service
|
10
|
+
@shipping_service ||= create_shipping_service(
|
11
|
+
id: '123',
|
12
|
+
name: 'Standard Shipping',
|
13
|
+
tax_code: '001',
|
14
|
+
rates: [{ price: 7.to_m }],
|
15
|
+
kount_code: 'ST'
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
def shipment
|
20
|
+
@shipment ||= Workarea::Shipping.create!(order_id: order.id).tap { |shipment|
|
21
|
+
shipment.shipping_service = shipping_service
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_valid_returns_true_if_a_shipments_shipping_service_contains_a_kount_code
|
26
|
+
assert_equal(shipment.shipping_service.kount_code, 'ST')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Workarea
|
4
|
+
module Kount
|
5
|
+
class EventBatchTest < Workarea::TestCase
|
6
|
+
setup :setup_sidekiq
|
7
|
+
teardown :teardown_sidekiq
|
8
|
+
|
9
|
+
def test_valid_with_valid_xml
|
10
|
+
event_batch = EventBatch.new(valid_xml)
|
11
|
+
assert(event_batch.valid?)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_valid_with_invalid_xml
|
15
|
+
event_batch = EventBatch.new(invalid_xml)
|
16
|
+
refute(event_batch.valid?)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_process_with_valid_xml
|
20
|
+
event_batch = EventBatch.new(valid_xml)
|
21
|
+
assert_difference 'Workarea::Kount::ProcessReviewOrder.jobs.count', 2 do
|
22
|
+
event_batch.process!
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_process_with_invalid_xml
|
27
|
+
event_batch = EventBatch.new(invalid_xml)
|
28
|
+
assert_difference 'Workarea::Kount::ProcessReviewOrder.jobs.count', 0 do
|
29
|
+
event_batch.process!
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def valid_xml
|
36
|
+
<<~XML
|
37
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
38
|
+
<events merchant="200755" total="2">
|
39
|
+
<event>
|
40
|
+
<name>WORKFLOW_STATUS_EDIT</name>
|
41
|
+
<key order_number="D58470FCF0" site="DEFAULT">7JG1075ML345</key>
|
42
|
+
<old_value>R</old_value>
|
43
|
+
<new_value>A</new_value>
|
44
|
+
<agent>SYSTEM@KOUNT.NET</agent>
|
45
|
+
<occurred>2018-05-18 06:47:47.413756</occurred>
|
46
|
+
</event>
|
47
|
+
<event>
|
48
|
+
<name>WORKFLOW_STATUS_EDIT</name>
|
49
|
+
<key order_number="D58470FCF0" site="DEFAULT">7JG601D6MG7S</key>
|
50
|
+
<old_value>R</old_value>
|
51
|
+
<new_value>D</new_value>
|
52
|
+
<agent>SYSTEM@KOUNT.NET</agent>
|
53
|
+
<occurred>2018-05-18 06:47:59.252024</occurred>
|
54
|
+
</event>
|
55
|
+
</events>
|
56
|
+
XML
|
57
|
+
end
|
58
|
+
|
59
|
+
def invalid_xml
|
60
|
+
<<~XML
|
61
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?
|
62
|
+
<events merchant="200755" total="2">
|
63
|
+
<event>
|
64
|
+
<name>WORKFLOW_STATUS_EDIT</name>
|
65
|
+
<key order_number="D58470FCF0" site="DEFAULT">7JG1075ML345</key>
|
66
|
+
<old_value>R</old_value>
|
67
|
+
<new_value>A</new_value>
|
68
|
+
<agent>SYSTEM@KOUNT.NET</agent>
|
69
|
+
<occurred>2018-05-18 06:47:47.413756</occurred>
|
70
|
+
</event>
|
71
|
+
<event>
|
72
|
+
<name>WORKFLOW_STATUS_EDIT</name>
|
73
|
+
<key order_number="D58470FCF0" site="DEFAULT">7JG601D6MG7S</key>
|
74
|
+
<old_value>R</old_value>
|
75
|
+
<new_value>D</new_value>
|
76
|
+
<agent>SYSTEM@KOUNT.NET</agent>
|
77
|
+
<occurred>2018-05-18 06:47:59.252024</occurred>
|
78
|
+
</event>
|
79
|
+
</events>
|
80
|
+
XML
|
81
|
+
end
|
82
|
+
|
83
|
+
def setup_sidekiq
|
84
|
+
Sidekiq::Testing.fake!
|
85
|
+
|
86
|
+
Workarea::Kount::ProcessReviewOrder.clear
|
87
|
+
end
|
88
|
+
|
89
|
+
def teardown_sidekiq
|
90
|
+
Workarea::Kount::ProcessReviewOrder.clear
|
91
|
+
Sidekiq::Testing.inline!
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|