mirror of
https://github.com/TracksApp/tracks.git
synced 2025-12-26 20:08:51 +01:00
I'm not sure the test failures caused by reload not working are caused by the new aasm, perhaps the thread isolation is causing that...
926 lines
34 KiB
Ruby
926 lines
34 KiB
Ruby
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
|
|
|
class TodosControllerTest < ActionController::TestCase
|
|
|
|
def test_get_index_when_not_logged_in
|
|
get :index
|
|
assert_redirected_to login_url
|
|
end
|
|
|
|
############################
|
|
# not done / deferred counts
|
|
############################
|
|
|
|
def test_not_done_counts
|
|
login_as(:admin_user)
|
|
get :index
|
|
assert_equal 2, projects(:timemachine).todos.active.count
|
|
assert_equal 3, contexts(:call).todos.not_completed.count
|
|
assert_equal 1, contexts(:lab).todos.not_completed.count
|
|
end
|
|
|
|
def test_cached_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_cached_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_project
|
|
p = Project.find(1)
|
|
p.hide!
|
|
p.save!
|
|
login_as(:admin_user)
|
|
get :index
|
|
assert_equal 0, projects(:timemachine).todos.active.count
|
|
assert_equal 2, contexts(:call).todos.active.count
|
|
assert_equal 0, contexts(:lab).todos.active.count
|
|
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, projects(:timemachine).todos.active.count
|
|
assert_equal 3, contexts(:call).todos.not_completed.count
|
|
assert_equal 1, contexts(:lab).todos.not_completed.count
|
|
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['remaining_deferred_or_pending_count']
|
|
xhr :post, :toggle_check, :id => 15, :_source_view => 'project'
|
|
assert_equal 0, assigns['remaining_deferred_or_pending_count']
|
|
end
|
|
|
|
#########
|
|
# tagging
|
|
#########
|
|
|
|
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_tagging_changes_to_tag_with_numbers
|
|
# by default has_many_polymorph searches for tags with given id if the tag is a number. we do not want that
|
|
login_as(:admin_user)
|
|
assert_difference 'Todo.count' do
|
|
put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{
|
|
"notes"=>"", "description"=>"test tags", "due"=>"30/11/2006"},
|
|
"tag_list"=>"1234,5667,9876"
|
|
# default has_many_polymorphs will fail on these high numbers as tags with those id's do not exist
|
|
end
|
|
t = assigns['todo']
|
|
assert_equal t.description, "test tags"
|
|
assert_equal 3, t.tags.count
|
|
end
|
|
|
|
def test_tagging_changes_to_handle_empty_tags
|
|
# by default has_many_polymorph searches for tags with given id if the tag is a number. we do not want that
|
|
login_as(:admin_user)
|
|
assert_difference 'Todo.count' do
|
|
put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{
|
|
"notes"=>"", "description"=>"test tags", "due"=>"30/11/2006"},
|
|
"tag_list"=>"a,,b"
|
|
# default has_many_polymorphs will fail on the empty tag
|
|
end
|
|
t = assigns['todo']
|
|
assert_equal t.description, "test tags"
|
|
assert_equal 2, t.tags.count
|
|
end
|
|
|
|
def test_find_tagged_with
|
|
login_as(:admin_user)
|
|
@user = User.find(@request.session['user_id'])
|
|
tag = Tag.where(:name => 'foo').first.taggings
|
|
@tagged = tag.count
|
|
get :tag, :name => 'foo'
|
|
assert_response :success
|
|
assert_equal 3, @tagged
|
|
end
|
|
|
|
def test_get_boolean_expression_from_parameters_of_tag_view_single_tag
|
|
login_as(:admin_user)
|
|
get :tag, :name => "single"
|
|
assert_equal true, assigns['single_tag'], "should recognize it is a single tag name"
|
|
assert_equal "single", assigns['tag_expr'][0][0], "should store the single tag"
|
|
assert_equal "single", assigns['tag_name'], "should store the single tag name"
|
|
end
|
|
|
|
def test_get_boolean_expression_from_parameters_of_tag_view_multiple_tags
|
|
login_as(:admin_user)
|
|
get :tag, :name => "multiple", :and => "tags", :and1 => "present", :and2 => "here"
|
|
assert_equal false, assigns['single_tag'], "should recognize it has multiple tags"
|
|
assert_equal 4, assigns['tag_expr'].size, "should have 4 AND expressions"
|
|
end
|
|
|
|
def test_get_boolean_expression_from_parameters_of_tag_view_multiple_tags_without_digitless_and
|
|
login_as(:admin_user)
|
|
get :tag, :name => "multiple", :and1 => "tags", :and2 => "present", :and3 => "here"
|
|
assert_equal false, assigns['single_tag'], "should recognize it has multiple tags"
|
|
assert_equal 4, assigns['tag_expr'].size, "should have 4 AND expressions"
|
|
end
|
|
|
|
def test_get_boolean_expression_from_parameters_of_tag_view_multiple_ORs
|
|
login_as(:admin_user)
|
|
get :tag, :name => "multiple,tags,present"
|
|
assert_equal false, assigns['single_tag'], "should recognize it has multiple tags"
|
|
assert_equal 1, assigns['tag_expr'].size, "should have 1 expressions"
|
|
assert_equal 3, assigns['tag_expr'][0].size, "should have 3 ORs in 1st expression"
|
|
end
|
|
|
|
def test_get_boolean_expression_from_parameters_of_tag_view_multiple_ORs_and_ANDS
|
|
login_as(:admin_user)
|
|
get :tag, :name => "multiple,tags,present", :and => "here,is,two", :and1=>"and,three"
|
|
assert_equal false, assigns['single_tag'], "should recognize it has multiple tags"
|
|
assert_equal 3, assigns['tag_expr'].size, "should have 3 expressions"
|
|
assert_equal 3, assigns['tag_expr'][0].size, "should have 3 ORs in 1st expression"
|
|
assert_equal 3, assigns['tag_expr'][1].size, "should have 3 ORs in 2nd expression"
|
|
assert_equal 2, assigns['tag_expr'][2].size, "should have 2 ORs in 3rd expression"
|
|
end
|
|
|
|
def test_set_right_title_tag_page
|
|
login_as(:admin_user)
|
|
|
|
get :tag, :name => "foo"
|
|
assert_equal "foo", assigns['tag_title']
|
|
get :tag, :name => "foo,bar", :and => "baz"
|
|
assert_equal "foo,bar AND baz", assigns['tag_title']
|
|
end
|
|
|
|
def test_set_default_tag
|
|
login_as(:admin_user)
|
|
|
|
get :tag, :name => "foo"
|
|
assert_equal "foo", assigns['initial_tags']
|
|
get :tag, :name => "foo,bar", :and => "baz"
|
|
assert_equal "foo", assigns['initial_tags']
|
|
end
|
|
|
|
###############
|
|
# creating todo
|
|
###############
|
|
|
|
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_create_todo_via_xhr
|
|
login_as(:admin_user)
|
|
assert_difference 'Todo.count' do
|
|
xhr :put, :create, "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 200
|
|
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 409
|
|
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_add_multiple_todos
|
|
login_as(:admin_user)
|
|
|
|
start_count = Todo.count
|
|
put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{
|
|
:multiple_todos=>"a\nb\nmuch \"ado\" about \'nothing\'"}
|
|
|
|
assert_equal start_count+3, Todo.count, "two todos should have been added"
|
|
end
|
|
|
|
def test_add_multiple_todos_with_validation_error
|
|
login_as(:admin_user)
|
|
|
|
long_string = "a" * 500
|
|
|
|
start_count = Todo.count
|
|
put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{
|
|
:multiple_todos=>"a\nb\nmuch \"ado\" about \'nothing\'\n#{long_string}"}
|
|
|
|
assert_equal start_count, Todo.count, "no todos should have been added"
|
|
end
|
|
|
|
def test_add_multiple_dependent_todos
|
|
login_as(:admin_user)
|
|
|
|
start_count = Todo.count
|
|
put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{
|
|
:multiple_todos=>"a\nb"}, :todos_sequential => 'true'
|
|
put :create, :_source_view => 'todo', "context_name"=>"library", "project_name"=>"Build a working time machine", "todo"=>{
|
|
:multiple_todos=>"c\nd"}, :todos_sequential => 'false'
|
|
|
|
assert_equal start_count+4, Todo.count, "four todos should have been added"
|
|
|
|
# find a,b,c and d
|
|
%w{a b c d}.each do |todo|
|
|
eval "@#{todo} = Todo.where(:description => '#{todo}').first"
|
|
eval "assert !@#{todo}.nil?, 'a todo with description \"#{todo}\" should just have been added'"
|
|
end
|
|
|
|
assert @b.predecessors.include?(@a), "a should be a predeccesor of b"
|
|
assert !@d.predecessors.include?(@c), "c should not be a predecessor of d"
|
|
end
|
|
|
|
#########
|
|
# destroy
|
|
#########
|
|
|
|
def test_destroy_todo
|
|
login_as(:admin_user)
|
|
xhr :post, :destroy, :id => 1, :_source_view => 'todo'
|
|
todo = Todo.where(:id=>1).first
|
|
assert_nil todo
|
|
end
|
|
|
|
###############
|
|
# edit / update
|
|
###############
|
|
|
|
def test_get_edit_form_using_xhr
|
|
login_as(:admin_user)
|
|
xhr :get, :edit, :id => todos(:call_bill).id
|
|
assert_response 200
|
|
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 11, 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 10, 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 "bar, foo", t.tag_list
|
|
expected = Date.new(2006,11,30)
|
|
actual = t.due.to_date
|
|
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_update_todo_tags_with_whitespace_and_dots
|
|
t = Todo.find(1)
|
|
login_as(:admin_user)
|
|
taglist = " one , two,three ,four, 8.1.2, version1.5"
|
|
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"=>taglist
|
|
t = Todo.find(1)
|
|
assert_equal "8.1.2, four, one, three, two, version1.5", t.tag_list
|
|
end
|
|
|
|
def test_removing_hidden_project_activates_todo
|
|
login_as(:admin_user)
|
|
|
|
# get a project and hide it, todos in the project should be hidden
|
|
p = projects(:timemachine)
|
|
p.hide!
|
|
assert p.reload().hidden?
|
|
todo = p.todos.first
|
|
|
|
assert todo.project_hidden?, "todo should be project_hidden"
|
|
|
|
# clear project from todo: the todo should be unhidden
|
|
xhr :post, :update, :id => todo.id, :_source_view => 'todo', "project_name"=>"None", "todo"=>{}
|
|
|
|
assert assigns['project_changed'], "the project of the todo should be changed"
|
|
todo = Todo.find(todo.id) # reload does not seem to work anymore
|
|
assert todo.active?, "todo should be active"
|
|
end
|
|
|
|
def test_change_context_of_todo
|
|
# called by dragging a todo to another context container
|
|
login_as(:admin_user)
|
|
|
|
todo = users(:admin_user).todos.active.first
|
|
context = users(:admin_user).contexts.first
|
|
|
|
assert_not_equal todo.context.id, context.id
|
|
|
|
xhr :post, :change_context, :id => todo.id, :todo=>{:context_id => context.id}, :_source_view=>"todo"
|
|
assert assigns['context_changed'], "context should have changed"
|
|
assert_equal todo.id, assigns['todo'].id, 'correct todo should have been found'
|
|
assert_equal context.id, todo.reload.context.id, 'context of todo should be changed'
|
|
end
|
|
|
|
#######
|
|
# feeds
|
|
#######
|
|
|
|
def test_rss_feed
|
|
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 Actions'
|
|
assert_select '>description', "Actions for #{users(:admin_user).display_name}"
|
|
assert_select 'language', 'en-us'
|
|
assert_select 'ttl', '40'
|
|
assert_select 'item', 17 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', todos(:book).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', @response.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', 17 do
|
|
assert_xml_select 'title', /.+/
|
|
assert_xml_select 'content[type="html"]', /.*/
|
|
assert_xml_select 'published', /(#{Regexp.escape(todos(:book).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_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', @response.content_type
|
|
assert !(/ /.match(@response.body))
|
|
# #puts @response.body
|
|
end
|
|
|
|
def test_tag_text_feed_not_accessible_to_anonymous_user_without_token
|
|
login_as nil
|
|
get :tag, {:name => "foo", :format => "txt" }
|
|
assert_response 401
|
|
end
|
|
|
|
##############
|
|
# mobile index
|
|
##############
|
|
|
|
def test_mobile_index_uses_text_html_content_type
|
|
login_as(:admin_user)
|
|
get :index, { :format => "m" }
|
|
assert_equal 'text/html', @response.content_type
|
|
end
|
|
|
|
def test_mobile_index_assigns_down_count
|
|
login_as(:admin_user)
|
|
get :index, { :format => "m" }
|
|
assert_equal 11, assigns['down_count']
|
|
end
|
|
|
|
def test_mobile_redirect_to_login
|
|
get :index, { :format => "m" }
|
|
assert_redirected_to login_url(:format => "m")
|
|
end
|
|
|
|
###############
|
|
# mobile create
|
|
###############
|
|
|
|
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"}}
|
|
t = Todo.where(:description => "test_mobile_create_action").first
|
|
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), t.due.to_date
|
|
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 '/mobile'
|
|
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"}, "tag_list"=>"test, test2"}
|
|
assert_template 'todos/new'
|
|
end
|
|
|
|
################
|
|
# recurring todo
|
|
################
|
|
|
|
def test_toggle_check_on_recurring_todo
|
|
login_as(:admin_user)
|
|
|
|
# link todo_1 and recurring_todo_1
|
|
recurring_todo_1 = RecurringTodo.find(1)
|
|
todo_1 = Todo.where(:recurring_todo_id => 1).first
|
|
|
|
# mark todo_1 as complete by toggle_check
|
|
xhr :post, :toggle_check, :id => todo_1.id, :_source_view => 'todo'
|
|
todo_1.reload
|
|
assert todo_1.completed?
|
|
|
|
# check that there is only one active todo belonging to recurring_todo
|
|
count = Todo.count(:all, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'})
|
|
assert_equal 1, count
|
|
|
|
# check there is a new todo linked to the recurring pattern
|
|
next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'})
|
|
assert_equal "Call Bill Gates every day", next_todo.description
|
|
# check that the new todo is not the same as todo_1
|
|
assert_not_equal todo_1.id, next_todo.id
|
|
|
|
# change recurrence pattern to monthly and set show_from 2 days before due
|
|
# date this forces the next todo to be put in the tickler
|
|
recurring_todo_1.show_from_delta = 2
|
|
recurring_todo_1.show_always = 0
|
|
recurring_todo_1.target = 'due_date'
|
|
recurring_todo_1.recurring_period = 'monthly'
|
|
recurring_todo_1.recurrence_selector = 0
|
|
recurring_todo_1.every_other1 = 1
|
|
recurring_todo_1.every_other2 = 2
|
|
recurring_todo_1.every_other3 = 5
|
|
# use assert to catch validation errors if present. we need to replace
|
|
# this with a good factory implementation
|
|
assert recurring_todo_1.save
|
|
|
|
# mark next_todo as complete by toggle_check
|
|
xhr :post, :toggle_check, :id => next_todo.id, :_source_view => 'todo'
|
|
next_todo.reload
|
|
assert next_todo.completed?
|
|
|
|
# check that there are three todos belonging to recurring_todo: two
|
|
# completed and one deferred
|
|
count = Todo.count(:all, :conditions => {:recurring_todo_id => recurring_todo_1.id})
|
|
assert_equal 3, count
|
|
|
|
# check there is a new todo linked to the recurring pattern in the tickler
|
|
next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'})
|
|
assert !next_todo.nil?
|
|
assert_equal "Call Bill Gates every day", next_todo.description
|
|
# check that the todo is in the tickler
|
|
assert !next_todo.show_from.nil?
|
|
end
|
|
|
|
def test_toggle_check_on_rec_todo_show_from_today
|
|
login_as(:admin_user)
|
|
|
|
# link todo_1 and recurring_todo_1
|
|
recurring_todo_1 = RecurringTodo.find(1)
|
|
#set_user_to_current_time_zone(recurring_todo_1.user)
|
|
todo_1 = Todo.where(:recurring_todo_id => 1).first
|
|
today = Time.zone.now.at_midnight
|
|
|
|
# change recurrence pattern to monthly and set show_from to today
|
|
recurring_todo_1.target = 'show_from_date'
|
|
recurring_todo_1.recurring_period = 'monthly'
|
|
recurring_todo_1.recurrence_selector = 0
|
|
recurring_todo_1.every_other1 = today.day
|
|
recurring_todo_1.every_other2 = 1
|
|
assert recurring_todo_1.save
|
|
|
|
# mark todo_1 as complete by toggle_check, this gets rid of todo_1 that was
|
|
# not correctly created from the adjusted recurring pattern we defined
|
|
# above.
|
|
xhr :post, :toggle_check, :id => todo_1.id, :_source_view => 'todo'
|
|
todo_1.reload
|
|
assert todo_1.completed?
|
|
|
|
# locate the new todo. This todo is created from the adjusted recurring
|
|
# pattern defined in this test
|
|
new_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'})
|
|
assert !new_todo.nil?
|
|
|
|
# mark new_todo as complete by toggle_check
|
|
xhr :post, :toggle_check, :id => new_todo.id, :_source_view => 'todo'
|
|
new_todo.reload
|
|
assert todo_1.completed?
|
|
|
|
# locate the new todo in tickler
|
|
new_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'})
|
|
assert !new_todo.nil?
|
|
|
|
assert_equal "Call Bill Gates every day", new_todo.description
|
|
# check that the new todo is not the same as todo_1
|
|
assert_not_equal todo_1.id, new_todo.id
|
|
|
|
# check that the new_todo is in the tickler to show next month
|
|
assert !new_todo.show_from.nil?
|
|
|
|
# do not use today here. It somehow gets messed up with the timezone calculation.
|
|
next_month = (Time.zone.now + 1.month).at_midnight
|
|
|
|
assert_equal next_month.utc.to_date.to_s(:db), new_todo.show_from.utc.to_date.to_s(:db)
|
|
end
|
|
|
|
def test_check_for_next_todo
|
|
login_as :admin_user
|
|
|
|
recurring_todo_1 = RecurringTodo.find(5)
|
|
@todo = Todo.where(:recurring_todo_id => 1).first
|
|
assert @todo.from_recurring_todo?
|
|
# rewire @todo to yearly recurring todo
|
|
@todo.recurring_todo_id = 5
|
|
|
|
# make todo due tomorrow and change recurring date also to tomorrow
|
|
@todo.due = Time.zone.now + 1.day
|
|
@todo.save
|
|
recurring_todo_1.every_other1 = @todo.due.day
|
|
recurring_todo_1.every_other2 = @todo.due.month
|
|
recurring_todo_1.save
|
|
|
|
# mark todo complete
|
|
xhr :post, :toggle_check, :id => @todo.id, :_source_view => 'todo'
|
|
@todo = Todo.find(@todo.id) #reload does not seem to work anymore
|
|
assert @todo.completed?
|
|
|
|
# check that there is no active todo
|
|
next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'})
|
|
assert next_todo.nil?
|
|
|
|
# check for new deferred todo
|
|
next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'})
|
|
assert !next_todo.nil?
|
|
# check that the due date of the new todo is later than tomorrow
|
|
assert next_todo.due > @todo.due
|
|
end
|
|
|
|
############
|
|
# todo notes
|
|
############
|
|
|
|
def test_url_with_slash_in_query_string_are_parsed_correctly
|
|
# See http://blog.swivel.com/code/2009/06/rails-auto_link-and-certain-query-strings.html
|
|
login_as(:admin_user)
|
|
todo = users(:admin_user).todos.first
|
|
url = "http://example.com/foo?bar=/baz"
|
|
todo.notes = "foo #{url} bar"
|
|
todo.save!
|
|
get :index
|
|
assert_select("a[href=#{url}]")
|
|
end
|
|
|
|
def test_format_note_normal
|
|
login_as(:admin_user)
|
|
todo = users(:admin_user).todos.first
|
|
todo.notes = "A normal description."
|
|
todo.save!
|
|
get :index
|
|
assert_select("div#notes_todo_#{todo.id}", "A normal description.")
|
|
end
|
|
|
|
def test_format_note_textile
|
|
login_as(:admin_user)
|
|
todo = users(:admin_user).todos.first
|
|
todo.notes = "A *bold description*."
|
|
todo.save!
|
|
get :index
|
|
assert_select("div#notes_todo_#{todo.id}", "A bold description.")
|
|
assert_select("div#notes_todo_#{todo.id} strong", "bold description")
|
|
end
|
|
|
|
def test_format_note_link
|
|
login_as(:admin_user)
|
|
todo = users(:admin_user).todos.first
|
|
todo.notes = "A link to http://github.com/."
|
|
todo.save!
|
|
get :index
|
|
assert_select("div#notes_todo_#{todo.id}", 'A link to http://github.com/.')
|
|
assert_select("div#notes_todo_#{todo.id} a[href=http://github.com/]", 'http://github.com/')
|
|
end
|
|
|
|
def test_format_note_link_message
|
|
login_as(:admin_user)
|
|
todo = users(:admin_user).todos.first
|
|
todo.raw_notes = "A Mail.app message://<ABCDEF-GHADB-123455-FOO-BAR@example.com> link"
|
|
todo.save!
|
|
get :index
|
|
assert_select("div#notes_todo_#{todo.id}", 'A Mail.app message://<ABCDEF-GHADB-123455-FOO-BAR@example.com> link')
|
|
assert_select("div#notes_todo_#{todo.id} a", 'message://<ABCDEF-GHADB-123455-FOO-BAR@example.com>')
|
|
assert_select("div#notes_todo_#{todo.id} a[href=message://<ABCDEF-GHADB-123455-FOO-BAR@example.com>]", 'message://<ABCDEF-GHADB-123455-FOO-BAR@example.com>')
|
|
end
|
|
|
|
def test_format_note_link_onenote
|
|
login_as(:admin_user)
|
|
todo = users(:admin_user).todos.first
|
|
todo.notes = ' "link me to onenote":onenote:///E:\OneNote\dir\notes.one#PAGE§ion-id={FD597D3A-3793-495F-8345-23D34A00DD3B}&page-id={1C95A1C7-6408-4804-B3B5-96C28426022B}&end'
|
|
todo.save!
|
|
get :index
|
|
assert_select("div#notes_todo_#{todo.id}", 'link me to onenote')
|
|
assert_select("div#notes_todo_#{todo.id} a", 'link me to onenote')
|
|
assert_select("div#notes_todo_#{todo.id} a[href=onenote:///E:%5COneNote%5Cdir%5Cnotes.one#PAGE&section-id=%7BFD597D3A-3793-495F-8345-23D34A00DD3B%7D&page-id=%7B1C95A1C7-6408-4804-B3B5-96C28426022B%7D&end]", 'link me to onenote')
|
|
end
|
|
|
|
##############
|
|
# dependencies
|
|
##############
|
|
|
|
def test_make_todo_dependent
|
|
login_as(:admin_user)
|
|
|
|
predecessor = todos(:call_bill)
|
|
successor = todos(:call_dino_ext)
|
|
|
|
# no predecessors yet
|
|
assert_equal 0, successor.predecessors.size
|
|
|
|
# add predecessor
|
|
put :add_predecessor, :predecessor=>predecessor.id, :successor=>successor.id
|
|
|
|
assert_equal 1, successor.predecessors.count
|
|
assert_equal predecessor.id, successor.predecessors.first.id
|
|
end
|
|
|
|
def test_make_todo_with_dependencies_dependent
|
|
login_as(:admin_user)
|
|
|
|
predecessor = todos(:call_bill)
|
|
successor = todos(:call_dino_ext)
|
|
other_todo = todos(:phone_grandfather)
|
|
|
|
# predecessor -> successor
|
|
put :add_predecessor, :predecessor=>predecessor.id, :successor=>successor.id
|
|
|
|
# other_todo -> predecessor -> successor
|
|
put :add_predecessor, :predecessor=>other_todo.id, :successor=>predecessor.id
|
|
|
|
assert_equal 1, successor.predecessors(true).count
|
|
assert_equal 0, other_todo.predecessors(true).count
|
|
assert_equal 1, predecessor.predecessors(true).count
|
|
assert_equal predecessor.id, successor.predecessors.first.id
|
|
assert_equal other_todo.id, predecessor.predecessors.first.id
|
|
end
|
|
|
|
def test_mingle_dependent_todos_leave
|
|
# based on #1271
|
|
login_as(:admin_user)
|
|
|
|
t1 = todos(:call_bill)
|
|
t2 = todos(:call_dino_ext)
|
|
t3 = todos(:phone_grandfather)
|
|
t4 = todos(:construct_dilation_device)
|
|
|
|
# t1 -> t2
|
|
put :add_predecessor, :predecessor=>t1.id, :successor=>t2.id
|
|
# t3 -> t4
|
|
put :add_predecessor, :predecessor=>t3.id, :successor=>t4.id
|
|
|
|
# t2 -> t4
|
|
put :add_predecessor, :predecessor=>t2.id, :successor=>t4.id
|
|
|
|
# should be: t1 -> t2 -> t4 and t3 -> t4
|
|
assert t4.predecessors.map(&:id).include?(t2.id)
|
|
assert t4.predecessors.map(&:id).include?(t3.id)
|
|
assert t2.predecessors.map(&:id).include?(t1.id)
|
|
end
|
|
|
|
def test_mingle_dependent_todos_root
|
|
# based on #1271
|
|
login_as(:admin_user)
|
|
|
|
t1 = todos(:call_bill)
|
|
t2 = todos(:call_dino_ext)
|
|
t3 = todos(:phone_grandfather)
|
|
t4 = todos(:construct_dilation_device)
|
|
|
|
# t1 -> t2
|
|
put :add_predecessor, :predecessor=>t1.id, :successor=>t2.id
|
|
# t3 -> t4
|
|
put :add_predecessor, :predecessor=>t3.id, :successor=>t4.id
|
|
|
|
# t3 -> t2
|
|
put :add_predecessor, :predecessor=>t3.id, :successor=>t2.id
|
|
|
|
# should be: t1 -> t2 and t3 -> t4 & t2
|
|
assert t3.successors.map(&:id).include?(t4.id)
|
|
assert t3.successors.map(&:id).include?(t2.id)
|
|
assert t2.predecessors.map(&:id).include?(t1.id)
|
|
assert t2.predecessors.map(&:id).include?(t3.id)
|
|
end
|
|
|
|
def test_unmingle_dependent_todos
|
|
# based on #1271
|
|
login_as(:admin_user)
|
|
|
|
t1 = todos(:call_bill)
|
|
t2 = todos(:call_dino_ext)
|
|
t3 = todos(:phone_grandfather)
|
|
t4 = todos(:construct_dilation_device)
|
|
|
|
# create same dependency tree as previous test
|
|
# should be: t1 -> t2 -> t4 and t3 -> t4
|
|
put :add_predecessor, :predecessor=>t1.id, :successor=>t2.id
|
|
put :add_predecessor, :predecessor=>t3.id, :successor=>t4.id
|
|
put :add_predecessor, :predecessor=>t2.id, :successor=>t4.id
|
|
|
|
# removing t4 as successor of t2 should leave t4 blocked with t3 as predecessor
|
|
put :remove_predecessor, :predecessor=>t2.id, :id=>t4.id
|
|
|
|
t4.reload
|
|
assert t4.pending?, "t4 should remain pending"
|
|
assert t4.predecessors.map(&:id).include?(t3.id)
|
|
end
|
|
|
|
|
|
def test_calendar
|
|
login_as(:admin_user)
|
|
|
|
get :calendar
|
|
|
|
projects = [projects(:timemachine),
|
|
projects(:moremoney),
|
|
projects(:gardenclean)]
|
|
due_today = [todos(:phone_grandfather),
|
|
todos(:call_bill_gates_every_day),
|
|
todos(:due_today)]
|
|
due_next_week = [todos(:buy_shares),
|
|
todos(:buy_stego_bait),
|
|
todos(:new_action_in_context)]
|
|
|
|
assert_equal "calendar", assigns['source_view']
|
|
assert_equal projects, assigns['projects']
|
|
assert_equal due_today, assigns['calendar'].due_today
|
|
assert_equal [], assigns['calendar'].due_this_week
|
|
assert_equal due_next_week, assigns['calendar'].due_next_week
|
|
assert_equal [], assigns['calendar'].due_this_month
|
|
assert_equal 8, assigns['count']
|
|
end
|
|
end
|