require 'abstract_unit'
module Rails
class Application
module PathParent
def method_missing(id, *args)
name = id.to_s
if name =~ /^(.*)=$/
@children[$1] = Path.new(args.first, @root)
elsif path = @children[name]
path
else
super
end
end
end
class Root
include PathParent
attr_reader :path
def initialize(path)
raise unless path.is_a?(String)
@children = {}
# TODO: Move logic from set_root_path initializer
@path = File.expand_path(path)
@root = self
end
end
class Path
include PathParent
attr_reader :path #, :glob, :load_once, :eager
def initialize(path, root)
@children = {}
@root = root
@paths = [path].flatten
end
def push(path)
@paths.push path
end
alias << push
def unshift(path)
@paths.unshift path
end
def paths
@paths.map do |path|
path.index('/') == 0 ? path : File.join(@root.path, path)
end
end
alias to_a paths
end
end
end
class PathsTest < ActiveSupport::TestCase
def setup
@root = Rails::Application::Root.new("/foo/bar")
end
test "the paths object is initialized with the root path" do
root = Rails::Application::Root.new("/fiz/baz")
assert_equal "/fiz/baz", root.path
end
test "creating a root level path" do
@root.app = "/foo/bar"
assert_equal ["/foo/bar"], @root.app.to_a
end
test "relative paths are relative to the paths root" do
@root.app = "app"
assert_equal ["/foo/bar/app"], @root.app.to_a
end
test "creating a child level path" do
@root.app = "/foo/bar"
@root.app.models = "/foo/bar/baz"
assert_equal ["/foo/bar/baz"], @root.app.models.to_a
end
test "child level paths are relative from the root" do
@root.app = "/app"
@root.app.models = "baz"
assert_equal ["/foo/bar/baz"], @root.app.models.to_a
end
test "adding multiple physical paths as an array" do
@root.app = ["/app", "/app2"]
assert_equal ["/app", "/app2"], @root.app.to_a
end
test "adding multiple physical paths using #push" do
@root.app = "/app"
@root.app.push "/app2"
assert_equal ["/app", "/app2"], @root.app.to_a
end
test "adding multiple physical paths using <<" do
@root.app = "/app"
@root.app << "/app2"
assert_equal ["/app", "/app2"], @root.app.to_a
end
test "adding multiple physical paths using #unshift" do
@root.app = "/app"
@root.app.unshift "/app2"
assert_equal ["/app2", "/app"], @root.app.to_a
end
test "the root can only have one physical path" do
assert_raise(RuntimeError) { Rails::Application::Root.new(["/fiz", "/biz"]) }
assert_raise(NoMethodError) { @root.push "/biz" }
assert_raise(NoMethodError) { @root.unshift "/biz" }
assert_raise(NoMethodError) { @root << "/biz" }
end
end