aboutsummaryrefslogblamecommitdiffstats
path: root/railties/test/paths_test.rb
blob: 1fad32401567577d6bed01dde6a2206d273951b9 (plain) (tree)
1
2
3
4
5
6
7
8



                       
                     

                                   
 







                                                     










































                                                                   
         

                      




                                         
 
           
                                                    
     
 
                                                              

                                                   
     
 

                                      
                                             
     
 

                                                         
                                                 
     
 


                                       
                                                        
     
 


                                                        































                                                                                 

     
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