105 lines
2.5 KiB
Ruby
105 lines
2.5 KiB
Ruby
module ControllerBuilder
|
|
TMP_VIEW_PATH = File.expand_path(File.join(TESTAPP_ROOT, 'tmp',
|
|
'views')).freeze
|
|
|
|
def self.included(example_group)
|
|
example_group.class_eval do
|
|
after do
|
|
delete_temporary_views
|
|
restore_original_routes
|
|
end
|
|
end
|
|
end
|
|
|
|
def define_controller(class_name, &block)
|
|
class_name = class_name.to_s
|
|
class_name << 'Controller' unless class_name =~ /Controller$/
|
|
define_class(class_name, ActionController::Base, &block)
|
|
end
|
|
|
|
def define_routes(&block)
|
|
Rails.application.routes.draw(&block)
|
|
@routes = Rails.application.routes
|
|
class << self
|
|
include ActionDispatch::Assertions
|
|
end
|
|
end
|
|
|
|
def build_response(opts = {}, &block)
|
|
action = opts[:action] || 'example'
|
|
partial = opts[:partial] || '_partial'
|
|
block ||= lambda { render :nothing => true }
|
|
controller_class = define_controller('Examples') do
|
|
layout false
|
|
define_method(action, &block)
|
|
end
|
|
controller_class.view_paths = [TMP_VIEW_PATH]
|
|
|
|
define_routes do
|
|
get 'examples', :to => "examples##{action}"
|
|
end
|
|
|
|
create_view("examples/#{action}.html.erb", 'action')
|
|
create_view("examples/#{partial}.html.erb", 'partial')
|
|
|
|
setup_rails_controller_test(controller_class)
|
|
get action
|
|
|
|
@controller
|
|
end
|
|
|
|
def setup_rails_controller_test(controller_class)
|
|
@controller = controller_class.new
|
|
@request = ::ActionController::TestRequest.new
|
|
@response = ::ActionController::TestResponse.new
|
|
|
|
class << self
|
|
include ActionController::TestCase::Behavior
|
|
end
|
|
end
|
|
|
|
def create_view(path, contents)
|
|
full_path = File.join(TMP_VIEW_PATH, path)
|
|
FileUtils.mkdir_p(File.dirname(full_path))
|
|
File.open(full_path, 'w') { |file| file.write(contents) }
|
|
end
|
|
|
|
def controller_for_resource_with_strong_parameters(&block)
|
|
define_model "User"
|
|
controller_class = define_controller "Users" do
|
|
def new
|
|
@user = User.new
|
|
render :nothing => true
|
|
end
|
|
|
|
def create
|
|
@user = User.create(user_params)
|
|
render :nothing => true
|
|
end
|
|
|
|
private
|
|
define_method :user_params, &block
|
|
end
|
|
|
|
setup_rails_controller_test(controller_class)
|
|
|
|
define_routes { resources :users }
|
|
|
|
controller_class
|
|
end
|
|
|
|
private
|
|
|
|
def delete_temporary_views
|
|
FileUtils.rm_rf(TMP_VIEW_PATH)
|
|
end
|
|
|
|
def restore_original_routes
|
|
Rails.application.reload_routes!
|
|
end
|
|
end
|
|
|
|
RSpec.configure do |config|
|
|
config.include ControllerBuilder
|
|
end
|