I love the routes feature for RoR...until now. I'm trying to write tests to make sure my urls are correctly mapping to the routes I expect them to map to. This is driving me nuts because I simply can't get any of my tests to pass. I have thus concluded that routes must work differently than I thought. I will try to explain my understanding of how routes work. Via this process, it would be great if someone could point out where I've gone wrong.

Here is my route:

Code:
      map.download ':platform_filter/:software/:version/:platform/:distribution_channel/:id',
    	:controller => 'user/version',
    	:platform_filter => /all/,
    	:platform =>  /windows/linux/,
    	:distribution_channel => /download/,
    	:action => 'download',
    	:id => /\d+/
Ok, so the following url will map to this route:
http://mysite.com:3000/all/eudora/7....ows/download/5

Here's how I think the match is determined:
  1. Rails looks at the first portion of the url--"all"--and checks to see if it will be accepted by my route. It matches my regex constraint, so platform_filter => "all" is set.
  2. Rails inspects the next url item--"eudora"--checks to see if it matches my mapping constraint. There is no constraint, so it matches, sets :software => "eudora".
  3. Rails inspects the next url item--"7.0.1"--checks to see if it matches my mapping constraint. There is no constraint, so :version => "7.0.1" is set.
  4. Rails inspects the next url item--"windows"--checks to see if it matches my mapping constraint. It matches my regex constraint, so platform => "windows" is set.
  5. Rails inspects the next url item--"download"--checks to see if it matches my mapping constraint. It matches my regex constraint, so :distribution_channel => "download" is set.
  6. Rails inspects the last url item--"5"--checks to see if it matches my mapping constraint. It matches my regex constraint, so :id => "download" is set.
  7. All the url portions mapped, so this route will be used.
  8. Rails looks at the :controller and the :action defined in this route and executes them, passing all the matchig url portions via the params hash. Ex: we can access the :software portion of the url like this--params[:software]
If any of the above steps do not match, the route is skipped, the keys are cleared and the process is repeated with the next route.

So now I want to test my route with within the User::VersionControllerTest class:

Code:
    def test_route
   url = "/all/eudora/7.0.1/windows|download/5"
   opts = {:controller => 'user/version', :platform_filter => "all", :software => "eudora", 
 			 :version => "7.0.1", :platform => "windows",
 			 :distribution_channel => "download", :id => 5}
    
   assert_recognizes(opts, url)	 # Assertion fails!
    end
I really don't understand why this is failing, even the error message doesn't make sense:

Code:
 The recognized options <{"software"=>"eudora",
  "platform"=>"windows",
  "action"=>"download",
  "platform_filter"=>"all",
  "id"=>"5",
  "controller"=>"user/version",
  "version"=>"7.0.1",
  "distribution_channel"=>"download"}> did not match <{"software"=>"eudora",
  "platform"=>"windows",
  "platform_filter"=>"all",
  "id"=>5,
  "controller"=>"user/version",
  "version"=>"7.0.1",
  "distribution_channel"=>"download"}>
The error message show identical options but says they don't match?

If anyone can shed some light on this, please do.

-Steven