109 lines
2.8 KiB
Ruby
109 lines
2.8 KiB
Ruby
# Shoulda model builder
|
|
#
|
|
class ActiveSupport::TestCase
|
|
def create_table(table_name, &block)
|
|
connection = ActiveRecord::Base.connection
|
|
|
|
begin
|
|
connection.execute("DROP TABLE IF EXISTS #{table_name}")
|
|
connection.create_table(table_name, &block)
|
|
@created_tables ||= []
|
|
@created_tables << table_name
|
|
connection
|
|
rescue Exception => e
|
|
connection.execute("DROP TABLE IF EXISTS #{table_name}")
|
|
raise e
|
|
end
|
|
end
|
|
|
|
def define_constant(class_name, base, &block)
|
|
class_name = class_name.to_s.camelize
|
|
|
|
klass = Class.new(base)
|
|
Object.const_set(class_name, klass)
|
|
|
|
klass.class_eval(&block) if block_given?
|
|
|
|
@defined_constants ||= []
|
|
@defined_constants << class_name
|
|
|
|
klass
|
|
end
|
|
|
|
def define_model_class(class_name, &block)
|
|
define_constant(class_name, ActiveRecord::Base, &block)
|
|
end
|
|
|
|
def define_model(name, columns = {}, &block)
|
|
class_name = name.to_s.pluralize.classify
|
|
table_name = class_name.tableize
|
|
|
|
create_table(table_name) do |table|
|
|
columns.each do |name, type|
|
|
table.column name, type
|
|
end
|
|
end
|
|
|
|
define_model_class(class_name, &block)
|
|
end
|
|
|
|
def define_controller(class_name, &block)
|
|
class_name = class_name.to_s
|
|
class_name << 'Controller' unless class_name =~ /Controller$/
|
|
define_constant(class_name, ActionController::Base, &block)
|
|
end
|
|
|
|
def define_routes(&block)
|
|
@replaced_routes = ActionController::Routing::Routes
|
|
new_routes = ActionController::Routing::RouteSet.new
|
|
silence_warnings do
|
|
ActionController::Routing.const_set('Routes', new_routes)
|
|
end
|
|
new_routes.draw(&block)
|
|
end
|
|
|
|
def build_response(&block)
|
|
klass = define_controller('Examples')
|
|
block ||= lambda { render :nothing => true }
|
|
klass.class_eval { define_method(:example, &block) }
|
|
define_routes do |map|
|
|
map.connect 'examples', :controller => 'examples', :action => 'example'
|
|
end
|
|
|
|
@controller = klass.new
|
|
@request = ActionController::TestRequest.new
|
|
@response = ActionController::TestResponse.new
|
|
get :example
|
|
|
|
@controller
|
|
end
|
|
|
|
def teardown_with_models
|
|
if @defined_constants
|
|
@defined_constants.each do |class_name|
|
|
Object.send(:remove_const, class_name)
|
|
end
|
|
end
|
|
|
|
if @created_tables
|
|
@created_tables.each do |table_name|
|
|
ActiveRecord::Base.
|
|
connection.
|
|
execute("DROP TABLE IF EXISTS #{table_name}")
|
|
end
|
|
end
|
|
|
|
if @replaced_routes
|
|
ActionController::Routing::Routes.clear!
|
|
silence_warnings do
|
|
ActionController::Routing.const_set('Routes', @replaced_routes)
|
|
end
|
|
@replaced_routes.reload!
|
|
end
|
|
|
|
teardown_without_models
|
|
end
|
|
alias_method :teardown_without_models, :teardown
|
|
alias_method :teardown, :teardown_with_models
|
|
end
|