workarea-kount 3.3.0

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 (163) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +20 -0
  3. data/.eslintrc +24 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  5. data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
  6. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  7. data/.github/workflows/ci.yml +58 -0
  8. data/.gitignore +14 -0
  9. data/.rubocop.yml +2 -0
  10. data/CHANGELOG.md +212 -0
  11. data/CODE_OF_CONDUCT.md +3 -0
  12. data/CONTRIBUTING.md +3 -0
  13. data/Gemfile +17 -0
  14. data/LICENSE.md +3 -0
  15. data/README.md +98 -0
  16. data/Rakefile +53 -0
  17. data/app/controllers/workarea/admin/orders_controller.decorator +5 -0
  18. data/app/controllers/workarea/storefront/checkout/place_order_controller.decorator +11 -0
  19. data/app/controllers/workarea/storefront/kount_controller.rb +19 -0
  20. data/app/controllers/workarea/storefront/kount_orders_controller.rb +40 -0
  21. data/app/lib/active_shipping/rate_estimate.decorator +10 -0
  22. data/app/mailers/workarea/storefront/order_mailer.decorator +14 -0
  23. data/app/models/workarea/checkout.decorator +37 -0
  24. data/app/models/workarea/checkout/fraud/kount_analyzer.rb +71 -0
  25. data/app/models/workarea/kount/ens_event.rb +13 -0
  26. data/app/models/workarea/kount/order.rb +14 -0
  27. data/app/models/workarea/order.decorator +62 -0
  28. data/app/models/workarea/order/fraud_decision.decorator +9 -0
  29. data/app/models/workarea/order/item.decorator +8 -0
  30. data/app/models/workarea/order/status/review.rb +13 -0
  31. data/app/models/workarea/payment/credit_card.decorator +13 -0
  32. data/app/models/workarea/payment/payment.decorator +11 -0
  33. data/app/models/workarea/payment/status/kount_declined.rb +13 -0
  34. data/app/models/workarea/payment/status/kount_review.rb +13 -0
  35. data/app/models/workarea/payment/tender/credit_card.decorator +10 -0
  36. data/app/models/workarea/search/admin.decorator +12 -0
  37. data/app/models/workarea/search/admin/order.decorator +7 -0
  38. data/app/models/workarea/shipping/rate_lookup.decorator +26 -0
  39. data/app/models/workarea/shipping/service.decorator +9 -0
  40. data/app/models/workarea/shipping/service_selection.decorator +7 -0
  41. data/app/models/workarea/shipping_option.decorator +27 -0
  42. data/app/services/workarea/kount/cancel_order_under_review.rb +28 -0
  43. data/app/services/workarea/kount/event.rb +43 -0
  44. data/app/services/workarea/kount/event/dmc_event.rb +9 -0
  45. data/app/services/workarea/kount/event/risk_change_event.rb +21 -0
  46. data/app/services/workarea/kount/event/special_alert_event.rb +21 -0
  47. data/app/services/workarea/kount/event/workflow_event.rb +25 -0
  48. data/app/services/workarea/kount/event_batch.rb +37 -0
  49. data/app/services/workarea/kount/order_fraud_update_service.rb +42 -0
  50. data/app/services/workarea/kount/ris_inquiry.rb +120 -0
  51. data/app/services/workarea/kount/ris_inquiry/product.rb +53 -0
  52. data/app/services/workarea/kount/ris_request.rb +84 -0
  53. data/app/services/workarea/kount/ris_update.rb +39 -0
  54. data/app/view_models/workarea/admin/order_view_model.decorator +35 -0
  55. data/app/view_models/workarea/storefront/order_view_model.decorator +11 -0
  56. data/app/views/workarea/admin/orders/_kount.html.haml +28 -0
  57. data/app/views/workarea/admin/orders/kount.html.haml +46 -0
  58. data/app/views/workarea/storefront/checkouts/_kount_data_collector.html.haml +4 -0
  59. data/app/views/workarea/storefront/order_mailer/hold_denial.html.haml +14 -0
  60. data/app/workers/workarea/kount/process_review_order.rb +75 -0
  61. data/app/workers/workarea/kount/update_ris_inquiry.rb +31 -0
  62. data/bin/rails +18 -0
  63. data/config/initializers/appends.rb +11 -0
  64. data/config/initializers/workarea.rb +26 -0
  65. data/config/locales/en.yml +26 -0
  66. data/config/routes.rb +14 -0
  67. data/doc/Kount Technical Specification Guide 5.5.5.pdf +0 -0
  68. data/lib/workarea/kount.rb +87 -0
  69. data/lib/workarea/kount/address.rb +39 -0
  70. data/lib/workarea/kount/bogus_gateway.rb +415 -0
  71. data/lib/workarea/kount/engine.rb +8 -0
  72. data/lib/workarea/kount/errors.rb +2 -0
  73. data/lib/workarea/kount/gateway.rb +50 -0
  74. data/lib/workarea/kount/mappings.rb +195 -0
  75. data/lib/workarea/kount/payment_types.rb +50 -0
  76. data/lib/workarea/kount/response.rb +141 -0
  77. data/lib/workarea/kount/security_mash.rb +79 -0
  78. data/lib/workarea/kount/user_defined_fields.rb +16 -0
  79. data/lib/workarea/kount/version.rb +5 -0
  80. data/lib/workarea/mailer_previews/storefront/order_mailer_preview.rb +10 -0
  81. data/test/dummy/Rakefile +6 -0
  82. data/test/dummy/app/assets/config/manifest.js +4 -0
  83. data/test/dummy/app/assets/images/.keep +0 -0
  84. data/test/dummy/app/assets/javascripts/application.js +13 -0
  85. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  86. data/test/dummy/app/controllers/application_controller.rb +3 -0
  87. data/test/dummy/app/controllers/concerns/.keep +0 -0
  88. data/test/dummy/app/helpers/application_helper.rb +2 -0
  89. data/test/dummy/app/jobs/application_job.rb +2 -0
  90. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  91. data/test/dummy/app/models/concerns/.keep +0 -0
  92. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  93. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  94. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  95. data/test/dummy/bin/bundle +3 -0
  96. data/test/dummy/bin/rails +4 -0
  97. data/test/dummy/bin/rake +4 -0
  98. data/test/dummy/bin/setup +34 -0
  99. data/test/dummy/bin/update +29 -0
  100. data/test/dummy/config.ru +5 -0
  101. data/test/dummy/config/application.rb +23 -0
  102. data/test/dummy/config/boot.rb +5 -0
  103. data/test/dummy/config/cable.yml +9 -0
  104. data/test/dummy/config/environment.rb +5 -0
  105. data/test/dummy/config/environments/development.rb +56 -0
  106. data/test/dummy/config/environments/production.rb +86 -0
  107. data/test/dummy/config/environments/test.rb +44 -0
  108. data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
  109. data/test/dummy/config/initializers/assets.rb +11 -0
  110. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  111. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  112. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  113. data/test/dummy/config/initializers/inflections.rb +16 -0
  114. data/test/dummy/config/initializers/mime_types.rb +4 -0
  115. data/test/dummy/config/initializers/new_framework_defaults.rb +21 -0
  116. data/test/dummy/config/initializers/session_store.rb +3 -0
  117. data/test/dummy/config/initializers/workarea.rb +5 -0
  118. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  119. data/test/dummy/config/locales/en.yml +23 -0
  120. data/test/dummy/config/puma.rb +47 -0
  121. data/test/dummy/config/routes.rb +6 -0
  122. data/test/dummy/config/secrets.yml +22 -0
  123. data/test/dummy/config/spring.rb +6 -0
  124. data/test/dummy/db/seeds.rb +2 -0
  125. data/test/dummy/lib/assets/.keep +0 -0
  126. data/test/dummy/log/.keep +0 -0
  127. data/test/dummy/public/404.html +67 -0
  128. data/test/dummy/public/422.html +67 -0
  129. data/test/dummy/public/500.html +66 -0
  130. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  131. data/test/dummy/public/apple-touch-icon.png +0 -0
  132. data/test/dummy/public/favicon.ico +0 -0
  133. data/test/factories/kount.rb +164 -0
  134. data/test/integration/workarea/api/admin/payment_transactions_integration_test.decorator +29 -0
  135. data/test/integration/workarea/kount_moneris_integration_test.rb +37 -0
  136. data/test/integration/workarea/storefront/kount_integration_test.rb +37 -0
  137. data/test/integration/workarea/storefront/kount_orders_integration_test.rb +89 -0
  138. data/test/lib/workarea/kount/response_test.rb +95 -0
  139. data/test/lib/workarea/kount/security_mash_test.rb +62 -0
  140. data/test/models/workarea/checkout/fraud/kount_analyzer_test.rb +44 -0
  141. data/test/models/workarea/checkout_test.decorator +22 -0
  142. data/test/models/workarea/order/queries_test.decorator +28 -0
  143. data/test/models/workarea/order_test.decorator +25 -0
  144. data/test/models/workarea/payment/payment_test.rb +106 -0
  145. data/test/models/workarea/payment/saved_credit_card_test.rb +24 -0
  146. data/test/models/workarea/payment_test.decorator +54 -0
  147. data/test/models/workarea/shipping_option_test.rb +29 -0
  148. data/test/services/workarea/kount/event_batch_test.rb +95 -0
  149. data/test/services/workarea/kount/event_test.rb +51 -0
  150. data/test/services/workarea/kount/order_fraud_update_service_test.rb +48 -0
  151. data/test/support/workarea/kount_api_config.rb +27 -0
  152. data/test/system/workarea/kount_system_test.rb +72 -0
  153. data/test/system/workarea/storefront/kount_guest_checkout_system_test.rb +32 -0
  154. data/test/system/workarea/storefront/kount_logged_in_checkout_system_test.rb +102 -0
  155. data/test/test_helper.rb +16 -0
  156. data/test/vcr_cassettes/kount/basic_fraud_test.yml +43 -0
  157. data/test/vcr_cassettes/kount/integration/moneris_new_credit_card.yml +84 -0
  158. data/test/vcr_cassettes/kount/integration/moneris_saved_credit_card.yml +84 -0
  159. data/test/vcr_cassettes/kount/order_fraud_update.yml +82 -0
  160. data/test/workers/workarea/kount/clean_orders_test.rb +40 -0
  161. data/test/workers/workarea/kount/process_review_order_test.rb +100 -0
  162. data/workarea-kount.gemspec +17 -0
  163. metadata +238 -0
@@ -0,0 +1,84 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://esqa.moneris.com/gateway2/servlet/MpgRequest
6
+ body:
7
+ encoding: UTF-8
8
+ string: "<request><store_id>monca02501</store_id><api_token>YSI4CKbdvgSbr6is4JMZ</api_token><res_add_cc><pan>4111111111111111</pan><expdate>2101</expdate><crypt_type>7</crypt_type></res_add_cc></request>"
9
+ headers:
10
+ Content-Type:
11
+ - application/x-www-form-urlencoded
12
+ Connection:
13
+ - close
14
+ Accept-Encoding:
15
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
16
+ Accept:
17
+ - "*/*"
18
+ User-Agent:
19
+ - Ruby
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ Date:
26
+ - Mon, 21 Sep 2020 18:36:55 GMT
27
+ X-Ua-Compatible:
28
+ - IE=Edge
29
+ Connection:
30
+ - close
31
+ Content-Type:
32
+ - text/html
33
+ Set-Cookie:
34
+ - TS019df888=015d06d254a632752c749840557162f63baf7d0861476031f3a8e57658bdc65a7e4ed402703d8960f9e921a20a172ce1b78bc9e8f0;
35
+ Path=/; Domain=.esqa.moneris.com; Secure
36
+ Transfer-Encoding:
37
+ - chunked
38
+ body:
39
+ encoding: UTF-8
40
+ string: <?xml version="1.0"?><response><receipt><DataKey>890xonL55b8sZrm5TqqoT1Tr1</DataKey><ReceiptId>null</ReceiptId><ReferenceNum>null</ReferenceNum><ResponseCode>001</ResponseCode><ISO>null</ISO><AuthCode>null</AuthCode><Message>Successfully
41
+ registered CC details.</Message><TransTime>14:36:55</TransTime><TransDate>2020-09-21</TransDate><TransType>null</TransType><Complete>true</Complete><TransAmount>null</TransAmount><CardType>null</CardType><TransID>null</TransID><TimedOut>false</TimedOut><CorporateCard>null</CorporateCard><RecurSuccess>null</RecurSuccess><AvsResultCode>null</AvsResultCode><CvdResultCode>null</CvdResultCode><ResSuccess>true</ResSuccess><PaymentType>cc</PaymentType><IsVisaDebit>null</IsVisaDebit><ResolveData><cust_id></cust_id><phone></phone><email></email><note></note><avs_street_number></avs_street_number><avs_street_name></avs_street_name><avs_zipcode></avs_zipcode><masked_pan>4111***1111</masked_pan><expdate>2101</expdate><crypt_type>7</crypt_type></ResolveData></receipt></response>
42
+ http_version:
43
+ recorded_at: Mon, 21 Sep 2020 18:36:55 GMT
44
+ - request:
45
+ method: post
46
+ uri: https://esqa.moneris.com/gateway2/servlet/MpgRequest
47
+ body:
48
+ encoding: UTF-8
49
+ string: "<request><store_id>monca02501</store_id><api_token>YSI4CKbdvgSbr6is4JMZ</api_token><res_preauth_cc><data_key>890xonL55b8sZrm5TqqoT1Tr1</data_key><order_id>CF60471F69_2020_09_21_14_36_57</order_id><amount>11.00</amount><crypt_type>7</crypt_type></res_preauth_cc></request>"
50
+ headers:
51
+ Content-Type:
52
+ - application/x-www-form-urlencoded
53
+ Connection:
54
+ - close
55
+ Accept-Encoding:
56
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
57
+ Accept:
58
+ - "*/*"
59
+ User-Agent:
60
+ - Ruby
61
+ response:
62
+ status:
63
+ code: 200
64
+ message: OK
65
+ headers:
66
+ Date:
67
+ - Mon, 21 Sep 2020 18:36:57 GMT
68
+ X-Ua-Compatible:
69
+ - IE=Edge
70
+ Connection:
71
+ - close
72
+ Content-Type:
73
+ - text/html
74
+ Set-Cookie:
75
+ - TS019df888=015d06d254b203887d231a7ac51a1b2445052a677fda5bf375851a2912d0d63f45e46b044740d1e4edd8f7455955dad77b9ee01035;
76
+ Path=/; Domain=.esqa.moneris.com; Secure
77
+ Transfer-Encoding:
78
+ - chunked
79
+ body:
80
+ encoding: UTF-8
81
+ string: <?xml version="1.0"?><response><receipt><DataKey>890xonL55b8sZrm5TqqoT1Tr1</DataKey><ReceiptId>CF60471F69_2020_09_21_14_36_57</ReceiptId><ReferenceNum>660189810010090020</ReferenceNum><ResponseCode>027</ResponseCode><ISO>01</ISO><AuthCode>628516</AuthCode><Message>APPROVED * =</Message><TransTime>14:36:57</TransTime><TransDate>2020-09-21</TransDate><TransType>01</TransType><Complete>true</Complete><TransAmount>11.00</TransAmount><CardType>V</CardType><TransID>160-0_15</TransID><TimedOut>false</TimedOut><CorporateCard>false</CorporateCard><RecurSuccess>null</RecurSuccess><AvsResultCode>null</AvsResultCode><CvdResultCode>null</CvdResultCode><ResSuccess>true</ResSuccess><PaymentType>cc</PaymentType><IsVisaDebit>false</IsVisaDebit><ResolveData><cust_id></cust_id><phone></phone><email></email><note></note><expdate>2101</expdate><masked_pan>4111***1111</masked_pan><crypt_type>7</crypt_type><avs_street_number></avs_street_number><avs_street_name></avs_street_name><avs_zipcode></avs_zipcode></ResolveData></receipt></response>
82
+ http_version:
83
+ recorded_at: Mon, 21 Sep 2020 18:36:58 GMT
84
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,82 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://risk.test.kount.net/
6
+ body:
7
+ encoding: UTF-8
8
+ string: MACK=Y&AUTH=A&SESS=12345666&MODE=Q&SITE=DEFAULT&S2A1=22+S.+3rd+St.&S2A2=Second+Floor&S2CI=Philadelphia&S2ST=PA&S2PC=19106&S2CC=US&S2PN&B2A1=22+S.+3rd+St.&B2A2=Second+Floor&B2CI=Philadelphia&B2ST=PA&B2PC=19106&B2CC=US&B2PN&PTYP=CARD&PTOK=411111WMS5YA6FUZA1KC&PENC=KHASH&SHTP=ST&TOTL=1100&CURR=USD&EMAL=bcrouse-new%40workarea.com&NAME=Ben+Crouse&IPAD=170.115.187.68&ORDR=3E50D97E53&PROD_TYPE[]=Test+Product&PROD_DESC[]=Test+Product+-+&PROD_ITEM[]=SKU&PROD_PRICE[]=500&PROD_QUANT[]=2&VERS=0630&MERC=200755&FRMT=JSON
9
+ headers:
10
+ Accept:
11
+ - "*/*"
12
+ Accept-Encoding:
13
+ - gzip, deflate
14
+ User-Agent:
15
+ - rest-client/2.0.2 (darwin17.4.0 x86_64) ruby/2.4.4p296
16
+ X-Kount-Api-Key:
17
+ - eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIyMDA3NTUiLCJhdWQiOiJLb3VudC4xIiwiaWF0IjoxNTAwNDA3NTE1LCJzY3AiOnsia2EiOm51bGwsImtjIjpudWxsLCJhcGkiOnRydWUsInJpcyI6dHJ1ZX19.1YwTR1G8qBQ_TDK8MBYxDB2EhpUD0IlwWdvqHVOnm0o
18
+ Content-Length:
19
+ - '512'
20
+ Content-Type:
21
+ - application/x-www-form-urlencoded
22
+ Host:
23
+ - risk.test.kount.net
24
+ response:
25
+ status:
26
+ code: 200
27
+ message: OK
28
+ headers:
29
+ Date:
30
+ - Fri, 01 Jun 2018 12:44:26 GMT
31
+ Server:
32
+ - Apache
33
+ Content-Length:
34
+ - '941'
35
+ Content-Type:
36
+ - text/plain;charset=UTF-8
37
+ body:
38
+ encoding: UTF-8
39
+ string: '{"VERS":"0630","MODE":"Q","TRAN":"7J1X0SCK4V8D","MERC":"200755","SESS":"12345666","ORDR":"3E50D97E53","AUTO":"A","SCOR":"34","GEOX":"US","BRND":"VISA","REGN":"US_PA","NETW":"N","KAPT":"N","CARDS":"1","DEVICES":"1","EMAILS":"1","VELO":"0","VMAX":"0","SITE":"DEFAULT","DEVICE_LAYERS":"....","FINGERPRINT":null,"TIMEZONE":null,"LOCALTIME":"
40
+ ","REGION":null,"COUNTRY":null,"PROXY":null,"JAVASCRIPT":null,"FLASH":null,"COOKIES":null,"HTTP_COUNTRY":null,"LANGUAGE":null,"MOBILE_DEVICE":null,"MOBILE_TYPE":null,"MOBILE_FORWARDER":null,"VOICE_DEVICE":null,"PC_REMOTE":null,"RULES_TRIGGERED":0,"COUNTERS_TRIGGERED":0,"REASON_CODE":null,"MASTERCARD":"","DDFS":null,"DSR":null,"UAS":null,"BROWSER":null,"OS":null,"PIP_IPAD":null,"PIP_LAT":null,"PIP_LON":null,"PIP_COUNTRY":null,"PIP_REGION":null,"PIP_CITY":null,"PIP_ORG":null,"IP_IPAD":null,"IP_LAT":null,"IP_LON":null,"IP_COUNTRY":null,"IP_REGION":null,"IP_CITY":null,"IP_ORG":null,"WARNING_COUNT":0}'
41
+ http_version:
42
+ recorded_at: Fri, 01 Jun 2018 12:44:26 GMT
43
+ - request:
44
+ method: post
45
+ uri: https://risk.test.kount.net/
46
+ body:
47
+ encoding: UTF-8
48
+ string: MACK=Y&AUTH=A&SESS=12345666&MODE=U&TRAN=7J1X0SCK4V8D&VERS=0630&MERC=200755&FRMT=JSON
49
+ headers:
50
+ Accept:
51
+ - "*/*"
52
+ Accept-Encoding:
53
+ - gzip, deflate
54
+ User-Agent:
55
+ - rest-client/2.0.2 (darwin17.4.0 x86_64) ruby/2.4.4p296
56
+ X-Kount-Api-Key:
57
+ - eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIyMDA3NTUiLCJhdWQiOiJLb3VudC4xIiwiaWF0IjoxNTAwNDA3NTE1LCJzY3AiOnsia2EiOm51bGwsImtjIjpudWxsLCJhcGkiOnRydWUsInJpcyI6dHJ1ZX19.1YwTR1G8qBQ_TDK8MBYxDB2EhpUD0IlwWdvqHVOnm0o
58
+ Content-Length:
59
+ - '84'
60
+ Content-Type:
61
+ - application/x-www-form-urlencoded
62
+ Host:
63
+ - risk.test.kount.net
64
+ response:
65
+ status:
66
+ code: 200
67
+ message: OK
68
+ headers:
69
+ Date:
70
+ - Fri, 01 Jun 2018 12:44:26 GMT
71
+ Server:
72
+ - Apache
73
+ Content-Length:
74
+ - '178'
75
+ Content-Type:
76
+ - text/plain;charset=UTF-8
77
+ body:
78
+ encoding: UTF-8
79
+ string: '{"VERS":"0630","MODE":"U","TRAN":"7J1X0SCK4V8D","MERC":"200755","SESS":"12345666","RULES_TRIGGERED":0,"COUNTERS_TRIGGERED":0,"REASON_CODE":null,"MASTERCARD":"","WARNING_COUNT":0}'
80
+ http_version:
81
+ recorded_at: Fri, 01 Jun 2018 12:44:27 GMT
82
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,40 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Kount
5
+ class CleanOrdersTest < TestCase
6
+ include SearchIndexing
7
+
8
+ def test_perform_with_review_orders
9
+ checkout = create_purchasable_checkout(order: { kount_decision: :review, checkout_started_at: 1.year.ago })
10
+ order = checkout.order
11
+ order.update_attributes(updated_at: 1.year.ago)
12
+
13
+ _kount_order = Kount::Order.create(id: order.id)
14
+ checkout.handle_kount_review
15
+
16
+ CleanOrders.new.perform
17
+
18
+ orders = Workarea::Order.unscoped.all.to_a
19
+ assert_includes orders, order
20
+ end
21
+
22
+ def test_perform_with_kount_declined_orders
23
+ checkout = create_purchasable_checkout(order: { kount_decision: :review, checkout_started_at: 1.year.ago })
24
+ order = checkout.order
25
+
26
+ _kount_order = Kount::Order.create(id: order.id)
27
+ checkout.handle_kount_review
28
+
29
+ event_string = "<event><name>WORKFLOW_STATUS_EDIT</name><key order_number=\"D58470FCF0\" site=\"DEFAULT\">7JG1075ML345</key><old_value>R</old_value><new_value>A</new_value><agent>SYSTEM@KOUNT.NET</agent><occurred>2018-05-18 06:47:47.413756</occurred></event>"
30
+ ProcessReviewOrder.new.perform(order.id, false, event_string)
31
+ order.reload.update_attributes(updated_at: 1.year.ago)
32
+
33
+ CleanOrders.new.perform
34
+
35
+ orders = Workarea::Order.unscoped.all.to_a
36
+ assert_includes orders, order
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,100 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Kount
5
+ class ProcessReviewOrderTest < Workarea::TestCase
6
+ include TestCase::SearchIndexing
7
+ include TestCase::Mail
8
+
9
+ def test_perform_when_the_order_is_declined
10
+ checkout = create_purchasable_checkout(order: { kount_decision: :review })
11
+ order = checkout.order
12
+ _kount_order = Kount::Order.create(id: order.id)
13
+ checkout.handle_kount_review
14
+
15
+ ProcessReviewOrder.new.perform(order.id, false, event_string)
16
+
17
+ order.reload
18
+ refute(order.placed_at.present?)
19
+ assert(order.canceled_at.present?)
20
+
21
+ cancelation_email = ActionMailer::Base.deliveries.last
22
+ assert_equal(
23
+ t('workarea.storefront.email.hold_denial.subject', order_id: order.id),
24
+ cancelation_email.subject
25
+ )
26
+ assert_match(
27
+ t('workarea.storefront.email.hold_denial.info_html'),
28
+ cancelation_email.html_part.to_s
29
+ )
30
+ end
31
+
32
+ def test_perform_when_the_order_is_approved_but_payment_is_declined
33
+ checkout = create_purchasable_checkout(order: { kount_decision: :review })
34
+ order = checkout.order
35
+
36
+ _kount_order = Kount::Order.create(id: order.id)
37
+ checkout.handle_kount_review
38
+
39
+ Workarea.config.gateways.credit_card.expects(:authorize).returns(
40
+ ActiveMerchant::Billing::Response.new(
41
+ false,
42
+ ActiveMerchant::Billing::BogusGateway::FAILURE_MESSAGE,
43
+ {
44
+ paid_amount: 1.to_m.cents,
45
+ error: ActiveMerchant::Billing::BogusGateway::FAILURE_MESSAGE
46
+ },
47
+ { test: true,
48
+ error_code: ActiveMerchant::Billing::BogusGateway::STANDARD_ERROR_CODE[:processing_error] }
49
+ )
50
+ )
51
+
52
+ ProcessReviewOrder.new.perform(order.id, true, event_string)
53
+
54
+ order.reload
55
+ refute(order.placed_at.present?)
56
+ assert(order.canceled_at.present?)
57
+ assert_equal(1, order.comments.length)
58
+
59
+ cancelation_email = ActionMailer::Base.deliveries.last
60
+ assert_equal(
61
+ t('workarea.storefront.email.hold_denial.subject', order_id: order.id),
62
+ cancelation_email.subject
63
+ )
64
+ assert_match(
65
+ t('workarea.storefront.email.hold_denial.info_html'),
66
+ cancelation_email.html_part.to_s
67
+ )
68
+ end
69
+
70
+ def test_perform_when_the_order_is_approved_and_payment_is_successful
71
+ checkout = create_purchasable_checkout(order: { kount_decision: :review })
72
+ order = checkout.order
73
+ _kount_order = Kount::Order.create(id: order.id)
74
+ checkout.handle_kount_review
75
+
76
+ ProcessReviewOrder.new.perform(order.id, true, event_string)
77
+
78
+ order.reload
79
+ refute(order.canceled_at.present?)
80
+ assert(order.placed_at.present?)
81
+
82
+ confirmation_email = ActionMailer::Base.deliveries.last
83
+ assert_equal(
84
+ t('workarea.storefront.email.order_confirmation.subject', order_id: order.id),
85
+ confirmation_email.subject
86
+ )
87
+ assert_match(
88
+ t('workarea.storefront.email.order_confirmation.heading', order_id: order.id),
89
+ confirmation_email.html_part.to_s
90
+ )
91
+ end
92
+
93
+ private
94
+
95
+ def event_string
96
+ "<event><name>WORKFLOW_STATUS_EDIT</name><key order_number=\"D58470FCF0\" site=\"DEFAULT\">7JG1075ML345</key><old_value>R</old_value><new_value>A</new_value><agent>SYSTEM@KOUNT.NET</agent><occurred>2018-05-18 06:47:47.413756</occurred></event>"
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,17 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+
3
+ require 'workarea/kount/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'workarea-kount'
7
+ s.version = Workarea::Kount::VERSION
8
+ s.authors = ['Jake Beresford']
9
+ s.email = ['jberesford@workarea.com']
10
+ s.homepage = 'https://github.com/workarea-commerce/workarea-kount'
11
+ s.summary = 'Kount for the Workarea ecommerce platform.'
12
+ s.description = 'Kount’s award-winning anti-fraud technology. Boost Sales, Beat Fraud with Kount.'
13
+ s.files = `git ls-files`.split("\n")
14
+
15
+ s.add_dependency 'workarea', '~> 3.x', ">= 3.5"
16
+ s.add_dependency 'rest-client', '~> 2.0'
17
+ end
metadata ADDED
@@ -0,0 +1,238 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: workarea-kount
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Jake Beresford
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-09-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: workarea
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 3.x
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: '3.5'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: 3.x
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '3.5'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rest-client
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.0'
47
+ description: Kount’s award-winning anti-fraud technology. Boost Sales, Beat Fraud
48
+ with Kount.
49
+ email:
50
+ - jberesford@workarea.com
51
+ executables: []
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - ".editorconfig"
56
+ - ".eslintrc"
57
+ - ".github/ISSUE_TEMPLATE/bug_report.md"
58
+ - ".github/ISSUE_TEMPLATE/documentation-request.md"
59
+ - ".github/ISSUE_TEMPLATE/feature_request.md"
60
+ - ".github/workflows/ci.yml"
61
+ - ".gitignore"
62
+ - ".rubocop.yml"
63
+ - CHANGELOG.md
64
+ - CODE_OF_CONDUCT.md
65
+ - CONTRIBUTING.md
66
+ - Gemfile
67
+ - LICENSE.md
68
+ - README.md
69
+ - Rakefile
70
+ - app/controllers/workarea/admin/orders_controller.decorator
71
+ - app/controllers/workarea/storefront/checkout/place_order_controller.decorator
72
+ - app/controllers/workarea/storefront/kount_controller.rb
73
+ - app/controllers/workarea/storefront/kount_orders_controller.rb
74
+ - app/lib/active_shipping/rate_estimate.decorator
75
+ - app/mailers/workarea/storefront/order_mailer.decorator
76
+ - app/models/workarea/checkout.decorator
77
+ - app/models/workarea/checkout/fraud/kount_analyzer.rb
78
+ - app/models/workarea/kount/ens_event.rb
79
+ - app/models/workarea/kount/order.rb
80
+ - app/models/workarea/order.decorator
81
+ - app/models/workarea/order/fraud_decision.decorator
82
+ - app/models/workarea/order/item.decorator
83
+ - app/models/workarea/order/status/review.rb
84
+ - app/models/workarea/payment/credit_card.decorator
85
+ - app/models/workarea/payment/payment.decorator
86
+ - app/models/workarea/payment/status/kount_declined.rb
87
+ - app/models/workarea/payment/status/kount_review.rb
88
+ - app/models/workarea/payment/tender/credit_card.decorator
89
+ - app/models/workarea/search/admin.decorator
90
+ - app/models/workarea/search/admin/order.decorator
91
+ - app/models/workarea/shipping/rate_lookup.decorator
92
+ - app/models/workarea/shipping/service.decorator
93
+ - app/models/workarea/shipping/service_selection.decorator
94
+ - app/models/workarea/shipping_option.decorator
95
+ - app/services/workarea/kount/cancel_order_under_review.rb
96
+ - app/services/workarea/kount/event.rb
97
+ - app/services/workarea/kount/event/dmc_event.rb
98
+ - app/services/workarea/kount/event/risk_change_event.rb
99
+ - app/services/workarea/kount/event/special_alert_event.rb
100
+ - app/services/workarea/kount/event/workflow_event.rb
101
+ - app/services/workarea/kount/event_batch.rb
102
+ - app/services/workarea/kount/order_fraud_update_service.rb
103
+ - app/services/workarea/kount/ris_inquiry.rb
104
+ - app/services/workarea/kount/ris_inquiry/product.rb
105
+ - app/services/workarea/kount/ris_request.rb
106
+ - app/services/workarea/kount/ris_update.rb
107
+ - app/view_models/workarea/admin/order_view_model.decorator
108
+ - app/view_models/workarea/storefront/order_view_model.decorator
109
+ - app/views/workarea/admin/orders/_kount.html.haml
110
+ - app/views/workarea/admin/orders/kount.html.haml
111
+ - app/views/workarea/storefront/checkouts/_kount_data_collector.html.haml
112
+ - app/views/workarea/storefront/order_mailer/hold_denial.html.haml
113
+ - app/workers/workarea/kount/process_review_order.rb
114
+ - app/workers/workarea/kount/update_ris_inquiry.rb
115
+ - bin/rails
116
+ - config/initializers/appends.rb
117
+ - config/initializers/workarea.rb
118
+ - config/locales/en.yml
119
+ - config/routes.rb
120
+ - doc/Kount Technical Specification Guide 5.5.5.pdf
121
+ - lib/workarea/kount.rb
122
+ - lib/workarea/kount/address.rb
123
+ - lib/workarea/kount/bogus_gateway.rb
124
+ - lib/workarea/kount/engine.rb
125
+ - lib/workarea/kount/errors.rb
126
+ - lib/workarea/kount/gateway.rb
127
+ - lib/workarea/kount/mappings.rb
128
+ - lib/workarea/kount/payment_types.rb
129
+ - lib/workarea/kount/response.rb
130
+ - lib/workarea/kount/security_mash.rb
131
+ - lib/workarea/kount/user_defined_fields.rb
132
+ - lib/workarea/kount/version.rb
133
+ - lib/workarea/mailer_previews/storefront/order_mailer_preview.rb
134
+ - test/dummy/Rakefile
135
+ - test/dummy/app/assets/config/manifest.js
136
+ - test/dummy/app/assets/images/.keep
137
+ - test/dummy/app/assets/javascripts/application.js
138
+ - test/dummy/app/assets/stylesheets/application.css
139
+ - test/dummy/app/controllers/application_controller.rb
140
+ - test/dummy/app/controllers/concerns/.keep
141
+ - test/dummy/app/helpers/application_helper.rb
142
+ - test/dummy/app/jobs/application_job.rb
143
+ - test/dummy/app/mailers/application_mailer.rb
144
+ - test/dummy/app/models/concerns/.keep
145
+ - test/dummy/app/views/layouts/application.html.erb
146
+ - test/dummy/app/views/layouts/mailer.html.erb
147
+ - test/dummy/app/views/layouts/mailer.text.erb
148
+ - test/dummy/bin/bundle
149
+ - test/dummy/bin/rails
150
+ - test/dummy/bin/rake
151
+ - test/dummy/bin/setup
152
+ - test/dummy/bin/update
153
+ - test/dummy/config.ru
154
+ - test/dummy/config/application.rb
155
+ - test/dummy/config/boot.rb
156
+ - test/dummy/config/cable.yml
157
+ - test/dummy/config/environment.rb
158
+ - test/dummy/config/environments/development.rb
159
+ - test/dummy/config/environments/production.rb
160
+ - test/dummy/config/environments/test.rb
161
+ - test/dummy/config/initializers/application_controller_renderer.rb
162
+ - test/dummy/config/initializers/assets.rb
163
+ - test/dummy/config/initializers/backtrace_silencers.rb
164
+ - test/dummy/config/initializers/cookies_serializer.rb
165
+ - test/dummy/config/initializers/filter_parameter_logging.rb
166
+ - test/dummy/config/initializers/inflections.rb
167
+ - test/dummy/config/initializers/mime_types.rb
168
+ - test/dummy/config/initializers/new_framework_defaults.rb
169
+ - test/dummy/config/initializers/session_store.rb
170
+ - test/dummy/config/initializers/workarea.rb
171
+ - test/dummy/config/initializers/wrap_parameters.rb
172
+ - test/dummy/config/locales/en.yml
173
+ - test/dummy/config/puma.rb
174
+ - test/dummy/config/routes.rb
175
+ - test/dummy/config/secrets.yml
176
+ - test/dummy/config/spring.rb
177
+ - test/dummy/db/seeds.rb
178
+ - test/dummy/lib/assets/.keep
179
+ - test/dummy/log/.keep
180
+ - test/dummy/public/404.html
181
+ - test/dummy/public/422.html
182
+ - test/dummy/public/500.html
183
+ - test/dummy/public/apple-touch-icon-precomposed.png
184
+ - test/dummy/public/apple-touch-icon.png
185
+ - test/dummy/public/favicon.ico
186
+ - test/factories/kount.rb
187
+ - test/integration/workarea/api/admin/payment_transactions_integration_test.decorator
188
+ - test/integration/workarea/kount_moneris_integration_test.rb
189
+ - test/integration/workarea/storefront/kount_integration_test.rb
190
+ - test/integration/workarea/storefront/kount_orders_integration_test.rb
191
+ - test/lib/workarea/kount/response_test.rb
192
+ - test/lib/workarea/kount/security_mash_test.rb
193
+ - test/models/workarea/checkout/fraud/kount_analyzer_test.rb
194
+ - test/models/workarea/checkout_test.decorator
195
+ - test/models/workarea/order/queries_test.decorator
196
+ - test/models/workarea/order_test.decorator
197
+ - test/models/workarea/payment/payment_test.rb
198
+ - test/models/workarea/payment/saved_credit_card_test.rb
199
+ - test/models/workarea/payment_test.decorator
200
+ - test/models/workarea/shipping_option_test.rb
201
+ - test/services/workarea/kount/event_batch_test.rb
202
+ - test/services/workarea/kount/event_test.rb
203
+ - test/services/workarea/kount/order_fraud_update_service_test.rb
204
+ - test/support/workarea/kount_api_config.rb
205
+ - test/system/workarea/kount_system_test.rb
206
+ - test/system/workarea/storefront/kount_guest_checkout_system_test.rb
207
+ - test/system/workarea/storefront/kount_logged_in_checkout_system_test.rb
208
+ - test/test_helper.rb
209
+ - test/vcr_cassettes/kount/basic_fraud_test.yml
210
+ - test/vcr_cassettes/kount/integration/moneris_new_credit_card.yml
211
+ - test/vcr_cassettes/kount/integration/moneris_saved_credit_card.yml
212
+ - test/vcr_cassettes/kount/order_fraud_update.yml
213
+ - test/workers/workarea/kount/clean_orders_test.rb
214
+ - test/workers/workarea/kount/process_review_order_test.rb
215
+ - workarea-kount.gemspec
216
+ homepage: https://github.com/workarea-commerce/workarea-kount
217
+ licenses: []
218
+ metadata: {}
219
+ post_install_message:
220
+ rdoc_options: []
221
+ require_paths:
222
+ - lib
223
+ required_ruby_version: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - ">="
226
+ - !ruby/object:Gem::Version
227
+ version: '0'
228
+ required_rubygems_version: !ruby/object:Gem::Requirement
229
+ requirements:
230
+ - - ">="
231
+ - !ruby/object:Gem::Version
232
+ version: '0'
233
+ requirements: []
234
+ rubygems_version: 3.0.3
235
+ signing_key:
236
+ specification_version: 4
237
+ summary: Kount for the Workarea ecommerce platform.
238
+ test_files: []