Un-recognised routes that do exist, using namespaces & subdomain checking

I’m getting really cheesed off with RSpec not matching some of my
routes when controller testing when I have subdomain checking
(courtesy of subdomain-fu) on namespaces. These routes appear in the
rake routes output, and work fine via HTTP requests .

The really annoying thing is it’s working fine for routes that aren’t
at the root of the namespace.

E.g. say I have

map.namespace :foo, :path_prefix => ‘’, :conditions => { :subdomain =>
‘foo’ } do |foo|

foo.bars, :controller => 'bars', :only => [:show] do |bar|
    bar.resources some_things ....
end

foo.resources :monkeys

end

My specs for bars/some_things all resolve the routes fine (e.g. doing
get :index etc.)

Any spec that tries to hit monkeys/ give me a no route matches even
though these routes exist

No route matches {:controller=>"foo/monkeys", :action=>"update"}

I’ve tried setting both @request.host and request.host to
foo.test.host but that doesn’t make a blind bit of difference.

Maybe RSpec is doing something different with the request, as if I
monkey patch the routing with the following I never get the dumps when
using RSpec even though both these are called pretty early on in route
recognition.

module Foo

module RouteSetExtensions
def self.included(base)
base.alias_method_chain :extract_request_environment, :debug
base.alias_method_chain :recognize_path, :debug
end

def recognize_path_with_debug(path, environment={})
  puts path
  puts environment.to_yaml
  recognize_path_without_debug(path, environment)
end

def extract_request_environment_with_debug(request)
  env = extract_request_environment_without_debug(request)
  puts env.to_yaml
  env
end

end

end

ActionController::Routing::RouteSet.send :include,
Foo::RouteSetExtensions

So as you can probably tell, I’m out of ideas so I wondered if anyone
had any thoughts.

On Tue, Nov 10, 2009 at 2:25 PM, DEfusion [email protected] wrote:

map.namespace :foo, :path_prefix => ‘’, :conditions => { :subdomain =>
get :index etc.)
monkey patch the routing with the following I never get the dumps when

end
end

end

ActionController::Routing::RouteSet.send :include,
Foo::RouteSetExtensions

So as you can probably tell, I’m out of ideas so I wondered if anyone
had any thoughts.

Please post the failing spec and the exact failure message.

Thx,
David

Now that is weird. I tried to make an isolated example for you and
that worked fine. So I put un-commented my spec bit by bit and it
works fine.

I’m sure I’ve had this problem before. If I do re-create it I’ll post
more details here.

=D

Okay I’ve managed to re-create my original problem by trying to use
params_from to verify the routing (which was another area I was
experiencing problems with before).

Note each one of the routes I’m defining here all return fine in the
browser, they hit the appropriate controller and run the show action,
however as you can see by the comments 2 of the specs fail to find the
routes defined.

-D

On Tue, Nov 10, 2009 at 4:10 PM, DEfusion [email protected] wrote:

browser, they hit the appropriate controller and run the show action,
however as you can see by the comments 2 of the specs fail to find the
routes defined.

foo_routing_spec.rb · GitHub

Can you try using route_to instead of params_from().should ==?

See rspec-rails/Upgrade.rdoc at master · dchelimsky/rspec-rails · GitHub

Let me know if that works better.

David

Hi David,

Yeah I had used the new style in the past and got the same issue, I
just accidentally reverted to the old style.

Anyway changing to the new style using route_to as suggested doesn’t
resolve the issue, the same 2 routes give the same error, but the
telling thing is the failure message shows that the subdomain wasn’t
passed, or at least received by the routing:

ActionController::RoutingError in ‘Foo::MonkeysController should
route’
No route matches “/monkeys/1” with
{:port=>80, :method=>:get, :host_with_port=>“test.host”,
:subdomain=>nil, :domain=>“test.host”, :host=>“test.host”}
If you’re expecting this failure, we suggest { :get => “/monkeys/
1” }.should_not be_routable

Even if I specifically set @request.host = ‘foo.some.com’ before the
test it still errors saying host_with_port=>‘test.host’

-D

Removing the :sub domain conditions from the namespace does fix the
issue, and moving the sub domain conditions to the individual route
definitions causes them all to fail.

On Wed, Nov 11, 2009 at 3:12 AM, DEfusion [email protected] wrote:

ActionController::RoutingError in ‘Foo::MonkeysController should
route’
No route matches “/monkeys/1” with
{:port=>80, :method=>:get, :host_with_port=>“test.host”, :subdomain=>nil,
:domain=>“test.host”, :host=>“test.host”}
If you’re expecting this failure, we suggest { :get => “/monkeys/
1” }.should_not be_routable

Even if I specifically set @request.host = ‘foo.some.com’ before the
test it still errors saying host_with_port=>‘test.host’

OK. I haven’t used subdomain-fu before, but I’m guessing that it’s
either
getting loaded or invoked after rspec, or the two are monkey patching
the
same things and creating a conflict.

Would you do me a favor and slap together a small demo app with the
specific
version of rspec and subdomain-fu that you are using bundled
(vendor/gems
preferable), zip it up and submit it in a ticket to
http://rspec.lighthouseapp.com?

Thx,
David

On Wed, Nov 11, 2009 at 4:54 AM, David C.
[email protected]wrote:

passed, or at least received by the routing:
test it still errors saying host_with_port=>‘test.host’

Of course, the app should demonstrate the failure :slight_smile: Forgot that little
tidbit.

Was able to get past this testing issue for the moment. In the
interest of time I dropped some example code on my site pending a more
permanent solution. Hope it helps…

http://www.evanclosson.com/devlog/testingrouteswithrspecandsubdomainfu