require File.dirname(__FILE__) + '/../spec_helper'

describe SessionsController do
  include ActionController::AuthenticationTestHelper

  render_views

  describe "new" do
    it 'should render' do
      get :new

      assert_response 200
    end
  end

  describe "create" do
    describe 'with valid login and password of user with chat' do
      before do
        user_attributes = Factory.attributes_for(:user)
        @user = User.create(user_attributes)
        @user.activate
        @credentials = user_attributes.reject{ |k, v|
          ! [ :login, :password ].include?(k)
        }
      end

      it 'should validate user and redirect to home with chat' do
        post :create, @credentials

        assert controller.current_user == @user
        response.should redirect_to(home_path)
      end
    end

    describe 'with valid login and password of user without chat' do
      before do
        user_attributes = Factory.attributes_for(:user_without_chat)
        @user = User.create(user_attributes)
        @user.activate
        @credentials = user_attributes.reject{ |k, v|
          ! [ :login, :password ].include?(k)
        }
      end

      it 'should validate user and redirect to home without chat' do
        post :create, @credentials

        assert controller.current_user == @user
        response.should redirect_to(home_path)
      end
    end

    describe 'with valid login and password of user with params return_to and chat' do
      before do
        user_attributes = Factory.attributes_for(:user)
        @user = User.create(user_attributes)
        @user.activate
        @credentials = user_attributes.reject{ |k, v|
          ! [ :login, :password ].include?(k)
        }
        @public_space = Factory(:public_space)
      end

      it 'should validate user and redirect to the path, in params return_to, with chat' do
        post :create, @credentials, :return_to => space_path(@public_space)

        assert controller.current_user == @user
        response.should redirect_to(space_path(@public_space))
      end
    end

    describe 'with valid login and password of user with params return_to and without chat' do
      before do
        user_attributes = Factory.attributes_for(:user_without_chat)
        @user = User.create(user_attributes)
        @user.activate
        @credentials = user_attributes.reject{ |k, v|
          ! [ :login, :password ].include?(k)
        }
        @public_space = Factory(:public_space)
      end

      it 'should validate user and redirect to the path, in params return_to, without chat' do
        post :create, @credentials, :return_to => space_path(@public_space)

        assert controller.current_user == @user
        response.should redirect_to(space_path(@public_space))
      end
    end

    describe 'with invalid login and password' do
      before do
        @credentials = { :login => 'bad', :password => 'incorrect' }
      end

      it 'should NOT validate user' do
        post :create, @credentials

        controller.current_user.should be(Anonymous.current)
        assert_response 200
        response.should render_template('new')
      end
    end

    describe 'with valid openid' do
      before :each do
        @credentials = { :openid_identifier => 'dit.upm.es/atapiador' }
        @openid_provider = 'http://dit.upm.es'
      end

      it 'should redirect to OpenID provider' do
        post :create, @credentials

        assert_response 302
        response.redirect_url.should contain(/#{ Regexp.escape('http://irss.dit.upm.es/openid_server') }/)
      end
    end


  end

  describe "on logout" do
    before do
      login_as Factory(:user)
    end

    it 'should destroy session' do
      get :destroy

      session[:agent_id].should be_nil
      session[:agent_type].should be_nil
      response.should be_redirect
    end
  end
end
