diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 9443168f..ce37d92c 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -40,6 +40,7 @@ class ProjectsController < ApplicationController
end
def show
+ @contexts = current_user.contexts(true)
init_data_for_sidebar unless mobile?
@projects = current_user.projects
@page_title = "TRACKS::Project: #{@project.name}"
diff --git a/app/views/shared/_add_new_item_form.rhtml b/app/views/shared/_add_new_item_form.rhtml
index 3e3f749f..b4da4b3e 100644
--- a/app/views/shared/_add_new_item_form.rhtml
+++ b/app/views/shared/_add_new_item_form.rhtml
@@ -27,17 +27,17 @@
:condition => "!$('todo_new_action_submit').isWaiting() && askIfNewContextProvided()") do -%>
<%= error_messages_for("item", :object_name => 'action') %>
diff --git a/doc/README_DEVELOPERS b/doc/README_DEVELOPERS
index 7366a16a..5a1306c3 100644
--- a/doc/README_DEVELOPERS
+++ b/doc/README_DEVELOPERS
@@ -1,6 +1,6 @@
1. Wiki
-There are some pointers for setting up your Tracks copy for testing at http://dev.rousette.org.uk/wiki/Tracks/Testing
+There are some pointers for setting up your Tracks copy for testing at http://www.rousette.org.uk/projects/wiki/Testing/
2. SQLITE3 FOR TESTING
diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb
index 7b2ad866..c66906aa 100644
--- a/test/functional/projects_controller_test.rb
+++ b/test/functional/projects_controller_test.rb
@@ -1,259 +1,259 @@
-require File.dirname(__FILE__) + '/../test_helper'
-require File.dirname(__FILE__) + '/todo_container_controller_test_base'
-require 'projects_controller'
-
-# Re-raise errors caught by the controller.
-class ProjectsController; def rescue_action(e) raise e end; end
-
-class ProjectsControllerTest < TodoContainerControllerTestBase
- fixtures :users, :todos, :preferences, :projects, :contexts
-
- def setup
- perform_setup(Project, ProjectsController)
- end
-
- def test_projects_list
- login_as :admin_user
- get :index
- end
-
- def test_show_exposes_deferred_todos
- p = projects(:timemachine)
- login_as :admin_user
- get :show, :id => p.to_param
- assert_not_nil assigns['deferred']
- assert_equal 1, assigns['deferred'].size
-
- t = p.not_done_todos[0]
- t.show_from = 1.days.from_now.utc
- t.save!
-
- get :show, :id => p.to_param
- assert_equal 2, assigns['deferred'].size
- end
-
- def test_show_exposes_next_project_in_same_state
- 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
- login_as :admin_user
- get :show, :id => projects(:moremoney).to_param
- assert_equal(projects(:timemachine), assigns['previous_project'])
- end
-
- def test_create_project_via_ajax_increments_number_of_projects
- assert_ajax_create_increments_count 'My New Project'
- end
-
- def test_create_project_with_ajax_success_rjs
- ajax_create 'My New Project'
- assert_rjs :insert_html, :bottom, "list-active-projects"
- assert_rjs :sortable, 'list-active-projects', { :tag => 'div', :handle => 'handle', :complete => visual_effect(:highlight, 'list-active-projects'), :url => order_projects_path }
- # not yet sure how to write the following properly...
- assert_rjs :call, "Form.reset", "project-form"
- assert_rjs :call, "Form.focusFirstElement", "project-form"
- end
-
- def test_create_project_and_go_to_project_page
- num_projects = Project.count
- xhr :post, :create, { :project => {:name => 'Immediate Project Planning Required'}, :go_to_project => 1}
- assert_js_redirected_to %r{/?projects/\d+}
- assert_equal num_projects + 1, Project.count
- end
-
- def test_create_with_comma_in_name_does_not_increment_number_of_projects
- assert_ajax_create_does_not_increment_count 'foo,bar'
- end
-
- def test_create_with_comma_in_name_fails_with_rjs
- ajax_create 'foo,bar'
- assert_rjs :show, 'status'
- # Not working with Rails 2.0 upgrade
- # assert_rjs :update, 'status', "1 error prohibited this record from being saved
There were problems with the following fields:
Name cannot contain the comma (',') character
"
- end
-
- def test_todo_state_is_project_hidden_after_hiding_project
- p = projects(:timemachine)
- todos = p.todos.find_in_state(:all, :active)
- 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
- end
- assert p.reload().hidden?
- end
-
- def test_not_done_counts_after_hiding_and_unhiding_project
- p = projects(:timemachine)
- todos = p.todos.find_in_state(:all, :active)
- 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|
- assert_equal :active, t.reload().current_state
- end
- assert p.reload().active?
- end
-
- def test_rss_feed_content
- login_as(:admin_user)
- get :index, { :format => "rss" }
- assert_equal 'application/rss+xml', @response.content_type
- #puts @response.body
-
- assert_xml_select 'rss[version="2.0"]' do
- assert_select 'channel' do
- assert_select '>title', 'Tracks Projects'
- assert_select '>description', "Lists all the projects for #{users(:admin_user).display_name}"
- assert_select 'language', 'en-us'
- assert_select 'ttl', '40'
- end
- assert_select 'item', 3 do
- assert_select 'title', /.+/
- assert_select 'description' do
- assert_select_encoded do
- assert_select 'p', /^\d+ actions\. Project is (active|hidden|completed)\.$/
- end
- end
- %w(guid link).each do |node|
- assert_select node, /http:\/\/test.host\/projects\/.+/
- end
- assert_select 'pubDate', projects(:timemachine).updated_at.to_s(:rfc822)
- 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', @response.content_type
- #puts @response.body
-
- assert_xml_select 'feed[xmlns="http://www.w3.org/2005/Atom"]' do
- assert_select '>title', 'Tracks Projects'
- assert_select '>subtitle', "Lists all the projects for #{users(:admin_user).display_name}"
- assert_select 'entry', 3 do
- assert_select 'title', /.+/
- assert_select 'content[type="html"]' do
- assert_select_encoded do
- assert_select 'p', /\d+ actions. Project is (active|hidden|completed)./
- end
- end
- assert_select 'published', /(#{Regexp.escape(projects(:timemachine).updated_at.xmlschema)}|#{Regexp.escape(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', @response.content_type
- assert !(/ /.match(@response.body))
- #puts @response.body
- end
-
- def test_text_feed_content_for_projects_with_no_actions
- login_as :admin_user
- p = projects(:timemachine)
- p.todos.each { |t| t.destroy }
-
- get :index, { :format => "txt", :only_active_with_no_next_actions => true }
- assert (/^\s*BUILD A WORKING TIME MACHINE\s+0 actions. Project is active.\s*$/.match(@response.body))
- assert !(/[1-9] actions/.match(@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_actionize_sorts_active_projects_by_number_of_tasks
- login_as :admin_user
- u = users(:admin_user)
- post :actionize, :state => "active", :format => 'js'
- assert_equal 1, projects(:gardenclean).position
- assert_equal 2, projects(:moremoney).position
- assert_equal 3, projects(:timemachine).position
- end
-
- def test_alphabetize_sorts_active_projects_alphabetically
- login_as :admin_user
- u = users(:admin_user)
- post :alphabetize, :state => "active", :format => 'js'
- assert_equal 1, projects(:timemachine).position
- assert_equal 2, projects(:gardenclean).position
- assert_equal 3, projects(:moremoney).position
- end
-
- def test_alphabetize_assigns_state
- login_as :admin_user
- post :alphabetize, :state => "active", :format => 'js'
- assert_equal "active", assigns['state']
- end
-
- def test_alphabetize_assigns_projects
- login_as :admin_user
- post :alphabetize, :state => "active", :format => 'js'
- 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
-
- def protect_against_forgery?
- false
- end
-end
+require File.dirname(__FILE__) + '/../test_helper'
+require File.dirname(__FILE__) + '/todo_container_controller_test_base'
+require 'projects_controller'
+
+# Re-raise errors caught by the controller.
+class ProjectsController; def rescue_action(e) raise e end; end
+
+class ProjectsControllerTest < TodoContainerControllerTestBase
+ fixtures :users, :todos, :preferences, :projects, :contexts
+
+ def setup
+ perform_setup(Project, ProjectsController)
+ end
+
+ def test_projects_list
+ login_as :admin_user
+ get :index
+ end
+
+ def test_show_exposes_deferred_todos
+ p = projects(:timemachine)
+ login_as :admin_user
+ get :show, :id => p.to_param
+ assert_not_nil assigns['deferred']
+ assert_equal 1, assigns['deferred'].size
+
+ t = p.not_done_todos[0]
+ t.show_from = 1.days.from_now.utc
+ t.save!
+
+ get :show, :id => p.to_param
+ assert_equal 2, assigns['deferred'].size
+ end
+
+ def test_show_exposes_next_project_in_same_state
+ 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
+ login_as :admin_user
+ get :show, :id => projects(:moremoney).to_param
+ assert_equal(projects(:timemachine), assigns['previous_project'])
+ end
+
+ def test_create_project_via_ajax_increments_number_of_projects
+ assert_ajax_create_increments_count 'My New Project'
+ end
+
+ def test_create_project_with_ajax_success_rjs
+ ajax_create 'My New Project'
+ assert_rjs :insert_html, :bottom, "list-active-projects"
+ assert_rjs :sortable, 'list-active-projects', { :tag => 'div', :handle => 'handle', :complete => visual_effect(:highlight, 'list-active-projects'), :url => order_projects_path }
+ # not yet sure how to write the following properly...
+ assert_rjs :call, "Form.reset", "project-form"
+ assert_rjs :call, "Form.focusFirstElement", "project-form"
+ end
+
+ def test_create_project_and_go_to_project_page
+ num_projects = Project.count
+ xhr :post, :create, { :project => {:name => 'Immediate Project Planning Required'}, :go_to_project => 1}
+ assert_js_redirected_to %r{/?projects/\d+}
+ assert_equal num_projects + 1, Project.count
+ end
+
+ def test_create_with_comma_in_name_does_not_increment_number_of_projects
+ assert_ajax_create_does_not_increment_count 'foo,bar'
+ end
+
+ def test_create_with_comma_in_name_fails_with_rjs
+ ajax_create 'foo,bar'
+ assert_rjs :show, 'status'
+ # Not working with Rails 2.0 upgrade
+ # assert_rjs :update, 'status', "1 error prohibited this record from being saved
There were problems with the following fields:
Name cannot contain the comma (',') character
"
+ end
+
+ def test_todo_state_is_project_hidden_after_hiding_project
+ p = projects(:timemachine)
+ todos = p.todos.find_in_state(:all, :active)
+ 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
+ end
+ assert p.reload().hidden?
+ end
+
+ def test_not_done_counts_after_hiding_and_unhiding_project
+ p = projects(:timemachine)
+ todos = p.todos.find_in_state(:all, :active)
+ 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|
+ assert_equal :active, t.reload().current_state
+ end
+ assert p.reload().active?
+ end
+
+ def test_rss_feed_content
+ login_as(:admin_user)
+ get :index, { :format => "rss" }
+ assert_equal 'application/rss+xml', @response.content_type
+ #puts @response.body
+
+ assert_xml_select 'rss[version="2.0"]' do
+ assert_select 'channel' do
+ assert_select '>title', 'Tracks Projects'
+ assert_select '>description', "Lists all the projects for #{users(:admin_user).display_name}"
+ assert_select 'language', 'en-us'
+ assert_select 'ttl', '40'
+ end
+ assert_select 'item', 3 do
+ assert_select 'title', /.+/
+ assert_select 'description' do
+ assert_select_encoded do
+ assert_select 'p', /^\d+ actions\. Project is (active|hidden|completed)\.$/
+ end
+ end
+ %w(guid link).each do |node|
+ assert_select node, /http:\/\/test.host\/projects\/.+/
+ end
+ assert_select 'pubDate', projects(:timemachine).updated_at.to_s(:rfc822)
+ 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', @response.content_type
+ #puts @response.body
+
+ assert_xml_select 'feed[xmlns="http://www.w3.org/2005/Atom"]' do
+ assert_select '>title', 'Tracks Projects'
+ assert_select '>subtitle', "Lists all the projects for #{users(:admin_user).display_name}"
+ assert_select 'entry', 3 do
+ assert_select 'title', /.+/
+ assert_select 'content[type="html"]' do
+ assert_select_encoded do
+ assert_select 'p', /\d+ actions. Project is (active|hidden|completed)./
+ end
+ end
+ assert_select 'published', /(#{Regexp.escape(projects(:timemachine).updated_at.xmlschema)}|#{Regexp.escape(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', @response.content_type
+ assert !(/ /.match(@response.body))
+ #puts @response.body
+ end
+
+ def test_text_feed_content_for_projects_with_no_actions
+ login_as :admin_user
+ p = projects(:timemachine)
+ p.todos.each { |t| t.destroy }
+
+ get :index, { :format => "txt", :only_active_with_no_next_actions => true }
+ assert (/^\s*BUILD A WORKING TIME MACHINE\s+0 actions. Project is active.\s*$/.match(@response.body))
+ assert !(/[1-9] actions/.match(@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_actionize_sorts_active_projects_by_number_of_tasks
+ login_as :admin_user
+ u = users(:admin_user)
+ post :actionize, :state => "active", :format => 'js'
+ assert_equal 1, projects(:moremoney).position
+ assert_equal 2, projects(:gardenclean).position
+ assert_equal 3, projects(:timemachine).position
+ end
+
+ def test_alphabetize_sorts_active_projects_alphabetically
+ login_as :admin_user
+ u = users(:admin_user)
+ post :alphabetize, :state => "active", :format => 'js'
+ assert_equal 1, projects(:timemachine).position
+ assert_equal 2, projects(:gardenclean).position
+ assert_equal 3, projects(:moremoney).position
+ end
+
+ def test_alphabetize_assigns_state
+ login_as :admin_user
+ post :alphabetize, :state => "active", :format => 'js'
+ assert_equal "active", assigns['state']
+ end
+
+ def test_alphabetize_assigns_projects
+ login_as :admin_user
+ post :alphabetize, :state => "active", :format => 'js'
+ 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
+
+ def protect_against_forgery?
+ false
+ end
+end
diff --git a/vendor/plugins/webrat/lib/webrat/core.rb b/vendor/plugins/webrat/lib/webrat/core.rb
index 32743d16..185a00d5 100644
--- a/vendor/plugins/webrat/lib/webrat/core.rb
+++ b/vendor/plugins/webrat/lib/webrat/core.rb
@@ -1,3 +1,3 @@
-Dir[File.join(File.dirname(__FILE__), "core", "*.rb")].each do |file|
- require File.expand_path(file)
+%w{field form label link logging page select_option session}.each do |file|
+ require File.dirname(__FILE__) + "/core/#{file}"
end
\ No newline at end of file