diff --git a/tracks/test/functional/login_controller_test.rb b/tracks/test/functional/login_controller_test.rb index 9c77c7c9..b585dd6b 100644 --- a/tracks/test/functional/login_controller_test.rb +++ b/tracks/test/functional/login_controller_test.rb @@ -1,146 +1,146 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'login_controller' -require_dependency "login_system" - -# Re-raise errors caught by the controller. -class LoginController; def rescue_action(e) raise e end; end - -class LoginControllerTest < Test::Rails::TestCase - fixtures :preferences, :users - - def setup - assert_equal "test", ENV['RAILS_ENV'] - assert_equal "change-me", Tracks::Config.salt - @controller = LoginController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - end - - #============================================ - #Login and logout - #============================================ - - def test_invalid_login - post :login, {:user_login => 'cracker', :user_password => 'secret', :user_noexpiry => 'on'} - assert_response :success - assert(!@response.has_session_object?(:user_id)) - assert_template "login" - end - - def test_login_with_valid_admin_user - @request.session['return-to'] = "/bogus/location" - 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 - assert_equal "Login successful: session will not expire.", flash[:notice] - assert_equal("http://#{@request.host}/bogus/location", @response.redirect_url) - end - - def test_login_with_valid_standard_user - 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 - assert_equal "Login successful: session will expire after 1 hour of inactivity.", flash[:notice] - assert_redirected_to home_url - end - - def test_login_with_no_users_redirects_to_signup - User.delete_all - get :login - assert_redirected_to :controller => 'users', :action => 'new' - end - - def test_logout - login_as :admin_user - get :logout - assert_nil(session['user_id']) - assert_redirected_to :controller => 'login', :action => 'login' - end - - # Test login with a bad password for existing user - # - def test_login_bad_password - post :login, {:user_login => 'jane', :user_password => 'wrong', :user_noexpiry => 'on'} - assert(!@response.has_session_object?(:user)) - assert_equal "Login unsuccessful", flash[:warning] - assert_response :success - end - - def test_login_bad_login - post :login, {:user_login => 'blah', :user_password => 'sesame', :user_noexpiry => 'on'} - assert(!@response.has_session_object?(:user)) - assert_equal "Login unsuccessful", flash[:warning] - assert_response :success - end - - def test_should_remember_me - post :login, :user_login => 'jane', :user_password => 'sesame', :user_noexpiry => "on" - assert_not_nil @response.cookies["auth_token"] - end - - def test_should_not_remember_me - post :login, :user_login => 'jane', :user_password => 'sesame', :user_noexpiry => "off" - assert_nil @response.cookies["auth_token"] - end - - def test_should_delete_token_on_logout - login_as :other_user - get :logout - assert_equal @response.cookies["auth_token"], [] - end - - def test_should_login_with_cookie - users(:other_user).remember_me - @request.cookies["auth_token"] = auth_token_cookie_for(:other_user) - get :login - assert @controller.send(:logged_in?) - end - - 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"] = 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"] = CGI::Cookie.new('name' => 'auth_token', 'value' => 'invalid_auth_token') - get :login - assert !@controller.send(:logged_in?) - end - - def test_current_user_nil - get :login - assert_nil @controller.current_user - end - - def test_current_user_correct - 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 - post :login, {:user_login => 'jane', :user_password => 'sesame', :user_noexpiry => 'off'} - assert_equal users(:other_user).prefs, @controller.prefs - end - - private - - def auth_token_cookie_for(user) - CGI::Cookie.new('name' => 'auth_token', 'value' => users(user).remember_token) - end - - -end +require File.dirname(__FILE__) + '/../test_helper' +require 'login_controller' +require_dependency "login_system" + +# Re-raise errors caught by the controller. +class LoginController; def rescue_action(e) raise e end; end + +class LoginControllerTest < Test::Rails::TestCase + fixtures :preferences, :users + + def setup + assert_equal "test", ENV['RAILS_ENV'] + assert_equal "change-me", Tracks::Config.salt + @controller = LoginController.new + @request = ActionController::TestRequest.new + @response = ActionController::TestResponse.new + end + + #============================================ + #Login and logout + #============================================ + + def test_invalid_login + post :login, {:user_login => 'cracker', :user_password => 'secret', :user_noexpiry => 'on'} + assert_response :success + assert(!@response.has_session_object?(:user_id)) + assert_template "login" + end + + def test_login_with_valid_admin_user + @request.session['return-to'] = "/bogus/location" + 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 + assert_equal "Login successful: session will not expire.", flash[:notice] + assert_equal("http://#{@request.host}/bogus/location", @response.redirect_url) + end + + def test_login_with_valid_standard_user + 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 + assert_equal "Login successful: session will expire after 1 hour of inactivity.", flash[:notice] + assert_redirected_to home_url + end + + def test_login_with_no_users_redirects_to_signup + User.delete_all + get :login + assert_redirected_to :controller => 'users', :action => 'new' + end + + def test_logout + login_as :admin_user + get :logout + assert_nil(session['user_id']) + assert_redirected_to :controller => 'login', :action => 'login' + end + + # Test login with a bad password for existing user + # + def test_login_bad_password + post :login, {:user_login => 'jane', :user_password => 'wrong', :user_noexpiry => 'on'} + assert(!@response.has_session_object?(:user)) + assert_equal "Login unsuccessful", flash[:warning] + assert_response :success + end + + def test_login_bad_login + post :login, {:user_login => 'blah', :user_password => 'sesame', :user_noexpiry => 'on'} + assert(!@response.has_session_object?(:user)) + assert_equal "Login unsuccessful", flash[:warning] + assert_response :success + end + + def test_should_remember_me + post :login, :user_login => 'jane', :user_password => 'sesame', :user_noexpiry => "on" + assert_not_nil @response.cookies["auth_token"] + end + + def test_should_not_remember_me + post :login, :user_login => 'jane', :user_password => 'sesame', :user_noexpiry => "off" + assert_nil @response.cookies["auth_token"] + end + + def test_should_delete_token_on_logout + login_as :other_user + get :logout + assert_equal @response.cookies["auth_token"], [] + end + + def test_should_login_with_cookie + users(:other_user).remember_me + @request.cookies["auth_token"] = auth_token_cookie_for(:other_user) + get :login + assert @controller.send(:logged_in?) + end + + def test_should_fail_expired_cookie_login + users(:other_user).remember_me + users(:other_user).update_attribute :remember_token_expires_at, 5.minutes.ago.utc + @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"] = CGI::Cookie.new('name' => 'auth_token', 'value' => 'invalid_auth_token') + get :login + assert !@controller.send(:logged_in?) + end + + def test_current_user_nil + get :login + assert_nil @controller.current_user + end + + def test_current_user_correct + 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 + post :login, {:user_login => 'jane', :user_password => 'sesame', :user_noexpiry => 'off'} + assert_equal users(:other_user).prefs, @controller.prefs + end + + private + + def auth_token_cookie_for(user) + CGI::Cookie.new('name' => 'auth_token', 'value' => users(user).remember_token) + end + + +end diff --git a/tracks/test/functional/todos_controller_test.rb b/tracks/test/functional/todos_controller_test.rb index 418d0bbc..57d895dd 100644 --- a/tracks/test/functional/todos_controller_test.rb +++ b/tracks/test/functional/todos_controller_test.rb @@ -1,352 +1,351 @@ -require File.dirname(__FILE__) + '/../test_helper' -require 'todos_controller' - -# Re-raise errors caught by the controller. -class TodosController; def rescue_action(e) raise e end; end - -class TodosControllerTest < Test::Rails::TestCase - fixtures :users, :preferences, :projects, :contexts, :todos, :tags, :taggings - - def setup - @controller = TodosController.new - @request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new - end - - def test_get_index_when_not_logged_in - get :index - assert_redirected_to :controller => 'login', :action => 'login' - end - - def test_not_done_counts - login_as(:admin_user) - get :index - assert_equal 2, assigns['project_not_done_counts'][projects(:timemachine).id] - assert_equal 3, assigns['context_not_done_counts'][contexts(:call).id] - assert_equal 1, assigns['context_not_done_counts'][contexts(:lab).id] - end - - def test_tag_is_retrieved_properly - login_as(:admin_user) - get :index - t = assigns['not_done_todos'].find{|t| t.id == 2} - assert_equal 1, t.tags.count - assert_equal 'foo', t.tags[0].name - assert !t.starred? - end - - def test_not_done_counts_after_hiding_project - p = Project.find(1) - p.hide! - p.save! - login_as(:admin_user) - get :index - assert_equal nil, assigns['project_not_done_counts'][projects(:timemachine).id] - assert_equal 2, assigns['context_not_done_counts'][contexts(:call).id] - assert_equal nil, assigns['context_not_done_counts'][contexts(:lab).id] - end - - def test_not_done_counts_after_hiding_and_unhiding_project - p = Project.find(1) - p.hide! - p.save! - p.activate! - p.save! - login_as(:admin_user) - get :index - assert_equal 2, assigns['project_not_done_counts'][projects(:timemachine).id] - assert_equal 3, assigns['context_not_done_counts'][contexts(:call).id] - assert_equal 1, assigns['context_not_done_counts'][contexts(:lab).id] - end - - def test_deferred_count_for_project_source_view - login_as(:admin_user) - xhr :post, :toggle_check, :id => 5, :_source_view => 'project' - assert_equal 1, assigns['deferred_count'] - xhr :post, :toggle_check, :id => 15, :_source_view => 'project' - assert_equal 0, assigns['deferred_count'] - end - - def test_destroy_todo - login_as(:admin_user) - xhr :post, :destroy, :id => 1, :_source_view => 'todo' - assert_rjs :page, "todo_1", :remove - #assert_rjs :replace_html, "badge-count", '9' - end - - def test_create_todo - assert_difference Todo, :count do - login_as(:admin_user) - put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{"notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" - end - end - - def test_create_todo_via_xml - login_as(:admin_user) - assert_difference Todo, :count do - put :create, :format => "xml", "request" => { "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{"notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" } - assert_response 201 - end - end - - def test_fail_to_create_todo_via_xml - login_as(:admin_user) - #try to create with no context, which is not valid - put :create, :format => "xml", "request" => { "project_name"=>"Build a working time machine", "todo"=>{"notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" } - assert_response 422 - assert_xml_select "errors" do - assert_xml_select "error", "Context can't be blank" - end - end - - def test_create_deferred_todo - original_todo_count = Todo.count - login_as(:admin_user) - put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{"notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2026", 'show_from' => '30/10/2026'}, "tag_list"=>"foo bar" - assert_equal original_todo_count + 1, Todo.count - end - - def test_update_todo_project - t = Todo.find(1) - login_as(:admin_user) - xhr :post, :update, :id => 1, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" - t = Todo.find(1) - assert_equal 1, t.project_id - end - - def test_update_todo_project_to_none - t = Todo.find(1) - login_as(:admin_user) - xhr :post, :update, :id => 1, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"None", "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" - t = Todo.find(1) - assert_nil t.project_id - end - - def test_update_todo_to_deferred_is_reflected_in_badge_count - login_as(:admin_user) - get :index - assert_equal 10, assigns['count'] - xhr :post, :update, :id => 1, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Make more money than Billy Gates", "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006", "show_from"=>"30/11/2030"}, "tag_list"=>"foo bar" - assert_equal 9, assigns['down_count'] - end - - def test_update_todo - t = Todo.find(1) - login_as(:admin_user) - xhr :post, :update, :id => 1, :_source_view => 'todo', "todo"=>{"context_id"=>"1", "project_id"=>"2", "id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo, bar" - t = Todo.find(1) - assert_equal "Call Warren Buffet to find out how much he makes per day", t.description - assert_equal "foo, bar", t.tag_list - expected = Date.new(2006,11,30) - actual = t.due - assert_equal expected, actual, "Expected #{expected.to_s(:db)}, was #{actual.to_s(:db)}" - end - - def test_update_todos_with_blank_project_name - t = Todo.find(1) - login_as(:admin_user) - xhr :post, :update, :id => 1, :_source_view => 'todo', :project_name => '', "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo, bar" - t.reload - assert t.project.nil? - end - - def test_update_todo_tags_to_none - t = Todo.find(1) - login_as(:admin_user) - xhr :post, :update, :id => 1, :_source_view => 'todo', "todo"=>{"context_id"=>"1", "project_id"=>"2", "id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"" - t = Todo.find(1) - assert_equal true, t.tag_list.empty? - end - - def test_find_tagged_with - login_as(:admin_user) - @user = User.find(@request.session['user_id']) - tag = Tag.find_by_name('foo').todos - @tagged = tag.find(:all, :conditions => ['taggings.user_id = ?', @user.id]).size - get :tag, :name => 'foo' - assert_response :success - assert_equal 3, @tagged - end - - def test_rss_feed - login_as(:admin_user) - get :index, { :format => "rss" } - assert_equal 'application/rss+xml; charset=utf-8', @response.headers["Content-Type"] - #puts @response.body - - assert_xml_select 'rss[version="2.0"]' do - assert_select 'channel' do - assert_select '>title', 'Tracks Actions' - assert_select '>description', "Actions for #{users(:admin_user).display_name}" - assert_select 'language', 'en-us' - assert_select 'ttl', '40' - assert_select 'item', 10 do - assert_select 'title', /.+/ - assert_select 'description', /.*/ - %w(guid link).each do |node| - assert_select node, /http:\/\/test.host\/contexts\/.+/ - end - assert_select 'pubDate', projects(:timemachine).updated_at.to_s(:rfc822) - end - end - end - end - - def test_rss_feed_with_limit - login_as(:admin_user) - get :index, { :format => "rss", :limit => '5' } - - assert_xml_select 'rss[version="2.0"]' do - assert_select 'channel' do - assert_select '>title', 'Tracks Actions' - assert_select '>description', "Actions for #{users(:admin_user).display_name}" - assert_select 'item', 5 do - assert_select 'title', /.+/ - assert_select 'description', /.*/ - end - end - end - end - - def test_rss_feed_not_accessible_to_anonymous_user_without_token - login_as nil - get :index, { :format => "rss" } - assert_response 401 - end - - def test_rss_feed_not_accessible_to_anonymous_user_with_invalid_token - login_as nil - get :index, { :format => "rss", :token => 'foo' } - assert_response 401 - end - - def test_rss_feed_accessible_to_anonymous_user_with_valid_token - login_as nil - get :index, { :format => "rss", :token => users(:admin_user).token } - assert_response :ok - end - - def test_atom_feed_content - login_as :admin_user - get :index, { :format => "atom" } - assert_equal 'application/atom+xml; charset=utf-8', @response.headers["Content-Type"] - #puts @response.body - - assert_xml_select 'feed[xmlns="http://www.w3.org/2005/Atom"]' do - assert_xml_select '>title', 'Tracks Actions' - assert_xml_select '>subtitle', "Actions for #{users(:admin_user).display_name}" - assert_xml_select 'entry', 10 do - assert_xml_select 'title', /.+/ - assert_xml_select 'content[type="html"]', /.*/ - assert_xml_select 'published', /(#{projects(:timemachine).updated_at.xmlschema}|#{projects(:moremoney).updated_at.xmlschema})/ - end - end - end - - def test_atom_feed_not_accessible_to_anonymous_user_without_token - login_as nil - get :index, { :format => "atom" } - assert_response 401 - end - - def test_atom_feed_not_accessible_to_anonymous_user_with_invalid_token - login_as nil - get :index, { :format => "atom", :token => 'foo' } - assert_response 401 - end - - def test_atom_feed_accessible_to_anonymous_user_with_valid_token - login_as nil - get :index, { :format => "atom", :token => users(:admin_user).token } - assert_response :ok - end - - def test_text_feed_content - login_as(:admin_user) - get :index, { :format => "txt" } - assert_equal 'text/plain; charset=utf-8', @response.headers["Content-Type"] - assert !(/ /.match(@response.body)) - #puts @response.body - end - - def test_text_feed_not_accessible_to_anonymous_user_without_token - login_as nil - get :index, { :format => "txt" } - assert_response 401 - end - - def test_text_feed_not_accessible_to_anonymous_user_with_invalid_token - login_as nil - get :index, { :format => "txt", :token => 'foo' } - assert_response 401 - end - - def test_text_feed_accessible_to_anonymous_user_with_valid_token - login_as nil - get :index, { :format => "txt", :token => users(:admin_user).token } - assert_response :ok - end - - def test_ical_feed_content - login_as :admin_user - get :index, { :format => "ics" } - assert_equal 'text/calendar; charset=utf-8', @response.headers["Content-Type"] - assert !(/ /.match(@response.body)) - #puts @response.body - end - - def test_mobile_index_uses_text_html_content_type - login_as(:admin_user) - get :index, { :format => "m" } - assert_equal 'text/html; charset=utf-8', @response.headers["Content-Type"] - end - - def test_mobile_index_assigns_down_count - login_as(:admin_user) - get :index, { :format => "m" } - assert_equal 10, assigns['down_count'] - end - - def test_mobile_create_action_creates_a_new_todo - login_as(:admin_user) - post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", - "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", - "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", - "project_id"=>"1", - "notes"=>"test notes", "description"=>"test_mobile_create_action", "state"=>"0"}} - t = Todo.find_by_description("test_mobile_create_action") - assert_not_nil t - assert_equal 2, t.context_id - assert_equal 1, t.project_id - assert t.active? - assert_equal 'test notes', t.notes - assert_nil t.show_from - assert_equal Date.new(2007,1,2).to_s, t.due.to_s - end - - def test_mobile_create_action_redirects_to_mobile_home_page_when_successful - login_as(:admin_user) - post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", - "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", - "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", - "project_id"=>"1", - "notes"=>"test notes", "description"=>"test_mobile_create_action", "state"=>"0"}} - assert_redirected_to '/m' - end - - def test_mobile_create_action_renders_new_template_when_save_fails - login_as(:admin_user) - post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", - "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", - "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", - "project_id"=>"1", - "notes"=>"test notes", "state"=>"0"}} - assert_template 'todos/new_mobile' - end - - def test_index_html_assigns_default_project_name_map - login_as(:admin_user) - get :index, {"format"=>"html"} - assert_equal '"{\\"Build a working time machine\\": \\"lab\\"}"', assigns(:default_project_context_name_map) - end - -end +require File.dirname(__FILE__) + '/../test_helper' +require 'todos_controller' + +# Re-raise errors caught by the controller. +class TodosController; def rescue_action(e) raise e end; end + +class TodosControllerTest < Test::Rails::TestCase + fixtures :users, :preferences, :projects, :contexts, :todos, :tags, :taggings + + def setup + @controller = TodosController.new + @request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new + end + + def test_get_index_when_not_logged_in + get :index + assert_redirected_to :controller => 'login', :action => 'login' + end + + def test_not_done_counts + login_as(:admin_user) + get :index + assert_equal 2, assigns['project_not_done_counts'][projects(:timemachine).id] + assert_equal 3, assigns['context_not_done_counts'][contexts(:call).id] + assert_equal 1, assigns['context_not_done_counts'][contexts(:lab).id] + end + + def test_tag_is_retrieved_properly + login_as(:admin_user) + get :index + t = assigns['not_done_todos'].find{|t| t.id == 2} + assert_equal 1, t.tags.count + assert_equal 'foo', t.tags[0].name + assert !t.starred? + end + + def test_not_done_counts_after_hiding_project + p = Project.find(1) + p.hide! + p.save! + login_as(:admin_user) + get :index + assert_equal nil, assigns['project_not_done_counts'][projects(:timemachine).id] + assert_equal 2, assigns['context_not_done_counts'][contexts(:call).id] + assert_equal nil, assigns['context_not_done_counts'][contexts(:lab).id] + end + + def test_not_done_counts_after_hiding_and_unhiding_project + p = Project.find(1) + p.hide! + p.save! + p.activate! + p.save! + login_as(:admin_user) + get :index + assert_equal 2, assigns['project_not_done_counts'][projects(:timemachine).id] + assert_equal 3, assigns['context_not_done_counts'][contexts(:call).id] + assert_equal 1, assigns['context_not_done_counts'][contexts(:lab).id] + end + + def test_deferred_count_for_project_source_view + login_as(:admin_user) + xhr :post, :toggle_check, :id => 5, :_source_view => 'project' + assert_equal 1, assigns['deferred_count'] + xhr :post, :toggle_check, :id => 15, :_source_view => 'project' + assert_equal 0, assigns['deferred_count'] + end + + def test_destroy_todo + login_as(:admin_user) + xhr :post, :destroy, :id => 1, :_source_view => 'todo' + assert_rjs :page, "todo_1", :remove + #assert_rjs :replace_html, "badge-count", '9' + end + + def test_create_todo + assert_difference Todo, :count do + login_as(:admin_user) + put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{"notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" + end + end + + def test_create_todo_via_xml + login_as(:admin_user) + assert_difference Todo, :count do + put :create, :format => "xml", "request" => { "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{"notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" } + assert_response 201 + end + end + + def test_fail_to_create_todo_via_xml + login_as(:admin_user) + #try to create with no context, which is not valid + put :create, :format => "xml", "request" => { "project_name"=>"Build a working time machine", "todo"=>{"notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" } + assert_response 422 + assert_xml_select "errors" do + assert_xml_select "error", "Context can't be blank" + end + end + + def test_create_deferred_todo + original_todo_count = Todo.count + login_as(:admin_user) + put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{"notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2026", 'show_from' => '30/10/2026'}, "tag_list"=>"foo bar" + assert_equal original_todo_count + 1, Todo.count + end + + def test_update_todo_project + t = Todo.find(1) + login_as(:admin_user) + xhr :post, :update, :id => 1, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" + t = Todo.find(1) + assert_equal 1, t.project_id + end + + def test_update_todo_project_to_none + t = Todo.find(1) + login_as(:admin_user) + xhr :post, :update, :id => 1, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"None", "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo bar" + t = Todo.find(1) + assert_nil t.project_id + end + + def test_update_todo_to_deferred_is_reflected_in_badge_count + login_as(:admin_user) + get :index + assert_equal 10, assigns['count'] + xhr :post, :update, :id => 1, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Make more money than Billy Gates", "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006", "show_from"=>"30/11/2030"}, "tag_list"=>"foo bar" + assert_equal 9, assigns['down_count'] + end + + def test_update_todo + t = Todo.find(1) + login_as(:admin_user) + xhr :post, :update, :id => 1, :_source_view => 'todo', "todo"=>{"context_id"=>"1", "project_id"=>"2", "id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo, bar" + t = Todo.find(1) + assert_equal "Call Warren Buffet to find out how much he makes per day", t.description + assert_equal "foo, bar", t.tag_list + expected = Date.new(2006,11,30) + actual = t.due + assert_equal expected, actual, "Expected #{expected.to_s(:db)}, was #{actual.to_s(:db)}" + end + + def test_update_todos_with_blank_project_name + t = Todo.find(1) + login_as(:admin_user) + xhr :post, :update, :id => 1, :_source_view => 'todo', :project_name => '', "todo"=>{"id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"foo, bar" + t.reload + assert t.project.nil? + end + + def test_update_todo_tags_to_none + t = Todo.find(1) + login_as(:admin_user) + xhr :post, :update, :id => 1, :_source_view => 'todo', "todo"=>{"context_id"=>"1", "project_id"=>"2", "id"=>"1", "notes"=>"", "description"=>"Call Warren Buffet to find out how much he makes per day", "due"=>"30/11/2006"}, "tag_list"=>"" + t = Todo.find(1) + assert_equal true, t.tag_list.empty? + end + + def test_find_tagged_with + login_as(:admin_user) + @user = User.find(@request.session['user_id']) + tag = Tag.find_by_name('foo').todos + @tagged = tag.find(:all, :conditions => ['taggings.user_id = ?', @user.id]).size + get :tag, :name => 'foo' + assert_response :success + assert_equal 3, @tagged + end + + def test_rss_feed + login_as(:admin_user) + get :index, { :format => "rss" } + assert_equal 'application/rss+xml; charset=utf-8', @response.headers["Content-Type"] + #puts @response.body + + assert_xml_select 'rss[version="2.0"]' do + assert_select 'channel' do + assert_select '>title', 'Tracks Actions' + assert_select '>description', "Actions for #{users(:admin_user).display_name}" + assert_select 'language', 'en-us' + assert_select 'ttl', '40' + assert_select 'item', 10 do + assert_select 'title', /.+/ + assert_select 'description', /.*/ + assert_select 'link', %r{http://test.host/contexts/.+} + assert_select 'guid', %r{http://test.host/todos/.+} + assert_select 'pubDate', projects(:timemachine).updated_at.to_s(:rfc822) + end + end + end + end + + def test_rss_feed_with_limit + login_as(:admin_user) + get :index, { :format => "rss", :limit => '5' } + + assert_xml_select 'rss[version="2.0"]' do + assert_select 'channel' do + assert_select '>title', 'Tracks Actions' + assert_select '>description', "Actions for #{users(:admin_user).display_name}" + assert_select 'item', 5 do + assert_select 'title', /.+/ + assert_select 'description', /.*/ + end + end + end + end + + def test_rss_feed_not_accessible_to_anonymous_user_without_token + login_as nil + get :index, { :format => "rss" } + assert_response 401 + end + + def test_rss_feed_not_accessible_to_anonymous_user_with_invalid_token + login_as nil + get :index, { :format => "rss", :token => 'foo' } + assert_response 401 + end + + def test_rss_feed_accessible_to_anonymous_user_with_valid_token + login_as nil + get :index, { :format => "rss", :token => users(:admin_user).token } + assert_response :ok + end + + def test_atom_feed_content + login_as :admin_user + get :index, { :format => "atom" } + assert_equal 'application/atom+xml; charset=utf-8', @response.headers["Content-Type"] + #puts @response.body + + assert_xml_select 'feed[xmlns="http://www.w3.org/2005/Atom"]' do + assert_xml_select '>title', 'Tracks Actions' + assert_xml_select '>subtitle', "Actions for #{users(:admin_user).display_name}" + assert_xml_select 'entry', 10 do + assert_xml_select 'title', /.+/ + assert_xml_select 'content[type="html"]', /.*/ + assert_xml_select 'published', /(#{projects(:timemachine).updated_at.xmlschema}|#{projects(:moremoney).updated_at.xmlschema})/ + end + end + end + + def test_atom_feed_not_accessible_to_anonymous_user_without_token + login_as nil + get :index, { :format => "atom" } + assert_response 401 + end + + def test_atom_feed_not_accessible_to_anonymous_user_with_invalid_token + login_as nil + get :index, { :format => "atom", :token => 'foo' } + assert_response 401 + end + + def test_atom_feed_accessible_to_anonymous_user_with_valid_token + login_as nil + get :index, { :format => "atom", :token => users(:admin_user).token } + assert_response :ok + end + + def test_text_feed_content + login_as(:admin_user) + get :index, { :format => "txt" } + assert_equal 'text/plain; charset=utf-8', @response.headers["Content-Type"] + assert !(/ /.match(@response.body)) + #puts @response.body + end + + def test_text_feed_not_accessible_to_anonymous_user_without_token + login_as nil + get :index, { :format => "txt" } + assert_response 401 + end + + def test_text_feed_not_accessible_to_anonymous_user_with_invalid_token + login_as nil + get :index, { :format => "txt", :token => 'foo' } + assert_response 401 + end + + def test_text_feed_accessible_to_anonymous_user_with_valid_token + login_as nil + get :index, { :format => "txt", :token => users(:admin_user).token } + assert_response :ok + end + + def test_ical_feed_content + login_as :admin_user + get :index, { :format => "ics" } + assert_equal 'text/calendar; charset=utf-8', @response.headers["Content-Type"] + assert !(/ /.match(@response.body)) + #puts @response.body + end + + def test_mobile_index_uses_text_html_content_type + login_as(:admin_user) + get :index, { :format => "m" } + assert_equal 'text/html; charset=utf-8', @response.headers["Content-Type"] + end + + def test_mobile_index_assigns_down_count + login_as(:admin_user) + get :index, { :format => "m" } + assert_equal 10, assigns['down_count'] + end + + def test_mobile_create_action_creates_a_new_todo + login_as(:admin_user) + post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", + "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", + "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", + "project_id"=>"1", + "notes"=>"test notes", "description"=>"test_mobile_create_action", "state"=>"0"}} + t = Todo.find_by_description("test_mobile_create_action") + assert_not_nil t + assert_equal 2, t.context_id + assert_equal 1, t.project_id + assert t.active? + assert_equal 'test notes', t.notes + assert_nil t.show_from + assert_equal Date.new(2007,1,2).to_s, t.due.to_s + end + + def test_mobile_create_action_redirects_to_mobile_home_page_when_successful + login_as(:admin_user) + post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", + "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", + "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", + "project_id"=>"1", + "notes"=>"test notes", "description"=>"test_mobile_create_action", "state"=>"0"}} + assert_redirected_to '/m' + end + + def test_mobile_create_action_renders_new_template_when_save_fails + login_as(:admin_user) + post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", + "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", + "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", + "project_id"=>"1", + "notes"=>"test notes", "state"=>"0"}} + assert_template 'todos/new_mobile' + end + + def test_index_html_assigns_default_project_name_map + login_as(:admin_user) + get :index, {"format"=>"html"} + assert_equal '"{\\"Build a working time machine\\": \\"lab\\"}"', assigns(:default_project_context_name_map) + end + +end diff --git a/tracks/test/integration/ldap_auth_test.rb b/tracks/test/integration/ldap_auth_test.rb index a3bc5c44..0454effa 100755 --- a/tracks/test/integration/ldap_auth_test.rb +++ b/tracks/test/integration/ldap_auth_test.rb @@ -1,142 +1,145 @@ -require "#{File.dirname(__FILE__)}/../test_helper" -require 'tempfile' - -module Tracks - class Config - def self.salt - "change-me" - end - def self.auth_schemes - ['database','ldap'] - end - end -end - -class LdapAuthTest < ActionController::IntegrationTest - - fixtures :users - - RUN_LDAP_TESTS = ENV['RUN_TRACKS_LDAP_TESTS'] || false - SLAPD_BIN = "/usr/libexec/slapd" #You may need to adjust this - SLAPD_SCHEMA_DIR = "/etc/openldap/schema/" #You may need to adjust this - SLAPD_TEST_PORT = 10389 - OUTPUT_DEBUG_INFO = false - - require 'net/ldap' #requires ruby-net-ldap gem be installed - require 'simple_ldap_authenticator' - SimpleLdapAuthenticator.ldap_library = 'net/ldap' - SimpleLdapAuthenticator.servers = %w'localhost' - SimpleLdapAuthenticator.use_ssl = false - SimpleLdapAuthenticator.login_format = 'cn=%s,dc=lukemelia,dc=com' - SimpleLdapAuthenticator.port = 10389 - SimpleLdapAuthenticator.logger = RAILS_DEFAULT_LOGGER - - def setup - assert_equal "test", ENV['RAILS_ENV'] - assert_equal "change-me", Tracks::Config.salt - - if RUN_LDAP_TESTS - setup_ldap_server_conf - start_ldap_server - end - end - - def teardown - stop_ldap_server if RUN_LDAP_TESTS - end - - def test_authenticate_against_ldap - add_ldap_user_to_ldap_repository - assert SimpleLdapAuthenticator.valid?('john', 'deere') - user = User.authenticate('john', 'deere') - assert_not_nil(user) - assert_equal user.login, 'john' - end - - private :test_authenticate_against_ldap unless RUN_LDAP_TESTS - - def setup_ldap_server_conf - @slapd_conf = create_slapd_conf() - open(@slapd_conf.path) { |f| f.read } - unless File.exist?(SLAPD_BIN) - assert false, "slapd could not be found at #{SLAPD_BIN}. Adjust the path in #{__FILE__}" - end - end - - def start_ldap_server - t = Thread.new(@slapd_conf.path) do |slapd_conf_path| - puts "starting slapd..." if OUTPUT_DEBUG_INFO - run_cmd %Q{/usr/libexec/slapd -f #{slapd_conf_path} -h "ldap://127.0.0.1:10389/" -d0} - end - sleep(2) - run_cmd %Q{ldapsearch -H "ldap://127.0.0.1:10389/" -x -b '' -s base '(objectclass=*)' namingContexts} - end - - def add_ldap_user_to_ldap_repository - ldif_file = create_ldif() - run_cmd %Q{ldapadd -H "ldap://127.0.0.1:10389/" -f #{ldif_file.path} -cxv -D "cn=Manager,dc=lukemelia,dc=com" -w secret} - puts `cat #{ldif_file.path}` if OUTPUT_DEBUG_INFO - end - - def stop_ldap_server - pid = open(get_pid_file_path(@slapd_conf)) { |f| f.read } - run_cmd "kill -TERM #{pid}" - end - - def create_slapd_conf - slapd_conf = Tempfile.new("slapd.conf") - slapd_conf.path - data_dir = slapd_conf.path + '-data' - pid_file = get_pid_file_path(slapd_conf) - Dir.mkdir(data_dir) - encrypted_password = `slappasswd -s secret` - open(slapd_conf.path, 'w') do |f| - f.puts %Q{include #{SLAPD_SCHEMA_DIR}core.schema -pidfile #{pid_file} -database ldbm -suffix "dc=lukemelia,dc=com" -rootdn "cn=Manager,dc=lukemelia,dc=com" -rootpw #{encrypted_password} -directory #{data_dir} - -access to * - by self write - by users read - by anonymous auth -} - end - puts `cat #{slapd_conf.path}` if OUTPUT_DEBUG_INFO - slapd_conf - end - - def create_ldif - ldif_file = Tempfile.new("ldap_user.ldif") - encrypted_password = `slappasswd -s deere` - open(ldif_file.path, 'w') do |f| - f.puts %Q{dn: dc=lukemelia,dc=com -objectclass: dcObject -objectclass: organization -o: Luke Melia DotCom -dc: lukemelia - -dn: cn=john,dc=lukemelia,dc=com -cn: john -sn: john -objectclass: person -userPassword: #{encrypted_password} -} - end - ldif_file - end - - def run_cmd(cmd) - puts cmd if OUTPUT_DEBUG_INFO - cmd_out = `#{cmd}` - puts cmd_out if OUTPUT_DEBUG_INFO - end - - def get_pid_file_path(tempfile) - tempfile.path + '.pid' - end - -end +require "#{File.dirname(__FILE__)}/../test_helper" +require 'tempfile' + +module Tracks + class Config + def self.salt + "change-me" + end + def self.auth_schemes + ['database','ldap'] + end + end +end + +class LdapAuthTest < ActionController::IntegrationTest + + fixtures :users + + RUN_LDAP_TESTS = ENV['RUN_TRACKS_LDAP_TESTS'] || false + SLAPD_BIN = "/usr/libexec/slapd" #You may need to adjust this + SLAPD_SCHEMA_DIR = "/etc/openldap/schema/" #You may need to adjust this + SLAPD_TEST_PORT = 10389 + OUTPUT_DEBUG_INFO = false + + begin + require 'net/ldap' #requires ruby-net-ldap gem be installed + require 'simple_ldap_authenticator' + end if RUN_LDAP_TESTS + + SimpleLdapAuthenticator.ldap_library = 'net/ldap' + SimpleLdapAuthenticator.servers = %w'localhost' + SimpleLdapAuthenticator.use_ssl = false + SimpleLdapAuthenticator.login_format = 'cn=%s,dc=lukemelia,dc=com' + SimpleLdapAuthenticator.port = 10389 + SimpleLdapAuthenticator.logger = RAILS_DEFAULT_LOGGER + + def setup + assert_equal "test", ENV['RAILS_ENV'] + assert_equal "change-me", Tracks::Config.salt + + if RUN_LDAP_TESTS + setup_ldap_server_conf + start_ldap_server + end + end + + def teardown + stop_ldap_server if RUN_LDAP_TESTS + end + + def test_authenticate_against_ldap + add_ldap_user_to_ldap_repository + assert SimpleLdapAuthenticator.valid?('john', 'deere') + user = User.authenticate('john', 'deere') + assert_not_nil(user) + assert_equal user.login, 'john' + end + + private :test_authenticate_against_ldap unless RUN_LDAP_TESTS + + def setup_ldap_server_conf + @slapd_conf = create_slapd_conf() + open(@slapd_conf.path) { |f| f.read } + unless File.exist?(SLAPD_BIN) + assert false, "slapd could not be found at #{SLAPD_BIN}. Adjust the path in #{__FILE__}" + end + end + + def start_ldap_server + t = Thread.new(@slapd_conf.path) do |slapd_conf_path| + puts "starting slapd..." if OUTPUT_DEBUG_INFO + run_cmd %Q{/usr/libexec/slapd -f #{slapd_conf_path} -h "ldap://127.0.0.1:10389/" -d0} + end + sleep(2) + run_cmd %Q{ldapsearch -H "ldap://127.0.0.1:10389/" -x -b '' -s base '(objectclass=*)' namingContexts} + end + + def add_ldap_user_to_ldap_repository + ldif_file = create_ldif() + run_cmd %Q{ldapadd -H "ldap://127.0.0.1:10389/" -f #{ldif_file.path} -cxv -D "cn=Manager,dc=lukemelia,dc=com" -w secret} + puts `cat #{ldif_file.path}` if OUTPUT_DEBUG_INFO + end + + def stop_ldap_server + pid = open(get_pid_file_path(@slapd_conf)) { |f| f.read } + run_cmd "kill -TERM #{pid}" + end + + def create_slapd_conf + slapd_conf = Tempfile.new("slapd.conf") + slapd_conf.path + data_dir = slapd_conf.path + '-data' + pid_file = get_pid_file_path(slapd_conf) + Dir.mkdir(data_dir) + encrypted_password = `slappasswd -s secret` + open(slapd_conf.path, 'w') do |f| + f.puts %Q{include #{SLAPD_SCHEMA_DIR}core.schema +pidfile #{pid_file} +database ldbm +suffix "dc=lukemelia,dc=com" +rootdn "cn=Manager,dc=lukemelia,dc=com" +rootpw #{encrypted_password} +directory #{data_dir} + +access to * + by self write + by users read + by anonymous auth +} + end + puts `cat #{slapd_conf.path}` if OUTPUT_DEBUG_INFO + slapd_conf + end + + def create_ldif + ldif_file = Tempfile.new("ldap_user.ldif") + encrypted_password = `slappasswd -s deere` + open(ldif_file.path, 'w') do |f| + f.puts %Q{dn: dc=lukemelia,dc=com +objectclass: dcObject +objectclass: organization +o: Luke Melia DotCom +dc: lukemelia + +dn: cn=john,dc=lukemelia,dc=com +cn: john +sn: john +objectclass: person +userPassword: #{encrypted_password} +} + end + ldif_file + end + + def run_cmd(cmd) + puts cmd if OUTPUT_DEBUG_INFO + cmd_out = `#{cmd}` + puts cmd_out if OUTPUT_DEBUG_INFO + end + + def get_pid_file_path(tempfile) + tempfile.path + '.pid' + end + +end