Skip to content

Commit

Permalink
SessionsController specs written and passing
Browse files Browse the repository at this point in the history
  • Loading branch information
clouder committed Oct 22, 2011
1 parent d483d91 commit 9f09827
Show file tree
Hide file tree
Showing 11 changed files with 194 additions and 4 deletions.
3 changes: 3 additions & 0 deletions app/assets/javascripts/sessions.js.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
3 changes: 3 additions & 0 deletions app/assets/stylesheets/sessions.css.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// Place all the styles related to the sessions controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
4 changes: 4 additions & 0 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
class ApplicationController < ActionController::Base
protect_from_forgery

def authorized?
@user = User.find(session[:user_id]) if session[:user_id]
end
end
4 changes: 0 additions & 4 deletions app/controllers/brooms_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,4 @@ def destroy
def check_for_user
redirect_to root_url unless authorized?
end

def authorized?
@user = User.find(session[:user_id]) if session[:user_id]
end
end
53 changes: 53 additions & 0 deletions app/controllers/sessions_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
class SessionsController < ApplicationController
before_filter :check_for_user, :except => :destroy

def index

end

def new
session[:oauth] ||= {}
consumer = OAuth::Consumer.new(
'anonymous', 'anonymous', :site => 'https://www.google.com',
:request_token_path => '/accounts/OAuthGetRequestToken?scope=https://mail.google.com/%20https://www.googleapis.com/auth/userinfo%23email',
:access_token_path => '/accounts/OAuthGetAccessToken',
:authorize_path => '/account/OAuthAuthorizeToken'
)

if session[:oauth][:request_token]
request_token = OAuth::RequestToken.new(consumer, session[:oauth][:request_token], session[:oauth][:request_secret])
reset_session

begin
access_token = request_token.get_access_token(:oauth_verifier => params[:oauth_verifier])
rescue OAuth::Unauthorized
flash[:error] = 'Oops, we were not granted permission. You may try again if you like.'
redirect_to root_url and return
end

response = access_token.get('https://www.googleapis.com/userinfo/email?alt=json')
email = JSON.parse(response.body)['data']['email']
user = User.find_or_initialize_by_email(email)
user.attributes = { :token => access_token.token, :secret => access_token.secret }
user.save
session[:user_id] = user.id
redirect_to brooms_url
else
request_token = consumer.get_request_token(:oauth_callback => "#{request.scheme}://#{request.host}:#{request.port}/login")
session[:oauth][:request_token] = request_token.token
session[:oauth][:request_secret] = request_token.secret
redirect_to '/accounts/OAuthAuthorizeToken'
end
end

def destroy
reset_session
redirect_to root_url
end

private

def check_for_user
redirect_to brooms_url if authorized?
end
end
2 changes: 2 additions & 0 deletions app/helpers/sessions_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
module SessionsHelper
end
Empty file.
3 changes: 3 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
Pushbroom::Application.routes.draw do
resources :brooms

get '/login' => 'sessions#new', :as => :login
get '/logout' => 'sessions#destroy', :as => :logout

# The priority is based upon order of creation:
# first created -> highest priority.

Expand Down
1 change: 1 addition & 0 deletions spec/controllers/brooms_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@
User.any_instance.stub_chain(:brooms, :find).and_return(broom)
put :update, :id => 1, :broom => { :number => 5 }
end

it 'should redirect to brooms_url' do
response.should redirect_to(brooms_url)
end
Expand Down
110 changes: 110 additions & 0 deletions spec/controllers/sessions_controller_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
require 'spec_helper'

describe SessionsController, 'when authorized' do
before :each do
controller.stub(:authorized?).and_return(true)
end

it 'should redirect to brooms_url' do
get :index
response.should redirect_to(brooms_url)
get :new
response.should redirect_to(brooms_url)
end

describe 'on get :destroy' do
before :each do
session[:user_id] = 1
get :destroy
end

it 'should clear the user session' do
session.should be_blank
end

it 'should redirect to root_url' do
response.should redirect_to(root_url)
end
end
end

describe SessionsController, 'when unauthorized' do
it 'should respond with success on GET :index' do
get :index
response.should be_success
end

describe 'on GET :new with empty session' do
before :each do
request_token = mock(OAuth::RequestToken, :token => 'token', :secret => 'secret')
OAuth::Consumer.any_instance.stub(:get_request_token).and_return(request_token)
get :new
end

it 'should redirect to /accounts/OAuthAuthorizeToken' do
response.should redirect_to('/accounts/OAuthAuthorizeToken')
end

it 'should set session[:oauth][:request_token]' do
session[:oauth][:request_token].should eq('token')
end

it 'should set session[:oauth][:request_secret]' do
session[:oauth][:request_secret].should eq('secret')
end
end

describe 'on GET :new with session[:oauth][:request_token]' do
before :each do
session[:oauth] = {}
session[:oauth][:request_token] = 'token'
session[:oauth][:request_secret] = 'secret'
response = mock(Net::HTTPSuccess, :body => '{"data":{"email": "push@broom.com"}}')
access_token = mock(OAuth::AccessToken, :get => response, :token => 'token', :secret => 'secret')
OAuth::RequestToken.any_instance.stub(:get_access_token).and_return(access_token)
User.stub(:find_or_initialize_by_email).and_return(stub_model(User))
end

it 'should redirect to brooms_url' do
get :new
response.should redirect_to(brooms_url)
end

it 'should find or setup and save a user' do
User.should_receive(:find_or_initialize_by_email).with('push@broom.com')
User.any_instance.should_receive(:attributes=).with({ :token => 'token', :secret => 'secret' })
get :new
end

it 'should set session[:user_id]' do
get :new
session[:user_id].should_not be_blank
end

it 'should blank session[:oauth]' do
get :new
session[:oauth].should be_blank
end

describe 'but the user denies access on Google page' do
before :each do
OAuth::RequestToken.any_instance.stub(:get_access_token).and_raise(OAuth::Unauthorized)
end

it 'should redirect to root_url' do
get :new
response.should redirect_to(root_url)
end

it 'should set flash[:error] with info of the mishap' do
get :new
flash[:error].should eq("Oops, we were not granted permission. You may try again if you like.")
end

it 'should reset the session' do
get :new
session.should be_blank
end
end
end
end
15 changes: 15 additions & 0 deletions spec/helpers/sessions_helper_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
require 'spec_helper'

# Specs in this file have access to a helper object that includes
# the SessionsHelper. For example:
#
# describe SessionsHelper do
# describe "string concat" do
# it "concats two strings with spaces" do
# helper.concat_strings("this","that").should == "this that"
# end
# end
# end
describe SessionsHelper do
pending "add some examples to (or delete) #{__FILE__}"
end

0 comments on commit 9f09827

Please sign in to comment.