[newbie] CSS navigation in controller response?

I’m hooked on RSpec after my first taste (thanks to
Chapter 1: From zero to deploy | Ruby on Rails Tutorial | Learn Enough to Be Dangerous). And of course I
have a newbish question.

Assume a contrived doc structure like:

moribund

Now lets say I want to write an RSpec controller test that will pass if
the status is “moribund” or “Moribund” or “MORIBUND”.

I know I can write:

it “should be moribund” do
get :show
response.should have_selector(“td”, :class => “status”, :content =>
“moribund”)
end

… which captures the fact that the status string is inside a
“td.status” element, but is case sensitive. Alternatively I could
write:

it “should be moribund” do
get :show
response.body.should =~ /moribund/i
end

… which is case insensitive but doesn’t discriminate where the string
appears in the document.

What’s the right idiom to navigate to a specific place in a document
(preferably using CSS navigation syntax) AND perform a case-insensitive
test?

TIA.

  • ff

P.S.: I fully appreciate that you shouldn’t normally hardwire the
document structure into the test itself – that’s not what this question
is about! :slight_smile:

P.P.S: I know that response is an ActionController::TestResponse object,
but haven’t been able to find docs or sources for that – where should I
look?

You can pass a block to have_selector to nest your assertions, like:

response.should have_selector(“td”, :class => “status”) do |td|
td.to_s.should == /moribund/i # => td is [#<Nokogiri::XML::Element
…>, …] here
end

Would replacing
:content => “moribund”
with
:content => /moribund/
work?

Whoops, let me fix that:

Would replacing
:content => “moribund”
with
:content => /moribund/i
work?

Evgeniy D. wrote in post #977322:

You can pass a block to have_selector to nest your assertions, like:

td is [#Nokogiri::XML::Element..., …] here

Most wonderfully cool. If it’s Nokogiri, then I’m on familiar turf.
Thanks very much.

  • ff

I wish it would, but no, it won’t due to the nature of how Webrat
have_selector matcher works (it uses XPath queries behind the scenes)