<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>RealityForge.org: Enhanced Rails Plugin to Validate (X)HTML and CSS</title>
    <link>/articles/2007/05/09/enhanced-rails-plugin-to-validate-x-html-and-css</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>A little short for a storm trooper</description>
    <item>
      <title>Enhanced Rails Plugin to Validate (X)HTML and CSS</title>
      <description>&lt;p&gt;It feels like forever ago that I was last working with ruby on rails. But I am back hacking away at a few rails and I slowly getting more familiarity with ruby itself rather than just using it as part of the rails platform.&lt;/p&gt;


	&lt;p&gt;Something I have wanted to do for a long time is automagically validate content such as (X)HTML, &lt;span class="caps"&gt;CSS&lt;/span&gt;, atom feeds etc that is generated by the web application. A while ago I put together the &lt;a href="http://www.realityforge.org/articles/2006/03/15/rails-plugin-to-validate-x-html-and-css"&gt;assert-valid-asset&lt;/a&gt; plugin that allowed you to assert (in functional tests) that the content generated is valid. However you still had to explicitly call the assert.&lt;/p&gt;


	&lt;p&gt;So recently I enhanced the plugin so that it can automatically validate generated content when configured to do so. To configure auto validation you need to set a class variable in Test::Unit::TestCase via code such as;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;    &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Test::Unit::TestCase&lt;/span&gt;
      &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;auto_validate&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Then anytime content is generated in tests (such as via get and post methods) it will check the mime type of the content. If the content has a mime type of &amp;#8216;text/html&amp;#8217; or &amp;#8216;text/xhtml&amp;#8217; it will pass it to the &amp;#8216;assert_valid_markup&amp;#8217; method. If the content is &amp;#8216;text/css&amp;#8217; then it will be validated by the &amp;#8216;assert_valid_css&amp;#8217; method.&lt;/p&gt;


	&lt;p&gt;Of course you may have tests that generate invalid (X)HTML or &lt;span class="caps"&gt;CSS&lt;/span&gt; (to work with specific unnamed browsers) and you may want to exclude these tests from the automatic content validation. This can be done by adding the test  symbol to the exclude list or alternatively by adding the desired test symbols to an include list. Both of the following examples have identical behavior;&lt;/p&gt;


Example 1:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;    &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;FooControllerTest&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Unit&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;TestCase&lt;/span&gt;
      &lt;span class="punct"&gt;...&lt;/span&gt;
      &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;auto_validate_excludes&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:test_foo&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;span class="symbol"&gt;:test_bar&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;

      &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_foo&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="punct"&gt;...&lt;/span&gt; &lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;
      &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_bar&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="punct"&gt;...&lt;/span&gt; &lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;
      &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_baz&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="punct"&gt;...&lt;/span&gt; &lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

Example 2:
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;    &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;FooControllerTest&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Unit&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;TestCase&lt;/span&gt;
      &lt;span class="punct"&gt;...&lt;/span&gt;
      &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;auto_validate_includes&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:test_baz&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;

      &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_foo&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="punct"&gt;...&lt;/span&gt; &lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;
      &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_bar&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="punct"&gt;...&lt;/span&gt; &lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;
      &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_baz&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="punct"&gt;...&lt;/span&gt; &lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;You can grab it from subversion at;&lt;/p&gt;


	&lt;p&gt;svn checkout &lt;a href="http://assert-valid-asset.googlecode.com/svn/trunk/"&gt;http://assert-valid-asset.googlecode.com/svn/trunk/&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;The original article describing the plugin is &lt;a href="http://www.realityforge.org/articles/2006/03/15/rails-plugin-to-validate-x-html-and-css"&gt;here&lt;/a&gt; .&lt;/p&gt;</description>
      <pubDate>Wed, 09 May 2007 15:17:00 +1000</pubDate>
      <guid isPermaLink="false">urn:uuid:b48f332b-faa7-4b92-b722-e1722432e9c6</guid>
      <author>Peter Donald</author>
      <link>http://www.realityforge.org/articles/2007/05/09/enhanced-rails-plugin-to-validate-x-html-and-css</link>
      <category>Rails</category>
      <trackback:ping>http://www.realityforge.org/articles/trackback/73</trackback:ping>
    </item>
  </channel>
</rss>
