Using Shoulda to test login – should_require_login

October 2nd, 2008 by Justin Ball

I've had my problems with shoulda, but one very powerful component of the testing framework is the ability to create macros. Here's one that checks to make sure a user has to be logged in to access an action. Put it into test/shoulda_macros/authentication.rb. (You can name the file anything you want I just thought authentication.rb made sense)

 
Test::Unit::TestCase.class_eval do
  def self.should_require_login(*actions)
    actions.each do |action|
      should "Require login for '#{action}' action" do
        get(action)
        assert_redirected_to(login_url)
      end
    end
  end
end
</ruby>
 
Then inside your controller test do something like this:
<pre lang="ruby">
class UserControllerTest < ActionController::TestCase
  should_require_login :edit, :update, :destroy
end
 

Tags:   · · 6 Comments

Leave A Comment

6 responses so far ↓

  • 1 Alex Sharp Oct 21, 2008 at 1:39 pm

    Nice! I was actually in the middle of writing a should_have_before_filters macro when I found this post. Very helpful.

  • 2 Ruben Jan 10, 2009 at 7:50 pm

    Hi Justin, i think this macro don’t work fine under the hood because update and destroy don’t user the GET verb, i think that the parameter should be a hash with action and verb, what do you think?

    Regards.

  • 3 Justin Ball Jan 10, 2009 at 9:57 pm

    That is a good point. Those actions should require the appropriate ver – POST, PUT and DELETE. I don’t know that I want to pass a hash to the macro but perhaps that is the only correct way. I’m open to ideas and modifications if you have them.

  • 4 Ruben Jan 11, 2009 at 8:30 am

    Here is an idea: http://gist.github.com/45709

    Regards.

  • [...] Using Shoulda to test login – Justin Ball, has been looking into using Shoulda to test authentication. [...]

  • 6 Coletânea de artigos sobre o Shoulda May 13, 2009 at 7:02 am

    [...] Usando o Shoulda para testar login – Justin Ball tem pesquisado a utilização do Shoulda para testar autenticação. [...]