Rspec and acl_system2 plugin

View: New views
3 Messages — Rating Filter:   Alert me  

Rspec and acl_system2 plugin

by Franck D'agostini :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hello,

I'm trying to spec a Rails application using the couple restful_authentication/acl_system2 plugins.

In my admin layout, I put the following code :

<% restrict_to "admin" do -%>
<ul id="admin-tabs">
  <li>Users management</li>
</ul>
<% end -%>

Then in my spec file 'spec/views/layout/admin.rhtml_spec.rb' :

describe "Layout Admin if admin user" do
  include UserMockViewHelper
 
  it "should display the admin tabs" do
    login_as :admin
    render 'layouts/admin'
    response.should have_tag("ul#admin-tabs")
  end
end

the UserMockViewHelper module handle the mocking of the current user :

module UserMockViewHelper
  def login_as(user)
    @current_user = mock_model(User)
    @role = mock_model(Role)

    case user
    when :admin
      @role.stub!(:map).and_return(["admin", "cms"])
    when :cms_admin
      @role.stub!(:map).and_return(["cms", "cms_admin"])
    when :cms
      @role.stub!(:map).and_return(["cms"])
    else
      @role.stub!(:map).and_return([])
    end

    @current_user.stub!(:roles).and_return(@role)
    @current_user.stub!(:login).and_return(user)
    User.should_receive(:find_by_id).any_number_of_times.and_return(@current_user)
    request.session[:user] = @current_user
    @controller.template.should_receive(:current_user).and_return(@current_user)    
  end  
end

When I run 'ruby script/spec spec/views/layouts/admin.rhtml_spec.rb', I've got the following error message :

ActionView::TemplateError in 'Layout Admin if admin user should display the admin tabs'
undefined local variable or method `current_user' for #<Spec::Rails::DSL::ViewExampleController:0x3076d88>
On line #28 of app/views/layouts/admin.rhtml

    25:     <ul>
    26:       <li>Publications</li>
    27:     </ul>
    28:     <% restrict_to "admin" do -%>
    29:     <ul id="admin-tabs">
    30:       <li>Utilisateurs</li>
    31:     </ul>

    #{RAILS_ROOT}/vendor/plugins/acl_system2/lib/caboose/access_control.rb:75:in `restrict_to'
    (eval):2:in `send'
    (eval):2:in `restrict_to'
    #{RAILS_ROOT}/app/views/layouts/admin.rhtml:28:in `_run_rhtml_47app47views47layouts47admin46rhtml'
    /usr/local/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_view/base.rb:326:in `send'
    /usr/local/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_view/base.rb:326:in `compile_and_render_template'
    /usr/local/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_view/base.rb:301:in `render_template'
    /usr/local/lib/ruby/gems/1.8/gems/actionpack-1.13.3/lib/action_view/base.rb:260:in `render_file'


In the acl_system2 plugin, we have the following code :

# restrict_to "admin | moderator" do
#   link_to "foo"
# end  
def restrict_to(logicstring, context = {})
  return false if current_user.nil?
  result = ''    
  if permit?(logicstring, context)
    result = yield if block_given?
  end
  result
end


I'm just starting with rspec and I believe I'm missing something ...

Did someone run into this error before ?

Re: Rspec and acl_system2 plugin

by Franck D'agostini :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Sorry, I've just seen that this question has already been raised in this mailing list.

I should have double checked first. My bad

Re: Rspec and acl_system2 plugin

by court3nay :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On 8/11/07, Franck D'agostini <franck.dagostini@...> wrote:

>
> I'm trying to spec a Rails application using the couple
> restful_authentication/acl_system2 plugins.
>
> In my admin layout, I put the following code :
>
> <% restrict_to "admin" do -%>
> <ul id="admin-tabs">
>   <li> /users Users management </li>
> </ul>
> <% end -%>
>

Remember, rSpec is Behavioural.  The code behind "restrict_to" doesn't
matter; it's the behaviour that matters.   As such, your view-spec
should only know about the code in that view.  So for example, there's
no mention of a "user" or "role" model there, only a "restrict_to"
method.

Spec out the "restrict_to" code, rather than setting up a complex
chain of fragile model interactions.  This means that you can change
the whole ACL system, but as long as it conforms to the same
interface, restrict_to("rolename"), your specs will suceed.  You can
also change the associations or the name of your models, or add some
fancy caching, anything, and this particular spec won't die.

> User.should_receive(:find_by_id).any_number_of_times.and_return(@current_user)
> request.session[:user] = @current_user

The fact that you're stubbing "find" calls in the *view* spec
indicates that you're probably testing things that are out of the
scope of that spec.

The actual ACL system should be tested on its own, not in the context of a view.


Courtenay
_______________________________________________
rspec-users mailing list
rspec-users@...
http://rubyforge.org/mailman/listinfo/rspec-users