workarea-sezzle 1.0.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 (108) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  3. data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. data/.gitignore +23 -0
  6. data/.rubocop.yml +405 -0
  7. data/.scss-lint.yml +204 -0
  8. data/Gemfile +17 -0
  9. data/LICENSE +7 -0
  10. data/README.md +95 -0
  11. data/Rakefile +56 -0
  12. data/Workarea +0 -0
  13. data/app/assets/images/workarea/admin/sezzle/.keep +0 -0
  14. data/app/assets/images/workarea/sezzle_logo_white.svg +1 -0
  15. data/app/assets/images/workarea/storefront/sezzle/.keep +0 -0
  16. data/app/assets/javascripts/workarea/admin/sezzle/.keep +0 -0
  17. data/app/assets/javascripts/workarea/storefront/sezzle/.keep +0 -0
  18. data/app/assets/stylesheets/workarea/admin/sezzle/.keep +0 -0
  19. data/app/assets/stylesheets/workarea/admin/sezzle/components/_payment_icon.scss +13 -0
  20. data/app/assets/stylesheets/workarea/storefront/sezzle/.keep +0 -0
  21. data/app/assets/stylesheets/workarea/storefront/sezzle/components/_payment_icon.scss +13 -0
  22. data/app/assets/stylesheets/workarea/storefront/sezzle/components/_sezzle.scss +13 -0
  23. data/app/controllers/.keep +0 -0
  24. data/app/controllers/workarea/storefront/checkout/place_order_controller.decorator +11 -0
  25. data/app/controllers/workarea/storefront/sezzle_controller.rb +109 -0
  26. data/app/helpers/.keep +0 -0
  27. data/app/mailers/.keep +0 -0
  28. data/app/models/.keep +0 -0
  29. data/app/models/workarea/payment/authorize/sezzle.rb +32 -0
  30. data/app/models/workarea/payment/capture/sezzle.rb +85 -0
  31. data/app/models/workarea/payment/purchase/sezzle.rb +30 -0
  32. data/app/models/workarea/payment/refund/sezzle.rb +47 -0
  33. data/app/models/workarea/payment/tender/sezzle.rb +15 -0
  34. data/app/models/workarea/paymentl.decorator +32 -0
  35. data/app/services/workarea/sezzle/order_builder.rb +135 -0
  36. data/app/view_models/workarea/storefront/checkout/payment_view_model.decorator +11 -0
  37. data/app/views/.keep +0 -0
  38. data/app/views/workarea/admin/orders/tenders/_sezzle.html.haml +3 -0
  39. data/app/views/workarea/storefront/carts/_sezzle_widget.html.haml +5 -0
  40. data/app/views/workarea/storefront/checkouts/_sezzle_payment.html.haml +8 -0
  41. data/app/views/workarea/storefront/order_mailer/tenders/_sezzle.html.haml +1 -0
  42. data/app/views/workarea/storefront/order_mailer/tenders/_sezzle.text.erb +1 -0
  43. data/app/views/workarea/storefront/orders/tenders/_sezzle.html.haml +4 -0
  44. data/app/views/workarea/storefront/products/_sezzle_widget.html.haml +10 -0
  45. data/app/views/workarea/storefront/sezzle/_script.html.haml +22 -0
  46. data/bin/rails +25 -0
  47. data/config/initializers/appends.rb +30 -0
  48. data/config/initializers/configurations.rb +41 -0
  49. data/config/initializers/workarea.rb +21 -0
  50. data/config/locales/en.yml +43 -0
  51. data/config/routes.rb +5 -0
  52. data/lib/workarea/sezzle.rb +53 -0
  53. data/lib/workarea/sezzle/authentication.rb +49 -0
  54. data/lib/workarea/sezzle/bogus_gateway.rb +128 -0
  55. data/lib/workarea/sezzle/engine.rb +10 -0
  56. data/lib/workarea/sezzle/gateway.rb +90 -0
  57. data/lib/workarea/sezzle/response.rb +27 -0
  58. data/lib/workarea/sezzle/version.rb +5 -0
  59. data/module +0 -0
  60. data/test/dummy/.ruby-version +1 -0
  61. data/test/dummy/Rakefile +6 -0
  62. data/test/dummy/app/assets/config/manifest.js +2 -0
  63. data/test/dummy/app/assets/images/.keep +0 -0
  64. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  65. data/test/dummy/app/controllers/application_controller.rb +2 -0
  66. data/test/dummy/app/controllers/concerns/.keep +0 -0
  67. data/test/dummy/app/helpers/application_helper.rb +2 -0
  68. data/test/dummy/app/javascript/packs/application.js +14 -0
  69. data/test/dummy/app/jobs/application_job.rb +7 -0
  70. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  71. data/test/dummy/app/models/concerns/.keep +0 -0
  72. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  73. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  74. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  75. data/test/dummy/bin/rails +4 -0
  76. data/test/dummy/bin/rake +4 -0
  77. data/test/dummy/bin/setup +25 -0
  78. data/test/dummy/config.ru +5 -0
  79. data/test/dummy/config/application.rb +34 -0
  80. data/test/dummy/config/boot.rb +5 -0
  81. data/test/dummy/config/environment.rb +5 -0
  82. data/test/dummy/config/environments/development.rb +53 -0
  83. data/test/dummy/config/environments/production.rb +101 -0
  84. data/test/dummy/config/environments/test.rb +47 -0
  85. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  86. data/test/dummy/config/initializers/assets.rb +12 -0
  87. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  88. data/test/dummy/config/initializers/content_security_policy.rb +28 -0
  89. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  90. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  91. data/test/dummy/config/initializers/inflections.rb +16 -0
  92. data/test/dummy/config/initializers/mime_types.rb +4 -0
  93. data/test/dummy/config/initializers/workarea.rb +5 -0
  94. data/test/dummy/config/initializers/wrap_parameters.rb +9 -0
  95. data/test/dummy/config/locales/en.yml +33 -0
  96. data/test/dummy/config/puma.rb +38 -0
  97. data/test/dummy/config/routes.rb +5 -0
  98. data/test/dummy/config/spring.rb +6 -0
  99. data/test/dummy/db/seeds.rb +2 -0
  100. data/test/dummy/lib/assets/.keep +0 -0
  101. data/test/dummy/log/.keep +0 -0
  102. data/test/integration/workarea/storefront/sezzle_integration_test.rb +205 -0
  103. data/test/models/workarea/payment/sezzle_payment_integration_test.rb +82 -0
  104. data/test/services/workarea/sezzle/order_builder_test.rb +116 -0
  105. data/test/teaspoon_env.rb +6 -0
  106. data/test/test_helper.rb +10 -0
  107. data/workarea-sezzle.gemspec +20 -0
  108. metadata +163 -0
@@ -0,0 +1,82 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ class SezzlePaymentIntegrationTest < Workarea::TestCase
5
+ def test_auth_capture
6
+ transaction = tender.build_transaction(action: 'authorize')
7
+ Payment::Authorize::Sezzle.new(tender, transaction).complete!
8
+
9
+ assert(transaction.success?)
10
+ transaction.save!
11
+
12
+ capture = Payment::Capture.new(payment: payment)
13
+ capture.allocate_amounts!(total: 5.to_m)
14
+ assert(capture.valid?)
15
+ capture.complete!
16
+
17
+ capture_transaction = payment.transactions.detect(&:captures)
18
+ assert(capture_transaction.valid?)
19
+ end
20
+
21
+ def test_auth_capture_refund
22
+ tender.amount = 5.to_m
23
+ transaction = tender.build_transaction(action: 'authorize')
24
+ operation = Payment::Authorize::Sezzle.new(tender, transaction)
25
+ operation.complete!
26
+ assert(transaction.success?, 'expected transaction to be successful')
27
+ transaction.save!
28
+
29
+ capture = Payment::Capture.new(payment: payment)
30
+ capture.allocate_amounts!(total: 5.to_m)
31
+ assert(capture.valid?)
32
+ capture.complete!
33
+
34
+ capture_transaction = payment.transactions.detect(&:captures)
35
+ assert(capture_transaction.valid?)
36
+
37
+ refund = Payment::Refund.new(payment: payment)
38
+ refund.allocate_amounts!(total: 5.to_m)
39
+
40
+ assert(refund.valid?)
41
+ refund.complete!
42
+
43
+ refund_transaction = payment.sezzle.transactions.refunds.first
44
+ assert(refund_transaction.valid?)
45
+ end
46
+
47
+ private
48
+
49
+ def payment
50
+ @payment ||=
51
+ begin
52
+ profile = create_payment_profile
53
+ create_payment(
54
+ profile_id: profile.id,
55
+ address: {
56
+ first_name: 'Ben',
57
+ last_name: 'Crouse',
58
+ street: '22 s. 3rd st.',
59
+ city: 'Philadelphia',
60
+ region: 'PA',
61
+ postal_code: '19106',
62
+ country: Country['US']
63
+ }
64
+ )
65
+ end
66
+ end
67
+
68
+ def tender
69
+ @tender ||=
70
+ begin
71
+ payment.set_address(first_name: 'Ben', last_name: 'Crouse')
72
+
73
+ payment.build_sezzle(
74
+ sezzle_id: '12345',
75
+ amount: 5.to_m
76
+ )
77
+
78
+ payment.sezzle
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,116 @@
1
+ require 'test_helper'
2
+
3
+ module Workarea
4
+ module Sezzle
5
+ class OrderBuilderTest < Workarea::TestCase
6
+ def test_build
7
+ create_order_total_discount
8
+ order = create_order
9
+
10
+ # apply store credit
11
+ payment = Workarea::Payment.find(order.id)
12
+ payment.profile.update_attributes!(store_credit: 1.00)
13
+ payment.set_store_credit
14
+ payment.tenders.first.amount = 1.to_m
15
+ payment.save
16
+
17
+ order.reload
18
+ payment.reload
19
+ order_hash = Workarea::Sezzle::OrderBuilder.new(order).build
20
+
21
+ customer = order_hash[:customer]
22
+ assert_equal(order.email, customer[:email])
23
+ assert_equal('Bob', customer[:first_name])
24
+ assert_equal('Clams', customer[:last_name])
25
+ assert_equal(expected_billing_address, customer[:billing_address])
26
+ assert_equal(expected_shipping_address, customer[:shipping_address])
27
+
28
+ sezzle_order = order_hash[:order]
29
+ assert_equal('1234', sezzle_order[:reference_id])
30
+ refute(sezzle_order[:requires_shipping_info])
31
+
32
+ item = sezzle_order[:items].first
33
+ assert_equal('Test Product', item[:name])
34
+ assert_equal('SKU', item[:sku])
35
+ assert_equal(2, item[:quantity])
36
+
37
+ assert_equal(900, sezzle_order[:order_amount][:amount_in_cents])
38
+ assert_equal(100, sezzle_order[:shipping_amount][:amount_in_cents])
39
+ assert_equal(0, sezzle_order[:tax_amount][:amount_in_cents])
40
+
41
+ discounts = sezzle_order[:discounts]
42
+ assert_equal('Order Total Discount', discounts.first[:name])
43
+ assert_equal(100, discounts.first[:amount][:amount_in_cents])
44
+ end
45
+
46
+ private
47
+
48
+ def create_order(overrides = {})
49
+ attributes = {
50
+ id: '1234',
51
+ email: 'bcrouse-new@workarea.com',
52
+ placed_at: Time.current
53
+ }.merge(overrides)
54
+
55
+ shipping_service = create_shipping_service
56
+ product = create_product(variants: [{ sku: 'SKU', regular: 5.to_m }])
57
+
58
+ order = Workarea::Order.new(attributes)
59
+ order.add_item(product_id: product.id, sku: 'SKU', quantity: 2)
60
+
61
+ checkout = Checkout.new(order)
62
+ checkout.update(
63
+ shipping_address: {
64
+ first_name: 'Jeff',
65
+ last_name: 'Yucis',
66
+ street: '22 S. 3rd St.',
67
+ street_2: 'Second Floor',
68
+ city: 'Philadelphia',
69
+ region: 'PA',
70
+ postal_code: '19106',
71
+ country: 'US'
72
+ },
73
+ billing_address: {
74
+ first_name: 'Bob',
75
+ last_name: 'Clams',
76
+ street: '12 N. 3rd St.',
77
+ street_2: 'Second Floor',
78
+ city: 'Wilmington',
79
+ region: 'DE',
80
+ postal_code: '18083',
81
+ country: 'US'
82
+ },
83
+ shipping_service: shipping_service.name,
84
+ )
85
+
86
+ order
87
+ end
88
+
89
+ def expected_billing_address
90
+ {
91
+ name: 'Bob Clams',
92
+ street: '12 N. 3rd St.',
93
+ street2: 'Second Floor',
94
+ city: 'Wilmington',
95
+ state: 'DE',
96
+ postal_code: '18083',
97
+ country_code: 'US',
98
+ phone_number: nil
99
+ }
100
+ end
101
+
102
+ def expected_shipping_address
103
+ {
104
+ name: 'Jeff Yucis',
105
+ street: '22 S. 3rd St.',
106
+ street2: 'Second Floor',
107
+ city: 'Philadelphia',
108
+ state: 'PA',
109
+ postal_code: '19106',
110
+ country_code: 'US',
111
+ phone_number: nil
112
+ }
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,6 @@
1
+ require 'workarea/testing/teaspoon'
2
+
3
+ Teaspoon.configure do |config|
4
+ config.root = Workarea::Sezzle::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,20 @@
1
+ $:.push File.expand_path('lib', __dir__)
2
+
3
+ # Maintain your gem's version:
4
+ require 'workarea/sezzle/version'
5
+
6
+ # Describe your gem and declare its dependencies:
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'workarea-sezzle'
9
+ spec.version = Workarea::Sezzle::VERSION
10
+ spec.authors = ['Jeff Yucis']
11
+ spec.email = ['jeff@syatt.io']
12
+ spec.homepage = 'https://github.com/syatt-io/workarea-sezzle'
13
+ spec.summary = 'Sezzle Payments for Workarea'
14
+ spec.description = 'Integrates Sezzle into the Workarea Commerce system.'
15
+ spec.license = 'Business Software License'
16
+
17
+ spec.files = `git ls-files`.split("\n")
18
+
19
+ spec.add_dependency 'workarea', '~> 3.x'
20
+ end
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: workarea-sezzle
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jeff Yucis
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-12-01 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
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 3.x
27
+ description: Integrates Sezzle into the Workarea Commerce system.
28
+ email:
29
+ - jeff@syatt.io
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".github/ISSUE_TEMPLATE/bug_report.md"
35
+ - ".github/ISSUE_TEMPLATE/documentation-request.md"
36
+ - ".github/ISSUE_TEMPLATE/feature_request.md"
37
+ - ".gitignore"
38
+ - ".rubocop.yml"
39
+ - ".scss-lint.yml"
40
+ - Gemfile
41
+ - LICENSE
42
+ - README.md
43
+ - Rakefile
44
+ - Workarea
45
+ - app/assets/images/workarea/admin/sezzle/.keep
46
+ - app/assets/images/workarea/sezzle_logo_white.svg
47
+ - app/assets/images/workarea/storefront/sezzle/.keep
48
+ - app/assets/javascripts/workarea/admin/sezzle/.keep
49
+ - app/assets/javascripts/workarea/storefront/sezzle/.keep
50
+ - app/assets/stylesheets/workarea/admin/sezzle/.keep
51
+ - app/assets/stylesheets/workarea/admin/sezzle/components/_payment_icon.scss
52
+ - app/assets/stylesheets/workarea/storefront/sezzle/.keep
53
+ - app/assets/stylesheets/workarea/storefront/sezzle/components/_payment_icon.scss
54
+ - app/assets/stylesheets/workarea/storefront/sezzle/components/_sezzle.scss
55
+ - app/controllers/.keep
56
+ - app/controllers/workarea/storefront/checkout/place_order_controller.decorator
57
+ - app/controllers/workarea/storefront/sezzle_controller.rb
58
+ - app/helpers/.keep
59
+ - app/mailers/.keep
60
+ - app/models/.keep
61
+ - app/models/workarea/payment/authorize/sezzle.rb
62
+ - app/models/workarea/payment/capture/sezzle.rb
63
+ - app/models/workarea/payment/purchase/sezzle.rb
64
+ - app/models/workarea/payment/refund/sezzle.rb
65
+ - app/models/workarea/payment/tender/sezzle.rb
66
+ - app/models/workarea/paymentl.decorator
67
+ - app/services/workarea/sezzle/order_builder.rb
68
+ - app/view_models/workarea/storefront/checkout/payment_view_model.decorator
69
+ - app/views/.keep
70
+ - app/views/workarea/admin/orders/tenders/_sezzle.html.haml
71
+ - app/views/workarea/storefront/carts/_sezzle_widget.html.haml
72
+ - app/views/workarea/storefront/checkouts/_sezzle_payment.html.haml
73
+ - app/views/workarea/storefront/order_mailer/tenders/_sezzle.html.haml
74
+ - app/views/workarea/storefront/order_mailer/tenders/_sezzle.text.erb
75
+ - app/views/workarea/storefront/orders/tenders/_sezzle.html.haml
76
+ - app/views/workarea/storefront/products/_sezzle_widget.html.haml
77
+ - app/views/workarea/storefront/sezzle/_script.html.haml
78
+ - bin/rails
79
+ - config/initializers/appends.rb
80
+ - config/initializers/configurations.rb
81
+ - config/initializers/workarea.rb
82
+ - config/locales/en.yml
83
+ - config/routes.rb
84
+ - lib/workarea/sezzle.rb
85
+ - lib/workarea/sezzle/authentication.rb
86
+ - lib/workarea/sezzle/bogus_gateway.rb
87
+ - lib/workarea/sezzle/engine.rb
88
+ - lib/workarea/sezzle/gateway.rb
89
+ - lib/workarea/sezzle/response.rb
90
+ - lib/workarea/sezzle/version.rb
91
+ - module
92
+ - test/dummy/.ruby-version
93
+ - test/dummy/Rakefile
94
+ - test/dummy/app/assets/config/manifest.js
95
+ - test/dummy/app/assets/images/.keep
96
+ - test/dummy/app/assets/stylesheets/application.css
97
+ - test/dummy/app/controllers/application_controller.rb
98
+ - test/dummy/app/controllers/concerns/.keep
99
+ - test/dummy/app/helpers/application_helper.rb
100
+ - test/dummy/app/javascript/packs/application.js
101
+ - test/dummy/app/jobs/application_job.rb
102
+ - test/dummy/app/mailers/application_mailer.rb
103
+ - test/dummy/app/models/concerns/.keep
104
+ - test/dummy/app/views/layouts/application.html.erb
105
+ - test/dummy/app/views/layouts/mailer.html.erb
106
+ - test/dummy/app/views/layouts/mailer.text.erb
107
+ - test/dummy/bin/rails
108
+ - test/dummy/bin/rake
109
+ - test/dummy/bin/setup
110
+ - test/dummy/config.ru
111
+ - test/dummy/config/application.rb
112
+ - test/dummy/config/boot.rb
113
+ - test/dummy/config/environment.rb
114
+ - test/dummy/config/environments/development.rb
115
+ - test/dummy/config/environments/production.rb
116
+ - test/dummy/config/environments/test.rb
117
+ - test/dummy/config/initializers/application_controller_renderer.rb
118
+ - test/dummy/config/initializers/assets.rb
119
+ - test/dummy/config/initializers/backtrace_silencers.rb
120
+ - test/dummy/config/initializers/content_security_policy.rb
121
+ - test/dummy/config/initializers/cookies_serializer.rb
122
+ - test/dummy/config/initializers/filter_parameter_logging.rb
123
+ - test/dummy/config/initializers/inflections.rb
124
+ - test/dummy/config/initializers/mime_types.rb
125
+ - test/dummy/config/initializers/workarea.rb
126
+ - test/dummy/config/initializers/wrap_parameters.rb
127
+ - test/dummy/config/locales/en.yml
128
+ - test/dummy/config/puma.rb
129
+ - test/dummy/config/routes.rb
130
+ - test/dummy/config/spring.rb
131
+ - test/dummy/db/seeds.rb
132
+ - test/dummy/lib/assets/.keep
133
+ - test/dummy/log/.keep
134
+ - test/integration/workarea/storefront/sezzle_integration_test.rb
135
+ - test/models/workarea/payment/sezzle_payment_integration_test.rb
136
+ - test/services/workarea/sezzle/order_builder_test.rb
137
+ - test/teaspoon_env.rb
138
+ - test/test_helper.rb
139
+ - workarea-sezzle.gemspec
140
+ homepage: https://github.com/syatt-io/workarea-sezzle
141
+ licenses:
142
+ - Business Software License
143
+ metadata: {}
144
+ post_install_message:
145
+ rdoc_options: []
146
+ require_paths:
147
+ - lib
148
+ required_ruby_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ requirements: []
159
+ rubygems_version: 3.0.3
160
+ signing_key:
161
+ specification_version: 4
162
+ summary: Sezzle Payments for Workarea
163
+ test_files: []