Forum: Ruby assert_xhtml - test your HTML by example

Posted by Phlip (Guest)
on 2009-03-12 06:00
(Received via mailing list)
Rubies:

My quest to get the maximum coverage & diagnostics from the leanest 
possible
tests has reached a new level.

This is a Rails functional test on an HTML form:

     user = users(:Moses)
     get :edit_user, :id => user.id

     assert_xhtml do

       form :action => '/users' do
         fieldset do
           legend 'Personal Information'
           label 'First name'
           input :type => 'text',
                 :name => 'user[first_name]'
                 :value => user.first_name
         end
       end

     end

That's all. The assertion expects a form with a given action, containing 
a
fieldset, a legend, a label, and a populated text input field. The 
assertion
forgives any other details, such as intervening structural tags, and 
complains
if any required detail is missing, out of order, or ill-formed.

You test HTML by writing an example of what you expect, excluding 
details you
don't care about.

When it fails, the assertion will print out your reference HTML, and 
your sample
HTML from your web page.

The assertion faults if...

  - any attribute does not match exactly
  - any text content does not match, stripped
  - any node is not found at all
  - any node is found out of order

The assertion does not fail if

  - nodes contain un-specified attributes
  - the DOM contains any un-specified tags (<html>, <div>, etc.)

Here's the assertion checking that a list appears in collating order:

     assert_xhtml SAMPLE_LIST do

       ul :style => 'font-size: 18' do
         li 'model' do
           li 'Billings criteria'
           li 'Billings report'
           li 'Sales report'
         end
       end

     end

The assertion takes a block that renders into a Nokogiri::HTML::Builder. 
Any
HTML it can build, you can specify by example.

That freedom causes two issues: The 'self' context is different inside 
this
block, so you must pass variables in as closures. And an element with 
the same
name as a Builder method, such as .select, need a bang: .select!

Get the assertion, from assert2-0.3.8.gem, with these incantations:

   gem install assert2 nokogiri

   require 'assert2/xhtml'  #  for Test::Unit::TestCase and derivatives

Those of you using RSpec will know how to apply this Gist:

   http://gist.github.com/76136

Good hunting!
Posted by David Chelimsky (Guest)
on 2009-03-12 21:38
(Received via mailing list)
On Wed, Mar 11, 2009 at 11:58 PM, Phlip <phlip2005@gmail.com> wrote:
>    assert_xhtml do
>
> When it fails, the assertion will print out your reference HTML, and your
>
>          li 'Billings report'
> block, so you must pass variables in as closures. And an element with the
>  http://gist.github.com/76136
Any interest in just incorporating this into the lib? So an RSpec user
could say "require 'assert2/rspec'" or something?
Posted by Phlip (Guest)
on 2009-03-12 23:30
(Received via mailing list)
>> Those of you using RSpec will know how to apply this Gist:
>>
>>  http://gist.github.com/76136
> 
> Any interest in just incorporating this into the lib? So an RSpec user
> could say "require 'assert2/rspec'" or something?

Yabsolutely!

And my boss just hit the "crunch mode" button today, after 2 years of 
pure
sustainable pace. Guess it's time to pay out the energy we have stored 
up, huh?

(No RSpec onsite. Sorry!)
Posted by Marcin Raczkowski (Guest)
on 2009-03-13 22:11
(Received via mailing list)
Amazing stuff :D
Can't wait to test it out
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.