bento 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/README.rdoc +62 -42
  2. data/lib/bento/controllers/account_scopable.rb +31 -2
  3. data/lib/bento/controllers/helpers.rb +13 -9
  4. data/lib/bento/models/account.rb +18 -37
  5. data/lib/bento/models/modules/trial.rb +15 -0
  6. data/lib/bento/models/modules/user_accessors.rb +26 -0
  7. data/lib/bento/models/modules/user_association.rb +13 -0
  8. data/lib/bento/models/modules/validations.rb +14 -0
  9. data/lib/bento/rails/routes.rb +24 -0
  10. data/lib/bento/rails.rb +2 -0
  11. data/lib/bento/version.rb +1 -1
  12. data/lib/generators/active_record/bento_generator.rb +1 -1
  13. data/lib/generators/active_record/templates/add_migration.rb +2 -2
  14. data/lib/generators/active_record/templates/create_migration.rb +4 -5
  15. data/lib/generators/bento/bento_generator.rb +4 -0
  16. data/lib/generators/bento/orm_helpers.rb +1 -1
  17. data/spec/bento/controllers/helpers_spec.rb +24 -0
  18. data/spec/bento/models/account_spec.rb +5 -95
  19. data/spec/bento/models/modules/trial_spec.rb +22 -0
  20. data/spec/bento/models/modules/user_accessors_spec.rb +48 -0
  21. data/spec/bento/models/modules/user_association_spec.rb +16 -0
  22. data/spec/bento/models/modules/validations_spec.rb +27 -0
  23. data/spec/bento/rails/routes_spec.rb +27 -0
  24. data/spec/bento_spec.rb +4 -0
  25. data/spec/controllers/bento_for_routes_spec.rb +55 -0
  26. data/spec/rails_app/app/controllers/custom_accounts_controller.rb +7 -1
  27. data/spec/rails_app/app/models/account.rb +1 -1
  28. data/spec/rails_app/app/models/site.rb +8 -0
  29. data/spec/rails_app/app/models/user.rb +1 -0
  30. data/spec/rails_app/app/views/custom_accounts/index.html.erb +14 -0
  31. data/spec/rails_app/app/views/custom_accounts/new.html.erb +11 -7
  32. data/spec/rails_app/app/views/custom_accounts/show.html.erb +12 -0
  33. data/spec/rails_app/app/views/layouts/application.html.erb +3 -2
  34. data/spec/rails_app/app/views/projects/_all_projects.html.erb +1 -0
  35. data/spec/rails_app/app/views/projects/show.html.erb +1 -0
  36. data/spec/rails_app/config/routes.rb +6 -1
  37. data/spec/rails_app/db/development.sqlite3 +0 -0
  38. data/spec/rails_app/db/migrate/20101029122256_bento_create_sites.rb +14 -0
  39. data/spec/rails_app/db/migrate/20101029122257_bento_add_site_id_to_sites.rb +9 -0
  40. data/spec/rails_app/db/schema.rb +10 -1
  41. data/spec/rails_app/db/test.sqlite3 +0 -0
  42. data/spec/rails_app/log/development.log +50 -1220
  43. data/spec/rails_app/{db/production.sqlite3 → log/production.log} +0 -0
  44. data/spec/rails_app/log/server.log +0 -0
  45. data/spec/rails_app/log/test.log +32539 -21983
  46. data/spec/spec_helper.rb +1 -1
  47. data/spec/support/blueprints.rb +4 -0
  48. metadata +24 -6
  49. data/spec/rails_app/tmp/pids/server.pid +0 -1
data/README.rdoc CHANGED
@@ -1,62 +1,82 @@
1
1
  = Bento
2
2
  Bento is a Rails account management engine.
3
3
 
4
- == Disclaimer
5
- Don't expect everything to work as described below. The gem is still in early beta.
4
+ == Installation
5
+ Install the gem with bundler:
6
+ gem install bundler
7
+ add gem 'bento' to your Gemfile
8
+ bundle install
6
9
 
7
- == Requirements
8
- Currently it has a lot of pre conditions. The goal is to get rid of as many of them as possible but right new Bento expects the following:
9
- * Your model for managing accounts is named Account (Bento can generate it for you)
10
- * The account model has a name and a plan column (Bento can generate the migrations too)
11
- * You have a model named User to keep track of users
12
- - The users has a first_name, last_name, email and password fields
10
+ When you are done, you are ready to add Bento to any of your models using the generator:
11
+ rails generate bento MODEL
12
+ rake db:migrate
13
+ Replace MODEL by the class name you want to use as your account-like model, like Account, Site, etc.
14
+ This will create a model (if one does not exist) and configure it with default Bento options.
15
+ The generator will also create a migration file (if you're running ActiveRecord) and configure your routes.
13
16
 
14
- == Installation
15
- gem install bento
16
- rails generate bento account
17
- rake db:migrate
18
-
19
- == Basic Usage
20
- Bento sets up the following routes that you can use, complete with views and controllers:
21
- * [GET] sign_up_accounts - account and user creation in once
22
- * [GET] new_accounts - for just account creation
23
- * [GET] accounts - show
24
- * [GET] account - index
25
- * [POST] accounts - create
26
- * [PUT] account - update
27
- * [DELETE] account - destroy
28
-
29
- == Views and controllers
30
- === Access the current account:
31
- There is a current_account helper in your controllers and views which returns the currently logged in user's account.
32
-
33
- === Automatic scoping
34
- If you're using inherited_resources in your controllers you can do the below to scope your resource to the current account.
35
- class MyController < ApplicationController
17
+ == Getting started
18
+ === Model
19
+ This is a walkthrough with all steps you need to setup a Bento resource, including model, migration and route files.
20
+ Bento must be set up within the model (or models) you want to use. Bento routes must be created inside your config/routes.rb file.
21
+ We're assuming here you want a Account model with the default Bento options.
22
+ class Account < ActiveRecord::Base
23
+ bento
24
+ end
25
+ Bento doesn't use attr_accessible or attr_protected inside its modules, so be sure to define attributes as accessible or protected in your model.
26
+
27
+ === Routes
28
+ Configure your routes after setting up your model. Open your config/routes.rb file and add:
29
+ bento_for :accounts
30
+ This will use your Account model to create a set of needed routes (you can see them by running `rake routes`).
31
+
32
+ This will add bento_for :accounts to your routes file. If you want to add another model just rename or add the argument(s) to bento_for.
33
+ bento_for :accounts, :sites
34
+
35
+ === Controllers
36
+ You can tell your controllers to scope your resource to the current account.
37
+ class AccountsController < Bento::AccountsController
36
38
  scoped_to_account
37
39
  end
40
+ If you're defining your own controller you must generate views as described below.
41
+ If your current_user respond to admin? All the actions will only be accessible by users that respond with true.
38
42
 
39
- === Admin managed account
40
- Bento can give you a complete CRUD for creating accounts. Use
43
+ === Views
44
+ Bento gives you a complete CRUD for managing accounts. To customize the views use:
41
45
  rails generate bento:views
42
- If your current_user respond to admin? These actions will only be accessible by users that respond with true.
43
-
44
- == Configuring controllers
45
46
 
46
- You can customize the accounts controller by following these steps:
47
+ === Helpers
48
+ Bento will create the following helpers to use inside your controllers and views:
49
+ current_account
50
+ Where account would be anything your model is named.
51
+ The helper depends on a current_user-helper being defined (as is the case if you're using Devise).
47
52
 
48
- 1) Create your custom accounts controller, AccountsController
49
- class AccountsController < Bento::AccountsController
53
+ === Override specific pieces
54
+ The default behavior is to redirect to the accounts show view after creation.
55
+ This can be changed by overriding the after_create_url method:
56
+ class AccountsController < Bento::AccountsController
57
+ protected
58
+ def after_create_url
59
+ account_path(resource)
50
60
  end
61
+ end
51
62
 
52
- 2) Tell the router to use this controller:
53
- resources :accounts
63
+ == Navigating the source
64
+ The gem has a basic set of cucumber features along with a rails app.
65
+ Check them out to see some examples on how to use Bento in your application.
54
66
 
55
- 3) And since we changed the controller, it won't use the gem's views so make sure to make some and put in app/views/accounts.
67
+ == Disclaimer
68
+ * The gem is still in early beta, be careful.
69
+ * Forces you to have a User-model.
70
+ * Only works with Rails 3 and ActiveRecord.
56
71
 
57
72
  == Credits and contributors
58
-
59
73
  * The contributors of the awesome Devise gem from which I've borrowed a lot of ideas and patterns.
60
74
  * Elabs for sponsoring
61
75
  * Jonas Nicklas for helping me boot strap the engine.
62
76
  * All the gems that this gem depends on.
77
+
78
+ == TODO:
79
+ * Be able to nest other routes in bento_for.
80
+ * Remove the requirement to generate view files when overriding the accounts controller.
81
+ * Make is possible to have another user model then User.
82
+ * Make it possible for a user to belong to more then one account.
@@ -7,11 +7,40 @@ module Bento
7
7
  end
8
8
 
9
9
  module InstanceMethods
10
+ private
11
+
10
12
  def begin_of_association_chain
11
- current_user.account
13
+ @account ||= current_account
14
+ end
15
+
16
+ def current_account
17
+ if not_responding_to_admin? or admin?
18
+ account_by_param_or_session
19
+ else
20
+ current_user.account
21
+ end
22
+ end
23
+
24
+ def admin?
25
+ respond_to_admin? and current_user.admin?
26
+ end
27
+
28
+ def not_responding_to_admin?
29
+ (not respond_to_admin?)
30
+ end
31
+
32
+ def respond_to_admin?
33
+ current_user.respond_to?(:admin?)
12
34
  end
13
35
 
14
- private :begin_of_association_chain
36
+ def account_by_param_or_session
37
+ if account_id then Account.find(account_id) else current_user.account end
38
+ end
39
+
40
+ def account_id
41
+ key, value = params.find { |key, value| key.to_s.ends_with?("account_id") }
42
+ value
43
+ end
15
44
  end
16
45
  end
17
46
  end
@@ -1,17 +1,21 @@
1
1
  module Bento
2
2
  module Controllers
3
3
  module Helpers
4
- def self.included(base)
5
- base.helper_method :current_account
6
- end
4
+ mattr_accessor :resource_names
5
+ @@resource_names = []
6
+
7
+ def self.define_helpers(resource_name)
8
+ @@resource_names << resource_name.to_s.singularize
7
9
 
8
- def current_account
9
- current_user.account if current_user
10
+ ActiveSupport.on_load(:action_controller) do
11
+ @@resource_names.uniq.each do |name|
12
+ define_method("current_#{name}") do
13
+ current_user.send(name) if current_user
14
+ end
15
+ helper_method "current_#{name}"
16
+ end
17
+ end
10
18
  end
11
19
  end
12
20
  end
13
- end
14
-
15
- class ActionController::Base
16
- include Bento::Controllers::Helpers
17
21
  end
@@ -1,53 +1,34 @@
1
+ Dir["#{File.expand_path(File.dirname(__FILE__))}/modules/*.rb"].each {|f| require f}
2
+
1
3
  module Bento
2
4
  module Models
3
5
  module Account
6
+ DEFAULT_MODULES = %w[validations user_association]
7
+ ALL_MODULES = DEFAULT_MODULES + %w[trial user_accessors]
8
+
4
9
  def self.included(base)
5
10
  base.extend(ClassMethods)
6
11
  end
7
12
 
8
13
  module ClassMethods
9
- USER_ACCESSORS = [:first_name, :last_name, :email, :password, :password_confirmation]
10
-
11
- def bento_account(*options)
12
- if extend_with_validations?(options)
13
- validates_presence_of :name
14
- end
15
-
16
- if extend_with_user_accessors?(options)
17
- attr_accessor *USER_ACCESSORS
18
- end
19
-
20
- if extend_with_user_association?(options)
21
- has_many :users
22
- end
23
-
24
- if extend_with_trial?(options)
25
- define_method("trial_days_remaining") do
26
- created_at.advance(:days => 30).to_date - Date.today
27
- end
28
- end
29
-
30
- if extend_with_user_association?(options) and extend_with_user_accessors?(options)
31
- before_validation :build_user, :on => :create
32
-
33
- define_method("build_user") do
34
- user_attributes = USER_ACCESSORS.inject({}) { |h, key| h.merge(key => send(key)) }
35
- if user_attributes.values.any?
36
- @user ||= users.build(user_attributes)
37
- @user.tap(&:valid?).errors.each { |attribute, message| errors.add(attribute, message) }
38
- @user
39
- end
40
- end
41
- end
14
+ def bento(*modules)
15
+ module_names(modules).each { |name| include account_module(name) }
42
16
  end
43
17
 
44
18
  private
45
19
 
46
- def method_missing(*args)
47
- option = args.shift.to_s.sub(/^extend_with_/, '').chop.to_sym
48
- available = args.flatten
20
+ def module_names(modules)
21
+ if modules.include?(:all)
22
+ ALL_MODULES
23
+ elsif modules.empty?
24
+ DEFAULT_MODULES
25
+ else
26
+ modules
27
+ end
28
+ end
49
29
 
50
- (available.is_a?(Array) and available.empty?) or available.include?(:all) or available.include?(option)
30
+ def account_module(name)
31
+ "Bento::Models::Modules::#{name.to_s.camelcase}".constantize
51
32
  end
52
33
  end
53
34
  end
@@ -0,0 +1,15 @@
1
+ module Bento
2
+ module Models
3
+ module Modules
4
+ module Trial
5
+ def self.included(base)
6
+ base.class_eval do
7
+ define_method("trial_days_remaining") do
8
+ created_at.advance(:days => 30).to_date - Date.today
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,26 @@
1
+ module Bento
2
+ module Models
3
+ module Modules
4
+ module UserAccessors
5
+ USER_ACCESSORS = [:first_name, :last_name, :email, :password, :password_confirmation]
6
+
7
+ def self.included(base)
8
+ base.class_eval do
9
+ include ::Bento::Models::Modules::UserAssociation
10
+ attr_accessor *USER_ACCESSORS
11
+ before_validation :build_user, :on => :create
12
+
13
+ define_method("build_user") do
14
+ user_attributes = USER_ACCESSORS.inject({}) { |h, key| h.merge(key => send(key)) }
15
+ if user_attributes.values.any?
16
+ @user ||= users.build(user_attributes)
17
+ @user.tap(&:valid?).errors.each { |attribute, message| errors.add(attribute, message) }
18
+ @user
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ module Bento
2
+ module Models
3
+ module Modules
4
+ module UserAssociation
5
+ def self.included(base)
6
+ base.class_eval do
7
+ has_many :users
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module Bento
2
+ module Models
3
+ module Modules
4
+ module Validations
5
+ def self.included(base)
6
+ base.class_eval do
7
+ validates_presence_of :name
8
+ validates_uniqueness_of :name, :allow_blank => true
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+ module ActionDispatch::Routing
2
+ class Mapper
3
+ def bento_for(*resource_names)
4
+ resource_names.map!(&:to_sym)
5
+ resource_names.each do |resource_name|
6
+ Bento::Controllers::Helpers.define_helpers(resource_name)
7
+
8
+ resources(resource_name, :controller => account_controller(resource_name)) do
9
+ collection { get :sign_up }
10
+ end
11
+ end
12
+ end
13
+
14
+ protected
15
+
16
+ def account_controller(resource_name)
17
+ if resource_name == :accounts and not overridden_accounts_contoller? then "bento/accounts" else nil end
18
+ end
19
+
20
+ def overridden_accounts_contoller?
21
+ File.exist?(Rails.root.join("app", "controllers", "accounts_controller.rb"))
22
+ end
23
+ end
24
+ end
data/lib/bento/rails.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'bento/rails/routes'
2
+
1
3
  module Bento
2
4
  class Engine < ::Rails::Engine
3
5
  end
data/lib/bento/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Bento
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -15,7 +15,7 @@ module ActiveRecord
15
15
 
16
16
  def copy_bento_migration
17
17
  migration_template "create_migration.rb", "db/migrate/bento_create_#{table_name}"
18
- migration_template "add_migration.rb", "db/migrate/bento_add_account_id_to_#{table_name}"
18
+ migration_template "add_migration.rb", "db/migrate/bento_add_#{name}_id_to_#{table_name}"
19
19
  end
20
20
 
21
21
  def inject_bento_content
@@ -1,6 +1,6 @@
1
- class BentoAddAccountIdToAccounts < ActiveRecord::Migration
1
+ class BentoAdd<%= name.classify %>IdTo<%= name.classify %>s < ActiveRecord::Migration
2
2
  def self.up
3
- add_column :users, :account_id, :integer
3
+ add_column :users, :<%= name %>_id, :integer
4
4
  end
5
5
 
6
6
  def self.down
@@ -1,18 +1,17 @@
1
- class BentoCreateAccounts < ActiveRecord::Migration
1
+ class BentoCreate<%= name.classify %>s < ActiveRecord::Migration
2
2
  def self.up
3
- create_table :accounts do |t|
3
+ create_table :<%= name.pluralize %> do |t|
4
4
  t.string :name
5
- t.string :plan
6
5
  <% for attribute in attributes -%>
7
6
  t.<%= attribute.type %> :<%= attribute.name %>
8
7
  <% end -%>
9
8
  t.timestamps
10
9
  end
11
10
 
12
- add_index :accounts, :name, :unique => true
11
+ add_index :<%= name.pluralize %>, :name, :unique => true
13
12
  end
14
13
 
15
14
  def self.down
16
- drop_table :accounts
15
+ drop_table :<%= name.pluralize %>
17
16
  end
18
17
  end
@@ -8,6 +8,10 @@ module Bento
8
8
  "configuration plus a migration file."
9
9
 
10
10
  hook_for :orm
11
+
12
+ def add_bento_routes
13
+ route "bento_for :#{table_name}"
14
+ end
11
15
  end
12
16
  end
13
17
  end
@@ -5,7 +5,7 @@ module Bento
5
5
  <<-CONTENT
6
6
  # Include all bento modules. Others available are:
7
7
  # :all, :validations, :user_accessors, :user_association, :user_accessors, :trial
8
- bento_account
8
+ bento
9
9
 
10
10
  CONTENT
11
11
  end
@@ -1,4 +1,28 @@
1
1
  require 'spec_helper'
2
2
 
3
+ class AccountController < ActionController::Base; end
4
+
3
5
  describe Bento::Controllers::Helpers do
6
+ subject { AccountController.new }
7
+ let(:account) { Account.make }
8
+ let(:site) { Site.make }
9
+ let(:user) { User.make(:account => account, :site => site) }
10
+
11
+ before do
12
+ AccountController.send(:include, Bento::Controllers::Helpers)
13
+ subject.stubs(:current_user).returns(user)
14
+ end
15
+
16
+ describe ".define_helpers" do
17
+ it "defines the method current_<resource>" do
18
+ Bento::Controllers::Helpers.define_helpers(:site)
19
+ subject.current_site.should == site
20
+ end
21
+ end
22
+
23
+ describe "#current_account" do
24
+ it "returns the current users account" do
25
+ subject.current_account.should == account
26
+ end
27
+ end
4
28
  end
@@ -1,23 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
- class Bento::AccountTest < ActiveRecord::Base
4
- set_table_name("accounts")
5
- attr_accessible :name, :plan, :first_name, :last_name, :email, :password_confirmation, :password, :created_at
6
- end
7
- class NoOptionsTestAccount < Bento::AccountTest; bento_account; end
8
- class AllTestAccount < Bento::AccountTest; bento_account(:all); end
9
- class ValidationsTestAccount < Bento::AccountTest; bento_account(:validations); end
10
- class UserAccessorsTestAccount < Bento::AccountTest; bento_account(:user_accessors); end
11
- class UserAssociationTestAccount < Bento::AccountTest; bento_account(:user_association); end
12
- class AllUserTestAccount < Bento::AccountTest; bento_account(:user_accessors, :user_association); end
13
- class ServeralOptionsAccessorsTestAccount < Bento::AccountTest; bento_account(:user_accessors, :validations); end
14
- class TrialTestAccount < Bento::AccountTest; bento_account(:trial); end
3
+ class Bento::AccountTest < ActiveRecord::Base; set_table_name("accounts"); end
4
+ class NoOptionsTestAccount < Bento::AccountTest; bento; end
5
+ class AllTestAccount < Bento::AccountTest; bento(:all); end
6
+ class ServeralOptionsAccessorsTestAccount < Bento::AccountTest; bento(:trial, :validations); end
15
7
 
16
8
  describe Bento::Models::Account do
17
- let(:account_params) do
18
- { :name => "Hashrocket", :first_name => "Obie", :last_name => "Fernandez", :email => "obie@hashrocket.com", :password => "test1234" }
19
- end
20
-
21
9
  context "all" do
22
10
  subject { AllTestAccount.new }
23
11
  it { should be_invalid_without(:name) }
@@ -25,64 +13,13 @@ describe Bento::Models::Account do
25
13
  it { should respond_to(:users) }
26
14
  it { should respond_to(:trial_days_remaining) }
27
15
  it { should respond_to(:build_user) }
28
-
29
- describe ".build_user" do
30
- context "all user attributes are blank" do
31
- it "creates the account without the user" do
32
- account = AllTestAccount.new(:name => "Elabs")
33
- account.save.should be_true
34
- User.find_by_account_id(account.id).should be_nil
35
- end
36
- end
37
-
38
- context "at least one user attributes is present" do
39
- context "successfully creating a user" do
40
- subject do
41
- account = AllTestAccount.create!(account_params)
42
- account.users.first
43
- end
44
-
45
- its(:email) { should == "obie@hashrocket.com" }
46
- its(:first_name) { should == "Obie" }
47
- its(:last_name) { should == "Fernandez" }
48
- end
49
-
50
- context "unsuccessfully creating a user" do
51
- subject { AllTestAccount.new(account_params.merge(:email => "")).tap(&:valid?) }
52
- it { subject.errors.should include(:email) }
53
- end
54
- end
55
- end
56
-
57
- describe "#trial_days_remaining" do
58
- subject { TrialTestAccount.create!(:name => "Account", :created_at => 6.days.ago).trial_days_remaining }
59
- it("returns the number of days that are left in the trial") { should == 24 }
60
- end
61
16
  end
62
17
 
63
18
  context "no options" do
64
19
  subject { NoOptionsTestAccount.new }
65
20
  it { should be_invalid_without(:name) }
66
- it { should have_user_accessors }
67
- it { should respond_to(:users) }
68
- it { should respond_to(:trial_days_remaining) }
69
- it { should respond_to(:build_user) }
70
- end
71
-
72
- context "validations" do
73
- subject { ValidationsTestAccount.new }
74
- it { should be_invalid_without(:name) }
75
21
  it { should_not have_user_accessors }
76
- it { should_not respond_to(:users) }
77
- it { should_not respond_to(:trial_days_remaining) }
78
- it { should_not respond_to(:build_user) }
79
- end
80
-
81
- context "user accessors" do
82
- subject { UserAccessorsTestAccount.new }
83
- it { should_not be_invalid_without(:name) }
84
- it { should have_user_accessors }
85
- it { should_not respond_to(:users) }
22
+ it { should respond_to(:users) }
86
23
  it { should_not respond_to(:trial_days_remaining) }
87
24
  it { should_not respond_to(:build_user) }
88
25
  end
@@ -90,36 +27,9 @@ describe Bento::Models::Account do
90
27
  context "several options" do
91
28
  subject { ServeralOptionsAccessorsTestAccount.new }
92
29
  it { should be_invalid_without(:name) }
93
- it { should have_user_accessors }
94
- it { should_not respond_to(:users) }
95
- it { should_not respond_to(:trial_days_remaining) }
96
- it { should_not respond_to(:build_user) }
97
- end
98
-
99
- context "user association" do
100
- subject { UserAssociationTestAccount.new }
101
- it { should_not be_invalid_without(:name) }
102
- it { should_not have_user_accessors }
103
- it { should respond_to(:users) }
104
- it { should_not respond_to(:trial_days_remaining) }
105
- it { should_not respond_to(:build_user) }
106
- end
107
-
108
- context "trial" do
109
- subject { TrialTestAccount.new }
110
- it { should_not be_invalid_without(:name) }
111
30
  it { should_not have_user_accessors }
112
31
  it { should_not respond_to(:users) }
113
32
  it { should respond_to(:trial_days_remaining) }
114
33
  it { should_not respond_to(:build_user) }
115
34
  end
116
-
117
- context "user accessors and user association" do
118
- subject { AllUserTestAccount.new }
119
- it { should_not be_invalid_without(:name) }
120
- it { should have_user_accessors }
121
- it { should respond_to(:users) }
122
- it { should_not respond_to(:trial_days_remaining) }
123
- it { should respond_to(:build_user) }
124
- end
125
35
  end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ class TrialTestAccount < ActiveRecord::Base
4
+ set_table_name("accounts")
5
+ attr_accessible :name, :created_at
6
+ bento(:trial)
7
+ end
8
+
9
+ describe Bento::Models::Modules::Trial do
10
+ subject { TrialTestAccount.new }
11
+ it { should_not be_invalid_without(:name) }
12
+ it { should_not have_user_accessors }
13
+ it { should_not respond_to(:users) }
14
+ it { should respond_to(:trial_days_remaining) }
15
+ it { should_not respond_to(:build_user) }
16
+
17
+ describe "#trial_days_remaining" do
18
+ subject { TrialTestAccount.create!(:name => "Account", :created_at => 6.days.ago).trial_days_remaining }
19
+ it("returns the number of days that are left in the trial") { should == 24 }
20
+ end
21
+
22
+ end