paid_up 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +3 -0
- data/README.md +28 -20
- data/VERSION +1 -1
- data/app/helpers/paid_up/features_helper.rb +3 -3
- data/app/models/paid_up/ability.rb +29 -11
- data/app/models/paid_up/feature.rb +70 -8
- data/app/models/paid_up/features_plan.rb +1 -2
- data/app/models/paid_up/plan.rb +9 -13
- data/app/models/paid_up/unlimited.rb +15 -0
- data/app/views/paid_up/features/_abilities_table.html.haml +13 -4
- data/app/views/paid_up/subscriptions/new.html.haml +20 -20
- data/bin/rails +8 -1
- data/config/locales/en.yml +4 -1
- data/coverage/.last_run.json +1 -1
- data/coverage/.resultset.json +291 -145
- data/db/migrate/20150407105900_create_paid_up_features_plans_table.rb +1 -1
- data/lib/generators/paid_up/install/install_generator.rb +6 -0
- data/lib/generators/paid_up/install/templates/initializer.rb +21 -1
- data/lib/paid_up/{integer.rb → extensions/integer.rb} +2 -4
- data/lib/paid_up/{stripe_extensions.rb → extensions/stripe.rb} +3 -6
- data/lib/paid_up/mixins/paid_for.rb +24 -0
- data/lib/paid_up/{mixins.rb → mixins/subscriber.rb} +28 -22
- data/lib/paid_up/validators/rolify_rows.rb +9 -0
- data/lib/paid_up/{table_validator.rb → validators/table_rows.rb} +2 -2
- data/lib/paid_up.rb +27 -7
- data/paid_up.gemspec +26 -16
- data/spec/dummy/app/models/ability.rb +0 -1
- data/spec/dummy/app/models/doodad.rb +3 -0
- data/spec/dummy/app/models/group.rb +1 -1
- data/spec/dummy/app/models/role.rb +10 -0
- data/spec/dummy/app/models/user.rb +2 -3
- data/spec/dummy/bin/rspec +3 -0
- data/spec/dummy/config/application.rb +0 -1
- data/spec/dummy/config/initializers/paid_up.rb +21 -1
- data/spec/dummy/config/initializers/rolify.rb +7 -0
- data/spec/dummy/config/routes.rb +10 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20150517175135_create_groups_table.rb +0 -1
- data/spec/dummy/db/migrate/20150517175136_create_doodads_table.rb +9 -0
- data/spec/dummy/db/migrate/{20150518000915_add_devise_to_users.rb → 20150523010827_add_devise_to_users.rb} +0 -0
- data/spec/dummy/db/migrate/20150523010837_rolify_create_roles.rb +19 -0
- data/spec/dummy/db/migrate/{20150518000917_create_paid_up_features_plans_table.paid_up.rb → 20150523010838_create_paid_up_features_plans_table.paid_up.rb} +1 -1
- data/spec/dummy/db/migrate/{20150518000919_create_paid_up_plans_table.paid_up.rb → 20150523010839_create_paid_up_plans_table.paid_up.rb} +0 -0
- data/spec/dummy/db/migrate/{20150519164355_add_stripe_id_column_to_users.paid_up.rb → 20150523010840_add_stripe_id_column_to_users.paid_up.rb} +0 -0
- data/spec/dummy/db/schema.rb +29 -15
- data/spec/dummy/db/seeds/features_plans.seeds.rb +9 -9
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +932 -108863
- data/spec/models/paid_up/feature_spec.rb +23 -5
- data/spec/models/paid_up/features_plan_spec.rb +2 -1
- data/spec/models/paid_up/plan_spec.rb +8 -32
- data/spec/models/user_spec.rb +110 -37
- data/spec/rails_helper.rb +1 -0
- data/spec/support/plans_and_features.rb +16 -62
- data/spec/views/paid_up/subscriptions_spec.rb +1 -1
- metadata +47 -15
- data/db/migrate/20150407110100_create_paid_up_features_table.rb +0 -11
- data/lib/paid_up/unlimited.rb +0 -17
- data/spec/dummy/db/migrate/20150518000918_create_paid_up_features_table.paid_up.rb +0 -12
- data/spec/dummy/db/seeds/features.seeds.rb +0 -19
- data/spec/dummy/test/controllers/plans_controller_controller_test.rb +0 -7
@@ -1,21 +1,39 @@
|
|
1
1
|
require 'rails_helper'
|
2
2
|
|
3
3
|
describe PaidUp::Feature do
|
4
|
-
it { should
|
5
|
-
it { should have_many(:plans).class_name('PaidUp::Plan').through(:features_plans) }
|
6
|
-
it { should validate_presence_of(:name) }
|
4
|
+
it { should validate_presence_of(:slug) }
|
7
5
|
it { should validate_presence_of(:title) }
|
8
6
|
it { should validate_presence_of(:setting_type) }
|
7
|
+
it { should validate_inclusion_of(:setting_type).in_array(%w(boolean table_rows rolify_rows))}
|
9
8
|
|
9
|
+
include_context 'plans and features'
|
10
10
|
context '#feature_model' do
|
11
|
-
include_context 'plans and features'
|
12
11
|
subject { groups_feature.feature_model }
|
13
12
|
it { should eq Group }
|
14
13
|
end
|
15
14
|
|
16
15
|
context '#feature_model_name' do
|
17
|
-
include_context 'plans and features'
|
18
16
|
subject { groups_feature.feature_model_name }
|
19
17
|
it { should eq 'Group' }
|
20
18
|
end
|
19
|
+
|
20
|
+
context '.all' do
|
21
|
+
subject { PaidUp::Feature.all }
|
22
|
+
it { should eq [ad_free_feature, groups_feature, doodads_feature] }
|
23
|
+
end
|
24
|
+
|
25
|
+
context '.find_by_slug' do
|
26
|
+
subject { PaidUp::Feature.find_by_slug('groups') }
|
27
|
+
it { should be_a PaidUp::Feature }
|
28
|
+
end
|
29
|
+
|
30
|
+
context '.find_all' do
|
31
|
+
subject { PaidUp::Feature.find_all( setting_type: 'rolify_rows') }
|
32
|
+
it { should be_an Array }
|
33
|
+
end
|
34
|
+
|
35
|
+
context '.find' do
|
36
|
+
subject { PaidUp::Feature.find(setting_type: 'rolify_rows') }
|
37
|
+
it { should be_a PaidUp::Feature }
|
38
|
+
end
|
21
39
|
end
|
@@ -2,6 +2,7 @@ require 'rails_helper'
|
|
2
2
|
|
3
3
|
describe PaidUp::FeaturesPlan do
|
4
4
|
it { should belong_to(:plan).class_name("PaidUp::Plan") }
|
5
|
-
it { should belong_to(:feature).class_name("PaidUp::Feature") }
|
6
5
|
it { should validate_presence_of(:setting) }
|
6
|
+
it { should validate_presence_of(:plan) }
|
7
|
+
it { should validate_presence_of(:feature) }
|
7
8
|
end
|
@@ -4,8 +4,8 @@ describe PaidUp::Plan do
|
|
4
4
|
it { should have_many(:features_plans).class_name('PaidUp::FeaturesPlan') }
|
5
5
|
it { should have_many(:features).class_name('PaidUp::Feature').through(:features_plans) }
|
6
6
|
|
7
|
-
it { should validate_presence_of(:description) }
|
8
7
|
it { should validate_presence_of(:name) }
|
8
|
+
it { should validate_presence_of(:stripe_id) }
|
9
9
|
|
10
10
|
include_context 'plans and features'
|
11
11
|
|
@@ -26,46 +26,22 @@ describe PaidUp::Plan do
|
|
26
26
|
describe '#feature_setting' do
|
27
27
|
describe 'when setting_type is integer' do
|
28
28
|
context 'returns the setting value if available' do
|
29
|
-
subject { group_leader_plan.feature_setting(
|
29
|
+
subject { group_leader_plan.feature_setting('groups') }
|
30
30
|
it { should eq(1) }
|
31
31
|
end
|
32
32
|
context 'returns 0 if not available' do
|
33
|
-
subject { free_plan.feature_setting(
|
33
|
+
subject { free_plan.feature_setting('groups') }
|
34
34
|
it { should eq(0) }
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
describe 'when setting_type is boolean' do
|
39
39
|
context 'returns the setting value if available' do
|
40
|
-
subject { group_leader_plan.feature_setting(
|
40
|
+
subject { group_leader_plan.feature_setting('ad_free') }
|
41
41
|
it { should eq(true) }
|
42
42
|
end
|
43
43
|
context 'returns false if not available' do
|
44
|
-
subject { free_plan.feature_setting(
|
45
|
-
it { should eq(false) }
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe '#feature_setting_by_name' do
|
51
|
-
describe 'when setting_type is integer' do
|
52
|
-
context 'returns the setting value if available' do
|
53
|
-
subject { group_leader_plan.feature_setting_by_name('groups') }
|
54
|
-
it { should eq(1) }
|
55
|
-
end
|
56
|
-
context 'returns 0 if not available' do
|
57
|
-
subject { free_plan.feature_setting_by_name('groups') }
|
58
|
-
it { should eq(0) }
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
describe 'when setting_type is boolean' do
|
63
|
-
context 'returns the setting value if available' do
|
64
|
-
subject { group_leader_plan.feature_setting_by_name('ad_free') }
|
65
|
-
it { should eq(true) }
|
66
|
-
end
|
67
|
-
context 'returns false if not available' do
|
68
|
-
subject { free_plan.feature_setting_by_name('ad_free') }
|
44
|
+
subject { free_plan.feature_setting('ad_free') }
|
69
45
|
it { should eq(false) }
|
70
46
|
end
|
71
47
|
end
|
@@ -73,15 +49,15 @@ describe PaidUp::Plan do
|
|
73
49
|
|
74
50
|
describe '#feature_unlimited?' do
|
75
51
|
context 'returns true if unlimited' do
|
76
|
-
subject { professional_plan.feature_unlimited?(
|
52
|
+
subject { professional_plan.feature_unlimited?('groups') }
|
77
53
|
it { should eq(true) }
|
78
54
|
end
|
79
55
|
context 'returns false if an integer' do
|
80
|
-
subject { group_leader_plan.feature_unlimited?(
|
56
|
+
subject { group_leader_plan.feature_unlimited?('groups') }
|
81
57
|
it { should eq(false) }
|
82
58
|
end
|
83
59
|
context 'returns false if not found' do
|
84
|
-
subject { free_plan.feature_unlimited?(
|
60
|
+
subject { free_plan.feature_unlimited?('groups') }
|
85
61
|
it { should eq(false) }
|
86
62
|
end
|
87
63
|
end
|
data/spec/models/user_spec.rb
CHANGED
@@ -79,61 +79,123 @@ describe User do
|
|
79
79
|
|
80
80
|
context '#table_rows_remaining' do
|
81
81
|
context 'when using a plan without the feature' do
|
82
|
-
subject { no_ads_subscriber.table_rows_remaining '
|
82
|
+
subject { no_ads_subscriber.table_rows_remaining 'doodads' }
|
83
83
|
it { should eq 0 }
|
84
84
|
end
|
85
85
|
context 'when subscribed to a plan with the feature limited' do
|
86
|
-
subject { group_leader_subscriber.table_rows_remaining '
|
87
|
-
it { should eq
|
86
|
+
subject { group_leader_subscriber.table_rows_remaining 'doodads' }
|
87
|
+
it { should eq 5 }
|
88
88
|
end
|
89
89
|
context 'when subscribed to a plan with the feature unlimited' do
|
90
|
-
subject { professional_subscriber.table_rows_remaining '
|
90
|
+
subject { professional_subscriber.table_rows_remaining 'doodads' }
|
91
91
|
it { should eq PaidUp::Unlimited.to_i }
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
95
|
context '#table_rows_unlimited?' do
|
96
96
|
context 'when using a plan without the feature' do
|
97
|
-
subject { no_ads_subscriber.table_rows_unlimited? '
|
97
|
+
subject { no_ads_subscriber.table_rows_unlimited? 'doodads' }
|
98
98
|
it { should eq false }
|
99
99
|
end
|
100
100
|
context 'when subscribed to a plan with the feature limited' do
|
101
|
-
subject { group_leader_subscriber.table_rows_unlimited? '
|
101
|
+
subject { group_leader_subscriber.table_rows_unlimited? 'doodads' }
|
102
102
|
it { should eq false }
|
103
103
|
end
|
104
104
|
context 'when subscribed to a plan with the feature unlimited' do
|
105
|
-
subject { professional_subscriber.table_rows_unlimited? '
|
105
|
+
subject { professional_subscriber.table_rows_unlimited? 'doodads' }
|
106
106
|
it { should eq true }
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
110
|
context '#table_rows_allowed' do
|
111
111
|
context 'when using a plan without the feature' do
|
112
|
-
subject { no_ads_subscriber.table_rows_allowed '
|
112
|
+
subject { no_ads_subscriber.table_rows_allowed 'doodads' }
|
113
113
|
it { should eq 0 }
|
114
114
|
end
|
115
115
|
context 'when subscribed to a plan with the feature limited' do
|
116
|
-
subject { group_leader_subscriber.table_rows_allowed '
|
117
|
-
it { should eq
|
116
|
+
subject { group_leader_subscriber.table_rows_allowed 'doodads' }
|
117
|
+
it { should eq 5 }
|
118
118
|
end
|
119
119
|
context 'when subscribed to a plan with the feature unlimited' do
|
120
|
-
subject { professional_subscriber.table_rows_allowed '
|
120
|
+
subject { professional_subscriber.table_rows_allowed 'doodads' }
|
121
121
|
it { should eq PaidUp::Unlimited.to_i }
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
125
125
|
context '#table_rows' do
|
126
126
|
context 'when possessing no rows' do
|
127
|
-
subject { professional_subscriber.table_rows '
|
127
|
+
subject { professional_subscriber.table_rows 'doodads' }
|
128
|
+
it { should eq 0 }
|
129
|
+
end
|
130
|
+
context 'when possessing 3 rows' do
|
131
|
+
before do
|
132
|
+
3.times do
|
133
|
+
professional_subscriber.doodads.create! name: 'Test Doodad'
|
134
|
+
end
|
135
|
+
end
|
136
|
+
subject { professional_subscriber.table_rows 'doodads' }
|
137
|
+
it { should eq 3 }
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
context '#rolify_rows_remaining' do
|
142
|
+
context 'when using a plan without the feature' do
|
143
|
+
subject { no_ads_subscriber.rolify_rows_remaining 'groups' }
|
144
|
+
it { should eq 0 }
|
145
|
+
end
|
146
|
+
context 'when subscribed to a plan with the feature limited' do
|
147
|
+
subject { group_leader_subscriber.rolify_rows_remaining 'groups' }
|
148
|
+
it { should eq 1 }
|
149
|
+
end
|
150
|
+
context 'when subscribed to a plan with the feature unlimited' do
|
151
|
+
subject { professional_subscriber.rolify_rows_remaining 'groups' }
|
152
|
+
it { should eq PaidUp::Unlimited.to_i }
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
context '#rolify_rows_unlimited?' do
|
157
|
+
context 'when using a plan without the feature' do
|
158
|
+
subject { no_ads_subscriber.rolify_rows_unlimited? 'groups' }
|
159
|
+
it { should eq false }
|
160
|
+
end
|
161
|
+
context 'when subscribed to a plan with the feature limited' do
|
162
|
+
subject { group_leader_subscriber.rolify_rows_unlimited? 'groups' }
|
163
|
+
it { should eq false }
|
164
|
+
end
|
165
|
+
context 'when subscribed to a plan with the feature unlimited' do
|
166
|
+
subject { professional_subscriber.rolify_rows_unlimited? 'groups' }
|
167
|
+
it { should eq true }
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
context '#rolify_rows_allowed' do
|
172
|
+
context 'when using a plan without the feature' do
|
173
|
+
subject { no_ads_subscriber.rolify_rows_allowed 'groups' }
|
174
|
+
it { should eq 0 }
|
175
|
+
end
|
176
|
+
context 'when subscribed to a plan with the feature limited' do
|
177
|
+
subject { group_leader_subscriber.rolify_rows_allowed 'groups' }
|
178
|
+
it { should eq 1 }
|
179
|
+
end
|
180
|
+
context 'when subscribed to a plan with the feature unlimited' do
|
181
|
+
subject { professional_subscriber.rolify_rows_allowed 'groups' }
|
182
|
+
it { should eq PaidUp::Unlimited.to_i }
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
context '#rolify_rows' do
|
187
|
+
context 'when possessing no rows' do
|
188
|
+
subject { professional_subscriber.rolify_rows 'groups' }
|
128
189
|
it { should eq 0 }
|
129
190
|
end
|
130
191
|
context 'when possessing 3 rows' do
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
192
|
+
before do
|
193
|
+
3.times do
|
194
|
+
group = Group.create! name: 'Test Group'
|
195
|
+
professional_subscriber.add_role(:owner, group)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
subject { professional_subscriber.rolify_rows 'groups' }
|
137
199
|
it { should eq 3 }
|
138
200
|
end
|
139
201
|
end
|
@@ -234,70 +296,81 @@ describe User do
|
|
234
296
|
|
235
297
|
|
236
298
|
describe "Abilities" do
|
237
|
-
subject(:ability){ Ability.new(user) }
|
238
299
|
|
239
300
|
context "when anonymous" do
|
240
|
-
let(:
|
301
|
+
let(:group) { Group.create!(name: 'Test Group') }
|
302
|
+
let(:user){ nil }
|
303
|
+
subject(:ability){ Ability.new(user) }
|
241
304
|
it{ should be_able_to(:read, Group) }
|
242
|
-
it{ should_not be_able_to(:manage,
|
305
|
+
it{ should_not be_able_to(:manage, group) }
|
243
306
|
it{ should_not be_able_to(:own, Group) }
|
244
307
|
it{ should_not be_able_to(:create, Group) }
|
245
308
|
it{ should_not be_able_to(:use, :ad_free) }
|
246
|
-
it{ should_not be_able_to(:
|
309
|
+
it{ should_not be_able_to(:create, Doodad) }
|
247
310
|
end
|
248
311
|
context "when on free plan" do
|
312
|
+
let(:group) { Group.create!(name: 'Test Group') }
|
249
313
|
let(:user){ free_subscriber }
|
314
|
+
subject(:ability){ Ability.new(user) }
|
250
315
|
it{ should be_able_to(:read, Group) }
|
251
|
-
it{ should_not be_able_to(:manage,
|
316
|
+
it{ should_not be_able_to(:manage, group) }
|
252
317
|
it{ should_not be_able_to(:own, Group) }
|
253
318
|
it{ should_not be_able_to(:create, Group) }
|
254
319
|
it{ should_not be_able_to(:use, :ad_free) }
|
255
|
-
it{ should_not be_able_to(:
|
320
|
+
it{ should_not be_able_to(:create, Doodad) }
|
256
321
|
end
|
257
322
|
context "when on group plan" do
|
258
323
|
context "given no groups are owned" do
|
324
|
+
let(:group) { Group.create!(name: 'Test Group') }
|
259
325
|
let(:user){ group_leader_subscriber }
|
326
|
+
subject(:ability){ Ability.new(user) }
|
260
327
|
it{ should be_able_to(:read, Group) }
|
261
|
-
it{
|
328
|
+
it{ should_not be_able_to(:manage, group) }
|
262
329
|
it{ should be_able_to(:own, Group) }
|
263
330
|
it{ should be_able_to(:create, Group) }
|
264
331
|
it{ should be_able_to(:use, :ad_free) }
|
265
|
-
it{
|
332
|
+
it{ should be_able_to(:create, Doodad) }
|
266
333
|
end
|
267
334
|
context "given one group is owned" do
|
268
|
-
let(:
|
269
|
-
|
270
|
-
group_leader_subscriber.
|
335
|
+
let(:group) { Group.create!(name: 'Test Group') }
|
336
|
+
let(:user) {
|
337
|
+
group_leader_subscriber.add_role(:owner, group)
|
338
|
+
group_leader_subscriber
|
271
339
|
}
|
340
|
+
subject(:ability){ Ability.new(user) }
|
272
341
|
it{ should be_able_to(:read, Group) }
|
273
|
-
it{ should be_able_to(:manage,
|
342
|
+
it{ should be_able_to(:manage, group) }
|
274
343
|
it{ should be_able_to(:own, Group) }
|
275
344
|
it{ should_not be_able_to(:create, Group) }
|
276
345
|
it{ should be_able_to(:use, :ad_free) }
|
277
|
-
it{
|
346
|
+
it{ should be_able_to(:create, Doodad) }
|
278
347
|
end
|
279
348
|
end
|
280
349
|
context "when on professional plan" do
|
281
350
|
context "given no groups are owned" do
|
351
|
+
let(:group) { Group.create!(name: 'Test Group') }
|
282
352
|
let(:user){ professional_subscriber }
|
353
|
+
subject(:ability){ Ability.new(user) }
|
283
354
|
it{ should be_able_to(:read, Group) }
|
284
|
-
it{
|
355
|
+
it{ should_not be_able_to(:manage, group) }
|
285
356
|
it{ should be_able_to(:own, Group) }
|
286
357
|
it{ should be_able_to(:create, Group) }
|
287
358
|
it{ should be_able_to(:use, :ad_free) }
|
288
|
-
it{ should be_able_to(:
|
359
|
+
it{ should be_able_to(:create, Doodad) }
|
289
360
|
end
|
290
361
|
context "given one group is owned" do
|
362
|
+
let(:group){ Group.create!(name: 'Test Group') }
|
291
363
|
let(:user){
|
292
|
-
professional_subscriber.
|
293
|
-
professional_subscriber
|
364
|
+
professional_subscriber.add_role(:owner, group)
|
365
|
+
professional_subscriber
|
294
366
|
}
|
367
|
+
subject(:ability){ Ability.new(user) }
|
295
368
|
it{ should be_able_to(:read, Group) }
|
296
|
-
it{ should be_able_to(:manage,
|
369
|
+
it{ should be_able_to(:manage, group) }
|
297
370
|
it{ should be_able_to(:own, Group) }
|
298
371
|
it{ should be_able_to(:create, Group) }
|
299
372
|
it{ should be_able_to(:use, :ad_free) }
|
300
|
-
it{ should be_able_to(:
|
373
|
+
it{ should be_able_to(:create, Doodad) }
|
301
374
|
end
|
302
375
|
end
|
303
376
|
end
|
data/spec/rails_helper.rb
CHANGED
@@ -9,6 +9,7 @@ require 'rspec/rails'
|
|
9
9
|
# Add additional requires below this line. Rails is not loaded until this point!
|
10
10
|
require 'shoulda/matchers'
|
11
11
|
require 'factory_girl_rails'
|
12
|
+
require 'capybara/rspec'
|
12
13
|
|
13
14
|
# Requires supporting ruby files with custom matchers and macros, etc, in
|
14
15
|
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
|
@@ -1,44 +1,13 @@
|
|
1
1
|
shared_context "plans and features" do
|
2
2
|
include_context 'stripe'
|
3
|
-
|
3
|
+
|
4
4
|
############
|
5
5
|
# Features #
|
6
6
|
############
|
7
7
|
|
8
|
-
let!(:ad_free_feature) {
|
9
|
-
|
10
|
-
|
11
|
-
title: 'Ad Free',
|
12
|
-
setting_type: 'boolean'
|
13
|
-
) }
|
14
|
-
|
15
|
-
let!(:groups_feature) { FactoryGirl.create(
|
16
|
-
:feature,
|
17
|
-
name: 'groups',
|
18
|
-
title: 'Groups',
|
19
|
-
setting_type: 'table_rows'
|
20
|
-
) }
|
21
|
-
|
22
|
-
let!(:configuration_feature) { FactoryGirl.create(
|
23
|
-
:feature,
|
24
|
-
name: 'configuration',
|
25
|
-
title: 'Configuration',
|
26
|
-
setting_type: 'boolean'
|
27
|
-
) }
|
28
|
-
|
29
|
-
let!(:theme_feature) { FactoryGirl.create(
|
30
|
-
:feature,
|
31
|
-
name: 'theme',
|
32
|
-
title: 'Theme',
|
33
|
-
setting_type: 'boolean'
|
34
|
-
) }
|
35
|
-
|
36
|
-
let!(:calendar_feature) { FactoryGirl.create(
|
37
|
-
:feature,
|
38
|
-
name: 'calendar',
|
39
|
-
title: 'Calendar',
|
40
|
-
setting_type: 'boolean'
|
41
|
-
) }
|
8
|
+
let!(:ad_free_feature) { PaidUp::Feature.find_by_slug('ad_free') }
|
9
|
+
let!(:groups_feature) { PaidUp::Feature.find_by_slug('groups') }
|
10
|
+
let!(:doodads_feature) { PaidUp::Feature.find_by_slug('doodads') }
|
42
11
|
|
43
12
|
#########
|
44
13
|
# Plans #
|
@@ -101,7 +70,8 @@ shared_context "plans and features" do
|
|
101
70
|
FactoryGirl.create(
|
102
71
|
:features_plan,
|
103
72
|
plan_id: no_ads_plan.id,
|
104
|
-
|
73
|
+
feature: 'ad_free',
|
74
|
+
setting: true
|
105
75
|
)
|
106
76
|
}
|
107
77
|
let!(:group_leader_plan) {
|
@@ -126,7 +96,7 @@ shared_context "plans and features" do
|
|
126
96
|
FactoryGirl.create(
|
127
97
|
:features_plan,
|
128
98
|
plan_id: group_leader_plan.id,
|
129
|
-
|
99
|
+
feature: 'ad_free',
|
130
100
|
setting: true
|
131
101
|
)
|
132
102
|
}
|
@@ -134,16 +104,16 @@ shared_context "plans and features" do
|
|
134
104
|
FactoryGirl.create(
|
135
105
|
:features_plan,
|
136
106
|
plan_id: group_leader_plan.id,
|
137
|
-
|
107
|
+
feature: 'groups',
|
138
108
|
setting: 1
|
139
109
|
)
|
140
110
|
}
|
141
|
-
let!(:
|
111
|
+
let!(:doodads_group_leader_features_plan) {
|
142
112
|
FactoryGirl.create(
|
143
113
|
:features_plan,
|
144
114
|
plan_id: group_leader_plan.id,
|
145
|
-
|
146
|
-
setting:
|
115
|
+
feature: 'doodads',
|
116
|
+
setting: 5
|
147
117
|
)
|
148
118
|
}
|
149
119
|
let!(:professional_plan) {
|
@@ -169,7 +139,7 @@ shared_context "plans and features" do
|
|
169
139
|
FactoryGirl.create(
|
170
140
|
:features_plan,
|
171
141
|
plan_id: professional_plan.id,
|
172
|
-
|
142
|
+
feature: 'ad_free',
|
173
143
|
setting: true
|
174
144
|
)
|
175
145
|
}
|
@@ -177,32 +147,16 @@ shared_context "plans and features" do
|
|
177
147
|
FactoryGirl.create(
|
178
148
|
:features_plan,
|
179
149
|
plan_id: professional_plan.id,
|
180
|
-
|
150
|
+
feature: 'groups',
|
181
151
|
setting: PaidUp::Unlimited.to_i(:db)
|
182
152
|
)
|
183
153
|
}
|
184
|
-
let!(:
|
185
|
-
FactoryGirl.create(
|
186
|
-
:features_plan,
|
187
|
-
plan_id: professional_plan.id,
|
188
|
-
feature_id: configuration_feature.id,
|
189
|
-
setting: true
|
190
|
-
)
|
191
|
-
}
|
192
|
-
let!(:theme_professional_features_plan) {
|
193
|
-
FactoryGirl.create(
|
194
|
-
:features_plan,
|
195
|
-
plan_id: professional_plan.id,
|
196
|
-
feature_id: theme_feature.id,
|
197
|
-
setting: true
|
198
|
-
)
|
199
|
-
}
|
200
|
-
let!(:calendar_professional_features_plan) {
|
154
|
+
let!(:doodads_professional_features_plan) {
|
201
155
|
FactoryGirl.create(
|
202
156
|
:features_plan,
|
203
157
|
plan_id: professional_plan.id,
|
204
|
-
|
205
|
-
setting:
|
158
|
+
feature: 'doodads',
|
159
|
+
setting: PaidUp::Unlimited.to_i(:db)
|
206
160
|
)
|
207
161
|
}
|
208
162
|
|
@@ -52,7 +52,7 @@ RSpec.describe "paid_up/subscriptions/index" do
|
|
52
52
|
it { should match /Group Leader/ }
|
53
53
|
it { should have_selector 'table.abilities #ad_free_ability .glyphicon-ok'}
|
54
54
|
it { should have_selector 'table.abilities #groups_ability .glyphicon-ok'}
|
55
|
-
it { should have_selector 'table.abilities #
|
55
|
+
it { should have_selector 'table.abilities #doodads_ability .glyphicon-ok'}
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paid_up
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karen Lundgren
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -178,6 +178,20 @@ dependencies:
|
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '1.6'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: rolify
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '4'
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '4'
|
181
195
|
- !ruby/object:Gem::Dependency
|
182
196
|
name: stripe
|
183
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -248,6 +262,20 @@ dependencies:
|
|
248
262
|
- - "~>"
|
249
263
|
- !ruby/object:Gem::Version
|
250
264
|
version: '5.0'
|
265
|
+
- !ruby/object:Gem::Dependency
|
266
|
+
name: high_voltage
|
267
|
+
requirement: !ruby/object:Gem::Requirement
|
268
|
+
requirements:
|
269
|
+
- - "~>"
|
270
|
+
- !ruby/object:Gem::Version
|
271
|
+
version: '2.3'
|
272
|
+
type: :development
|
273
|
+
prerelease: false
|
274
|
+
version_requirements: !ruby/object:Gem::Requirement
|
275
|
+
requirements:
|
276
|
+
- - "~>"
|
277
|
+
- !ruby/object:Gem::Version
|
278
|
+
version: '2.3'
|
251
279
|
description: Allows a model of your choosing (such as users) to subscribe to a plan,
|
252
280
|
which enables features.
|
253
281
|
email: karen.e.lundgren@gmail.com
|
@@ -277,6 +305,7 @@ files:
|
|
277
305
|
- app/models/paid_up/feature.rb
|
278
306
|
- app/models/paid_up/features_plan.rb
|
279
307
|
- app/models/paid_up/plan.rb
|
308
|
+
- app/models/paid_up/unlimited.rb
|
280
309
|
- app/views/devise/confirmations/new.html.haml
|
281
310
|
- app/views/devise/passwords/edit.html.haml
|
282
311
|
- app/views/devise/passwords/new.html.haml
|
@@ -300,7 +329,6 @@ files:
|
|
300
329
|
- coverage/.resultset.json
|
301
330
|
- coverage/.resultset.json.lock
|
302
331
|
- db/migrate/20150407105900_create_paid_up_features_plans_table.rb
|
303
|
-
- db/migrate/20150407110100_create_paid_up_features_table.rb
|
304
332
|
- db/migrate/20150407110101_create_paid_up_plans_table.rb
|
305
333
|
- db/migrate/20150519164237_add_stripe_id_column_to_users.rb
|
306
334
|
- lib/generators/paid_up/install/install_generator.rb
|
@@ -310,13 +338,14 @@ files:
|
|
310
338
|
- lib/paid_up.rb
|
311
339
|
- lib/paid_up/configuration.rb
|
312
340
|
- lib/paid_up/engine.rb
|
313
|
-
- lib/paid_up/integer.rb
|
341
|
+
- lib/paid_up/extensions/integer.rb
|
342
|
+
- lib/paid_up/extensions/stripe.rb
|
314
343
|
- lib/paid_up/localization.rb
|
315
|
-
- lib/paid_up/mixins.rb
|
344
|
+
- lib/paid_up/mixins/paid_for.rb
|
345
|
+
- lib/paid_up/mixins/subscriber.rb
|
316
346
|
- lib/paid_up/railtie.rb
|
317
|
-
- lib/paid_up/
|
318
|
-
- lib/paid_up/
|
319
|
-
- lib/paid_up/unlimited.rb
|
347
|
+
- lib/paid_up/validators/rolify_rows.rb
|
348
|
+
- lib/paid_up/validators/table_rows.rb
|
320
349
|
- lib/paid_up/version.rb
|
321
350
|
- paid_up.gemspec
|
322
351
|
- spec/controllers/paid_up/plans_spec.rb
|
@@ -326,13 +355,16 @@ files:
|
|
326
355
|
- spec/dummy/app/assets/stylesheets/application.css.scss
|
327
356
|
- spec/dummy/app/controllers/application_controller.rb
|
328
357
|
- spec/dummy/app/models/ability.rb
|
358
|
+
- spec/dummy/app/models/doodad.rb
|
329
359
|
- spec/dummy/app/models/group.rb
|
360
|
+
- spec/dummy/app/models/role.rb
|
330
361
|
- spec/dummy/app/models/user.rb
|
331
362
|
- spec/dummy/app/views/layouts/application.html.haml
|
332
363
|
- spec/dummy/app/views/pages/index.html.haml
|
333
364
|
- spec/dummy/bin/bundle
|
334
365
|
- spec/dummy/bin/rails
|
335
366
|
- spec/dummy/bin/rake
|
367
|
+
- spec/dummy/bin/rspec
|
336
368
|
- spec/dummy/bin/setup
|
337
369
|
- spec/dummy/config.ru
|
338
370
|
- spec/dummy/config/application.rb
|
@@ -351,6 +383,7 @@ files:
|
|
351
383
|
- spec/dummy/config/initializers/inflections.rb
|
352
384
|
- spec/dummy/config/initializers/mime_types.rb
|
353
385
|
- spec/dummy/config/initializers/paid_up.rb
|
386
|
+
- spec/dummy/config/initializers/rolify.rb
|
354
387
|
- spec/dummy/config/initializers/session_store.rb
|
355
388
|
- spec/dummy/config/initializers/wrap_parameters.rb
|
356
389
|
- spec/dummy/config/locales/devise.en.yml
|
@@ -360,14 +393,14 @@ files:
|
|
360
393
|
- spec/dummy/db/development.sqlite3
|
361
394
|
- spec/dummy/db/migrate/20150406154440_create_users_table.rb
|
362
395
|
- spec/dummy/db/migrate/20150517175135_create_groups_table.rb
|
363
|
-
- spec/dummy/db/migrate/
|
364
|
-
- spec/dummy/db/migrate/
|
365
|
-
- spec/dummy/db/migrate/
|
366
|
-
- spec/dummy/db/migrate/
|
367
|
-
- spec/dummy/db/migrate/
|
396
|
+
- spec/dummy/db/migrate/20150517175136_create_doodads_table.rb
|
397
|
+
- spec/dummy/db/migrate/20150523010827_add_devise_to_users.rb
|
398
|
+
- spec/dummy/db/migrate/20150523010837_rolify_create_roles.rb
|
399
|
+
- spec/dummy/db/migrate/20150523010838_create_paid_up_features_plans_table.paid_up.rb
|
400
|
+
- spec/dummy/db/migrate/20150523010839_create_paid_up_plans_table.paid_up.rb
|
401
|
+
- spec/dummy/db/migrate/20150523010840_add_stripe_id_column_to_users.paid_up.rb
|
368
402
|
- spec/dummy/db/schema.rb
|
369
403
|
- spec/dummy/db/seeds.rb
|
370
|
-
- spec/dummy/db/seeds/features.seeds.rb
|
371
404
|
- spec/dummy/db/seeds/features_plans.seeds.rb
|
372
405
|
- spec/dummy/db/seeds/plans.seeds.rb
|
373
406
|
- spec/dummy/db/test.sqlite3
|
@@ -386,7 +419,6 @@ files:
|
|
386
419
|
- spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-e395044093757d82afcb138957d06a1ea9361bdcf0b442d06a18a8051af57456.ttf
|
387
420
|
- spec/dummy/public/assets/bootstrap/glyphicons-halflings-regular-fe185d11a49676890d47bb783312a0cda5a44c4039214094e7957b4c040ef11c.woff2
|
388
421
|
- spec/dummy/public/favicon.ico
|
389
|
-
- spec/dummy/test/controllers/plans_controller_controller_test.rb
|
390
422
|
- spec/factories/feature.rb
|
391
423
|
- spec/factories/features_plan.rb
|
392
424
|
- spec/factories/plan.rb
|