solidus_subscriptions 1.0.0.rc1 → 1.0.1
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.
- checksums.yaml +4 -4
- data/.circleci/config.yml +57 -9
- data/.github/dependabot.yml +7 -0
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +201 -163
- data/Gemfile +14 -1
- data/README.md +17 -7
- data/app/controllers/solidus_subscriptions/api/v1/subscriptions_controller.rb +25 -1
- data/app/controllers/spree/admin/subscriptions_controller.rb +32 -4
- data/app/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions.rb +2 -2
- data/app/decorators/models/solidus_subscriptions/spree/wallet_payment_source/report_default_change_to_subscriptions.rb +2 -2
- data/app/jobs/solidus_subscriptions/create_subscription_job.rb +11 -0
- data/app/jobs/solidus_subscriptions/process_installment_job.rb +1 -1
- data/app/models/solidus_subscriptions/subscription.rb +75 -31
- data/app/subscribers/solidus_subscriptions/churn_buster_subscriber.rb +1 -0
- data/app/subscribers/solidus_subscriptions/event_storage_subscriber.rb +1 -0
- data/app/subscribers/solidus_subscriptions/order_subscriber.rb +16 -0
- data/app/views/spree/admin/shared/_subscription_actions.html.erb +27 -8
- data/app/views/spree/admin/shared/_subscription_sidebar.html.erb +2 -0
- data/app/views/spree/admin/subscriptions/_state_pill.html.erb +3 -2
- data/app/views/spree/admin/subscriptions/index.html.erb +50 -13
- data/bin/sandbox +1 -6
- data/config/locales/en.yml +16 -0
- data/config/routes.rb +9 -3
- data/db/migrate/20210905145955_add_paused_to_subscriptions.rb +5 -0
- data/{app/decorators → lib/decorators/api}/controllers/solidus_subscriptions/spree/api/line_items_controller/create_subscription_line_items.rb +14 -0
- data/lib/generators/solidus_subscriptions/install/install_generator.rb +16 -0
- data/lib/generators/solidus_subscriptions/install/templates/app/controllers/concerns/create_subscription.rb +17 -0
- data/lib/generators/solidus_subscriptions/install/templates/app/views/cart_line_items/_subscription_fields.html.erb +30 -0
- data/lib/generators/solidus_subscriptions/install/templates/initializer.rb +16 -1
- data/lib/solidus_subscriptions/checkout.rb +2 -9
- data/lib/solidus_subscriptions/configuration.rb +37 -8
- data/lib/solidus_subscriptions/dispatcher/payment_failed_dispatcher.rb +2 -2
- data/lib/solidus_subscriptions/dispatcher/success_dispatcher.rb +2 -2
- data/lib/solidus_subscriptions/engine.rb +28 -0
- data/lib/solidus_subscriptions/order_creator.rb +29 -0
- data/lib/solidus_subscriptions/permission_sets/default_customer.rb +1 -1
- data/lib/solidus_subscriptions/processing_error_handlers/rails_logger.rb +25 -0
- data/lib/solidus_subscriptions/subscription_generator.rb +6 -0
- data/lib/solidus_subscriptions/version.rb +1 -1
- data/lib/solidus_subscriptions.rb +1 -0
- data/solidus_subscriptions.gemspec +6 -6
- data/spec/controllers/spree/api/line_items_controller_spec.rb +63 -28
- data/spec/controllers/spree/api/users_controller_spec.rb +3 -0
- data/spec/decorators/controllers/solidus_subscriptions/spree/orders_controller/create_subscription_line_items_spec.rb +4 -4
- data/spec/decorators/models/solidus_subscriptions/spree/variant/auto_delete_from_subscriptions_spec.rb +2 -2
- data/spec/features/admin/subscriptions_spec.rb +13 -3
- data/spec/jobs/solidus_subscriptions/create_subscription_job_spec.rb +20 -0
- data/spec/jobs/solidus_subscriptions/process_installment_job_spec.rb +17 -0
- data/spec/lib/solidus_subscriptions/dispatcher/payment_failed_dispatcher_spec.rb +3 -3
- data/spec/lib/solidus_subscriptions/dispatcher/success_dispatcher_spec.rb +3 -3
- data/spec/lib/solidus_subscriptions/subscription_generator_spec.rb +1 -1
- data/spec/models/solidus_subscriptions/installment_spec.rb +1 -1
- data/spec/models/solidus_subscriptions/subscription_spec.rb +893 -16
- data/spec/models/spree/wallet_payment_source_spec.rb +3 -3
- data/spec/requests/api/v1/subscriptions_spec.rb +229 -0
- data/spec/subscribers/solidus_subscriptions/churn_buster_subscriber_spec.rb +8 -8
- data/spec/subscribers/solidus_subscriptions/order_subscriber_spec.rb +13 -0
- metadata +31 -23
- data/app/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions.rb +0 -23
- data/config/initializers/subscribers.rb +0 -9
- data/spec/decorators/models/solidus_subscriptions/spree/order/finalize_creates_subscriptions_spec.rb +0 -32
- /data/{app/decorators → lib/decorators/frontend}/controllers/solidus_subscriptions/spree/orders_controller/create_subscription_line_items.rb +0 -0
- /data/{app → lib}/views/spree/frontend/products/_subscription_line_item_fields.html.erb +0 -0
@@ -25,7 +25,7 @@ RSpec.describe 'Subscriptions admin' do
|
|
25
25
|
expect(subscription.billing_address.zipcode).to eq('33167')
|
26
26
|
end
|
27
27
|
|
28
|
-
it 'Creates a subscription' do
|
28
|
+
it 'Creates a subscription' do # rubocop:disable RSpec/MultipleExpectations
|
29
29
|
variant = create(:variant, subscribable: true)
|
30
30
|
create(:user)
|
31
31
|
create(:store)
|
@@ -53,10 +53,20 @@ RSpec.describe 'Subscriptions admin' do
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
select variant.
|
56
|
+
select variant.pretty_name, from: 'Subscribable'
|
57
57
|
fill_in 'Quantity', with: 1
|
58
58
|
|
59
|
-
expect
|
59
|
+
expect(SolidusSubscriptions::Subscription.count).to eq(0)
|
60
|
+
|
61
|
+
# The State field is controlled by JS, so we need to set it at the last moment
|
62
|
+
# available.
|
63
|
+
state_id = Spree::State.last.id.to_s
|
64
|
+
find('input#subscription_shipping_address_attributes_state_id', visible: :all).set(state_id)
|
65
|
+
find('input#subscription_billing_address_attributes_state_id', visible: :all).set(state_id)
|
66
|
+
|
67
|
+
click_on 'Create'
|
68
|
+
|
69
|
+
expect(SolidusSubscriptions::Subscription.count).to eq(1)
|
60
70
|
|
61
71
|
expect(page).to have_text('Subscription has been successfully created!')
|
62
72
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe SolidusSubscriptions::CreateSubscriptionJob do
|
4
|
+
describe '#perform' do
|
5
|
+
it 'creates new subscriptions for an order' do
|
6
|
+
order = create(:order, :with_subscription_line_items)
|
7
|
+
subscription_line_item = order.subscription_line_items.last
|
8
|
+
|
9
|
+
described_class.perform_now(order)
|
10
|
+
|
11
|
+
expect(SolidusSubscriptions::Subscription.count).to eq(order.subscription_line_items.count)
|
12
|
+
subscription = SolidusSubscriptions::Subscription.last
|
13
|
+
expect(subscription).to have_attributes(
|
14
|
+
user_id: order.user_id,
|
15
|
+
actionable_date: Time.zone.today + subscription.interval,
|
16
|
+
line_items: [subscription_line_item]
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -12,7 +12,24 @@ RSpec.describe SolidusSubscriptions::ProcessInstallmentJob do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
context 'when handling #perform errors' do
|
15
|
+
it 'by default logs exception data without raising exceptions' do # rubocop:disable RSpec/MultipleExpectations
|
16
|
+
installment = build_stubbed(:installment)
|
17
|
+
checkout = instance_double(SolidusSubscriptions::Checkout).tap do |c|
|
18
|
+
allow(c).to receive(:process).and_raise('test error')
|
19
|
+
end
|
20
|
+
allow(SolidusSubscriptions::Checkout).to receive(:new).and_return(checkout)
|
21
|
+
allow(Rails.logger).to receive(:error)
|
22
|
+
|
23
|
+
expect {
|
24
|
+
described_class.perform_now(installment)
|
25
|
+
}.not_to raise_error
|
26
|
+
|
27
|
+
expect(Rails.logger).to have_received(:error).with("Error processing installment with ID=#{installment.id}:").ordered
|
28
|
+
expect(Rails.logger).to have_received(:error).with("test error").ordered
|
29
|
+
end
|
30
|
+
|
15
31
|
it 'swallows error when a proc is not configured' do
|
32
|
+
stub_config(processing_error_handler: nil )
|
16
33
|
checkout = instance_double(SolidusSubscriptions::Checkout).tap do |c|
|
17
34
|
allow(c).to receive(:process).and_raise('test error')
|
18
35
|
end
|
@@ -27,15 +27,15 @@ RSpec.describe SolidusSubscriptions::Dispatcher::PaymentFailedDispatcher do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'fires an installments_failed_payment event' do
|
30
|
-
stub_const('
|
30
|
+
stub_const('SolidusSupport::LegacyEventCompat::Bus', class_spy(SolidusSupport::LegacyEventCompat::Bus))
|
31
31
|
installment = instance_spy(SolidusSubscriptions::Installment)
|
32
32
|
order = create(:order_with_line_items)
|
33
33
|
|
34
34
|
dispatcher = described_class.new(installment, order)
|
35
35
|
dispatcher.dispatch
|
36
36
|
|
37
|
-
expect(
|
38
|
-
'solidus_subscriptions.installment_failed_payment',
|
37
|
+
expect(SolidusSupport::LegacyEventCompat::Bus).to have_received(:publish).with(
|
38
|
+
:'solidus_subscriptions.installment_failed_payment',
|
39
39
|
installment: installment,
|
40
40
|
order: order,
|
41
41
|
)
|
@@ -13,15 +13,15 @@ RSpec.describe SolidusSubscriptions::Dispatcher::SuccessDispatcher do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'fires an installments_succeeded event' do
|
16
|
-
stub_const('
|
16
|
+
stub_const('SolidusSupport::LegacyEventCompat::Bus', class_spy(SolidusSupport::LegacyEventCompat::Bus))
|
17
17
|
installment = instance_spy(SolidusSubscriptions::Installment)
|
18
18
|
order = create(:order_with_line_items)
|
19
19
|
|
20
20
|
dispatcher = described_class.new(installment, order)
|
21
21
|
dispatcher.dispatch
|
22
22
|
|
23
|
-
expect(
|
24
|
-
'solidus_subscriptions.installment_succeeded',
|
23
|
+
expect(SolidusSupport::LegacyEventCompat::Bus).to have_received(:publish).with(
|
24
|
+
:'solidus_subscriptions.installment_succeeded',
|
25
25
|
installment: installment,
|
26
26
|
order: order,
|
27
27
|
)
|
@@ -75,7 +75,7 @@ RSpec.describe SolidusSubscriptions::SubscriptionGenerator do
|
|
75
75
|
weekly_subscriptions,
|
76
76
|
expiring_subscriptions,
|
77
77
|
]
|
78
|
-
grouping_result = described_class.group(subscriptions.
|
78
|
+
grouping_result = described_class.group(subscriptions.flatten)
|
79
79
|
|
80
80
|
expect(grouping_result).to match_array(subscriptions)
|
81
81
|
end
|
@@ -46,7 +46,7 @@ RSpec.describe SolidusSubscriptions::Installment, type: :model do
|
|
46
46
|
|
47
47
|
it 'creates a new installment detail' do
|
48
48
|
expect { success }.
|
49
|
-
to change
|
49
|
+
to change(SolidusSubscriptions::InstallmentDetail, :count).
|
50
50
|
by(1)
|
51
51
|
end
|
52
52
|
|