require File.dirname(__FILE__)+'/../lib/active_presenter'
require 'expectations'
require 'logger'
ActiveRecord::Base.configurations = {'sqlite3' => {:adapter => 'sqlite3', :database => ':memory:'}}
ActiveRecord::Base.establish_connection('sqlite3')
ActiveRecord::Base.logger = Logger.new(STDERR)
ActiveRecord::Base.logger.level = Logger::WARN
I18n.backend.store_translations '1337',
:activerecord => {
:models => {
:user => 'U53R'
},
:attributes => {
:user => {:password => 'pa22w0rD'}
},
:errors => {
:messages => {
:blank => 'c4N n07 83 8L4nK'
}
}
}
ActiveRecord::Schema.define(:version => 0) do
create_table :users do |t|
t.boolean :admin, :default => false
t.string :login, :default => ''
t.string :password, :default => ''
t.datetime :birthday
end
create_table :accounts do |t|
t.string :subdomain, :default => ''
t.string :title, :default => ''
end
create_table :addresses do |t|
t.string :street
end
create_table :account_infos do |t|
t.string :info
end
end
class User < ActiveRecord::Base
validates_presence_of :login
validate :presence_of_password
attr_accessible :login, :password, :birthday
attr_accessor :password_confirmation
def presence_of_password
if password.blank?
attribute_name = I18n.t(:password, {:default => "Password", :scope => [:activerecord, :attributes, :user]})
error_message = I18n.t(:blank, {:default => "can't be blank", :scope => [:activerecord, :errors, :messages]})
errors.add_to_base("#{attribute_name} #{error_message}")
end
end
end
class Account < ActiveRecord::Base; end
class Address < ActiveRecord::Base; end
class AccountInfo < ActiveRecord::Base; end
class PresenterWithTwoAddresses < ActivePresenter::Base
presents :address, :secondary_address => Address
end
class SignupPresenter < ActivePresenter::Base
presents :account, :user
end
class EndingWithSPresenter < ActivePresenter::Base
presents :address
end
class CantSavePresenter < ActivePresenter::Base
presents :address
before_save :halt
def halt; false; end
end
class SignupNoAccountPresenter < ActivePresenter::Base
presents :account, :user
def save?(key, instance)
key != :account
end
end
class AfterSavePresenter < ActivePresenter::Base
presents :address
after_save :set_street
def set_street
address.street = 'Some Street'
end
end
class SamePrefixPresenter < ActivePresenter::Base
presents :account, :account_info
end
class CallbackOrderingPresenter < ActivePresenter::Base
presents :account
before_validation :do_before_validation
before_save :do_before_save
after_save :do_after_save
attr_reader :steps
def initialize(params={})
super
@steps = []
end
def do_before_validation
@steps << :before_validation
end
def do_before_save
@steps << :before_save
end
def do_after_save
@steps << :after_save
end
end
class CallbackCantSavePresenter < ActivePresenter::Base
presents :account
before_validation :do_before_validation
before_save :do_before_save
before_save :halt
after_save :do_after_save
attr_reader :steps
def initialize(params={})
super
@steps = []
end
def do_before_validation
@steps << :before_validation
end
def do_before_save
@steps << :before_save
end
def do_after_save
@steps << :after_save
end
def halt
false
end
end
class CallbackCantValidatePresenter < ActivePresenter::Base
presents :account
before_validation :do_before_validation
before_validation :halt
before_save :do_before_save
after_save :do_after_save
attr_reader :steps
def initialize(params={})
super
@steps = []
end
def do_before_validation
@steps << :before_validation
end
def do_before_save
@steps << :before_save
end
def do_after_save
@steps << :after_save
end
def halt
false
end
end
def hash_for_user(opts = {})
{:login => 'jane', :password => 'seekrit' }.merge(opts)
end