workarea-klarna 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +20 -0
  3. data/.eslintrc.json +36 -0
  4. data/.github/workflows/ci.yml +61 -0
  5. data/.gitignore +24 -0
  6. data/.rubocop.yml +2 -0
  7. data/.stylelintrc.json +8 -0
  8. data/.yardopts +1 -0
  9. data/CHANGELOG.md +81 -0
  10. data/Gemfile +17 -0
  11. data/LICENSE +52 -0
  12. data/README.md +79 -0
  13. data/Rakefile +56 -0
  14. data/app/assets/javascripts/workarea/storefront/klarna/modules/klarna_widget.js +99 -0
  15. data/app/controllers/workarea/storefront/checkout/addresses_controller.decorator +8 -0
  16. data/app/controllers/workarea/storefront/checkout/place_order_controller.decorator +9 -0
  17. data/app/controllers/workarea/storefront/checkouts_controller.decorator +13 -0
  18. data/app/models/workarea/checkout/steps/payment.decorator +22 -0
  19. data/app/models/workarea/order.decorator +7 -0
  20. data/app/models/workarea/payment.decorator +34 -0
  21. data/app/models/workarea/payment/authorize/klarna.rb +21 -0
  22. data/app/models/workarea/payment/capture/klarna.rb +21 -0
  23. data/app/models/workarea/payment/klarna_session.rb +18 -0
  24. data/app/models/workarea/payment/purchase/klarna.rb +21 -0
  25. data/app/models/workarea/payment/refund/klarna.rb +18 -0
  26. data/app/models/workarea/payment/tender/klarna.rb +53 -0
  27. data/app/services/workarea/setup_klarna_session.rb +24 -0
  28. data/app/view_models/workarea/storefront/checkout/payment_view_model.decorator +41 -0
  29. data/app/views/workarea/admin/orders/tenders/_klarna.html.haml +4 -0
  30. data/app/views/workarea/storefront/checkouts/_klarna_payments.html.haml +22 -0
  31. data/app/views/workarea/storefront/klarna/_sdk.html.haml +2 -0
  32. data/app/views/workarea/storefront/order_mailer/tenders/_klarna.html.haml +2 -0
  33. data/app/views/workarea/storefront/orders/tenders/_klarna.html.haml +6 -0
  34. data/bin/rails +20 -0
  35. data/config/initializers/appends.rb +14 -0
  36. data/config/initializers/configuration.rb +32 -0
  37. data/config/initializers/fields.rb +43 -0
  38. data/config/locales/en.yml +30 -0
  39. data/config/routes.rb +2 -0
  40. data/lib/workarea/klarna.rb +30 -0
  41. data/lib/workarea/klarna/bogus_gateway.rb +19 -0
  42. data/lib/workarea/klarna/engine.rb +10 -0
  43. data/lib/workarea/klarna/gateway.rb +92 -0
  44. data/lib/workarea/klarna/gateway/cancel_request.rb +16 -0
  45. data/lib/workarea/klarna/gateway/capture_request.rb +24 -0
  46. data/lib/workarea/klarna/gateway/create_session_request.rb +22 -0
  47. data/lib/workarea/klarna/gateway/order.rb +249 -0
  48. data/lib/workarea/klarna/gateway/place_order_request.rb +34 -0
  49. data/lib/workarea/klarna/gateway/refund_request.rb +24 -0
  50. data/lib/workarea/klarna/gateway/release_request.rb +16 -0
  51. data/lib/workarea/klarna/gateway/request.rb +91 -0
  52. data/lib/workarea/klarna/gateway/response.rb +38 -0
  53. data/lib/workarea/klarna/gateway/update_session_request.rb +30 -0
  54. data/lib/workarea/klarna/version.rb +5 -0
  55. data/package.json +9 -0
  56. data/test/dummy/Rakefile +6 -0
  57. data/test/dummy/app/assets/config/manifest.js +4 -0
  58. data/test/dummy/app/assets/javascripts/application.js +13 -0
  59. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  60. data/test/dummy/app/controllers/application_controller.rb +3 -0
  61. data/test/dummy/app/helpers/application_helper.rb +2 -0
  62. data/test/dummy/app/jobs/application_job.rb +2 -0
  63. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  64. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  65. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  66. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  67. data/test/dummy/bin/bundle +3 -0
  68. data/test/dummy/bin/rails +4 -0
  69. data/test/dummy/bin/rake +4 -0
  70. data/test/dummy/bin/setup +34 -0
  71. data/test/dummy/bin/update +29 -0
  72. data/test/dummy/config.ru +5 -0
  73. data/test/dummy/config/application.rb +24 -0
  74. data/test/dummy/config/boot.rb +5 -0
  75. data/test/dummy/config/cable.yml +9 -0
  76. data/test/dummy/config/environment.rb +5 -0
  77. data/test/dummy/config/environments/development.rb +54 -0
  78. data/test/dummy/config/environments/production.rb +86 -0
  79. data/test/dummy/config/environments/test.rb +43 -0
  80. data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
  81. data/test/dummy/config/initializers/assets.rb +11 -0
  82. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  83. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  84. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  85. data/test/dummy/config/initializers/inflections.rb +16 -0
  86. data/test/dummy/config/initializers/mime_types.rb +4 -0
  87. data/test/dummy/config/initializers/new_framework_defaults.rb +21 -0
  88. data/test/dummy/config/initializers/workarea.rb +5 -0
  89. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  90. data/test/dummy/config/locales/en.yml +23 -0
  91. data/test/dummy/config/puma.rb +47 -0
  92. data/test/dummy/config/routes.rb +5 -0
  93. data/test/dummy/config/secrets.yml +22 -0
  94. data/test/dummy/config/spring.rb +6 -0
  95. data/test/dummy/db/seeds.rb +2 -0
  96. data/test/dummy/log/.keep +0 -0
  97. data/test/factories/workarea/klarna.rb +146 -0
  98. data/test/integration/workarea/storefront/klarna_session_integration_test.rb +40 -0
  99. data/test/lib/workarea/klarna/gateway/capture_request_test.rb +26 -0
  100. data/test/lib/workarea/klarna/gateway/create_session_request_test.rb +26 -0
  101. data/test/lib/workarea/klarna/gateway/order_test.rb +135 -0
  102. data/test/lib/workarea/klarna/gateway/place_order_request_test.rb +34 -0
  103. data/test/lib/workarea/klarna/gateway/refund_request_test.rb +26 -0
  104. data/test/lib/workarea/klarna/gateway/request_test.rb +87 -0
  105. data/test/lib/workarea/klarna/gateway/response_test.rb +75 -0
  106. data/test/lib/workarea/klarna/gateway/update_session_request_test.rb +27 -0
  107. data/test/lib/workarea/klarna/gateway_test.rb +58 -0
  108. data/test/models/workarea/checkout/steps/klarna_payment_test.rb +79 -0
  109. data/test/models/workarea/klarna_payment_test.rb +45 -0
  110. data/test/models/workarea/payment/authorize/klarna_test.rb +34 -0
  111. data/test/models/workarea/payment/capture/klarna_test.rb +51 -0
  112. data/test/models/workarea/payment/tender/klarna_test.rb +81 -0
  113. data/test/services/workarea/setup_klarna_session_test.rb +42 -0
  114. data/test/teaspoon_env.rb +6 -0
  115. data/test/test_helper.rb +10 -0
  116. data/test/vcr_cassettes/klarna_authorize.yml +62 -0
  117. data/test/vcr_cassettes/klarna_capture.yml +60 -0
  118. data/test/vcr_cassettes/klarna_create_session.yml +61 -0
  119. data/test/vcr_cassettes/klarna_refund.yml +60 -0
  120. data/test/view_models/workarea/storefront/checkout/klarna_payment_view_model_test.rb +62 -0
  121. data/workarea-klarna.gemspec +20 -0
  122. metadata +177 -0
@@ -0,0 +1,81 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class Payment
5
+ class Tender
6
+ class KlarnaTest < TestCase
7
+ def test_authorization_token_expired?
8
+ tender = Klarna.new
9
+ refute(tender.authorization_token_expired?)
10
+
11
+ tender.authorization_token = '123'
12
+ refute(tender.authorization_token_expired?)
13
+
14
+ travel_to 61.minutes.from_now
15
+
16
+ assert(tender.authorization_token_expired?)
17
+
18
+ tender.authorization_token = '123'
19
+ assert(tender.authorization_token_expired?)
20
+
21
+ tender.authorization_token = '456'
22
+ refute(tender.authorization_token_expired?)
23
+ ensure
24
+ travel_back
25
+ end
26
+
27
+ def test_clear_authorization!
28
+ payment = Payment.new(klarna: { authorization_token: '123' })
29
+ tender = payment.klarna
30
+
31
+ assert(tender.authorization_token.present?)
32
+ assert(tender.authorization_token_expires_at.present?)
33
+
34
+ tender.clear_authorization!
35
+
36
+ refute(tender.authorization_token.present?)
37
+ refute(tender.authorization_token_expires_at.present?)
38
+ end
39
+
40
+ def test_placed_order_data
41
+ payment = Payment.new(
42
+ klarna: { authorization_token: '123', amount: 5.to_m }
43
+ )
44
+ tender = payment.klarna
45
+
46
+ refute(tender.placed_order_data.present?)
47
+ assert_nil(tender.order_id)
48
+ assert_nil(tender.redirect_url)
49
+
50
+ txn = payment.klarna.build_transaction(action: 'purchase')
51
+ txn.update!(
52
+ success: true,
53
+ response: ActiveMerchant::Billing::Response.new(
54
+ true,
55
+ 'foo bar',
56
+ { 'order_id' => '111', 'redirect_url' => '/test-purchase' }
57
+ )
58
+ )
59
+
60
+ assert(tender.placed_order_data.present?)
61
+ assert_equal('111', tender.order_id)
62
+ assert_equal('/test-purchase', tender.redirect_url)
63
+
64
+ txn = payment.klarna.build_transaction(action: 'authorize')
65
+ txn.update!(
66
+ success: true,
67
+ response: ActiveMerchant::Billing::Response.new(
68
+ true,
69
+ 'foo bar',
70
+ { 'order_id' => '222', 'redirect_url' => '/test-capture' }
71
+ )
72
+ )
73
+
74
+ assert(tender.placed_order_data.present?)
75
+ assert_equal('222', tender.order_id)
76
+ assert_equal('/test-capture', tender.redirect_url)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,42 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class SetupKlarnaSessionTest < TestCase
5
+ setup :configure_klarna_data
6
+
7
+ def test_perform
8
+ klarna_gateway_class.any_instance.expects(:create_session).never
9
+
10
+ order = create_order
11
+ checkout = Checkout.new(order)
12
+
13
+ SetupKlarnaSession.new(checkout).perform
14
+
15
+ checkout.payment.build_address(unsupported_address)
16
+ assert(checkout.payment.address.valid?)
17
+
18
+ SetupKlarnaSession.new(checkout).perform
19
+
20
+ checkout.payment.address.attributes = supported_eur_address
21
+
22
+ klarna_gateway_class
23
+ .any_instance
24
+ .expects(:create_session)
25
+ .once
26
+ .returns(OpenStruct.new(success?: true, body: { session_id: '123' }))
27
+
28
+ SetupKlarnaSession.new(checkout).perform
29
+
30
+ session = Payment::KlarnaSession.find(order.id)
31
+ assert_equal('123', session.session_id)
32
+
33
+ klarna_gateway_class
34
+ .any_instance
35
+ .expects(:update_session)
36
+ .once
37
+ .with(order, session.session_id)
38
+
39
+ SetupKlarnaSession.new(checkout).perform
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,6 @@
1
+ require 'workarea/testing/teaspoon'
2
+
3
+ Teaspoon.configure do |config|
4
+ config.root = Workarea::Klarna::Engine.root
5
+ Workarea::Teaspoon.apply(config)
6
+ end
@@ -0,0 +1,10 @@
1
+ # Configure Rails Environment
2
+ ENV['RAILS_ENV'] = 'test'
3
+
4
+ require File.expand_path("../../test/dummy/config/environment.rb", __FILE__)
5
+ require 'rails/test_help'
6
+ require 'workarea/test_help'
7
+
8
+ # Filter out Minitest backtrace while allowing backtrace from other libraries
9
+ # to be shown.
10
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
@@ -0,0 +1,62 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api-na.playground.klarna.com//payments/v1/authorizations/31ae5ab6-d4d5-145f-b71b-36cd8404c5ba/order
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"purchase_country":"US","purchase_currency":"USD","locale":"en","order_amount":1412,"order_tax_amount":112,"order_lines":[{"name":"Integration
9
+ Product","type":"physical","reference":"SKU","quantity":2,"unit_price":500,"total_amount":1000,"product_url":"http://www.example.com/products/integration-product","product_identifiers":{"category_path":"Home
10
+ \u003e Pants"}},{"name":"Shipping","type":"shipping_fee","quantity":1,"unit_price":700,"total_amount":700},{"name":"Order
11
+ Discounts","type":"discount","quantity":1,"unit_price":-100,"total_amount":-100},{"name":"Tax","type":"sales_tax","quantity":1,"unit_price":112,"total_amount":112},{"name":"Store
12
+ Credit","type":"store_credit","quantity":1,"unit_price":-300,"total_amount":-300}],"billing_address":{"given_name":"Ben","family_name":"Crouse","email":"user0@workarea.com","street_address":"22
13
+ S. 3rd St.","street_address2":"Second Floor","postal_code":"19106","city":"Philadelphia","region":"PA","phone":null,"country":"US"},"shipping_address":{"given_name":"Ben","family_name":"Crouse","email":"user0@workarea.com","street_address":"22
14
+ S. 3rd St.","street_address2":"Second Floor","postal_code":"19106","city":"Philadelphia","region":"PA","phone":null,"country":"US"},"merchant_urls":{"confirmation":"http://www.example.com/checkout/confirmation"},"merchant_reference1":"A110ADB728","auto_capture":false}'
15
+ headers:
16
+ User-Agent:
17
+ - Workarea/3.5.16
18
+ Authorization:
19
+ - Basic Zm9vOmJhcg==
20
+ Content-Type:
21
+ - application/json
22
+ Accept-Encoding:
23
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
24
+ Accept:
25
+ - "*/*"
26
+ response:
27
+ status:
28
+ code: 200
29
+ message: OK
30
+ headers:
31
+ Date:
32
+ - Thu, 23 Jul 2020 23:52:38 GMT
33
+ Content-Type:
34
+ - application/json
35
+ Transfer-Encoding:
36
+ - chunked
37
+ Connection:
38
+ - keep-alive
39
+ Server:
40
+ - openresty
41
+ Vary:
42
+ - Accept-Encoding
43
+ Render-Time:
44
+ - '76'
45
+ Klarna-Correlation-Id:
46
+ - d0099594-4ee1-4f37-bc58-66cdb876b33a
47
+ Strict-Transport-Security:
48
+ - max-age=31536000; includeSubDomains
49
+ body:
50
+ encoding: ASCII-8BIT
51
+ string: |-
52
+ {
53
+ "order_id" : "48ab3d6b-e3b5-1f2b-8544-0469e87e9e1e",
54
+ "redirect_url" : "https://klarna-payments-na.playground.klarna.com/payments/v1/sessions/f9ac7fa6-52b9-13c9-8125-df870c1d8c2c/redirect",
55
+ "fraud_status" : "ACCEPTED",
56
+ "authorized_payment_method" : {
57
+ "type" : "invoice"
58
+ }
59
+ }
60
+ http_version:
61
+ recorded_at: Thu, 23 Jul 2020 23:52:38 GMT
62
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,60 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api-na.playground.klarna.com//ordermanagement/v1/orders/1dab0505-d1d5-1041-ac57-5ffda5af139c/captures
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"captured_amount":500}'
9
+ headers:
10
+ User-Agent:
11
+ - Workarea/3.5.16
12
+ Authorization:
13
+ - Basic Zm9vOmJhcg==
14
+ Content-Type:
15
+ - application/json
16
+ Accept-Encoding:
17
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
+ Accept:
19
+ - "*/*"
20
+ response:
21
+ status:
22
+ code: 201
23
+ message: ''
24
+ headers:
25
+ Date:
26
+ - Thu, 23 Jul 2020 23:29:51 GMT
27
+ Content-Length:
28
+ - '0'
29
+ Connection:
30
+ - keep-alive
31
+ Server:
32
+ - openresty
33
+ Location:
34
+ - https://api-na.playground.klarna.com/ordermanagement/v1/orders/1dab0505-d1d5-1041-ac57-5ffda5af139c/captures/eabd454d-c2cc-4139-8438-27635e93e666
35
+ Transaction-Id:
36
+ - 0a4de76d-a048-45d2-a2b3-3b4cd8704640
37
+ Capture-Id:
38
+ - eabd454d-c2cc-4139-8438-27635e93e666
39
+ X-Content-Type-Options:
40
+ - nosniff
41
+ X-Xss-Protection:
42
+ - 1; mode=block
43
+ Cache-Control:
44
+ - no-cache, no-store, max-age=0, must-revalidate
45
+ Pragma:
46
+ - no-cache
47
+ Expires:
48
+ - '0'
49
+ X-Frame-Options:
50
+ - DENY
51
+ Klarna-Correlation-Id:
52
+ - cf47e15c-4798-481d-b423-f052d409fddb
53
+ Strict-Transport-Security:
54
+ - max-age=31536000; includeSubDomains
55
+ body:
56
+ encoding: UTF-8
57
+ string: ''
58
+ http_version:
59
+ recorded_at: Thu, 23 Jul 2020 23:29:51 GMT
60
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,61 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api-na.playground.klarna.com/payments/v1/sessions
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"purchase_country":"US","purchase_currency":"USD","locale":"en","order_amount":1000,"order_tax_amount":0,"order_lines":[{"name":"Test
9
+ Product","type":"physical","reference":"SKU","quantity":2,"unit_price":500,"total_amount":1000,"product_url":"http://www.example.com/products/test-product","product_identifiers":{}},{"name":"Tax","type":"sales_tax","quantity":1,"unit_price":0,"total_amount":0}],"merchant_urls":{"confirmation":"http://www.example.com/checkout/confirmation"},"merchant_reference1":"D461D6C714"}'
10
+ headers:
11
+ User-Agent:
12
+ - Workarea/3.5.16
13
+ Authorization:
14
+ - Basic Zm9vOmJhcg==
15
+ Content-Type:
16
+ - application/json
17
+ Accept-Encoding:
18
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
19
+ Accept:
20
+ - "*/*"
21
+ response:
22
+ status:
23
+ code: 200
24
+ message: OK
25
+ headers:
26
+ Date:
27
+ - Fri, 24 Jul 2020 00:09:26 GMT
28
+ Content-Type:
29
+ - application/json
30
+ Transfer-Encoding:
31
+ - chunked
32
+ Connection:
33
+ - keep-alive
34
+ Server:
35
+ - openresty
36
+ Vary:
37
+ - Accept-Encoding
38
+ Render-Time:
39
+ - '25'
40
+ Klarna-Correlation-Id:
41
+ - 6c7c56d4-2a0a-4e77-8e35-a48a47019b34
42
+ Strict-Transport-Security:
43
+ - max-age=31536000; includeSubDomains
44
+ body:
45
+ encoding: ASCII-8BIT
46
+ string: |-
47
+ {
48
+ "session_id" : "94a6dd80-d2a6-1f8b-943b-786cd953a908",
49
+ "client_token" : "notarealtoken",
50
+ "payment_method_categories" : [ {
51
+ "identifier" : "pay_later",
52
+ "name" : "Pay later in 30 days",
53
+ "asset_urls" : {
54
+ "descriptive" : "https://x.klarnacdn.net/payment-method/assets/badges/generic/klarna.svg",
55
+ "standard" : "https://x.klarnacdn.net/payment-method/assets/badges/generic/klarna.svg"
56
+ }
57
+ } ]
58
+ }
59
+ http_version:
60
+ recorded_at: Fri, 24 Jul 2020 00:09:26 GMT
61
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,60 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api-na.playground.klarna.com//ordermanagement/v1/orders/1dab0505-d1d5-1041-ac57-5ffda5af139c/refunds
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"refunded_amount":500}'
9
+ headers:
10
+ User-Agent:
11
+ - Workarea/3.5.16
12
+ Authorization:
13
+ - Basic Zm9vOmJhcg==
14
+ Content-Type:
15
+ - application/json
16
+ Accept-Encoding:
17
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
18
+ Accept:
19
+ - "*/*"
20
+ response:
21
+ status:
22
+ code: 201
23
+ message: ''
24
+ headers:
25
+ Date:
26
+ - Thu, 23 Jul 2020 23:31:40 GMT
27
+ Content-Length:
28
+ - '0'
29
+ Connection:
30
+ - keep-alive
31
+ Server:
32
+ - openresty
33
+ Location:
34
+ - https://api-na.playground.klarna.com/ordermanagement/v1/orders/1dab0505-d1d5-1041-ac57-5ffda5af139c/refunds/2aca2466-c064-4331-a8f1-ee793413dfbf
35
+ Refund-Id:
36
+ - 2aca2466-c064-4331-a8f1-ee793413dfbf
37
+ Transaction-Id:
38
+ - ee534ddc-49f9-41ab-ab9c-ab5d606ac047
39
+ X-Content-Type-Options:
40
+ - nosniff
41
+ X-Xss-Protection:
42
+ - 1; mode=block
43
+ Cache-Control:
44
+ - no-cache, no-store, max-age=0, must-revalidate
45
+ Pragma:
46
+ - no-cache
47
+ Expires:
48
+ - '0'
49
+ X-Frame-Options:
50
+ - DENY
51
+ Klarna-Correlation-Id:
52
+ - ddc4b073-0d39-4a4d-a073-9ec3f5fd3607
53
+ Strict-Transport-Security:
54
+ - max-age=31536000; includeSubDomains
55
+ body:
56
+ encoding: UTF-8
57
+ string: ''
58
+ http_version:
59
+ recorded_at: Thu, 23 Jul 2020 23:31:41 GMT
60
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,62 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Storefront
5
+ module Checkout
6
+ class KlarnaPaymentViewModelTest < TestCase
7
+ setup :configure_klarna_data
8
+ delegate :order, :payment, to: :checkout
9
+
10
+ def checkout
11
+ @checkout ||= Workarea::Checkout.new(create_order)
12
+ end
13
+
14
+ def step
15
+ Workarea::Checkout::Steps::Payment.new(checkout)
16
+ end
17
+
18
+ def view_model
19
+ PaymentViewModel.new(step)
20
+ end
21
+
22
+ def test_offer_klarna_payments?
23
+ refute(view_model.offer_klarna_payments?)
24
+
25
+ payment.build_address(supported_eur_address)
26
+ refute(view_model.offer_klarna_payments?)
27
+
28
+ create_klarna_session(id: order.id)
29
+ assert(view_model.offer_klarna_payments?)
30
+ end
31
+
32
+ def test_klarna_selected?
33
+ refute(view_model.klarna_selected?)
34
+
35
+ payment.set_klarna(authorization_token: '123')
36
+ assert(view_model.klarna_selected?)
37
+ end
38
+
39
+ def test_klarna_payment_category_selected?
40
+ refute(view_model.klarna_payment_category_selected?('pay_later'))
41
+
42
+ payment.set_klarna(authorization_token: '123')
43
+ refute(view_model.klarna_payment_category_selected?('pay_later'))
44
+
45
+ payment.klarna.payment_method_category = 'pay_later'
46
+ assert(view_model.klarna_payment_category_selected?('pay_later'))
47
+ refute(view_model.klarna_payment_category_selected?('pay_now'))
48
+ end
49
+
50
+ def test_klarna_expired?
51
+ refute(view_model.klarna_expired?)
52
+
53
+ payment.set_klarna(authorization_token: '123')
54
+ refute(view_model.klarna_expired?)
55
+
56
+ payment.klarna.authorization_token_expires_at = 1.minutes.ago
57
+ assert(view_model.klarna_expired?)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end