Back story:
I'm developing a new Rails site for the local Ruby user group.  I'm using 
Devise to provide authentication for separate user and admin classes.

Current task:
I'm working on the create/new function for the sponsor class.  Sponsors are 
an independent class and are not tied to users, admins, or other classes. 
 However, only admins should be allowed to create sponsors.

The problem:
In my sponsor controller tests, I'm unable to prevent users and 
unauthenticated visitors from creating new sponsors without also preventing 
admins from doing so.  Troubleshooting with the puts command reveals that 
the admin_signed_in? value is false EVEN AFTER loggin in.

The source code of this app is 
at https://github.com/jhsu802701/ruby_mn_site/tree/sponsors_create_controller 
.

Excerpt from test/controllers/sponsors_controller_test.rb:

  test 'superadmin can create a new sponsor' do
    login_as @a1

    assert_difference 'Sponsor.count', 1 do
      add_past
    end

    assert_difference 'Sponsor.count', 1 do
      add_current
    end

    logout :admin
  end

  test 'regular admin can create a new sponsor' do
    login_as @a3

    assert_difference 'Sponsor.count', 1 do
      add_past
    end

    assert_difference 'Sponsor.count', 1 do
      add_current
    end

    logout :admin
  end

  test 'user cannot create a new sponsor' do
    login_as @u1

    assert_no_difference 'Sponsor.count' do
      add_past
    end

    assert_no_difference 'Sponsor.count' do
      add_current
    end

    logout :user
  end

  test 'an unregistered visitor cannot create a new sponsor' do
    assert_no_difference 'Sponsor.count' do
      add_past
    end

    assert_no_difference 'Sponsor.count' do
      add_current
    end
  end


app/controllers/sponsors_controller.rb

#
class SponsorsController < ApplicationController
  before_filter :admin_signed_in?, except: [:index, :show]

  def index
    @sponsors_current = Sponsor.where('current=?', true)
    @sponsors_past = Sponsor.where('current!=?', true)
  end

  def show
    @sponsor = Sponsor.find(params[:id])
  end

  def new
    @sponsor = Sponsor.new
  end

  def create
    puts admin_signed_in?
    if admin_signed_in?
      @sponsor = Sponsor.new(sponsor_params)
      if @sponsor.save
        flash[:info] = "Sponsor added."
        redirect_to sponsors_path
      else
        render 'new'
      end
    else
      redirect_to root_path
    end
  end

  private
    def sponsor_params
      params.require(:sponsor).permit(:name, :phone, :description,
                                      :contact_email, :contact_url,
                                      :current)
    end
end



-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/d4243b93-82b0-490c-941d-a07dcf0d137c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to