saucy 0.2.20 → 0.2.21

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,4 +13,8 @@
13
13
  <% end %>
14
14
  <% end -%>
15
15
  <% end %>
16
+ <% if plan.trial? -%>
17
+ <li class="trial"><%= t(".trial_will_expire",
18
+ :default => "Your trial will expire after 30 days.") %></li>
19
+ <% end -%>
16
20
  </ul>
@@ -4,3 +4,11 @@ en:
4
4
  support_email: support@example.com
5
5
  saucy:
6
6
  billing_address: Billing Address
7
+ errors:
8
+ past_due:
9
+ admin: There was an issue processing the credit card you have on file. Please update your credit card information.
10
+ user: There was an issue processing the credit card on file for this account. Please have an administrator on the account update the credit card information.
11
+ expired:
12
+ admin: Your account's trial has expired. Please upgrade to another plan.
13
+ user: This account's trial has expired. Please have an administrator on the account upgrade to another plan.
14
+
@@ -51,6 +51,9 @@ DESC
51
51
  when /^the billing page for the "([^"]+)" account$/
52
52
  account = Account.find_by_name!($1)
53
53
  account_billing_path(account)
54
+ when /^the upgrade plan page for the "([^"]+)" account$/
55
+ account = Account.find_by_name!($1)
56
+ edit_account_plan_path(account)
54
57
  PATHS
55
58
 
56
59
  replace_in_file "features/support/paths.rb",
@@ -0,0 +1,48 @@
1
+ Feature: Trial plans
2
+
3
+ Background:
4
+ Given the following plan exists:
5
+ | name | price | trial |
6
+ | Trial | 0 | true |
7
+ | Eternal | 0 | false |
8
+
9
+ Scenario: Sign up for a trial plan
10
+ When I go to the list of plans page
11
+ And I follow "Trial"
12
+ And I should see "Your trial will expire after 30 days"
13
+ And I fill in "Email" with "email@person.com"
14
+ And I fill in "Password" with "password"
15
+ And I fill in "Confirm password" with "password"
16
+ And I fill in "Your name" with "Robot"
17
+ And I fill in "Company Name" with "Robots, Inc"
18
+ And I fill in "Keyword" with "robotsinc"
19
+ And I press "Sign up"
20
+ Then I should see "created"
21
+
22
+ Scenario: use an account during the trial
23
+ Given a "Trial" account exists with a name of "Test" created 29 days ago
24
+ And I am signed in as an admin of the "Test" account
25
+ When I go to the projects page for the "Test" account
26
+ Then I should see "Test"
27
+ And I should not see "expired"
28
+
29
+ Scenario: Try to use an expired trial plan
30
+ Given a "Trial" account exists with a name of "Test" created 30 days ago
31
+ And I am signed in as an admin of the "Test" account
32
+ When I go to the projects page for the "Test" account
33
+ Then I should be on the upgrade plan page for the "Test" account
34
+ And I should see "expired"
35
+ And the "Trial" plan should be disabled
36
+
37
+ Scenario: Sign up for a non-trial plan
38
+ When I go to the list of plans page
39
+ And I follow "Eternal"
40
+ Then I should not see "trial"
41
+
42
+ Scenario: Use a non-trial plan forever
43
+ Given an "Eternal" account exists with a name of "Test" created 30 days ago
44
+ And I am signed in as an admin of the "Test" account
45
+ When I go to the projects page for the "Test" account
46
+ Then I should see "Test"
47
+ And I should not see "expired"
48
+
@@ -0,0 +1,5 @@
1
+ Given /^an? "([^"]+)" account exists with a name of "([^"]*)" created (\d+) days ago$/ do |plan_name, account_name, days|
2
+ plan = Plan.find_by_name!(plan_name)
3
+ Factory(:account, :created_at => days.to_i.days.ago, :plan => plan, :name => account_name)
4
+ end
5
+
@@ -30,7 +30,7 @@ class CreateSaucyTables < ActiveRecord::Migration
30
30
  table.integer :account_id
31
31
  table.boolean :admin
32
32
  table.string :code
33
- table.boolean :used
33
+ table.boolean :used, :default => false, :null => false
34
34
  table.datetime :created_at
35
35
  table.datetime :updated_at
36
36
  end
@@ -64,6 +64,7 @@ class CreateSaucyTables < ActiveRecord::Migration
64
64
  create_table :plans do |t|
65
65
  t.string :name
66
66
  t.integer :price, :null => false, :default => 0
67
+ t.boolean :trial, :default => false, :null => false
67
68
 
68
69
  t.timestamps
69
70
  end
data/lib/saucy/account.rb CHANGED
@@ -14,7 +14,7 @@ module Saucy
14
14
 
15
15
  belongs_to :plan
16
16
 
17
- delegate :free?, :billed?, :to => :plan
17
+ delegate :free?, :billed?, :trial?, :to => :plan
18
18
 
19
19
  validates_uniqueness_of :name, :keyword
20
20
  validates_presence_of :name, :keyword, :plan_id
@@ -50,6 +50,14 @@ module Saucy
50
50
  def memberships_by_name
51
51
  memberships.by_name
52
52
  end
53
+
54
+ def expired?
55
+ trial? && past_trial?
56
+ end
57
+
58
+ def past_trial?
59
+ created_at < 30.days.ago
60
+ end
53
61
  end
54
62
  end
55
63
  end
@@ -39,15 +39,23 @@ module Saucy
39
39
  end
40
40
 
41
41
  def ensure_active_account
42
- if current_account? && current_account.past_due?
43
- if current_user.admin_of?(current_account)
44
- flash[:alert] = t('.account_past_due.admin', :default => "There was an issue processing the credit card you have on file. Please update your credit card information.")
45
- else
46
- flash[:alert] = t('.account_past_due.user', :default => "There was an issue processing the credit card on file for this account. Please have an administrator on the account update the credit card information.")
42
+ if current_account?
43
+ if current_account.past_due?
44
+ redirect_unusable_account account_billing_path(current_account),
45
+ "past_due"
46
+ end
47
+ if current_account.expired?
48
+ redirect_unusable_account edit_account_plan_path(current_account),
49
+ "expired"
47
50
  end
48
- redirect_to account_billing_path(current_account)
49
51
  end
50
52
  end
53
+
54
+ def redirect_unusable_account(path, failure)
55
+ role = current_user.admin_of?(current_account) ? 'admin' : 'user'
56
+ flash[:alert] = t("saucy.errors.#{failure}.#{role}")
57
+ redirect_to path
58
+ end
51
59
  end
52
60
  end
53
61
  end
@@ -55,9 +55,7 @@ module Saucy
55
55
  end
56
56
 
57
57
  def can_change_plan_to?(new_plan)
58
- plan.limits.where(:value_type => :number).all? do |limit|
59
- new_plan.limit(limit.name).value >= send(limit.name).count
60
- end
58
+ within_limits_for?(new_plan) && !past_trial_for?(new_plan)
61
59
  end
62
60
 
63
61
  def past_due?
@@ -66,6 +64,16 @@ module Saucy
66
64
 
67
65
  private
68
66
 
67
+ def within_limits_for?(new_plan)
68
+ new_plan.limits.where(:value_type => :number).all? do |limit|
69
+ new_plan.limit(limit.name).value >= send(limit.name).count
70
+ end
71
+ end
72
+
73
+ def past_trial_for?(new_plan)
74
+ new_plan.trial? && past_trial?
75
+ end
76
+
69
77
  def retry_subscription_charge!
70
78
  authorized_transaction = Braintree::Subscription.retry_charge(subscription.id).transaction
71
79
  result = Braintree::Transaction.submit_for_settlement(authorized_transaction.id)
@@ -65,4 +65,19 @@ describe Account do
65
65
 
66
66
  result.should == expected
67
67
  end
68
+
69
+ it "is expired with a trial plan after 30 days" do
70
+ trial = Factory(:plan, :trial => true)
71
+ Factory(:account, :created_at => 30.days.ago, :plan => trial).should be_expired
72
+ end
73
+
74
+ it "isn't expired with a trial plan before 30 days" do
75
+ trial = Factory(:plan, :trial => true)
76
+ Factory(:account, :created_at => 29.days.ago, :plan => trial).should_not be_expired
77
+ end
78
+
79
+ it "isn't expired with a non-trial plan after 30 days" do
80
+ forever = Factory(:plan, :trial => false)
81
+ Factory(:account, :created_at => 30.days.ago, :plan => forever).should_not be_expired
82
+ end
68
83
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saucy
3
3
  version: !ruby/object:Gem::Version
4
- hash: 63
4
+ hash: 61
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 20
10
- version: 0.2.20
9
+ - 21
10
+ version: 0.2.21
11
11
  platform: ruby
12
12
  authors:
13
13
  - thoughtbot, inc.
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2011-02-11 00:00:00 -05:00
20
+ date: 2011-02-14 00:00:00 -05:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
@@ -176,6 +176,7 @@ files:
176
176
  - lib/generators/saucy/base.rb
177
177
  - lib/generators/saucy/features/features_generator.rb
178
178
  - lib/generators/saucy/features/templates/factories.rb
179
+ - lib/generators/saucy/features/templates/step_definitions/account_steps.rb
179
180
  - lib/generators/saucy/features/templates/step_definitions/braintree_steps.rb
180
181
  - lib/generators/saucy/features/templates/step_definitions/email_steps.rb
181
182
  - lib/generators/saucy/features/templates/step_definitions/factory_girl_steps.rb
@@ -226,6 +227,7 @@ files:
226
227
  - lib/generators/saucy/features/templates/features/new_account.feature
227
228
  - lib/generators/saucy/features/templates/features/sign_up.feature
228
229
  - lib/generators/saucy/features/templates/features/sign_up_paid.feature
230
+ - lib/generators/saucy/features/templates/features/trial_plans.feature
229
231
  - lib/generators/saucy/features/templates/README
230
232
  - spec/controllers/accounts_controller_spec.rb
231
233
  - spec/controllers/application_controller_spec.rb