From e0b63acfab9c0752aad58b8d3e14ef8ddf56442f Mon Sep 17 00:00:00 2001 From: lukemelia Date: Tue, 9 Oct 2007 05:17:28 +0000 Subject: [PATCH] Refactored tests for improved solubility/grokability. git-svn-id: http://www.rousette.org.uk/svn/tracks-repos/trunk@615 a4c988fc-2ded-0310-b66e-134b36920a42 --- .../functional/contexts_controller_test.rb | 38 +++--- .../test/functional/data_controller_test.rb | 2 +- .../functional/feedlist_controller_test.rb | 2 +- .../test/functional/login_controller_test.rb | 41 +++--- .../functional/projects_controller_test.rb | 56 ++++---- .../todo_container_controller_test_base.rb | 2 +- .../test/functional/users_controller_test.rb | 121 ++++++++++-------- 7 files changed, 129 insertions(+), 133 deletions(-) diff --git a/tracks/test/functional/contexts_controller_test.rb b/tracks/test/functional/contexts_controller_test.rb index 1b02d4e6..3938e6df 100644 --- a/tracks/test/functional/contexts_controller_test.rb +++ b/tracks/test/functional/contexts_controller_test.rb @@ -13,7 +13,7 @@ class ContextsControllerTest < TodoContainerControllerTestBase end def test_contexts_list - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user get :index end @@ -41,7 +41,7 @@ class ContextsControllerTest < TodoContainerControllerTestBase end def test_rss_feed_content - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user get :index, { :format => "rss" } assert_equal 'application/rss+xml; charset=utf-8', @response.headers["Content-Type"] #puts @response.body @@ -69,25 +69,25 @@ class ContextsControllerTest < TodoContainerControllerTestBase end def test_rss_feed_not_accessible_to_anonymous_user_without_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "rss" } assert_response 401 end def test_rss_feed_not_accessible_to_anonymous_user_with_invalid_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "rss", :token => 'foo' } assert_response 401 end def test_rss_feed_accessible_to_anonymous_user_with_valid_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "rss", :token => users(:admin_user).token } assert_response :ok end def test_atom_feed_content - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user get :index, { :format => "atom" } assert_equal 'application/atom+xml; charset=utf-8', @response.headers["Content-Type"] #puts @response.body @@ -108,78 +108,78 @@ class ContextsControllerTest < TodoContainerControllerTestBase end def test_atom_feed_not_accessible_to_anonymous_user_without_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "atom" } assert_response 401 end def test_atom_feed_not_accessible_to_anonymous_user_with_invalid_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "atom", :token => 'foo' } assert_response 401 end def test_atom_feed_accessible_to_anonymous_user_with_valid_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "atom", :token => users(:admin_user).token } assert_response :ok end def test_text_feed_content - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user get :index, { :format => "txt" } assert_equal 'text/plain; charset=utf-8', @response.headers["Content-Type"] assert !(/ /.match(@response.body)) end def test_text_feed_not_accessible_to_anonymous_user_without_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "txt" } assert_response 401 end def test_text_feed_not_accessible_to_anonymous_user_with_invalid_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "txt", :token => 'foo' } assert_response 401 end def test_text_feed_accessible_to_anonymous_user_with_valid_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "txt", :token => users(:admin_user).token } assert_response :ok end def test_show_sets_title - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user get :show, { :id => "1" } assert_equal 'TRACKS::Context: agenda', assigns['page_title'] end def test_show_renders_show_template - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user get :show, { :id => "1" } assert_template "contexts/show" end def test_show_xml_renders_context_to_xml - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user get :show, { :id => "1", :format => 'xml' } assert_equal contexts(:agenda).to_xml( :except => :user_id ), @response.body end def test_show_with_nil_context_returns_404 - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user get :show, { :id => "0" } assert_equal 'Context not found', @response.body assert_response 404 end def test_show_xml_with_nil_context_returns_404 - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user get :show, { :id => "0", :format => 'xml' } assert_response 404 assert_xml_select 'error', 'Context not found' end -end +end \ No newline at end of file diff --git a/tracks/test/functional/data_controller_test.rb b/tracks/test/functional/data_controller_test.rb index 4f8e36ec..3ac79cec 100644 --- a/tracks/test/functional/data_controller_test.rb +++ b/tracks/test/functional/data_controller_test.rb @@ -15,7 +15,7 @@ class DataControllerTest < Test::Rails::TestCase # Replace this with your real tests. def test_csv_export_completes_without_error - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user get :csv_notes end end diff --git a/tracks/test/functional/feedlist_controller_test.rb b/tracks/test/functional/feedlist_controller_test.rb index 38923a82..1c5db755 100644 --- a/tracks/test/functional/feedlist_controller_test.rb +++ b/tracks/test/functional/feedlist_controller_test.rb @@ -21,7 +21,7 @@ class FeedlistControllerTest < Test::Rails::TestCase end def test_get_index_by_logged_in_user - @request.session['user_id'] = users(:other_user).id + login_as :other_user get :index assert_response :success assert_equal "TRACKS::Feeds", assigns['page_title'] diff --git a/tracks/test/functional/login_controller_test.rb b/tracks/test/functional/login_controller_test.rb index 90a82564..9c77c7c9 100644 --- a/tracks/test/functional/login_controller_test.rb +++ b/tracks/test/functional/login_controller_test.rb @@ -14,7 +14,6 @@ class LoginControllerTest < Test::Rails::TestCase @controller = LoginController.new @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new - @num_users_in_fixture = User.count end #============================================ @@ -30,7 +29,8 @@ class LoginControllerTest < Test::Rails::TestCase def test_login_with_valid_admin_user @request.session['return-to'] = "/bogus/location" - user = login('admin', 'abracadabra', 'on') + post :login, {:user_login => 'admin', :user_password => 'abracadabra', :user_noexpiry => 'on'} + user = User.find(session['user_id']) assert_equal user.id, @response.session['user_id'] assert_equal user.login, "admin" assert user.is_admin @@ -39,7 +39,8 @@ class LoginControllerTest < Test::Rails::TestCase end def test_login_with_valid_standard_user - user = login('jane','sesame', 'off') + post :login, {:user_login => 'jane', :user_password => 'sesame', :user_noexpiry => 'off'} + user = User.find(session['user_id']) assert_equal user.id, @response.session['user_id'] assert_equal user.login, "jane" assert user.is_admin == false || user.is_admin == 0 @@ -54,7 +55,7 @@ class LoginControllerTest < Test::Rails::TestCase end def test_logout - user = login('admin','abracadabra', 'on') + login_as :admin_user get :logout assert_nil(session['user_id']) assert_redirected_to :controller => 'login', :action => 'login' @@ -94,7 +95,7 @@ class LoginControllerTest < Test::Rails::TestCase def test_should_login_with_cookie users(:other_user).remember_me - @request.cookies["auth_token"] = cookie_for(:other_user) + @request.cookies["auth_token"] = auth_token_cookie_for(:other_user) get :login assert @controller.send(:logged_in?) end @@ -102,14 +103,14 @@ class LoginControllerTest < Test::Rails::TestCase def test_should_fail_expired_cookie_login users(:other_user).remember_me users(:other_user).update_attribute :remember_token_expires_at, 5.minutes.ago - @request.cookies["auth_token"] = cookie_for(:other_user) + @request.cookies["auth_token"] = auth_token_cookie_for(:other_user) get :login assert !@controller.send(:logged_in?) end def test_should_fail_cookie_login users(:other_user).remember_me - @request.cookies["auth_token"] = auth_token('invalid_auth_token') + @request.cookies["auth_token"] = CGI::Cookie.new('name' => 'auth_token', 'value' => 'invalid_auth_token') get :login assert !@controller.send(:logged_in?) end @@ -120,35 +121,25 @@ class LoginControllerTest < Test::Rails::TestCase end def test_current_user_correct - user = login('jane','sesame', 'off') - assert_equal user, @controller.current_user + post :login, {:user_login => 'jane', :user_password => 'sesame', :user_noexpiry => 'off'} + assert_equal users(:other_user), @controller.current_user end def test_prefs_nil + login_as nil get :login assert_nil @controller.prefs end def test_prefs_correct - user = login('jane','sesame', 'off') - assert_equal user.prefs, @controller.prefs + post :login, {:user_login => 'jane', :user_password => 'sesame', :user_noexpiry => 'off'} + assert_equal users(:other_user).prefs, @controller.prefs end private - - # Logs in a user and returns the user object found in the session object - def login(login,password,expiry) - post :login, {:user_login => login, :user_password => password, :user_noexpiry => expiry} - assert_not_nil(session['user_id']) - return User.find(session['user_id']) - end - - def auth_token(token) - CGI::Cookie.new('name' => 'auth_token', 'value' => token) - end - - def cookie_for(user) - auth_token users(user).remember_token + + def auth_token_cookie_for(user) + CGI::Cookie.new('name' => 'auth_token', 'value' => users(user).remember_token) end diff --git a/tracks/test/functional/projects_controller_test.rb b/tracks/test/functional/projects_controller_test.rb index 025ca4ca..f183c1f7 100644 --- a/tracks/test/functional/projects_controller_test.rb +++ b/tracks/test/functional/projects_controller_test.rb @@ -13,13 +13,14 @@ class ProjectsControllerTest < TodoContainerControllerTestBase end def test_projects_list - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user get :index end def test_show_exposes_deferred_todos p = projects(:timemachine) - show p + login_as :admin_user + get :show, :id => p.to_param assert_not_nil assigns['deferred'] assert_equal 1, assigns['deferred'].size @@ -32,12 +33,14 @@ class ProjectsControllerTest < TodoContainerControllerTestBase end def test_show_exposes_next_project_in_same_state - show projects(:timemachine) + login_as :admin_user + get :show, :id => projects(:timemachine).to_param assert_equal(projects(:moremoney), assigns['next_project']) end def test_show_exposes_previous_project_in_same_state - show projects(:moremoney) + login_as :admin_user + get :show, :id => projects(:moremoney).to_param assert_equal(projects(:timemachine), assigns['previous_project']) end @@ -74,7 +77,7 @@ class ProjectsControllerTest < TodoContainerControllerTestBase def test_todo_state_is_project_hidden_after_hiding_project p = projects(:timemachine) todos = p.todos.find_in_state(:all, :active) - @request.session['user_id'] = users(:admin_user).id + login_as(:admin_user) xhr :post, :update, :id => 1, "project"=>{"name"=>p.name, "description"=>p.description, "state"=>"hidden"} todos.each do |t| assert_equal :project_hidden, t.reload().current_state @@ -85,7 +88,7 @@ class ProjectsControllerTest < TodoContainerControllerTestBase def test_not_done_counts_after_hiding_and_unhiding_project p = projects(:timemachine) todos = p.todos.find_in_state(:all, :active) - @request.session['user_id'] = users(:admin_user).id + login_as(:admin_user) xhr :post, :update, :id => 1, "project"=>{"name"=>p.name, "description"=>p.description, "state"=>"hidden"} xhr :post, :update, :id => 1, "project"=>{"name"=>p.name, "description"=>p.description, "state"=>"active"} todos.each do |t| @@ -95,7 +98,7 @@ class ProjectsControllerTest < TodoContainerControllerTestBase end def test_rss_feed_content - @request.session['user_id'] = users(:admin_user).id + login_as(:admin_user) get :index, { :format => "rss" } assert_equal 'application/rss+xml; charset=utf-8', @response.headers["Content-Type"] #puts @response.body @@ -123,25 +126,25 @@ class ProjectsControllerTest < TodoContainerControllerTestBase end def test_rss_feed_not_accessible_to_anonymous_user_without_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "rss" } assert_response 401 end def test_rss_feed_not_accessible_to_anonymous_user_with_invalid_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "rss", :token => 'foo' } assert_response 401 end def test_rss_feed_accessible_to_anonymous_user_with_valid_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "rss", :token => users(:admin_user).token } assert_response :ok end def test_atom_feed_content - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user get :index, { :format => "atom" } assert_equal 'application/atom+xml; charset=utf-8', @response.headers["Content-Type"] #puts @response.body @@ -162,25 +165,25 @@ class ProjectsControllerTest < TodoContainerControllerTestBase end def test_atom_feed_not_accessible_to_anonymous_user_without_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "atom" } assert_response 401 end def test_atom_feed_not_accessible_to_anonymous_user_with_invalid_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "atom", :token => 'foo' } assert_response 401 end def test_atom_feed_accessible_to_anonymous_user_with_valid_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "atom", :token => users(:admin_user).token } assert_response :ok end def test_text_feed_content - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user get :index, { :format => "txt" } assert_equal 'text/plain; charset=utf-8', @response.headers["Content-Type"] assert !(/ /.match(@response.body)) @@ -188,7 +191,7 @@ class ProjectsControllerTest < TodoContainerControllerTestBase end def test_text_feed_content_for_projects_with_no_actions - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user p = projects(:timemachine) p.todos.each { |t| t.destroy } @@ -198,26 +201,26 @@ class ProjectsControllerTest < TodoContainerControllerTestBase end def test_text_feed_not_accessible_to_anonymous_user_without_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "txt" } assert_response 401 end def test_text_feed_not_accessible_to_anonymous_user_with_invalid_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "txt", :token => 'foo' } assert_response 401 end def test_text_feed_accessible_to_anonymous_user_with_valid_token - @request.session['user_id'] = nil + login_as nil get :index, { :format => "txt", :token => users(:admin_user).token } assert_response :ok end def test_alphabetize_sorts_active_projects_alphabetically + login_as :admin_user u = users(:admin_user) - @request.session['user_id'] = u.id post :alphabetize, { :state => "active" } assert_equal 1, projects(:timemachine).position assert_equal 2, projects(:gardenclean).position @@ -225,25 +228,18 @@ class ProjectsControllerTest < TodoContainerControllerTestBase end def test_alphabetize_assigns_state - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user post :alphabetize, { :state => "active" } assert_equal "active", assigns['state'] end def test_alphabetize_assigns_projects - @request.session['user_id'] = users(:admin_user).id + login_as :admin_user post :alphabetize, { :state => "active" } exposed_projects = assigns['projects'] assert_equal 3, exposed_projects.length assert_equal projects(:timemachine), exposed_projects[0] assert_equal projects(:gardenclean), exposed_projects[1] assert_equal projects(:moremoney), exposed_projects[2] - end - - private - def show(project) - @request.session['user_id'] = project.user_id - get :show, :id => project.to_param - end - + end end diff --git a/tracks/test/functional/todo_container_controller_test_base.rb b/tracks/test/functional/todo_container_controller_test_base.rb index c4436adb..9742f173 100644 --- a/tracks/test/functional/todo_container_controller_test_base.rb +++ b/tracks/test/functional/todo_container_controller_test_base.rb @@ -3,7 +3,7 @@ class TodoContainerControllerTestBase < Test::Rails::TestCase def perform_setup(container_class, controller_class) @controller = controller_class.new @request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new - @request.session['user_id'] = users(:other_user).id + login_as :other_user @initial_count = container_class.count @container_class = container_class end diff --git a/tracks/test/functional/users_controller_test.rb b/tracks/test/functional/users_controller_test.rb index bec5355a..c9d854b8 100644 --- a/tracks/test/functional/users_controller_test.rb +++ b/tracks/test/functional/users_controller_test.rb @@ -13,9 +13,6 @@ class UsersControllerTest < Test::Rails::TestCase @controller = UsersController.new @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new - @num_users_in_fixture = User.count - @admin_user = users(:admin_user) - @nonadmin_user = users(:other_user) end def test_get_index_when_not_logged_in @@ -24,13 +21,13 @@ class UsersControllerTest < Test::Rails::TestCase end def test_get_index_by_nonadmin - login_as @nonadmin_user + login_as :other_user get :index assert_response 401 end def test_get_index_by_admin - login_as @admin_user + login_as :admin_user get :index assert_response :success assert_equal "TRACKS::Manage Users", assigns['page_title'] @@ -39,7 +36,7 @@ class UsersControllerTest < Test::Rails::TestCase end def test_destroy_user - login_as @admin_user + login_as :admin_user @no_users_before = User.find(:all).size xhr :post, :destroy, :id => 3 assert_rjs :page, "user-3", :remove @@ -49,7 +46,7 @@ class UsersControllerTest < Test::Rails::TestCase def test_update_password_successful get :change_password # should fail because no login assert_redirected_to :controller => 'login', :action => 'login' - login_as @admin_user + login_as :admin_user @user = @request.session['user_id'] get :change_password # should now pass because we're logged in assert_response :success @@ -64,7 +61,7 @@ class UsersControllerTest < Test::Rails::TestCase def test_update_password_no_confirmation post :update_password # should fail because no login assert_redirected_to :controller => 'login', :action => 'login' - login_as @admin_user + login_as :admin_user post :update_password, :updateuser => {:password => 'newpassword', :password_confirmation => 'wrong'} assert_redirected_to :controller => 'users', :action => 'change_password' assert users(:admin_user).save, false @@ -74,7 +71,7 @@ class UsersControllerTest < Test::Rails::TestCase def test_update_password_validation_errors post :update_password # should fail because no login assert_redirected_to :controller => 'login', :action => 'login' - login_as @admin_user + login_as :admin_user post :update_password, :updateuser => {:password => 'ba', :password_confirmation => 'ba'} assert_redirected_to :controller => 'users', :action => 'change_password' assert users(:admin_user).save, false @@ -88,74 +85,86 @@ class UsersControllerTest < Test::Rails::TestCase # Signup and creation of new users # ============================================ - def test_create - login_as @admin_user - newbie = create('newbie', 'newbiepass') - assert_equal "Signup successful for user newbie.", flash[:notice], "expected flash notice not found" - assert_redirected_to home_url - assert_valid newbie - session['user_id'] = nil # logout the admin user + def test_create_adds_a_new_nonadmin_user + login_as :admin_user + post :create, :user => {:login => 'newbie', :password => 'newbiepass', :password_confirmation => 'newbiepass'} + newbie = User.find_by_login('newbie') assert_equal newbie.login, "newbie" assert newbie.is_admin == false || newbie.is_admin == 0 assert_not_nil newbie.preference # have user preferences been created? assert_not_nil User.authenticate('newbie', 'newbiepass') - assert_equal User.count, @num_users_in_fixture + 1 + end + + def test_create_redirects_to_home_page + login_as :admin_user + post :create, :user => {:login => 'newbie', :password => 'newbiepass', :password_confirmation => 'newbiepass'} + assert_redirected_to home_url + end + + def test_create_sets_flash_message + login_as :admin_user + post :create, :user => {:login => 'newbie', :password => 'newbiepass', :password_confirmation => 'newbiepass'} + assert_equal "Signup successful for user newbie.", flash[:notice], "expected flash notice not found" + end + + def test_create_adds_a_user + login_as :admin_user + assert_difference(User, :count) do + post :create, :user => {:login => 'newbie', :password => 'newbiepass', :password_confirmation => 'newbiepass'} + end end # Test whether signup of new users is denied to a non-admin user # def test_create_by_non_admin - non_admin = login_as @nonadmin_user - post :create, :user => {:login => 'newbie2', :password => 'newbiepass2', :password_confirmation => 'newbiepass2'} + login_as :other_user + assert_no_difference(User, :count) do + post :create, :user => {:login => 'newbie2', :password => 'newbiepass2', :password_confirmation => 'newbiepass2'} + end assert_response :success assert_template 'users/nosignup' - assert_number_of_users_is_unchanged end # ============================================ # Test validations # ============================================ - def test_create_with_invalid_password - login_as @admin_user - post :create, :user => {:login => 'newbie', :password => '', :password_confirmation => ''} - assert_number_of_users_is_unchanged - assert_redirected_to :controller => 'users', :action => 'new' - end - - def test_create_with_invalid_user - login_as @admin_user - post :create, :user => {:login => 'n', :password => 'newbiepass', :password_confirmation => 'newbiepass'} - assert_number_of_users_is_unchanged - assert_redirected_to :controller => 'users', :action => 'new' - end - - # Test uniqueness of login - # - def test_validate_uniqueness_of_login - login_as @admin_user - post :create, :user => {:login => 'jane', :password => 'newbiepass', :password_confirmation => 'newbiepass'} - num_users = User.find(:all) - assert_number_of_users_is_unchanged - assert_redirected_to :controller => 'users', :action => 'new' - end - - private - - def login_as(user) - returning user do |u| - @request.session['user_id'] = u.id + def test_create_with_invalid_password_does_not_add_a_new_user + login_as :admin_user + assert_no_difference(User, :count) do + post :create, :user => {:login => 'newbie', :password => '', :password_confirmation => ''} end end - # Creates a new users with the login and password given - def create(login,password) - post :create, :user => {:login => login, :password => password, :password_confirmation => password} - return User.find_by_login(login) + def test_create_with_invalid_password_redirects_to_new_user_page + login_as :admin_user + post :create, :user => {:login => 'newbie', :password => '', :password_confirmation => ''} + assert_redirected_to :controller => 'users', :action => 'new' end - def assert_number_of_users_is_unchanged - assert_equal User.count, @num_users_in_fixture - end + def test_create_with_invalid_login_does_not_add_a_new_user + login_as :admin_user + post :create, :user => {:login => 'n', :password => 'newbiepass', :password_confirmation => 'newbiepass'} + assert_redirected_to :controller => 'users', :action => 'new' + end + + def test_create_with_invalid_login_redirects_to_new_user_page + login_as :admin_user + post :create, :user => {:login => 'n', :password => 'newbiepass', :password_confirmation => 'newbiepass'} + assert_redirected_to :controller => 'users', :action => 'new' + end + + def test_create_with_duplicate_login_does_not_add_a_new_user + login_as :admin_user + assert_no_difference(User, :count) do + post :create, :user => {:login => 'jane', :password => 'newbiepass', :password_confirmation => 'newbiepass'} + end + end + + def test_create_with_duplicate_login_redirects_to_new_user_page + login_as :admin_user + post :create, :user => {:login => 'jane', :password => 'newbiepass', :password_confirmation => 'newbiepass'} + assert_redirected_to :controller => 'users', :action => 'new' + end end