require File.join(File.dirname(__FILE__), '..', "spec_helper")

describe "When generating URLs," do
  
  describe "passing params in anonymously to routes" do
    
    before(:each) do
      Merb::Router.prepare do
        match("/:first/:second/:third").name(:ordered)
      end
    end
    
    it "should match the params to the segment variables in the order that they were declared" do
      url(:ordered, "one", "two", "three").should == "/one/two/three"
    end
    
    it "should not generate unless all the params are present" do
      lambda { url(:ordered, "one", "two") }.should raise_error(Merb::Router::GenerationError)
    end
    
    it "should not generate if there are too many anonymous params" do
      lambda { url(:ordered, "one", "two", "three", "four") }.should raise_error(Merb::Router::GenerationError)
    end
    
    it "should be able to mix and match with the params hash" do
      url(:ordered, "one", "two", :third => "three").should == "/one/two/three"
    end
    
    it "should be able to set query params with the params hash" do
      url(:ordered, "one", "two", "three", :fourth => "four").should == "/one/two/three?fourth=four"
    end
    
    it "should give precedence to the params hash" do
      url(:ordered, "one", "two", :first => "un").should             == "/un/one/two"
      url(:ordered, "one", :first => "un", :second => "deux").should == "/un/deux/one"
      url(:ordered, "one", :first => "un", :third => "trois").should == "/un/one/trois"
      url(:ordered, "one", "two", :second => "deux").should          == "/one/deux/two"
    end
    
    it "should raise an exception when there are two many anonymous params after the named params were placed" do
      lambda { url(:ordered, "one", "two", :first => "un", :second => "deux") }.should raise_error(Merb::Router::GenerationError)
    end
  end
  
  describe "passing params anonymously to resource routes with identifiers" do
    
    module ::AP
      class ORM ; end
      class User    < ORM ; def id ; 10 ; end ; end
      class Comment < ORM ; def id ; 25 ; end ; end
    end
    
    before(:each) do
      Merb::Router.prepare do
        identify AP::ORM => :id do
          resources :users do
            resources :comments
          end
        end
      end
    end
    
    it "should work the same as normal routes" do
      url(:user,         AP::User.new                 ).should == "/users/10"
      url(:user_comment, AP::User.new, AP::Comment.new).should == "/users/10/comments/25"
      url(:user_comment, 30,           AP::Comment.new).should == "/users/30/comments/25"
      url(:user_comment, AP::User.new, "42"           ).should == "/users/10/comments/42"
    end
    
  end
  
end
