Restore "Start Rails::Application object

This reverts commit f14ad41456.
This commit is contained in:
Joshua Peek 2009-09-25 21:32:28 -05:00
parent bace497aea
commit accd9b4634
5 changed files with 195 additions and 0 deletions

1
.gitignore vendored
View File

@ -31,3 +31,4 @@ actionpack/bin
vendor/gems/
*/vendor/gems/
bin/
railties/tmp

2
railties/lib/rails.rb Normal file
View File

@ -0,0 +1,2 @@
require 'rails/application'
require 'rails/initializer'

View File

@ -0,0 +1,29 @@
require 'action_controller'
module Rails
class Application
def self.load(path, options = {})
config = options[:config] || 'config.ru'
config = File.join(path, config)
if config =~ /\.ru$/
cfgfile = File.read(config)
if cfgfile[/^#\\(.*)/]
opts.parse!($1.split(/\s+/))
end
inner_app = eval("::Rack::Builder.new {( " + cfgfile + "\n )}.to_app", nil, config)
else
require config
inner_app = Object.const_get(File.basename(config, '.rb').capitalize)
end
end
def initialize
@app = ActionController::Dispatcher.new
end
def call(env)
@app.call(env)
end
end
end

View File

@ -0,0 +1,56 @@
require "isolation/abstract_unit"
require "rails"
require "rack"
module ApplicationTests
class LoadTest < Test::Unit::TestCase
include ActiveSupport::Testing::Isolation
def setup
build_app
end
test "rails app is present" do
assert File.exist?(app_path("config"))
end
test "running Rails::Application.load on the path returns a (vaguely) useful application" do
@app = Rails::Application.load app_path
assert_welcome get("/")
end
test "config.ru is used" do
app_file "config.ru", <<-CONFIG
class MyMiddleware
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
headers["Config-Ru-Test"] = "TESTING"
[status, headers, body]
end
end
use MyMiddleware
run proc {|env| [200, {"Content-Type" => "text/html"}, ["VICTORY"]] }
CONFIG
@app = Rails::Application.load app_path, :config => "config.ru"
assert_body "VICTORY", get("/omg")
assert_header "Config-Ru-Test", "TESTING", get("/omg")
end
test "arbitrary.rb can be used as a config" do
app_file "myapp.rb", <<-CONFIG
Myapp = proc {|env| [200, {"Content-Type" => "text/html"}, ["OMG ROBOTS"]] }
CONFIG
@app = Rails::Application.load app_path, :config => "myapp.rb"
assert_body "OMG ROBOTS", get("/omg")
end
end
end

View File

@ -0,0 +1,107 @@
# Note:
# It is important to keep this file as light as possible
# the goal for tests that require this is to test booting up
# rails from an empty state, so anything added here could
# hide potential failures
#
# It is also good to know what is the bare minimum to get
# Rails booted up.
# TODO: Remove rubygems when possible
require 'rubygems'
require 'test/unit'
# TODO: Remove setting this magic constant
RAILS_FRAMEWORK_ROOT = File.expand_path("#{File.dirname(__FILE__)}/../../..")
# These load paths usually get set inside of boot.rb
$:.unshift "#{RAILS_FRAMEWORK_ROOT}/railties/lib"
$:.unshift "#{RAILS_FRAMEWORK_ROOT}/actionpack/lib"
# These files do not require any others and are needed
# to run the tests
require "#{RAILS_FRAMEWORK_ROOT}/activesupport/lib/active_support/testing/isolation"
require "#{RAILS_FRAMEWORK_ROOT}/activesupport/lib/active_support/testing/declarative"
module TestHelpers
module Paths
module_function
def tmp_path(*args)
File.expand_path(File.join(File.dirname(__FILE__), *%w[.. .. tmp] + args))
end
def app_path(*args)
tmp_path(*%w[app] + args)
end
end
module Rack
def extract_body(response)
"".tap do |body|
response[2].each {|chunk| body << chunk }
end
end
def get(path)
@app.call(::Rack::MockRequest.env_for(path))
end
def assert_welcome(resp)
assert_equal 200, resp[0]
assert resp[1]["Content-Type"] = "text/html"
assert extract_body(resp).match(/Welcome aboard/)
end
def assert_success(resp)
assert_equal 202, resp[0]
end
def assert_missing(resp)
assert_equal 404, resp[0]
end
def assert_header(key, value, resp)
assert_equal value, resp[1][key.to_s]
end
def assert_body(expected, resp)
assert_equal expected, extract_body(resp)
end
end
module Generation
def build_app
FileUtils.cp_r(tmp_path('app_template'), app_path)
end
def app_file(path, contents)
File.open(app_path(path), 'w') do |f|
f.puts contents
end
end
def controller(name, contents)
app_file("app/controllers/#{name}_controller.rb", contents)
end
end
end
class Test::Unit::TestCase
include TestHelpers::Paths
include TestHelpers::Rack
include TestHelpers::Generation
extend ActiveSupport::Testing::Declarative
end
# Create a scope and build a fixture rails app
Module.new do
extend TestHelpers::Paths
# Build a rails app
if File.exist?(tmp_path)
FileUtils.rm_rf(tmp_path)
end
FileUtils.mkdir(tmp_path)
`#{Gem.ruby} #{RAILS_FRAMEWORK_ROOT}/railties/bin/rails #{tmp_path('app_template')}`
end