users_controller_spec.rb 3.41 KB
require 'spec_helper'

describe UsersController do
  
  it_requires_authentication
   it_requires_admin_privileges
  
  context 'Signed in as an admin' do
    before do
      sign_in Factory(:admin)
    end

    context "GET /users" do
      it 'paginates all users' do
        users = 3.times.inject(WillPaginate::Collection.new(1,30)) {|page,_| page << Factory.build(:user)}
        User.should_receive(:paginate).and_return(users)
        get :index
        assigns(:users).should == users
      end
    end
    
    context "GET /users/:id" do
      it 'finds the user' do
        user = Factory(:user)
        get :show, :id => user.id
        assigns(:user).should == user
      end
    end
    
    context "GET /users/new" do
      it 'assigns a new user' do
        get :new
        assigns(:user).should be_a(User)
        assigns(:user).should be_new_record
      end
    end
    
    context "GET /users/:id/edit" do
      it 'finds the user' do
        user = Factory(:user)
        get :edit, :id => user.id
        assigns(:user).should == user
      end
    end
    
    context "POST /users" do
      context "when the create is successful" do
        before do
          @user = Factory(:user)
          User.should_receive(:new).and_return(@user)
          @user.should_receive(:save).and_return(true)
        end
        
        it "sets a message to display" do
          post :create
          request.flash[:success].should include('part of the team')
        end
        
        it "redirects to the user's page" do
          post :create
          response.should redirect_to(user_path(@user))
        end
      end
      
      context "when the create is unsuccessful" do
        before do
          @user = Factory(:user)
          User.should_receive(:new).and_return(@user)
          @user.should_receive(:save).and_return(false)
        end
        
        it "renders the new page" do
          post :create
          response.should render_template(:new)
        end
      end
    end
    
    context "PUT /users/:id" do
      context "when the update is successful" do
        before do
          @user = Factory(:user)
        end
        
        it "sets a message to display" do
          put :update, :id => @user.to_param, :user => {:name => 'Kermit'}
          request.flash[:success].should include('updated')
        end
        
        it "redirects to the user's page" do
          put :update, :id => @user.to_param, :user => {:name => 'Kermit'}
          response.should redirect_to(user_path(@user))
        end
      end
      
      context "when the update is unsuccessful" do
        before do
          @user = Factory(:user)
        end
        
        it "renders the edit page" do
          put :update, :id => @user.to_param, :user => {:name => nil}
          response.should render_template(:edit)
        end
      end
    end
    
    context "DELETE /users/:id" do
      before do
        @user = Factory(:user)
      end
      
      it "destroys the user" do
        delete :destroy, :id => @user.id
        User.where(:id => @user.id).first.should be_nil
      end
      
      it "redirects to the users index page" do
        delete :destroy, :id => @user.id
        response.should redirect_to(users_path)
      end
      
      it "sets a message to display" do
        delete :destroy, :id => @user.id
        request.flash[:success[.should include('no longer part of your team')
      end
    end
    
  end
end