Ruby on rails Rails 3.1、RSpec和Authlogic的问题

Ruby on rails Rails 3.1、RSpec和Authlogic的问题,ruby-on-rails,login,rspec,authorization,authlogic,Ruby On Rails,Login,Rspec,Authorization,Authlogic,我是Rails开发的新手——我读了很多书,现在正全神贯注于headfirst。我有一个使用用户模型建立的基本应用程序,以及通过Authlogic建立的用户会话。我正在用RSpec测试 昨天早些时候,我的所有测试都通过了(有点像,见下文),然后实现了密码重置功能(通过电子邮件、HTTP),现在我的大部分测试都失败了——似乎是登录/Authlogic的问题 我在上面提到的是,自从启动以来,我的测试中一直存在Authlogic问题。。。它似乎不想登录。在请求规范中(也许这最好在单独的问题中解决),我无

我是Rails开发的新手——我读了很多书,现在正全神贯注于headfirst。我有一个使用用户模型建立的基本应用程序,以及通过Authlogic建立的用户会话。我正在用RSpec测试

昨天早些时候,我的所有测试都通过了(有点像,见下文),然后实现了密码重置功能(通过电子邮件、HTTP),现在我的大部分测试都失败了——似乎是登录/Authlogic的问题

我在上面提到的是,自从启动以来,我的测试中一直存在Authlogic问题。。。它似乎不想登录。在请求规范中(也许这最好在单独的问题中解决),我无法登录(通过访问登录路径和填写字段),除非我在该规范中手动注册用户(注册路径、填写等)。工厂似乎没有做到这一点。。。我所看到的每一个地方都说要做@user=Factory.create(:user)然后是UserSession.create(@user),但对我来说,它往往会失败。有时我可以使用spec_helper方法(sign_in(@user))登录,有时则失败

我应该注意到,不管我的测试说了什么,一切都在开发模式下工作。阅读关于TDD的文章首先让我对测试充满了热情,但这削弱了我的动力

无论如何。。。下面是一些相关代码。请告诉我还需要什么

典型错误:

Failure/Error: response.should render_template('users/show')expecting <"users/show"> but rendering with <"users/new,>.....

6) UsersController GET index for non admin users should protect the page
     Failure/Error: response.should redirect_to(root_path)
       Expected response to be a redirect to <http://test.host/> but was a redirect to <http://test.host/user_sessions/new>
     # ./spec/controllers/users_controller_spec.rb:72:in `block (4 levels) in <top (required)>'

  11) UsersController POST 'create' success should redirect to the user show page
     Failure/Error: response.should redirect_to(user_path(assigns(:user)))
       Expected response to be a redirect to <http://test.host/users/5> but was a redirect to <http://test.host/>
     # ./spec/controllers/users_controller_spec.rb:160:in `block (4 levels) in <top (required)>'

  13) UsersController POST 'create' success should be logged in
 Failure/Error: UserSession.find.should_not be_nil
   expected: not nil
        got: nil
用户控制器规范

require 'spec_helper'

describe UserSessionsController do
  render_views

    before(:each) do
        @valid_user = Factory.create(:user)
      activate_authlogic
    end

    describe "Authlogic & Application Controller tests" do

    it "should allow login of a specified user, and logged_in? should provide correct response" do
      sign_in(@valid_user)
      UserSession.find.user.should == @valid_user
      logged_in?.should be_true
      logged_in?.email.should == @valid_user.email #logged_in function actually returns session
    end

    it "should allow logout of a specified user and logged_in? should provide correct response" do
      sign_in(@valid_user)
      logged_in?.should be_true
      sign_out
      logged_in?.should be_false
    end

    end # authlogic tests

    describe "GET 'new'" do

    it "should only get new if logged out" do
      sign_in(@valid_user)     
      get :new
      flash[:error].should =~ /You must be logged out/i
      response.should redirect_to user_path(@valid_user.id)
      response.code.should == "302" # redirected by require_no_user
    end

  end # get new

  describe "POST 'create'" do
    it "should create user session" do
      logged_in?.should be_false
      post :create, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
      logged_in?.should be_true
    end

    it "should redirect to user show page, with flash success" do
      post :create, :user_session => { :email => @valid_user.email, :password => @valid_user.password }   
      assigns[:user_session].user.should == @valid_user
      response.code.should == "302"
      response.should redirect_to(user_path(@valid_user.id))
      flash[:success].should =~ /login succ/i 
    end    

    it "should not create user session for invalid password" do
      logged_in?.should be_false
      post :create, :user_session => { :email => @valid_user.email, :password => "" }
      logged_in?.should be_false
    end

    it "should redirect back to login page on invalid params, show proper flash" do
      post :create, :user_session => { :email => @valid_user.email, :password => "" }
      response.should redirect_to new_user_session_path
      ## BROKEN BECAUSE OF BEFORE_FILTER ##
      # response.should render_template('new')
      #response.should have_selector("div.flash.error", :content => "Incorrect user")
      flash[:error].should =~ /Incorrect user name or password/i 
    end

    it "should only create if logged out" do
      sign_in(@valid_user)
      post :create, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
      flash[:error].should =~ /You must be logged out/i
      response.code.should == "302"
      response.should redirect_to user_path(@valid_user.id) 
    end
  end # post create

  describe "DELETE destroy" do
    it "should destroy user session if logged in" do
      sign_in(@valid_user)
      logged_in?.should be_true
      delete :destroy
      UserSession.find.should be_nil
      response.should redirect_to new_user_session_path
    end

    it "should not destroy if logged out" do
      logged_in?.should be_false
      delete :destroy, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
      flash[:error].should =~ /You must be logged in/i
      response.code.should == "302" 
      response.should redirect_to new_user_session_path
    end

    it "should redirect to login page and show correct flash on logout" do
      sign_in(@valid_user)
      logged_in?.should be_true
      delete :destroy
      flash[:notice].should =~ /You have been logged/i
      response.should redirect_to new_user_session_path
    end

  end # delete destroy

end # specs
require 'spec_helper'

describe UsersController do
  render_views

  before(:each) do
    activate_authlogic
  end

  describe "GET 'new'" do

    it "should only work if not logged in" do
      user = Factory.create(:user)
      sign_in(user)
      get :new
      flash[:error].should =~ /must be logged out/i
      response.should redirect_to user_path(user)
    end
  end

  describe "GET index" do

    before(:each) do
      @admin_user = Factory.create(:user, :admin => true)
      @signed_in_user = Factory.create(:user)
      @user1 = Factory.create(:user)
      @user2 = Factory.create(:user)
      @user3 = Factory.create(:user)
      @users = [@admin_user, @signed_in_user, @user1, @user2, @user3]
    end

    describe "for non signed in users" do
      it "should deny access" do
        get :index
        flash[:error].should =~ /must be logged in/i
        response.should redirect_to new_user_session_path
      end    
    end

    describe "for non admin users" do
      it "should protect the page" do
        sign_in(@signed_in_user)
        get :index
        response.should redirect_to(root_path)
        flash[:error].should be_nil
        flash[:success].should be_nil
        flash[:notice].should be_nil               
      end
    end

    describe "for admin users" do

      before(:each) do
        sign_in(@admin_user)
      end    
    end      
  end

  describe "POST 'create'" do

    describe "failure" do

      before(:each) do
        @attr = {:name=>"", :email=>"", :password=>"", :password_confirmation=>""}
      end

      it "should not create a user" do
        lambda do
          post :create, :user => @attr
        end.should_not change(User, :count)
      end

      it "should render the 'new' page" do
        post :create, :user => @attr
        response.should render_template('new')
        response.should have_selector("div.error_messages")
      end

      it "should only create a user if not logged in" do
        @another_user = Factory.create(:user)
        sign_in(@another_user)
        @valid_attr = { :name=> 'New User', :email => 'somemail@gmail.com',:password => 'foobar', :password_confirmation => 'foobar' }
        post :create, :user => @attr
        flash[:error].should =~ /must be logged out/i
        response.should redirect_to user_path(@another_user)
      end

    end #failure

    describe "success" do

      before(:each) do
        @attr = { :name=> 'New User', :email => 'somemail@gmail.com',:password => 'foobar', :password_confirmation => 'foobar' }
      end

      it "should create a user" do
        lambda do
          post :create, :user => @attr
        end.should change(User, :count).by(1)
      end

      it "should redirect to the user show page" do
        post :create, :user => @attr
        assigns[:user].email.should == "somemail@gmail.com"
        response.should redirect_to(user_path(assigns(:user)))
      end

      it "should have a welcome message" do
        post :create, :user => @attr
        flash[:success].should =~ /signed/i
      end

       it "should be logged in" do
        post :create, :user => @attr
        UserSession.find.should_not be_nil
      end

    end #success
  end # post create

  describe "GET edit" do

    before(:each) do
      @valid_user = Factory.create(:user)
      sign_in(@valid_user)
    end

    describe "success" do    

      it "should have the right title" do
        get :edit, :id => @valid_user
        response.should have_selector("title", :content => "Edit User: #{@valid_user.name}")
      end 

    end # success

    describe "failure" do

      it "should not get edit if logged out" do
        sign_out
        get :edit, :id => @valid_user
        flash[:error].should =~ /must be logged in/i
        response.should redirect_to new_user_session_path
      end

    end # failure   
  end # GET edit

  describe "GET show" do

    before(:each) do
      @valid_user = Factory.create(:user)
      sign_in(@valid_user)
    end

    describe "success" do

      it "should get show if logged in" do
       get :show, :id => @valid_user
       response.should be_success
      end 

    end # success

    describe "failure" do

      it "should not get show if logged out" do
        sign_out
        get :show, :id => @valid_user
        flash[:error].should =~ /must be logged in/i
        response.should redirect_to new_user_session_path
      end

      it "should only be able to see their own page" do
        @another_user = Factory.create(:user)
        get :show, :id => @another_user
        response.should have_selector("title", :content => "Profile for #{@valid_user.name}")
      end

    end # failure   

    describe "admin users" do

      before(:each) do
        @admin_user = Factory.create(:user, :admin => true)
        sign_out
        sign_in(@admin_user)
      end

      it "should get their own show page if that is the selection" do
        get :show, :id => @admin_user
        response.should have_selector("title", :content => "Profile for #{@admin_user.name}")
      end

      it "should also be able to get other people's show page if that is the selection" do
        get :show, :id => @valid_user
        response.should have_selector("title", :content => "Profile for #{@valid_user.name}")
      end

      it "should not show admin content on admin login" do
        sign_in(@valid_user)
        get :show, :id => @valid_user
        response.should_not have_selector("section.admin>ul>li>a", :content => "Show Users", :href => users_path)
      end

    end

  end # GET show

  describe "PUT update" do

    before(:each) do
      @valid_user = Factory.create(:user)
      sign_in(@valid_user)
    end

    describe "success" do

      before(:each) do
        @new_attrs = { :name => "new name", :email => "myname@gmail.com", :password => @valid_user.password, :password_confirmation => @valid_user.password}
      end

      it "should correctly update the user with valid attributes" do
        put :update, :id => @valid_user.id, :user => @new_attrs
        assigns[:user].name.should == "new name"
        assigns[:user].email.should == "myname@gmail.com"
        User.find(@valid_user.id).email.should == "myname@gmail.com"
      end

      it "should redirect to the user show page" do
        put :update, :id => @valid_user.id, :user => @new_attrs
        response.should redirect_to user_path(@valid_user)
        flash[:success].should =~ /edited/i
      end

    end # success

    describe "failure" do

      before(:each) do
        @bad_attrs = { :name => "", :email => "nottaken"}
      end

      it "should not update user attributes if invalid" do
        original_email = @valid_user.email   
        put :update, :id => @valid_user, :user => @bad_attrs
        @valid_user.reload
        @valid_user.email.should == original_email
        logged_in?.should be_true
        User.find_by_email(original_email).should_not be_nil
      end

      it "should re-render the edit page" do
        put :update, :id => @valid_user, :user => @bad_attrs
        #controller.stub!(:require_user).and_return(true)
        response.should render_template('edit')
        logged_in?.should be_true
      end

      it "should not allow edit, even with valid attributes, if not logged in" do
        sign_out
        original_email = @valid_user.email
        put :update, :id => @valid_user, :user => @new_attrs
        @valid_user.reload
        @valid_user.email.should == original_email
        response.should redirect_to new_user_session_path
        logged_in?.should be_false
      end

      it "should not allow you to take another user's email" do
        @another_user = Factory.create(:user)
        put :update, :id => @valid_user, :user => { :name => "valid name", :email => @another_user.email}
        response.should render_template('edit')
        response.should have_selector("div.error_messages")
      end

    end #failure

  end # post update

  describe "DELETE destroy" do

    before(:each) do
       @valid_user = Factory.create(:user)
     end

    describe "as a non-signed-in user" do
      it "should deny access" do
        delete :destroy, :id => @valid_user
        flash[:error].should =~ /must be logged in/i
        response.should redirect_to new_user_session_path
      end
    end

    describe "as a non-admin user" do
      it "should protect the page" do
        sign_in(@valid_user)
        delete :destroy, :id => @valid_user
        response.should redirect_to(root_path)
        flash[:error].should be_nil
        flash[:success].should be_nil
        flash[:notice].should be_nil               
      end
    end

    describe "as an admin user" do

      before(:each) do
        @admin = Factory(:user, :admin => true)
        sign_in(@admin)
      end

      it "should destroy the user" do
        lambda do
          delete :destroy, :id => @valid_user
        end.should change(User, :count).by(-1)
      end

      it "should redirect to the users page with the correct flash" do
        delete :destroy, :id => @valid_user
        response.should redirect_to(users_path)
        flash[:success].should =~ /user destroyed/i
      end

    end

  end

end
用户工厂:

Factory.define :valid_user , :class => User do |u|
  u.name "brandon"
  u.email "brandon@example.com"
  u.password "foobar"
  u.password_confirmation "foobar"
end

Factory.define :invalid_user , :class => User do |u|
  u.name ""
  u.email "brandon@example"
  u.password "f"
  u.password_confirmation "f"
end

Factory.sequence :email do |n|
  "person#{n}@example.com"
end

Factory.sequence :name do |n|
  "John Doe the #{n}"
end

Factory.define :user do |f|

  f.name {Factory.next(:name)}
  f.email {Factory.next(:email)}
  f.password "foobar"
  f.password_confirmation "foobar"
end 
等级库助手

require 'database_cleaner'
require 'spork'
require 'factory_girl'
require 'authlogic/test_case'

Spork.prefork do
  # Loading more in this block will cause your tests to run faster. However,
  # if you change any configuration or code from libraries loaded here, you'll
  # need to restart spork for it take effect.  

    def sign_in(user)
        u = UserSession.create(user)
    end

    def sign_out
        us = UserSession.find
        us.destroy
    end

    def logged_in?
      current_user_session = UserSession.find
      return current_user_session.record if current_user_session
      return false
    end

  DatabaseCleaner.strategy = :truncation

    # This file is copied to spec/ when you run 'rails generate rspec:install'
    ENV["RAILS_ENV"] ||= 'test'
    require File.expand_path("../../config/environment", __FILE__)
    require 'rspec/rails'
    require 'rspec/autorun'
  require 'webrat'

  include Authlogic::TestCase

    # Requires supporting ruby files with custom matchers and macros, etc,
    # in spec/support/ and its subdirectories.
    Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  Webrat.configure do |config|
    config.mode = :rails
  end

    RSpec.configure do |config|
        # == Mock Framework
        #
        # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
        #
        # config.mock_with :mocha
        # config.mock_with :flexmock
        # config.mock_with :rr
        config.mock_with :rspec

    ApplicationController.skip_before_filter :activate_authlogic
    config.before(:each, :type => :request) do
      activate_authlogic
      #UserSession.create(User.find_by_email!(email))
    end

        # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
        config.fixture_path = "#{::Rails.root}/spec/fixtures"

        # If you're not using ActiveRecord, or you'd prefer not to run each of your
        # examples within a transaction, remove the following line or assign false
        # instead of true.
        config.use_transactional_fixtures = true

        # If true, the base class of anonymous controllers will be inferred
        # automatically. This will be the default behavior in future versions of
        # rspec-rails.
        config.infer_base_class_for_anonymous_controllers = false
    end

end

Spork.each_run do
  # This code will be run each time you run your specs.

  FactoryGirl.reload 
  ActiveSupport::Dependencies.clear

  RSpec.configure do |config|

    config.before(:each) do
          DatabaseCleaner.start
        end

        config.after(:each) do
          DatabaseCleaner.clean
        end

  end

 # DatabaseCleaner.clean

end
顺便说一句(可能与我的其他问题有关),我一直在犯这个令人沮丧的错误

  16) UsersController GET edit success should render the 'edit' page
 Failure/Error: response.should render_template('edit')
   expecting <"edit"> but rendering with <"">
 # ./spec/controllers/users_controller_spec.rb:203:in `block (4 levels) in <top (required)>'
16)UsersController获取编辑成功应呈现“编辑”页面
失败/错误:response.should呈现_模板(“编辑”)
预期但渲染为
#./spec/controllers/users\u controller\u spec.rb:203:in'block(4级)in'

我很感激能提供的任何帮助,我真是束手无策!!。我会发布你需要的任何附加代码。谢谢

您没有呼叫
设置:激活\u authlogic

您没有呼叫
设置:激活\u authlogic

请缩小您的问题范围。如果人们必须阅读这么多代码才能回答你的问题,他们不会很乐意回答你的问题。请缩小你的问题范围。如果人们必须阅读这么多的代码才能回答你的问题,他们不会很乐意回答你的问题。哇,我还以为这个问题已经很久没有了。。。谢谢你的回答。我的spec_helper.rb文件中有以下代码:1.include Authlogic::TestCase 2。config.before(:each)do,activate_authlogic,end(很抱歉格式化太残酷,我想我不能在这里放代码)调用
activate_authlogic
in
before(:each)
无效。你必须把它叫做throw
setup
和之后的
description
。哇,我还以为这一个早就不见了呢。。。谢谢你的回答。我的spec_helper.rb文件中有以下代码:1.include Authlogic::TestCase 2。config.before(:each)do,activate_authlogic,end(很抱歉格式化太残酷,我想我不能在这里放代码)调用
activate_authlogic
in
before(:each)
无效。您必须将其称为throw
setup
和after
description
require 'spec_helper'

describe UserSessionsController do
  render_views

    before(:each) do
        @valid_user = Factory.create(:user)
      activate_authlogic
    end

    describe "Authlogic & Application Controller tests" do

    it "should allow login of a specified user, and logged_in? should provide correct response" do
      sign_in(@valid_user)
      UserSession.find.user.should == @valid_user
      logged_in?.should be_true
      logged_in?.email.should == @valid_user.email #logged_in function actually returns session
    end

    it "should allow logout of a specified user and logged_in? should provide correct response" do
      sign_in(@valid_user)
      logged_in?.should be_true
      sign_out
      logged_in?.should be_false
    end

    end # authlogic tests

    describe "GET 'new'" do

    it "should only get new if logged out" do
      sign_in(@valid_user)     
      get :new
      flash[:error].should =~ /You must be logged out/i
      response.should redirect_to user_path(@valid_user.id)
      response.code.should == "302" # redirected by require_no_user
    end

  end # get new

  describe "POST 'create'" do
    it "should create user session" do
      logged_in?.should be_false
      post :create, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
      logged_in?.should be_true
    end

    it "should redirect to user show page, with flash success" do
      post :create, :user_session => { :email => @valid_user.email, :password => @valid_user.password }   
      assigns[:user_session].user.should == @valid_user
      response.code.should == "302"
      response.should redirect_to(user_path(@valid_user.id))
      flash[:success].should =~ /login succ/i 
    end    

    it "should not create user session for invalid password" do
      logged_in?.should be_false
      post :create, :user_session => { :email => @valid_user.email, :password => "" }
      logged_in?.should be_false
    end

    it "should redirect back to login page on invalid params, show proper flash" do
      post :create, :user_session => { :email => @valid_user.email, :password => "" }
      response.should redirect_to new_user_session_path
      ## BROKEN BECAUSE OF BEFORE_FILTER ##
      # response.should render_template('new')
      #response.should have_selector("div.flash.error", :content => "Incorrect user")
      flash[:error].should =~ /Incorrect user name or password/i 
    end

    it "should only create if logged out" do
      sign_in(@valid_user)
      post :create, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
      flash[:error].should =~ /You must be logged out/i
      response.code.should == "302"
      response.should redirect_to user_path(@valid_user.id) 
    end
  end # post create

  describe "DELETE destroy" do
    it "should destroy user session if logged in" do
      sign_in(@valid_user)
      logged_in?.should be_true
      delete :destroy
      UserSession.find.should be_nil
      response.should redirect_to new_user_session_path
    end

    it "should not destroy if logged out" do
      logged_in?.should be_false
      delete :destroy, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
      flash[:error].should =~ /You must be logged in/i
      response.code.should == "302" 
      response.should redirect_to new_user_session_path
    end

    it "should redirect to login page and show correct flash on logout" do
      sign_in(@valid_user)
      logged_in?.should be_true
      delete :destroy
      flash[:notice].should =~ /You have been logged/i
      response.should redirect_to new_user_session_path
    end

  end # delete destroy

end # specs
require 'spec_helper'

describe UsersController do
  render_views

  before(:each) do
    activate_authlogic
  end

  describe "GET 'new'" do

    it "should only work if not logged in" do
      user = Factory.create(:user)
      sign_in(user)
      get :new
      flash[:error].should =~ /must be logged out/i
      response.should redirect_to user_path(user)
    end
  end

  describe "GET index" do

    before(:each) do
      @admin_user = Factory.create(:user, :admin => true)
      @signed_in_user = Factory.create(:user)
      @user1 = Factory.create(:user)
      @user2 = Factory.create(:user)
      @user3 = Factory.create(:user)
      @users = [@admin_user, @signed_in_user, @user1, @user2, @user3]
    end

    describe "for non signed in users" do
      it "should deny access" do
        get :index
        flash[:error].should =~ /must be logged in/i
        response.should redirect_to new_user_session_path
      end    
    end

    describe "for non admin users" do
      it "should protect the page" do
        sign_in(@signed_in_user)
        get :index
        response.should redirect_to(root_path)
        flash[:error].should be_nil
        flash[:success].should be_nil
        flash[:notice].should be_nil               
      end
    end

    describe "for admin users" do

      before(:each) do
        sign_in(@admin_user)
      end    
    end      
  end

  describe "POST 'create'" do

    describe "failure" do

      before(:each) do
        @attr = {:name=>"", :email=>"", :password=>"", :password_confirmation=>""}
      end

      it "should not create a user" do
        lambda do
          post :create, :user => @attr
        end.should_not change(User, :count)
      end

      it "should render the 'new' page" do
        post :create, :user => @attr
        response.should render_template('new')
        response.should have_selector("div.error_messages")
      end

      it "should only create a user if not logged in" do
        @another_user = Factory.create(:user)
        sign_in(@another_user)
        @valid_attr = { :name=> 'New User', :email => 'somemail@gmail.com',:password => 'foobar', :password_confirmation => 'foobar' }
        post :create, :user => @attr
        flash[:error].should =~ /must be logged out/i
        response.should redirect_to user_path(@another_user)
      end

    end #failure

    describe "success" do

      before(:each) do
        @attr = { :name=> 'New User', :email => 'somemail@gmail.com',:password => 'foobar', :password_confirmation => 'foobar' }
      end

      it "should create a user" do
        lambda do
          post :create, :user => @attr
        end.should change(User, :count).by(1)
      end

      it "should redirect to the user show page" do
        post :create, :user => @attr
        assigns[:user].email.should == "somemail@gmail.com"
        response.should redirect_to(user_path(assigns(:user)))
      end

      it "should have a welcome message" do
        post :create, :user => @attr
        flash[:success].should =~ /signed/i
      end

       it "should be logged in" do
        post :create, :user => @attr
        UserSession.find.should_not be_nil
      end

    end #success
  end # post create

  describe "GET edit" do

    before(:each) do
      @valid_user = Factory.create(:user)
      sign_in(@valid_user)
    end

    describe "success" do    

      it "should have the right title" do
        get :edit, :id => @valid_user
        response.should have_selector("title", :content => "Edit User: #{@valid_user.name}")
      end 

    end # success

    describe "failure" do

      it "should not get edit if logged out" do
        sign_out
        get :edit, :id => @valid_user
        flash[:error].should =~ /must be logged in/i
        response.should redirect_to new_user_session_path
      end

    end # failure   
  end # GET edit

  describe "GET show" do

    before(:each) do
      @valid_user = Factory.create(:user)
      sign_in(@valid_user)
    end

    describe "success" do

      it "should get show if logged in" do
       get :show, :id => @valid_user
       response.should be_success
      end 

    end # success

    describe "failure" do

      it "should not get show if logged out" do
        sign_out
        get :show, :id => @valid_user
        flash[:error].should =~ /must be logged in/i
        response.should redirect_to new_user_session_path
      end

      it "should only be able to see their own page" do
        @another_user = Factory.create(:user)
        get :show, :id => @another_user
        response.should have_selector("title", :content => "Profile for #{@valid_user.name}")
      end

    end # failure   

    describe "admin users" do

      before(:each) do
        @admin_user = Factory.create(:user, :admin => true)
        sign_out
        sign_in(@admin_user)
      end

      it "should get their own show page if that is the selection" do
        get :show, :id => @admin_user
        response.should have_selector("title", :content => "Profile for #{@admin_user.name}")
      end

      it "should also be able to get other people's show page if that is the selection" do
        get :show, :id => @valid_user
        response.should have_selector("title", :content => "Profile for #{@valid_user.name}")
      end

      it "should not show admin content on admin login" do
        sign_in(@valid_user)
        get :show, :id => @valid_user
        response.should_not have_selector("section.admin>ul>li>a", :content => "Show Users", :href => users_path)
      end

    end

  end # GET show

  describe "PUT update" do

    before(:each) do
      @valid_user = Factory.create(:user)
      sign_in(@valid_user)
    end

    describe "success" do

      before(:each) do
        @new_attrs = { :name => "new name", :email => "myname@gmail.com", :password => @valid_user.password, :password_confirmation => @valid_user.password}
      end

      it "should correctly update the user with valid attributes" do
        put :update, :id => @valid_user.id, :user => @new_attrs
        assigns[:user].name.should == "new name"
        assigns[:user].email.should == "myname@gmail.com"
        User.find(@valid_user.id).email.should == "myname@gmail.com"
      end

      it "should redirect to the user show page" do
        put :update, :id => @valid_user.id, :user => @new_attrs
        response.should redirect_to user_path(@valid_user)
        flash[:success].should =~ /edited/i
      end

    end # success

    describe "failure" do

      before(:each) do
        @bad_attrs = { :name => "", :email => "nottaken"}
      end

      it "should not update user attributes if invalid" do
        original_email = @valid_user.email   
        put :update, :id => @valid_user, :user => @bad_attrs
        @valid_user.reload
        @valid_user.email.should == original_email
        logged_in?.should be_true
        User.find_by_email(original_email).should_not be_nil
      end

      it "should re-render the edit page" do
        put :update, :id => @valid_user, :user => @bad_attrs
        #controller.stub!(:require_user).and_return(true)
        response.should render_template('edit')
        logged_in?.should be_true
      end

      it "should not allow edit, even with valid attributes, if not logged in" do
        sign_out
        original_email = @valid_user.email
        put :update, :id => @valid_user, :user => @new_attrs
        @valid_user.reload
        @valid_user.email.should == original_email
        response.should redirect_to new_user_session_path
        logged_in?.should be_false
      end

      it "should not allow you to take another user's email" do
        @another_user = Factory.create(:user)
        put :update, :id => @valid_user, :user => { :name => "valid name", :email => @another_user.email}
        response.should render_template('edit')
        response.should have_selector("div.error_messages")
      end

    end #failure

  end # post update

  describe "DELETE destroy" do

    before(:each) do
       @valid_user = Factory.create(:user)
     end

    describe "as a non-signed-in user" do
      it "should deny access" do
        delete :destroy, :id => @valid_user
        flash[:error].should =~ /must be logged in/i
        response.should redirect_to new_user_session_path
      end
    end

    describe "as a non-admin user" do
      it "should protect the page" do
        sign_in(@valid_user)
        delete :destroy, :id => @valid_user
        response.should redirect_to(root_path)
        flash[:error].should be_nil
        flash[:success].should be_nil
        flash[:notice].should be_nil               
      end
    end

    describe "as an admin user" do

      before(:each) do
        @admin = Factory(:user, :admin => true)
        sign_in(@admin)
      end

      it "should destroy the user" do
        lambda do
          delete :destroy, :id => @valid_user
        end.should change(User, :count).by(-1)
      end

      it "should redirect to the users page with the correct flash" do
        delete :destroy, :id => @valid_user
        response.should redirect_to(users_path)
        flash[:success].should =~ /user destroyed/i
      end

    end

  end

end
Factory.define :valid_user , :class => User do |u|
  u.name "brandon"
  u.email "brandon@example.com"
  u.password "foobar"
  u.password_confirmation "foobar"
end

Factory.define :invalid_user , :class => User do |u|
  u.name ""
  u.email "brandon@example"
  u.password "f"
  u.password_confirmation "f"
end

Factory.sequence :email do |n|
  "person#{n}@example.com"
end

Factory.sequence :name do |n|
  "John Doe the #{n}"
end

Factory.define :user do |f|

  f.name {Factory.next(:name)}
  f.email {Factory.next(:email)}
  f.password "foobar"
  f.password_confirmation "foobar"
end 
require 'database_cleaner'
require 'spork'
require 'factory_girl'
require 'authlogic/test_case'

Spork.prefork do
  # Loading more in this block will cause your tests to run faster. However,
  # if you change any configuration or code from libraries loaded here, you'll
  # need to restart spork for it take effect.  

    def sign_in(user)
        u = UserSession.create(user)
    end

    def sign_out
        us = UserSession.find
        us.destroy
    end

    def logged_in?
      current_user_session = UserSession.find
      return current_user_session.record if current_user_session
      return false
    end

  DatabaseCleaner.strategy = :truncation

    # This file is copied to spec/ when you run 'rails generate rspec:install'
    ENV["RAILS_ENV"] ||= 'test'
    require File.expand_path("../../config/environment", __FILE__)
    require 'rspec/rails'
    require 'rspec/autorun'
  require 'webrat'

  include Authlogic::TestCase

    # Requires supporting ruby files with custom matchers and macros, etc,
    # in spec/support/ and its subdirectories.
    Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  Webrat.configure do |config|
    config.mode = :rails
  end

    RSpec.configure do |config|
        # == Mock Framework
        #
        # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
        #
        # config.mock_with :mocha
        # config.mock_with :flexmock
        # config.mock_with :rr
        config.mock_with :rspec

    ApplicationController.skip_before_filter :activate_authlogic
    config.before(:each, :type => :request) do
      activate_authlogic
      #UserSession.create(User.find_by_email!(email))
    end

        # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
        config.fixture_path = "#{::Rails.root}/spec/fixtures"

        # If you're not using ActiveRecord, or you'd prefer not to run each of your
        # examples within a transaction, remove the following line or assign false
        # instead of true.
        config.use_transactional_fixtures = true

        # If true, the base class of anonymous controllers will be inferred
        # automatically. This will be the default behavior in future versions of
        # rspec-rails.
        config.infer_base_class_for_anonymous_controllers = false
    end

end

Spork.each_run do
  # This code will be run each time you run your specs.

  FactoryGirl.reload 
  ActiveSupport::Dependencies.clear

  RSpec.configure do |config|

    config.before(:each) do
          DatabaseCleaner.start
        end

        config.after(:each) do
          DatabaseCleaner.clean
        end

  end

 # DatabaseCleaner.clean

end
  16) UsersController GET edit success should render the 'edit' page
 Failure/Error: response.should render_template('edit')
   expecting <"edit"> but rendering with <"">
 # ./spec/controllers/users_controller_spec.rb:203:in `block (4 levels) in <top (required)>'