workarea-sezzle 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []