acts_as_subscription 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +2 -0
- data/.rspec +3 -0
- data/.rvmrc +1 -0
- data/Gemfile +22 -0
- data/LICENSE.txt +19 -0
- data/README.rdoc +21 -0
- data/Rakefile +54 -0
- data/VERSION +1 -0
- data/acts_as_subscription.gemspec +104 -0
- data/autotest/discover.rb +1 -0
- data/lib/acts_as_subscription/backend/chargify_client.rb +173 -0
- data/lib/acts_as_subscription/backend/cheddar_getter_client.rb +151 -0
- data/lib/acts_as_subscription/backend/dummy_client.rb +49 -0
- data/lib/acts_as_subscription/backend/recurly_client.rb +58 -0
- data/lib/acts_as_subscription/backend.rb +168 -0
- data/lib/acts_as_subscription/error.rb +15 -0
- data/lib/acts_as_subscription/railtie.rb +13 -0
- data/lib/acts_as_subscription/subscription.rb +258 -0
- data/lib/acts_as_subscription/subscription_plan.rb +93 -0
- data/lib/acts_as_subscription.rb +7 -0
- data/spec/backend/backend/chargify_client_spec.rb +204 -0
- data/spec/backend/backend/cheddar_getter_client_spec.rb +191 -0
- data/spec/backend/backend_spec.rb +82 -0
- data/spec/models/subscription_plan_spec.rb +118 -0
- data/spec/models/subscription_spec.rb +207 -0
- data/spec/spec_helper.rb +110 -0
- data/spec/support/backend.yml.example +14 -0
- data/spec/support/database.yml +17 -0
- data/spec/support/models.rb +21 -0
- data/spec/support/schema.rb +30 -0
- metadata +244 -0
@@ -0,0 +1,204 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'acts_as_subscription/backend/chargify_client'
|
3
|
+
|
4
|
+
describe ActsAsSubscription::Subscription::Backend::ChargifyClient do
|
5
|
+
|
6
|
+
def active_subscriptions
|
7
|
+
Chargify::Subscription.find(:all, :params => {:state => 'active'})
|
8
|
+
end
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
@config = backend_config(:chargify)
|
12
|
+
@free_attr = free_attributes
|
13
|
+
@paid_attr = paid_attributes
|
14
|
+
# Chargify uses '1' as the success card number for testing, and '2' for failure.
|
15
|
+
@paid_attr[:cc_number] = 1
|
16
|
+
@backend = ActsAsSubscription::Subscription::Backend::ChargifyClient.new(@config['user'], @config['password'], @config['product_code'])
|
17
|
+
|
18
|
+
# Cancel any active subscriptions before each test - no way to actually delete via the chargify API.
|
19
|
+
active_subscriptions.each do |sub|
|
20
|
+
sub.cancel
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'for all accounts' do
|
25
|
+
|
26
|
+
it 'should return a list of plans' do
|
27
|
+
plans = @backend.plans
|
28
|
+
plans.length.should == 3
|
29
|
+
plans.each do |plan|
|
30
|
+
plan[:code].should_not be_nil
|
31
|
+
plan[:billing_frequency].should_not be_nil
|
32
|
+
plan[:name].should_not be_nil
|
33
|
+
plan[:description].should_not be_nil
|
34
|
+
plan[:recurring_charge].should_not be_nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
describe 'for paid accounts' do
|
41
|
+
|
42
|
+
describe 'with valid parameters' do
|
43
|
+
|
44
|
+
it 'should create new subscriptions' do
|
45
|
+
@backend.create_subscription(Subscription.new(@paid_attr)).should == true
|
46
|
+
active_subscriptions.size.should == 1
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should update existing subscriptions' do
|
50
|
+
subscription = Subscription.new(@paid_attr)
|
51
|
+
@backend.create_subscription(subscription).should == true
|
52
|
+
subscription.email = 'updated@recursive-design.com'
|
53
|
+
@backend.update_subscription(subscription).should == true
|
54
|
+
customer = Chargify::Customer.find_by_reference(subscription.customer_code)
|
55
|
+
customer.attributes[:email].should == 'updated@recursive-design.com'
|
56
|
+
active_subscriptions.size.should == 1
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should allow downgrading to a free plan' do
|
60
|
+
subscription = Subscription.new(@paid_attr)
|
61
|
+
@backend.create_subscription(subscription).should == true
|
62
|
+
subscription.plan_code = @free_attr[:plan_code]
|
63
|
+
@backend.update_subscription(subscription).should == true
|
64
|
+
sub = Chargify::Subscription.find_by_customer_reference(subscription.customer_code)
|
65
|
+
sub.product.attributes[:handle].should == @free_attr[:plan_code].downcase
|
66
|
+
active_subscriptions.size.should == 1
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should cancel existing subscriptions' do
|
70
|
+
subscription = Subscription.new(@paid_attr)
|
71
|
+
@backend.create_subscription(subscription).should == true
|
72
|
+
customer = Chargify::Customer.find_by_reference(subscription.customer_code)
|
73
|
+
@backend.cancel_subscription!(subscription.customer_code).should == true
|
74
|
+
sub = Chargify::Subscription.find_by_customer_reference(subscription.customer_code)
|
75
|
+
sub.attributes[:state].should == 'canceled'
|
76
|
+
active_subscriptions.size.should == 0
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
describe 'with invalid parameters' do
|
82
|
+
|
83
|
+
it 'should not create new subscriptions' do
|
84
|
+
@backend.create_subscription(Subscription.new(@paid_attr.merge(:first_name => nil))).should_not == true
|
85
|
+
active_subscriptions.size.should == 0
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should not update existing subscriptions' do
|
89
|
+
subscription = Subscription.new(@paid_attr)
|
90
|
+
@backend.create_subscription(subscription).should == true
|
91
|
+
subscription.email = ''
|
92
|
+
@backend.update_subscription(subscription).should_not == true
|
93
|
+
customer = Chargify::Customer.find_by_reference(subscription.customer_code)
|
94
|
+
customer.attributes[:email].should == @paid_attr[:email]
|
95
|
+
active_subscriptions.size.should == 1
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should not allow downgrading to a free plan' do
|
99
|
+
subscription = Subscription.new(@paid_attr)
|
100
|
+
@backend.create_subscription(subscription).should == true
|
101
|
+
subscription.plan_code = @free_attr[:plan_code]
|
102
|
+
subscription.email = ''
|
103
|
+
@backend.update_subscription(subscription).should_not == true
|
104
|
+
sub = Chargify::Subscription.find_by_customer_reference(subscription.customer_code)
|
105
|
+
sub.product.attributes[:handle].should == @paid_attr[:plan_code].downcase
|
106
|
+
active_subscriptions.size.should == 1
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'should fail to cancel invalid subscriptions' do
|
110
|
+
@backend.cancel_subscription!('invalid-customer-code').should == false
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
describe 'for free accounts' do
|
118
|
+
|
119
|
+
describe 'with valid parameters' do
|
120
|
+
|
121
|
+
it 'should create new subscriptions' do
|
122
|
+
@backend.create_subscription(Subscription.new(@free_attr)).should == true
|
123
|
+
active_subscriptions.size.should == 1
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'should update existing subscriptions' do
|
127
|
+
subscription = Subscription.new(@free_attr)
|
128
|
+
@backend.create_subscription(subscription).should == true
|
129
|
+
subscription.email = 'updated@recursive-design.com'
|
130
|
+
@backend.update_subscription(subscription).should == true
|
131
|
+
customer = Chargify::Customer.find_by_reference(subscription.customer_code)
|
132
|
+
customer.attributes[:email].should == 'updated@recursive-design.com'
|
133
|
+
active_subscriptions.size.should == 1
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should allow upgrading to a paid plan' do
|
137
|
+
subscription = Subscription.new(@free_attr)
|
138
|
+
@backend.create_subscription(subscription).should == true
|
139
|
+
subscription.plan_code = @paid_attr[:plan_code]
|
140
|
+
subscription.cc_number = @paid_attr[:cc_number]
|
141
|
+
subscription.cc_expiration_month = @paid_attr[:cc_expiration_month]
|
142
|
+
subscription.cc_expiration_year = @paid_attr[:cc_expiration_year]
|
143
|
+
subscription.cc_verification_value = @paid_attr[:cc_verification_value]
|
144
|
+
subscription.zip_code = @paid_attr[:zip_code]
|
145
|
+
@backend.update_subscription(subscription).should == true
|
146
|
+
sub = Chargify::Subscription.find_by_customer_reference(subscription.customer_code)
|
147
|
+
sub.product.attributes[:handle].should == @paid_attr[:plan_code].downcase
|
148
|
+
active_subscriptions.size.should == 1
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'should cancel existing subscriptions' do
|
152
|
+
subscription = Subscription.new(@free_attr)
|
153
|
+
@backend.create_subscription(subscription).should == true
|
154
|
+
customer = Chargify::Customer.find_by_reference(subscription.customer_code)
|
155
|
+
@backend.cancel_subscription!(subscription.customer_code).should == true
|
156
|
+
sub = Chargify::Subscription.find_by_customer_reference(subscription.customer_code)
|
157
|
+
sub.attributes[:state].should == 'canceled'
|
158
|
+
active_subscriptions.size.should == 0
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
describe 'with invalid parameters' do
|
164
|
+
|
165
|
+
it 'should not create new subscriptions' do
|
166
|
+
@backend.create_subscription(Subscription.new(@free_attr.merge(:first_name => nil))).should_not == true
|
167
|
+
active_subscriptions.size.should == 0
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'should not update existing subscriptions' do
|
171
|
+
subscription = Subscription.new(@free_attr)
|
172
|
+
@backend.create_subscription(subscription).should == true
|
173
|
+
subscription.email = ''
|
174
|
+
@backend.update_subscription(subscription).should_not == true
|
175
|
+
customer = Chargify::Customer.find_by_reference(subscription.customer_code)
|
176
|
+
customer.attributes[:email].should == @free_attr[:email]
|
177
|
+
active_subscriptions.size.should == 1
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'should not allow upgrading to a paid plan' do
|
181
|
+
subscription = Subscription.new(@free_attr)
|
182
|
+
@backend.create_subscription(subscription).should == true
|
183
|
+
subscription.plan_code = @paid_attr[:plan_code]
|
184
|
+
@backend.update_subscription(subscription).should_not == true
|
185
|
+
sub = Chargify::Subscription.find_by_customer_reference(subscription.customer_code)
|
186
|
+
sub.product.attributes[:handle].should == @free_attr[:plan_code].downcase
|
187
|
+
active_subscriptions.size.should == 1
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
193
|
+
|
194
|
+
end
|
195
|
+
|
196
|
+
|
197
|
+
module Chargify
|
198
|
+
|
199
|
+
class Customer < Base
|
200
|
+
def self.delete!
|
201
|
+
post(:destroy)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
@@ -0,0 +1,191 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'acts_as_subscription/backend/cheddar_getter_client'
|
3
|
+
|
4
|
+
describe ActsAsSubscription::Subscription::Backend::CheddarGetterClient do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
config = backend_config(:cheddar_getter)
|
8
|
+
@free_attr = free_attributes
|
9
|
+
@paid_attr = paid_attributes
|
10
|
+
@backend = ActsAsSubscription::Subscription::Backend::CheddarGetterClient.new(config['user'], config['password'], config['product_code'])
|
11
|
+
|
12
|
+
# Remove any existing customers before each test - quite slow unfortunately.
|
13
|
+
Mousetrap::Customer.all.each do |customer|
|
14
|
+
customer.delete if customer.email.match /@recursive-design.com$/
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'for all accounts' do
|
19
|
+
|
20
|
+
it 'should initialize the mousetrap gem' do
|
21
|
+
Mousetrap.product_code.should == 'ACTS_AS_SUBSCRIPTION_TEST'
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should return a list of plans' do
|
25
|
+
plans = @backend.plans
|
26
|
+
plans.length.should == 3
|
27
|
+
plans.each do |plan|
|
28
|
+
plan[:code].should_not be_nil
|
29
|
+
plan[:name].should_not be_nil
|
30
|
+
plan[:description].should_not be_nil
|
31
|
+
plan[:billing_frequency].should == 'month'
|
32
|
+
plan[:recurring_charge].should_not be_nil
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'for paid accounts' do
|
39
|
+
|
40
|
+
describe 'with valid parameters' do
|
41
|
+
|
42
|
+
it 'should create new subscriptions' do
|
43
|
+
@backend.create_subscription(Subscription.new(@paid_attr)).should == true
|
44
|
+
Mousetrap::Customer.all.size.should == 1
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should update existing subscriptions' do
|
48
|
+
subscription = Subscription.new(@paid_attr)
|
49
|
+
@backend.create_subscription(subscription)
|
50
|
+
subscription.email = 'updated@recursive-design.com'
|
51
|
+
@backend.update_subscription(subscription)
|
52
|
+
Mousetrap::Customer[subscription.customer_code].email.should == 'updated@recursive-design.com'
|
53
|
+
Mousetrap::Customer.all.size.should == 1
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should allow downgrading to a free plan' do
|
57
|
+
subscription = Subscription.new(@paid_attr)
|
58
|
+
@backend.create_subscription(subscription)
|
59
|
+
subscription.plan_code = @free_attr[:plan_code]
|
60
|
+
@backend.update_subscription(subscription)
|
61
|
+
Mousetrap::Customer[subscription.customer_code].subscription.plan.code.should == @free_attr[:plan_code]
|
62
|
+
Mousetrap::Customer.all.size.should == 1
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should cancel existing subscriptions' do
|
66
|
+
subscription = Subscription.new(@paid_attr)
|
67
|
+
@backend.create_subscription(subscription)
|
68
|
+
Mousetrap::Customer[subscription.customer_code].subscription.canceled_at.should == nil
|
69
|
+
@backend.cancel_subscription!(subscription.customer_code).should == true
|
70
|
+
Mousetrap::Customer[subscription.customer_code].subscription.canceled_at.should_not == nil
|
71
|
+
Mousetrap::Customer.all.size.should == 1
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
describe 'with invalid parameters' do
|
77
|
+
|
78
|
+
it 'should not create new subscriptions' do
|
79
|
+
@backend.create_subscription(Subscription.new(@paid_attr.merge(:first_name => nil))).should_not == true
|
80
|
+
Mousetrap::Customer.all.size.should == 0
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should not update existing subscriptions' do
|
84
|
+
subscription = Subscription.new(@paid_attr)
|
85
|
+
@backend.create_subscription(subscription)
|
86
|
+
subscription.email = ''
|
87
|
+
@backend.update_subscription(subscription)
|
88
|
+
Mousetrap::Customer[subscription.customer_code].email.should == 'dummy@recursive-design.com'
|
89
|
+
Mousetrap::Customer.all.size.should == 1
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'should not allow downgrading to a free plan' do
|
93
|
+
subscription = Subscription.new(@paid_attr)
|
94
|
+
@backend.create_subscription(subscription)
|
95
|
+
subscription.plan_code = @free_attr[:plan_code]
|
96
|
+
subscription.email = ''
|
97
|
+
@backend.update_subscription(subscription)
|
98
|
+
Mousetrap::Customer[subscription.customer_code].subscription.plan.code.should == @paid_attr[:plan_code]
|
99
|
+
Mousetrap::Customer.all.size.should == 1
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'should fail to cancel invalid subscriptions' do
|
103
|
+
@backend.cancel_subscription!('invalid-customer-code').should == false
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
describe 'for free accounts' do
|
111
|
+
|
112
|
+
describe 'with valid parameters' do
|
113
|
+
|
114
|
+
it 'should create new subscriptions' do
|
115
|
+
@backend.create_subscription(Subscription.new(@free_attr)).should == true
|
116
|
+
Mousetrap::Customer.all.size.should == 1
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should update existing subscriptions' do
|
120
|
+
subscription = Subscription.new(@free_attr)
|
121
|
+
@backend.create_subscription(subscription)
|
122
|
+
subscription.email = 'updated@recursive-design.com'
|
123
|
+
@backend.update_subscription(subscription)
|
124
|
+
Mousetrap::Customer[subscription.customer_code].email.should == 'updated@recursive-design.com'
|
125
|
+
Mousetrap::Customer.all.size.should == 1
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'should allow upgrading to a paid plan' do
|
129
|
+
subscription = Subscription.new(@free_attr)
|
130
|
+
@backend.create_subscription(subscription)
|
131
|
+
subscription.plan_code = @paid_attr[:plan_code]
|
132
|
+
subscription.cc_number = @paid_attr[:cc_number]
|
133
|
+
subscription.cc_expiration_month = @paid_attr[:cc_expiration_month]
|
134
|
+
subscription.cc_expiration_year = @paid_attr[:cc_expiration_year]
|
135
|
+
subscription.cc_verification_value = @paid_attr[:cc_verification_value]
|
136
|
+
subscription.zip_code = @paid_attr[:zip_code]
|
137
|
+
@backend.update_subscription(subscription)
|
138
|
+
Mousetrap::Customer[subscription.customer_code].subscription.plan.code.should == @paid_attr[:plan_code]
|
139
|
+
Mousetrap::Customer.all.size.should == 1
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'should cancel existing subscriptions' do
|
143
|
+
subscription = Subscription.new(@free_attr)
|
144
|
+
@backend.create_subscription(subscription)
|
145
|
+
Mousetrap::Customer[subscription.customer_code].subscription.canceled_at.should == nil
|
146
|
+
@backend.cancel_subscription!(subscription.customer_code).should == true
|
147
|
+
Mousetrap::Customer[subscription.customer_code].subscription.canceled_at.should_not == nil
|
148
|
+
Mousetrap::Customer.all.size.should == 1
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
describe 'with invalid parameters' do
|
154
|
+
|
155
|
+
it 'should not create new subscriptions' do
|
156
|
+
@backend.create_subscription(Subscription.new(@free_attr.merge(:first_name => nil))).should_not == true
|
157
|
+
Mousetrap::Customer.all.size.should == 0
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'should not update existing subscriptions' do
|
161
|
+
subscription = Subscription.new(@free_attr)
|
162
|
+
@backend.create_subscription(subscription)
|
163
|
+
subscription.email = ''
|
164
|
+
@backend.update_subscription(subscription)
|
165
|
+
Mousetrap::Customer[subscription.customer_code].email.should == 'dummy@recursive-design.com'
|
166
|
+
Mousetrap::Customer.all.size.should == 1
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'should not allow upgrading to a paid plan without credit card info' do
|
170
|
+
subscription = Subscription.new(@free_attr)
|
171
|
+
@backend.create_subscription(subscription)
|
172
|
+
subscription.plan_code = @paid_attr[:plan_code]
|
173
|
+
@backend.update_subscription(subscription)
|
174
|
+
Mousetrap::Customer[subscription.customer_code].subscription.plan.code.should == @free_attr[:plan_code]
|
175
|
+
Mousetrap::Customer.all.size.should == 1
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
183
|
+
|
184
|
+
|
185
|
+
module Mousetrap
|
186
|
+
class Customer
|
187
|
+
def delete
|
188
|
+
member_action 'delete' unless new_record?
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActsAsSubscription::Subscription::Backend do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@attr = {
|
7
|
+
:backend => :dummy,
|
8
|
+
:product_code => 'DUMMY_TEST',
|
9
|
+
:user => 'user',
|
10
|
+
:password => 'pass'
|
11
|
+
}
|
12
|
+
|
13
|
+
@backend = ActsAsSubscription::Subscription::Backend
|
14
|
+
@backend.instance = nil
|
15
|
+
@subscription = Subscription.new(paid_attributes)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'validation' do
|
19
|
+
|
20
|
+
it 'should require a :backend' do
|
21
|
+
lambda {
|
22
|
+
@backend.initialize(@attr.merge(:backend => nil))
|
23
|
+
}.should raise_error(ActsAsSubscription::Subscription::Error::ArgumentError)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should make sure :backend exists' do
|
27
|
+
lambda {
|
28
|
+
@backend.initialize(@attr.merge(:backend => :non_existent))
|
29
|
+
}.should raise_error(ActsAsSubscription::Subscription::Error::BackendError)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should accept a valid :backend' do
|
33
|
+
lambda {
|
34
|
+
@backend.initialize(@attr.merge(:backend => :dummy))
|
35
|
+
}.should_not raise_error(ActsAsSubscription::Subscription::Error::ArgumentError)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should require a :product_code' do
|
39
|
+
lambda {
|
40
|
+
@backend.initialize(@attr.merge(:product_code => nil))
|
41
|
+
}.should raise_error(ActsAsSubscription::Subscription::Error::ArgumentError)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should require a :user' do
|
45
|
+
lambda {
|
46
|
+
@backend.initialize(@attr.merge(:user => nil))
|
47
|
+
}.should raise_error(ActsAsSubscription::Subscription::Error::ArgumentError)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should require a :password' do
|
51
|
+
lambda {
|
52
|
+
@backend.initialize(@attr.merge(:password => nil))
|
53
|
+
}.should raise_error(ActsAsSubscription::Subscription::Error::ArgumentError)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should instantiate a backend given valid params' do
|
57
|
+
@backend.initialize(@attr)
|
58
|
+
@backend.instance.should_not == nil
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
describe 'operations' do
|
64
|
+
|
65
|
+
it 'should respond to create_subscription' do
|
66
|
+
@backend.initialize(@attr)
|
67
|
+
@backend.create_subscription(@subscription).should == true
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should respond to update_subscription' do
|
71
|
+
@backend.initialize(@attr)
|
72
|
+
@backend.update_subscription(@subscription).should == true
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'should respond to cancel_subscription!' do
|
76
|
+
@backend.initialize(@attr)
|
77
|
+
@backend.cancel_subscription!(@subscription).should == true
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'spec/spec_helper'
|
2
|
+
|
3
|
+
describe SubscriptionPlan do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
ActsAsSubscription::Subscription::Backend.config = {
|
7
|
+
:backend => :dummy,
|
8
|
+
:user => 'my_user',
|
9
|
+
:password => 'my_pass',
|
10
|
+
:product_code => 'my_product'
|
11
|
+
}
|
12
|
+
|
13
|
+
@attr = {
|
14
|
+
:code => 'FREE',
|
15
|
+
:name => 'free test plan',
|
16
|
+
:description => 'a bargain',
|
17
|
+
:billing_frequency => 'monthly',
|
18
|
+
:recurring_charge => 0.0
|
19
|
+
}
|
20
|
+
|
21
|
+
SubscriptionPlan.find(:all).each do |plan|
|
22
|
+
plan.destroy
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'validation' do
|
27
|
+
|
28
|
+
it 'should accept valid attributes' do
|
29
|
+
plan = SubscriptionPlan.new(@attr)
|
30
|
+
plan.should be_valid
|
31
|
+
lambda do
|
32
|
+
plan.save
|
33
|
+
end.should change(SubscriptionPlan, :count).by(1)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should require a plan_code' do
|
37
|
+
plan = SubscriptionPlan.new(@attr.merge(:code => ''))
|
38
|
+
plan.should_not be_valid
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should ensure that plan_code is unique' do
|
42
|
+
plan = SubscriptionPlan.new(@attr.merge(:code => 'unique'))
|
43
|
+
plan.should be_valid
|
44
|
+
plan.save
|
45
|
+
plan = SubscriptionPlan.new(@attr.merge(:code => 'unique'))
|
46
|
+
plan.should_not be_valid
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should require a name' do
|
50
|
+
plan = SubscriptionPlan.new(@attr.merge(:name => ''))
|
51
|
+
plan.should_not be_valid
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should require a billing_frequency' do
|
55
|
+
plan = SubscriptionPlan.new(@attr.merge(:billing_frequency => ''))
|
56
|
+
plan.should_not be_valid
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should require a numeric recurring_charge' do
|
60
|
+
plan = SubscriptionPlan.new(@attr.merge(:recurring_charge => 'zero'))
|
61
|
+
plan.should_not be_valid
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should require a positive recurring_charge' do
|
65
|
+
plan = SubscriptionPlan.new(@attr.merge(:recurring_charge => -1))
|
66
|
+
plan.should_not be_valid
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should accept a recurring_charge of up to two decimal places' do
|
70
|
+
plan = SubscriptionPlan.new(@attr.merge(:name => 'test 1', :recurring_charge => 0))
|
71
|
+
plan.should be_valid
|
72
|
+
plan = SubscriptionPlan.new(@attr.merge(:name => 'test 2', :recurring_charge => 0.1))
|
73
|
+
plan.should be_valid
|
74
|
+
plan = SubscriptionPlan.new(@attr.merge(:name => 'test 3', :recurring_charge => 0.01))
|
75
|
+
plan.should be_valid
|
76
|
+
plan = SubscriptionPlan.new(@attr.merge(:name => 'test 4', :recurring_charge => 0.001))
|
77
|
+
plan.should_not be_valid
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
describe 'syncing' do
|
83
|
+
|
84
|
+
it 'should populate the database with plan records' do
|
85
|
+
SubscriptionPlan.sync!
|
86
|
+
SubscriptionPlan.find(:all).length.should == 3
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should update existing records if possible' do
|
90
|
+
plan = SubscriptionPlan.new(@attr)
|
91
|
+
plan.name.should == @attr[:name]
|
92
|
+
plan.save
|
93
|
+
SubscriptionPlan.sync!
|
94
|
+
SubscriptionPlan.find(:all).length.should == 3
|
95
|
+
SubscriptionPlan.find(plan.id).name.should_not == plan.name
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
describe 'form options' do
|
101
|
+
|
102
|
+
it 'should populate the form_options array' do
|
103
|
+
SubscriptionPlan.sync!
|
104
|
+
plans = SubscriptionPlan.find_all_by_active(true)
|
105
|
+
options = SubscriptionPlan.form_options
|
106
|
+
options.length.should == 3
|
107
|
+
plans.each do |plan|
|
108
|
+
if plan.recurring_charge > 0
|
109
|
+
options.include?(["#{plan.name} ($#{plan.recurring_charge})", plan.code]).should == true
|
110
|
+
else
|
111
|
+
options.include?([plan.name, plan.code]).should == true
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|