solidus_subscriptions 1.0.0.rc1 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|