susply 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +8 -0
- data/Rakefile +30 -0
- data/app/assets/javascripts/susply/application.js +13 -0
- data/app/assets/stylesheets/susply/application.css +15 -0
- data/app/controllers/susply/application_controller.rb +4 -0
- data/app/helpers/susply/application_helper.rb +4 -0
- data/app/models/susply/payment.rb +19 -0
- data/app/models/susply/plan.rb +16 -0
- data/app/models/susply/subscription.rb +23 -0
- data/app/services/susply/calculations.rb +15 -0
- data/app/services/susply/cancel_subscription.rb +11 -0
- data/app/services/susply/change_subscription.rb +14 -0
- data/app/services/susply/close_subscription.rb +10 -0
- data/app/services/susply/create_payment.rb +30 -0
- data/app/services/susply/create_subscription.rb +21 -0
- data/app/services/susply/owner_methods.rb +28 -0
- data/app/services/susply/prorate.rb +22 -0
- data/app/services/susply/renews_subscription.rb +25 -0
- data/app/views/layouts/susply/application.html.erb +14 -0
- data/config/initializers/susply.rb +3 -0
- data/config/routes.rb +2 -0
- data/db/migrate/20150513155547_create_susply_plans.rb +14 -0
- data/db/migrate/20150513161513_add_status_to_plans.rb +6 -0
- data/db/migrate/20150513180124_create_susply_subscriptions.rb +17 -0
- data/db/migrate/20150521222634_create_susply_payments.rb +19 -0
- data/lib/generators/susply/install_generator.rb +20 -0
- data/lib/generators/templates/config/initializers/susply.rb +3 -0
- data/lib/susply/engine.rb +24 -0
- data/lib/susply/version.rb +3 -0
- data/lib/susply.rb +10 -0
- data/lib/tasks/susply_tasks.rake +4 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/organization.rb +5 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config/application.rb +32 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/susply.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20150513183555_create_organizations.rb +11 -0
- data/spec/dummy/db/production.sqlite3 +0 -0
- data/spec/dummy/db/schema.rb +67 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +950 -0
- data/spec/dummy/log/test.log +40824 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/spec/factories/organizations.rb +8 -0
- data/spec/dummy/spec/models/organization_spec.rb +4 -0
- data/spec/factories/susply_payments.rb +13 -0
- data/spec/factories/susply_plans.rb +15 -0
- data/spec/factories/susply_subscriptions.rb +19 -0
- data/spec/models/susply/payment_spec.rb +135 -0
- data/spec/models/susply/plan_spec.rb +106 -0
- data/spec/models/susply/subscription_spec.rb +102 -0
- data/spec/services/susply/calculations_spec.rb +29 -0
- data/spec/services/susply/cancel_subscription_spec.rb +20 -0
- data/spec/services/susply/change_subscription_spec.rb +68 -0
- data/spec/services/susply/close_subscription_spec.rb +36 -0
- data/spec/services/susply/create_payment_spec.rb +84 -0
- data/spec/services/susply/create_subscription_spec.rb +22 -0
- data/spec/services/susply/owner_methods_spec.rb +99 -0
- data/spec/services/susply/prorate_spec.rb +92 -0
- data/spec/services/susply/renews_subscription_spec.rb +98 -0
- data/spec/spec_helper.rb +19 -0
- metadata +282 -0
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Susply
|
4
|
+
describe ChangeSubscription do
|
5
|
+
let(:owner_class) { Susply.subscription_owner_class.constantize }
|
6
|
+
let(:time) {Time.zone.today}
|
7
|
+
|
8
|
+
context "when owner has an active subscription" do
|
9
|
+
it "closes the active subscription when present" do
|
10
|
+
owner = owner_class.create()
|
11
|
+
plan = create(:susply_plan)
|
12
|
+
subscription = create(:susply_subscription, :active, owner: owner)
|
13
|
+
|
14
|
+
new_subscription = Susply::ChangeSubscription.call(owner, plan)
|
15
|
+
subscription.reload
|
16
|
+
|
17
|
+
expect(subscription).not_to be_active
|
18
|
+
expect(new_subscription).to be_active
|
19
|
+
end
|
20
|
+
|
21
|
+
it "creates a plan_changed prorate payment" do
|
22
|
+
owner = owner_class.create()
|
23
|
+
plan = create(:susply_plan, interval: 'monthly', price: 100)
|
24
|
+
subscription = create(:susply_subscription, :active,owner: owner,
|
25
|
+
current_period_start: time - 15.days)
|
26
|
+
|
27
|
+
Susply::ChangeSubscription.call(owner, plan)
|
28
|
+
|
29
|
+
payment = owner.payments.last
|
30
|
+
expect(payment.generated_type).to eq 'plan_change'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "creates a new subscription" do
|
34
|
+
owner = owner_class.create()
|
35
|
+
plan = create(:susply_plan)
|
36
|
+
subscription = create(:susply_subscription, :active, owner: owner)
|
37
|
+
new_subscription = Susply::ChangeSubscription.call(owner, plan)
|
38
|
+
|
39
|
+
expect(new_subscription.owner).to eq owner
|
40
|
+
expect(new_subscription.plan).to eq plan
|
41
|
+
expect(new_subscription).to be_active
|
42
|
+
expect(owner.subscriptions.count).to eq 2
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "when owner does not have active subscription" do
|
47
|
+
it "does not creates a payment" do
|
48
|
+
owner = owner_class.create()
|
49
|
+
plan = create(:susply_plan)
|
50
|
+
|
51
|
+
new_subscription = Susply::ChangeSubscription.call(owner, plan)
|
52
|
+
|
53
|
+
expect(owner.payments.count).to eq 0
|
54
|
+
end
|
55
|
+
|
56
|
+
it "creates a new subscription" do
|
57
|
+
owner = owner_class.create()
|
58
|
+
plan = create(:susply_plan)
|
59
|
+
|
60
|
+
new_subscription = Susply::ChangeSubscription.call(owner, plan)
|
61
|
+
|
62
|
+
expect(new_subscription.owner).to eq owner
|
63
|
+
expect(new_subscription.plan).to eq plan
|
64
|
+
expect(new_subscription).to be_active
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Susply
|
4
|
+
describe CloseSubscription do
|
5
|
+
let(:owner_class) { Susply.subscription_owner_class.constantize }
|
6
|
+
let(:time) {Time.zone.today}
|
7
|
+
|
8
|
+
context "when owner has an active subscription" do
|
9
|
+
it "closes the active subscription when present" do
|
10
|
+
owner = owner_class.create()
|
11
|
+
plan = create(:susply_plan)
|
12
|
+
subscription = create(:susply_subscription, :active, owner: owner)
|
13
|
+
|
14
|
+
expect(owner.has_active_subscription?).to be true
|
15
|
+
Susply::CloseSubscription.call(owner)
|
16
|
+
subscription.reload
|
17
|
+
|
18
|
+
expect(subscription).not_to be_active
|
19
|
+
expect(owner.has_active_subscription?).to be false
|
20
|
+
end
|
21
|
+
|
22
|
+
it "creates a plan_close prorate payment" do
|
23
|
+
owner = owner_class.create()
|
24
|
+
plan = create(:susply_plan, interval: 'monthly', price: 100)
|
25
|
+
subscription = create(:susply_subscription, :active,owner: owner,
|
26
|
+
current_period_start: time - 15.days)
|
27
|
+
|
28
|
+
Susply::CloseSubscription.call(owner)
|
29
|
+
|
30
|
+
payment = owner.payments.last
|
31
|
+
expect(payment.generated_type).to eq 'plan_close'
|
32
|
+
expect(owner.has_active_subscription?).to be false
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Susply
|
4
|
+
describe CreatePayment do
|
5
|
+
let(:owner_class) { Susply.subscription_owner_class.constantize }
|
6
|
+
it "returns nil when its passes a closed subscription" do
|
7
|
+
s = create(:susply_subscription, :inactive)
|
8
|
+
payment = Susply::CreatePayment.call(s, 'my_type')
|
9
|
+
|
10
|
+
expect(payment).to be_nil
|
11
|
+
end
|
12
|
+
|
13
|
+
context "when passes an active subscription" do
|
14
|
+
let(:owner) {owner_class.create(name: 'iokero')}
|
15
|
+
it "sets the payment owner to the subscription owner" do
|
16
|
+
s = create(:susply_subscription, :active, owner: owner)
|
17
|
+
payment = Susply::CreatePayment.call(s, 'plan_change')
|
18
|
+
|
19
|
+
expect(payment.owner).to be owner
|
20
|
+
end
|
21
|
+
|
22
|
+
it "sets the payment plan to the subscription plan" do
|
23
|
+
plan = create(:susply_plan, sku: 'awea')
|
24
|
+
s = create(:susply_subscription, :active, owner: owner, plan: plan)
|
25
|
+
payment = Susply::CreatePayment.call(s, 'plan_change')
|
26
|
+
|
27
|
+
expect(payment.plan).to be plan
|
28
|
+
end
|
29
|
+
|
30
|
+
it "sets the payment subscription to the passed subscription" do
|
31
|
+
s = create(:susply_subscription, :active, owner: owner)
|
32
|
+
payment = Susply::CreatePayment.call(s, 'plan_change')
|
33
|
+
|
34
|
+
expect(payment.subscription).to be s
|
35
|
+
end
|
36
|
+
|
37
|
+
it "sets the payment amount proratated for no renovation type" do
|
38
|
+
allow(Susply::Prorate).to receive(:call) {5}
|
39
|
+
s = create(:susply_subscription, :active, owner: owner)
|
40
|
+
payment = Susply::CreatePayment.call(s, 'plan_change')
|
41
|
+
|
42
|
+
expect(payment.amount).to be 5
|
43
|
+
end
|
44
|
+
|
45
|
+
it "sets the payment mount as full plan price for renovation type" do
|
46
|
+
plan = create(:susply_plan, price: 25)
|
47
|
+
s = create(:susply_subscription, :active, owner: owner, plan: plan)
|
48
|
+
payment = Susply::CreatePayment.call(s, 'plan_renovation')
|
49
|
+
|
50
|
+
expect(payment.amount).to be 25
|
51
|
+
end
|
52
|
+
|
53
|
+
it "sets the payment type to the passed generated type" do
|
54
|
+
s = create(:susply_subscription, :active, owner: owner)
|
55
|
+
payment = Susply::CreatePayment.call(s, 'plan_change')
|
56
|
+
|
57
|
+
expect(payment.generated_type).to eq 'plan_change'
|
58
|
+
end
|
59
|
+
|
60
|
+
it "sets the payment period start" do
|
61
|
+
s = create(:susply_subscription, :active, owner: owner,
|
62
|
+
current_period_start: Time.zone.now - 3.hours)
|
63
|
+
payment = Susply::CreatePayment.call(s, 'plan_change')
|
64
|
+
|
65
|
+
expect(payment.period_start).to eq s.current_period_start
|
66
|
+
end
|
67
|
+
|
68
|
+
it "sets the payment period end" do
|
69
|
+
s = create(:susply_subscription, :active, owner: owner,
|
70
|
+
current_period_end: Time.zone.now + 3.hours)
|
71
|
+
payment = Susply::CreatePayment.call(s, 'plan_change')
|
72
|
+
|
73
|
+
expect(payment.period_end).to eq s.current_period_end
|
74
|
+
end
|
75
|
+
|
76
|
+
it "sets the status to generated" do
|
77
|
+
s = create(:susply_subscription, :active, owner: owner)
|
78
|
+
payment = Susply::CreatePayment.call(s, 'plan_change')
|
79
|
+
|
80
|
+
expect(payment.status).to eq 'generated'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Susply
|
4
|
+
describe CreateSubscription do
|
5
|
+
it "creates the subscription" do
|
6
|
+
owner = Organization.create(name: "Iokero", subdomain: 'iokero')
|
7
|
+
plan = create(:susply_plan, interval: 'monthly')
|
8
|
+
|
9
|
+
subscription = Susply::CreateSubscription.call(owner, plan)
|
10
|
+
|
11
|
+
expect(subscription.id).not_to be_nil
|
12
|
+
expect(subscription.owner).to eq owner
|
13
|
+
expect(subscription.plan).to eq plan
|
14
|
+
expect(subscription.quantity).to eq 1
|
15
|
+
expect(subscription.start).to be_within(1.second).of(Time.zone.now)
|
16
|
+
expect(subscription.current_period_start).
|
17
|
+
to be_within(2.second).of(Time.zone.now)
|
18
|
+
expect(subscription.current_period_end).
|
19
|
+
to be_within(2.second).of(Time.zone.now + 1.month)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'byebug'
|
3
|
+
|
4
|
+
module Susply
|
5
|
+
describe OwnerMethods do
|
6
|
+
let(:owner_class) { Susply.subscription_owner_class.constantize }
|
7
|
+
|
8
|
+
describe "sets the has many relationship for subscriptions" do
|
9
|
+
it "has many subscriptions" do
|
10
|
+
a = owner_class.reflect_on_association(:subscriptions)
|
11
|
+
expect(a.macro).to eq :has_many
|
12
|
+
end
|
13
|
+
|
14
|
+
it "sets subscriptions class" do
|
15
|
+
a = owner_class.reflect_on_association(:subscriptions)
|
16
|
+
expect(a.options[:class_name]).to eq 'Susply::Subscription'
|
17
|
+
end
|
18
|
+
|
19
|
+
it "sets subscriptions foreign key" do
|
20
|
+
a = owner_class.reflect_on_association(:subscriptions)
|
21
|
+
expect(a.options[:foreign_key]).to eq 'owner_id'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "sets the has many relationship for payments" do
|
26
|
+
it "has many payments" do
|
27
|
+
a = owner_class.reflect_on_association(:payments)
|
28
|
+
expect(a.macro).to eq :has_many
|
29
|
+
end
|
30
|
+
|
31
|
+
it "sets payments class" do
|
32
|
+
a = owner_class.reflect_on_association(:payments)
|
33
|
+
expect(a.options[:class_name]).to eq 'Susply::Payment'
|
34
|
+
end
|
35
|
+
|
36
|
+
it "sets payments foreign key" do
|
37
|
+
a = owner_class.reflect_on_association(:payments)
|
38
|
+
expect(a.options[:foreign_key]).to eq 'owner_id'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
describe "#active_subscription" do
|
44
|
+
it "returns nil when the is no subscrition" do
|
45
|
+
o = owner_class.create
|
46
|
+
|
47
|
+
expect(o.active_subscription).to be_nil
|
48
|
+
end
|
49
|
+
|
50
|
+
it "returns nil when the is no active subscription" do
|
51
|
+
o = owner_class.create
|
52
|
+
s = create(:susply_subscription, :inactive, owner: o)
|
53
|
+
|
54
|
+
expect(o.active_subscription).to be_nil
|
55
|
+
end
|
56
|
+
|
57
|
+
it "returns the active subscription when presente" do
|
58
|
+
o = owner_class.create
|
59
|
+
s = create(:susply_subscription, :active, owner: o)
|
60
|
+
|
61
|
+
expect(o.active_subscription).to eq s
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#has_active_subscription?" do
|
66
|
+
it "returns true when there is an active subscription" do
|
67
|
+
o = owner_class.create
|
68
|
+
s = create(:susply_subscription, :active, owner: o)
|
69
|
+
|
70
|
+
expect(o.has_active_subscription?).to eq true
|
71
|
+
end
|
72
|
+
|
73
|
+
it "returns false when there is not an active subscription" do
|
74
|
+
o = owner_class.create
|
75
|
+
s = create(:susply_subscription, :inactive, owner: o)
|
76
|
+
|
77
|
+
expect(o.has_active_subscription?).to eq false
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "#most_recentry_deactivated_subscription" do
|
82
|
+
it "returns nil when there is no inactive subscription" do
|
83
|
+
o = owner_class.create
|
84
|
+
s = create(:susply_subscription, :active, owner: o)
|
85
|
+
|
86
|
+
expect(o.most_recently_deactivated_subscription).to be_nil
|
87
|
+
end
|
88
|
+
|
89
|
+
it "returns the most recently deactivated usbscription" do
|
90
|
+
o = owner_class.create
|
91
|
+
mr = create(:susply_subscription, :inactive, owner: o)
|
92
|
+
nr = create(:susply_subscription, :inactive, owner: o,
|
93
|
+
deactivated_at: Time.zone.now - 5.days)
|
94
|
+
|
95
|
+
expect(o.most_recently_deactivated_subscription).to eq mr
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Susply
|
4
|
+
describe Prorate do
|
5
|
+
let(:time) {Time.zone.now}
|
6
|
+
|
7
|
+
describe ".call" do
|
8
|
+
it "returns 0 when subscription is not active" do
|
9
|
+
time = Time.zone.now - 3.days
|
10
|
+
subscription = create(:susply_subscription, deactivated_at: time)
|
11
|
+
|
12
|
+
expect(Susply::Prorate.call(subscription)).to be 0
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns the calculated amount for montly" do
|
16
|
+
plan = build(:susply_plan, price: 100, interval: 'monthly')
|
17
|
+
s = build(:susply_subscription, current_period_start: time - 7.days,
|
18
|
+
plan: plan )
|
19
|
+
|
20
|
+
expect(Susply::Prorate.call(s)).to be 24
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns the calculated amount for yearly" do
|
24
|
+
plan = build(:susply_plan, price: 1000, interval: 'yearly')
|
25
|
+
s = build(:susply_subscription, current_period_start: time - 304.days,
|
26
|
+
plan: plan )
|
27
|
+
|
28
|
+
expect(Susply::Prorate.call(s)).to be 1000
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ".used_days" do
|
33
|
+
it "returns the number of days in a month" do
|
34
|
+
s = build(:susply_subscription, current_period_start: time - 7.days )
|
35
|
+
|
36
|
+
expect(Susply::Prorate.used_days(s)).to be 7
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns the number of days in a year" do
|
40
|
+
s = build(:susply_subscription, current_period_start: time - 102.days )
|
41
|
+
|
42
|
+
expect(Susply::Prorate.used_days(s)).to be 102
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe ".calculate_used_amount" do
|
47
|
+
context "when plan interval is yearly" do
|
48
|
+
it "returns the prorate amount with price + 2 months" do
|
49
|
+
plan = build(:susply_plan, price: 40, interval: 'yearly')
|
50
|
+
used_days = 182
|
51
|
+
amount = Susply::Prorate.calculate_used_amount(plan, used_days)
|
52
|
+
|
53
|
+
expect(amount).to be 24
|
54
|
+
end
|
55
|
+
|
56
|
+
it "always return an integer value" do
|
57
|
+
plan = build(:susply_plan, price: 100, interval: 'yearly')
|
58
|
+
used_days = 91
|
59
|
+
amount = Susply::Prorate.calculate_used_amount(plan, used_days)
|
60
|
+
|
61
|
+
expect(amount).to be 30
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context "when plan interval is monthly" do
|
66
|
+
it "returns the prorate amount based on 30 days use" do
|
67
|
+
plan = build(:susply_plan, price: 100, interval: 'monthly')
|
68
|
+
used_days = 91
|
69
|
+
amount = Susply::Prorate.calculate_used_amount(plan, used_days)
|
70
|
+
|
71
|
+
expect(amount).to be 304
|
72
|
+
end
|
73
|
+
|
74
|
+
it "returns the prorate amount based on 30 days use" do
|
75
|
+
plan = build(:susply_plan, price: 49, interval: 'monthly')
|
76
|
+
used_days = 15
|
77
|
+
amount = Susply::Prorate.calculate_used_amount(plan, used_days)
|
78
|
+
|
79
|
+
expect(amount).to be 25
|
80
|
+
end
|
81
|
+
|
82
|
+
it "returns the exact amount used" do
|
83
|
+
plan = build(:susply_plan, price: 99, interval: 'monthly')
|
84
|
+
used_days = 10
|
85
|
+
amount = Susply::Prorate.calculate_used_amount(plan, used_days)
|
86
|
+
|
87
|
+
expect(amount).to be 33
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Susply
|
4
|
+
describe RenewsSubscription do
|
5
|
+
let(:owner_class) { Susply.subscription_owner_class.constantize }
|
6
|
+
let(:time) {Time.zone.today}
|
7
|
+
|
8
|
+
context "when owner does not has an active subscription" do
|
9
|
+
it "returns nil" do
|
10
|
+
owner = owner_class.create()
|
11
|
+
plan = create(:susply_plan)
|
12
|
+
subscription = create(:susply_subscription, :inactive, owner: owner)
|
13
|
+
|
14
|
+
s = Susply::RenewsSubscription.call(owner)
|
15
|
+
|
16
|
+
expect(s).to be_nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "when owner has an active subscription" do
|
21
|
+
it "creates a payment of renovation type" do
|
22
|
+
owner = owner_class.create()
|
23
|
+
plan = create(:susply_plan, interval: 'monthly', price: 101)
|
24
|
+
subscription = create(:susply_subscription, :active,
|
25
|
+
owner: owner, plan: plan)
|
26
|
+
|
27
|
+
s = Susply::RenewsSubscription.call(owner)
|
28
|
+
payment = owner.payments.last
|
29
|
+
|
30
|
+
expect(payment.generated_type).to eq 'plan_renovation'
|
31
|
+
expect(payment.amount).to eq 101
|
32
|
+
end
|
33
|
+
|
34
|
+
it "does not creates an extra subscription" do
|
35
|
+
owner = owner_class.create()
|
36
|
+
subscription = create(:susply_subscription, :active, owner: owner)
|
37
|
+
|
38
|
+
Susply::RenewsSubscription.call(owner)
|
39
|
+
|
40
|
+
expect(owner.subscriptions.count).to be 1
|
41
|
+
end
|
42
|
+
|
43
|
+
it "return a subscription with updated attributes" do
|
44
|
+
owner = owner_class.create()
|
45
|
+
subscription = create(:susply_subscription, :active, owner: owner,
|
46
|
+
current_period_start: time - 5.days)
|
47
|
+
s = Susply::RenewsSubscription.call(owner)
|
48
|
+
|
49
|
+
expect(s.quantity).not_to eq subscription.quantity
|
50
|
+
expect(s.current_period_start).
|
51
|
+
not_to eq subscription.current_period_start
|
52
|
+
expect(s.current_period_end).
|
53
|
+
not_to eq subscription.current_period_end
|
54
|
+
end
|
55
|
+
|
56
|
+
it "returns updates by one the subscriptions" do
|
57
|
+
owner = owner_class.create()
|
58
|
+
subscription = create(:susply_subscription, :active, owner: owner,
|
59
|
+
current_period_start: time - 5.days,
|
60
|
+
quantity: 5)
|
61
|
+
s = Susply::RenewsSubscription.call(owner)
|
62
|
+
|
63
|
+
expect(s.quantity).to eq 6
|
64
|
+
end
|
65
|
+
|
66
|
+
it "sets the subscription initial date o past end" do
|
67
|
+
owner = owner_class.create()
|
68
|
+
end_time = time + 6.hours
|
69
|
+
subscription = create(:susply_subscription, :active, owner: owner,
|
70
|
+
current_period_start: time - 5.days,
|
71
|
+
current_period_end: end_time)
|
72
|
+
s = Susply::RenewsSubscription.call(owner)
|
73
|
+
|
74
|
+
expect(s.current_period_start).to eq end_time
|
75
|
+
end
|
76
|
+
|
77
|
+
it "sets the end period to the given month calculation" do
|
78
|
+
owner = owner_class.create()
|
79
|
+
end_time = time + 6.hours
|
80
|
+
plan = create(:susply_plan, interval: 'monthly')
|
81
|
+
subscription = create(:susply_subscription, :active, owner: owner,
|
82
|
+
plan: plan, current_period_end: end_time)
|
83
|
+
s = Susply::RenewsSubscription.call(owner)
|
84
|
+
expect(s.current_period_end).to eq(end_time + 1.month)
|
85
|
+
end
|
86
|
+
|
87
|
+
it "sets the end period to the given yearly calculation" do
|
88
|
+
owner = owner_class.create()
|
89
|
+
end_time = time + 2.hours
|
90
|
+
plan = create(:susply_plan, interval: 'yearly')
|
91
|
+
subscription = create(:susply_subscription, :active, owner: owner,
|
92
|
+
plan: plan, current_period_end: end_time)
|
93
|
+
s = Susply::RenewsSubscription.call(owner)
|
94
|
+
expect(s.current_period_end).to eq(end_time + 1.year)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
ENV["RAILS_ENV"] ||= 'test'
|
2
|
+
require File.expand_path("../dummy/config/environment", __FILE__)
|
3
|
+
require 'rspec/rails'
|
4
|
+
require 'factory_girl_rails'
|
5
|
+
require "codeclimate-test-reporter"
|
6
|
+
CodeClimate::TestReporter.start
|
7
|
+
|
8
|
+
Rails.backtrace_cleaner.remove_silencers!
|
9
|
+
|
10
|
+
# Load support files
|
11
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
12
|
+
|
13
|
+
RSpec.configure do |config|
|
14
|
+
config.mock_with :rspec
|
15
|
+
config.use_transactional_fixtures = true
|
16
|
+
config.infer_base_class_for_anonymous_controllers = false
|
17
|
+
config.order = "random"
|
18
|
+
config.include FactoryGirl::Syntax::Methods
|
19
|
+
end
|