From 0347601fdba6e434a256c31222603102b62751eb Mon Sep 17 00:00:00 2001 From: Adam Cooke Date: Tue, 24 Feb 2015 14:46:43 +0000 Subject: [PATCH] add testing for controller methods (including adding a delegate class for managing the inteaction between controller & Authie) --- Rakefile | 2 + lib/authie/controller_delegate.rb | 61 +++++++++++++++++++++++++ lib/authie/controller_extension.rb | 41 ++++++----------- test/test_helper.rb | 2 + test/tests/controller_delegate_test.rb | 39 ++++++++++++++++ test/tests/controller_extension_test.rb | 46 +++++++++++++++++++ 6 files changed, 163 insertions(+), 28 deletions(-) create mode 100644 lib/authie/controller_delegate.rb create mode 100644 test/tests/controller_delegate_test.rb create mode 100644 test/tests/controller_extension_test.rb diff --git a/Rakefile b/Rakefile index 1fd553c..13196d7 100644 --- a/Rakefile +++ b/Rakefile @@ -3,4 +3,6 @@ task :default do $LOAD_PATH.unshift(File.expand_path('../test', __FILE__)) require 'test_helper' require 'tests/session_test' + require 'tests/controller_delegate_test' + require 'tests/controller_extension_test' end diff --git a/lib/authie/controller_delegate.rb b/lib/authie/controller_delegate.rb new file mode 100644 index 0000000..449fbdd --- /dev/null +++ b/lib/authie/controller_delegate.rb @@ -0,0 +1,61 @@ +module Authie + class ControllerDelegate + + def initialize(controller) + @controller = controller + end + + # Set a random browser ID for this browser. + def set_browser_id + until cookies[:browser_id] + proposed_browser_id = SecureRandom.uuid + unless Session.where(:browser_id => proposed_browser_id).exists? + cookies[:browser_id] = {:value => proposed_browser_id, :expires => 20.years.from_now} + end + end + end + + # Touch the auth session on each request if logged in + def touch_auth_session + if logged_in? + auth_session.touch! + end + end + + # Return the currently logged in user object + def current_user + auth_session.user + end + + # Set the currently logged in user + def current_user=(user) + if user + unless logged_in? + @auth_session = Session.start(@controller, :user => user) + end + @current_user = user + else + auth_session.destroy if logged_in? + @current_user = nil + end + end + + # Is anyone currently logged in? + def logged_in? + auth_session.is_a?(Session) + end + + # Return the currently logged in user session + def auth_session + @auth_session ||= Session.get_session(@controller) + end + + private + + # Return cookies for the controller + def cookies + @controller.send(:cookies) + end + + end +end diff --git a/lib/authie/controller_extension.rb b/lib/authie/controller_extension.rb index a9c3b5f..9071124 100644 --- a/lib/authie/controller_extension.rb +++ b/lib/authie/controller_extension.rb @@ -1,3 +1,5 @@ +require 'authie/controller_delegate' + module Authie module ControllerExtension @@ -8,49 +10,32 @@ def self.included(base) private - # Set a random browser ID for this browser. + def auth_session_delegate + @auth_session_delegate ||= Authie::ControllerDelegate.new(self) + end + def set_browser_id - until cookies[:browser_id] - proposed_browser_id = SecureRandom.uuid - unless Session.where(:browser_id => proposed_browser_id).exists? - cookies[:browser_id] = {:value => proposed_browser_id, :expires => 20.years.from_now} - end - end + auth_session_delegate.set_browser_id end - # Touch the auth session on each request if logged in def touch_auth_session - if logged_in? - auth_session.touch! - end + auth_session_delegate.touch_auth_session end - # Return the currently logged in user object def current_user - auth_session.user + auth_session_delegate.current_user end - # Set the currently logged in user - def current_user=(user) - if user - unless logged_in? - @auth_session = Session.start(self, :user => user) - end - @current_user = user - else - auth_session.destroy if logged_in? - @current_user = nil - end + def current_user=(*args) + auth_session_delegate.current_user(*args) end - # Is anyone currently logged in? def logged_in? - auth_session.is_a?(Session) + auth_session_delegate.logged_in? end - # Return the currently logged in user session def auth_session - @auth_session ||= Session.get_session(self) + auth_session_delegate.auth_session end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 726b79c..c93f4e8 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -13,6 +13,7 @@ class User < ActiveRecord::Base end class FakeController + def initialize(options = {}) @options = options end @@ -24,6 +25,7 @@ def cookies def request @request ||= FakeRequest.new(@options) end + end class FakeRequest diff --git a/test/tests/controller_delegate_test.rb b/test/tests/controller_delegate_test.rb new file mode 100644 index 0000000..28c934f --- /dev/null +++ b/test/tests/controller_delegate_test.rb @@ -0,0 +1,39 @@ +require 'authie/controller_delegate' + +class ControllerDelegateTest < Minitest::Test + + def setup + @controller = FakeController.new + @delegate = Authie::ControllerDelegate.new(@controller) + end + + def test_users_can_be_logged_in + # Test nobody is logged in by default + assert_equal false, @delegate.logged_in? + # Create a user and log them in + user = User.create(:username => 'tester') + @delegate.current_user = user + # Test that we're now logged in + assert_equal true, @delegate.logged_in? + assert_equal user, @delegate.current_user + assert_equal Authie::Session, @delegate.auth_session.class + end + + def test_browser_id_can_be_set + # Test that there's no browser ID to begin + assert_equal nil, @controller.cookies[:browser_id] + # Set the browser ID + @delegate.set_browser_id + # Test the browser ID looks like a UUID + assert @controller.cookies[:browser_id] =~ /\A[a-f0-9\-]{36}\z/ + end + + def test_touching_auth_sessions + @delegate.current_user = User.create(:username => 'dave') + assert_equal nil, @delegate.auth_session.last_activity_at + @delegate.touch_auth_session + assert_equal Time, @delegate.auth_session.last_activity_at.class + assert_equal '127.0.0.1', @delegate.auth_session.last_activity_ip + end + +end diff --git a/test/tests/controller_extension_test.rb b/test/tests/controller_extension_test.rb new file mode 100644 index 0000000..a703ff1 --- /dev/null +++ b/test/tests/controller_extension_test.rb @@ -0,0 +1,46 @@ +require 'authie/controller_extension' + +class ExtendedController < FakeController + + def self.before_filters + @before_filters ||= [] + end + + def self.before_filter(*names) + names.each { |n| before_filters << n } + end + + def self.helper_methods + @helper_methods ||= [] + end + + def self.helper_method(*names) + names.each { |n| helper_methods << n } + end + + include Authie::ControllerExtension + +end + +class ControllerExtensionTest < Minitest::Test + + def setup + @controller = ExtendedController.new + end + + def test_the_delegate_is_added + assert_equal Authie::ControllerDelegate, @controller.send(:auth_session_delegate).class + end + + def test_before_filters_are_added + assert @controller.class.before_filters.include?(:set_browser_id) + assert @controller.class.before_filters.include?(:touch_auth_session) + end + + def test_helper_methods_are_added + assert @controller.class.helper_methods.include?(:logged_in?) + assert @controller.class.helper_methods.include?(:current_user) + assert @controller.class.helper_methods.include?(:auth_session) + end + +end