remove unused and unneccesary user_id from taggings table.

this way we can stay closer to the defaults of has_many_polymorphs thus making upgrading easier
This commit is contained in:
Reinier Balt 2009-01-08 10:18:03 +01:00
parent 65fe971d32
commit f79c28231b
12 changed files with 1932 additions and 1911 deletions

View file

@ -6,8 +6,9 @@ class StatsController < ApplicationController
def index def index
@page_title = 'TRACKS::Statistics' @page_title = 'TRACKS::Statistics'
@unique_tags = @tags.count(:all, {:group=>"tag_id"}) @tags_count = get_total_number_of_tags_of_user
@unique_tags_count = get_unique_tags_of_user.count
@hidden_contexts = @contexts.hidden @hidden_contexts = @contexts.hidden
@first_action = @actions.find(:first, :order => "created_at ASC") @first_action = @actions.find(:first, :order => "created_at ASC")
@ -394,7 +395,7 @@ class StatsController < ApplicationController
def context_running_actions_data def context_running_actions_data
# get incomplete action count per visible context # get incomplete action count per visible context
# #
# Went from GROUP BY c.id to c.name for compatibility with postgresql. Since # Went from GROUP BY c.id to c.name for compatibility with postgresql. Since
# the name is forced to be unique, this should work. # the name is forced to be unique, this should work.
@all_actions_per_context = @contexts.find_by_sql( @all_actions_per_context = @contexts.find_by_sql(
@ -643,11 +644,31 @@ class StatsController < ApplicationController
private private
def get_unique_tags_of_user
tag_ids = @actions.find_by_sql([
"SELECT DISTINCT tags.id as id "+
"FROM tags, taggings, todos "+
"WHERE todos.user_id=? "+
"AND tags.id = taggings.tag_id " +
"AND taggings.taggable_id = todos.id ", current_user.id])
tags_ids_s = tag_ids.map(&:id).sort.join(",")
return Tag.find(:all, :conditions => "id in (" + tags_ids_s + ")")
end
def get_total_number_of_tags_of_user
# same query as get_unique_tags_of_user except for the DISTINCT
return @actions.find_by_sql([
"SELECT tags.id as id "+
"FROM tags, taggings, todos "+
"WHERE todos.user_id=? "+
"AND tags.id = taggings.tag_id " +
"AND taggings.taggable_id = todos.id ", current_user.id]).count
end
def init def init
@actions = @user.todos @actions = @user.todos
@projects = @user.projects @projects = @user.projects
@contexts = @user.contexts @contexts = @user.contexts
@tags = @user.tags
# default chart dimensions # default chart dimensions
@chart_width=460 @chart_width=460
@ -724,7 +745,7 @@ class StatsController < ApplicationController
def get_stats_contexts def get_stats_contexts
# get action count per context for TOP 5 # get action count per context for TOP 5
# #
# Went from GROUP BY c.id to c.id, c.name for compatibility with postgresql. # Went from GROUP BY c.id to c.id, c.name for compatibility with postgresql.
# Since the name is forced to be unique, this should work. # Since the name is forced to be unique, this should work.
@actions_per_context = @contexts.find_by_sql( @actions_per_context = @contexts.find_by_sql(
@ -737,7 +758,7 @@ class StatsController < ApplicationController
) )
# get incomplete action count per visible context for TOP 5 # get incomplete action count per visible context for TOP 5
# #
# Went from GROUP BY c.id to c.id, c.name for compatibility with postgresql. # Went from GROUP BY c.id to c.id, c.name for compatibility with postgresql.
# Since the name is forced to be unique, this should work. # Since the name is forced to be unique, this should work.
@running_actions_per_context = @contexts.find_by_sql( @running_actions_per_context = @contexts.find_by_sql(
@ -752,7 +773,7 @@ class StatsController < ApplicationController
def get_stats_projects def get_stats_projects
# get the first 10 projects and their action count (all actions) # get the first 10 projects and their action count (all actions)
# #
# Went from GROUP BY p.id to p.name for compatibility with postgresql. Since # Went from GROUP BY p.id to p.name for compatibility with postgresql. Since
# the name is forced to be unique, this should work. # the name is forced to be unique, this should work.
@projects_and_actions = @projects.find_by_sql( @projects_and_actions = @projects.find_by_sql(
@ -812,9 +833,10 @@ class StatsController < ApplicationController
# Get the tag cloud for all tags for actions # Get the tag cloud for all tags for actions
query = "SELECT tags.id, name, count(*) AS count" query = "SELECT tags.id, name, count(*) AS count"
query << " FROM taggings, tags" query << " FROM taggings, tags, todos"
query << " WHERE tags.id = tag_id" query << " WHERE tags.id = tag_id"
query << " AND taggings.user_id="+@user.id.to_s+" " query << " AND taggings.taggable_id = todos.id"
query << " AND todos.user_id="+current_user.id.to_s+" "
query << " AND taggings.taggable_type='Todo' " query << " AND taggings.taggable_type='Todo' "
query << " GROUP BY tags.id, tags.name" query << " GROUP BY tags.id, tags.name"
query << " ORDER BY count DESC, name" query << " ORDER BY count DESC, name"
@ -833,7 +855,7 @@ class StatsController < ApplicationController
query = "SELECT tags.id, tags.name AS name, count(*) AS count" query = "SELECT tags.id, tags.name AS name, count(*) AS count"
query << " FROM taggings, tags, todos" query << " FROM taggings, tags, todos"
query << " WHERE tags.id = tag_id" query << " WHERE tags.id = tag_id"
query << " AND taggings.user_id=? " query << " AND todos.user_id=? "
query << " AND taggings.taggable_type='Todo' " query << " AND taggings.taggable_type='Todo' "
query << " AND taggings.taggable_id=todos.id " query << " AND taggings.taggable_id=todos.id "
query << " AND (todos.created_at > ? OR " query << " AND (todos.created_at > ? OR "
@ -842,7 +864,7 @@ class StatsController < ApplicationController
query << " ORDER BY count DESC, name" query << " ORDER BY count DESC, name"
query << " LIMIT 100" query << " LIMIT 100"
@tags_for_cloud_90days = Tag.find_by_sql( @tags_for_cloud_90days = Tag.find_by_sql(
[query, @user.id, @cut_off_3months, @cut_off_3months] [query, current_user.id, @cut_off_3months, @cut_off_3months]
).sort_by { |tag| tag.name.downcase } ).sort_by { |tag| tag.name.downcase }
max_90days, @tags_min_90days = 0, 0 max_90days, @tags_min_90days = 0, 0

File diff suppressed because it is too large Load diff

View file

@ -5,7 +5,6 @@ class Tagging < ActiveRecord::Base
belongs_to :tag belongs_to :tag
belongs_to :taggable, :polymorphic => true belongs_to :taggable, :polymorphic => true
# belongs_to :user
# If you also need to use <tt>acts_as_list</tt>, you will have to manage the tagging positions manually by creating decorated join records when you associate Tags with taggables. # If you also need to use <tt>acts_as_list</tt>, you will have to manage the tagging positions manually by creating decorated join records when you associate Tags with taggables.
# acts_as_list :scope => :taggable # acts_as_list :scope => :taggable

View file

@ -104,8 +104,6 @@ class User < ActiveRecord::Base
end end
has_many :notes, :order => "created_at DESC", :dependent => :delete_all has_many :notes, :order => "created_at DESC", :dependent => :delete_all
has_one :preference, :dependent => :destroy has_one :preference, :dependent => :destroy
has_many :taggings
has_many :tags, :through => :taggings, :select => "DISTINCT tags.*"
attr_protected :is_admin attr_protected :is_admin

View file

@ -16,7 +16,7 @@ deferred actions. </p>
a total of <%= @actions.count %> actions. a total of <%= @actions.count %> actions.
<%= @actions.count(:conditions => "NOT completed_at IS NULL") %> of these are completed. <%= @actions.count(:conditions => "NOT completed_at IS NULL") %> of these are completed.
<p>You have <%= @tags.count-%> tags placed on actions. Of those tags, <p>You have <%= @tags_count-%> tags placed on actions. Of those tags,
<%= @unique_tags.size -%> are unique. <%= @unique_tags_count -%> are unique.
<% end -%> <% end -%>

View file

@ -0,0 +1,9 @@
class RemoveUserFromTaggings < ActiveRecord::Migration
def self.up
remove_column :taggings, :user_id
end
def self.down
add_column :taggings, :user_id, :integer
end
end

View file

@ -4,14 +4,12 @@ foo_bar1:
tag_id: 1 tag_id: 1
taggable_id: 1 # Call Bill Gates taggable_id: 1 # Call Bill Gates
taggable_type: Todo taggable_type: Todo
user_id: 1
foo_bar2: foo_bar2:
id: 2 id: 2
tag_id: 2 tag_id: 2
taggable_id: 1 # Call Bill Gates taggable_id: 1 # Call Bill Gates
taggable_type: Todo taggable_type: Todo
user_id: 1
# Todo 2 should be tagged with foo # Todo 2 should be tagged with foo
foo1: foo1:
@ -19,11 +17,9 @@ foo1:
tag_id: 1 tag_id: 1
taggable_id: 2 # Call dinosaur exterminator taggable_id: 2 # Call dinosaur exterminator
taggable_type: Todo taggable_type: Todo
user_id: 1
foo2: foo2:
id: 4 id: 4
tag_id: 1 tag_id: 1
taggable_id: 3 # Buy milk - completed taggable_id: 3 # Buy milk - completed
taggable_type: Todo taggable_type: Todo
user_id: 1

View file

@ -232,7 +232,7 @@ class ProjectsControllerTest < TodoContainerControllerTestBase
login_as :admin_user login_as :admin_user
u = users(:admin_user) u = users(:admin_user)
post :alphabetize, :state => "active", :format => 'js' post :alphabetize, :state => "active", :format => 'js'
assert_equal 1, projects(:timemachine).position assert_equal 1, projects(:timemachine).position
assert_equal 2, projects(:gardenclean).position assert_equal 2, projects(:gardenclean).position
assert_equal 3, projects(:moremoney).position assert_equal 3, projects(:moremoney).position
end end

View file

@ -57,8 +57,8 @@ class StatsControllerTest < Test::Unit::TestCase
assert_equal 3, assigns['projects'].count(:conditions => "state = 'active'") assert_equal 3, assigns['projects'].count(:conditions => "state = 'active'")
assert_equal 10, assigns['contexts'].count assert_equal 10, assigns['contexts'].count
assert_equal 16, assigns['actions'].count assert_equal 16, assigns['actions'].count
assert_equal 4, assigns['tags'].count assert_equal 4, assigns['tags_count']
assert_equal 2, assigns['unique_tags'].size assert_equal 2, assigns['unique_tags_count']
assert_equal 2.week.ago.utc.beginning_of_day, assigns['first_action'].created_at assert_equal 2.week.ago.utc.beginning_of_day, assigns['first_action'].created_at
end end

View file

@ -1,488 +1,488 @@
require File.dirname(__FILE__) + '/../test_helper' require File.dirname(__FILE__) + '/../test_helper'
require 'todos_controller' require 'todos_controller'
# Re-raise errors caught by the controller. # Re-raise errors caught by the controller.
class TodosController; def rescue_action(e) raise e end; end class TodosController; def rescue_action(e) raise e end; end
class TodosControllerTest < Test::Rails::TestCase class TodosControllerTest < Test::Rails::TestCase
fixtures :users, :preferences, :projects, :contexts, :todos, :tags, :taggings, :recurring_todos fixtures :users, :preferences, :projects, :contexts, :todos, :tags, :taggings, :recurring_todos
def setup def setup
@controller = TodosController.new @controller = TodosController.new
@request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new @request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new
end end
def test_get_index_when_not_logged_in def test_get_index_when_not_logged_in
get :index get :index
assert_redirected_to :controller => 'login', :action => 'login' assert_redirected_to :controller => 'login', :action => 'login'
end end
def test_not_done_counts def test_not_done_counts
login_as(:admin_user) login_as(:admin_user)
get :index get :index
assert_equal 2, assigns['project_not_done_counts'][projects(:timemachine).id] assert_equal 2, assigns['project_not_done_counts'][projects(:timemachine).id]
assert_equal 3, assigns['context_not_done_counts'][contexts(:call).id] assert_equal 3, assigns['context_not_done_counts'][contexts(:call).id]
assert_equal 1, assigns['context_not_done_counts'][contexts(:lab).id] assert_equal 1, assigns['context_not_done_counts'][contexts(:lab).id]
end end
def test_tag_is_retrieved_properly def test_tag_is_retrieved_properly
login_as(:admin_user) login_as(:admin_user)
get :index get :index
t = assigns['not_done_todos'].find{|t| t.id == 2} t = assigns['not_done_todos'].find{|t| t.id == 2}
assert_equal 1, t.tags.count assert_equal 1, t.tags.count
assert_equal 'foo', t.tags[0].name assert_equal 'foo', t.tags[0].name
assert !t.starred? assert !t.starred?
end end
def test_not_done_counts_after_hiding_project def test_not_done_counts_after_hiding_project
p = Project.find(1) p = Project.find(1)
p.hide! p.hide!
p.save! p.save!
login_as(:admin_user) login_as(:admin_user)
get :index get :index
assert_equal nil, assigns['project_not_done_counts'][projects(:timemachine).id] assert_equal nil, assigns['project_not_done_counts'][projects(:timemachine).id]
assert_equal 2, assigns['context_not_done_counts'][contexts(:call).id] assert_equal 2, assigns['context_not_done_counts'][contexts(:call).id]
assert_equal nil, assigns['context_not_done_counts'][contexts(:lab).id] assert_equal nil, assigns['context_not_done_counts'][contexts(:lab).id]
end end
def test_not_done_counts_after_hiding_and_unhiding_project def test_not_done_counts_after_hiding_and_unhiding_project
p = Project.find(1) p = Project.find(1)
p.hide! p.hide!
p.save! p.save!
p.activate! p.activate!
p.save! p.save!
login_as(:admin_user) login_as(:admin_user)
get :index get :index
assert_equal 2, assigns['project_not_done_counts'][projects(:timemachine).id] assert_equal 2, assigns['project_not_done_counts'][projects(:timemachine).id]
assert_equal 3, assigns['context_not_done_counts'][contexts(:call).id] assert_equal 3, assigns['context_not_done_counts'][contexts(:call).id]
assert_equal 1, assigns['context_not_done_counts'][contexts(:lab).id] assert_equal 1, assigns['context_not_done_counts'][contexts(:lab).id]
end end
def test_deferred_count_for_project_source_view def test_deferred_count_for_project_source_view
login_as(:admin_user) login_as(:admin_user)
xhr :post, :toggle_check, :id => 5, :_source_view => 'project' xhr :post, :toggle_check, :id => 5, :_source_view => 'project'
assert_equal 1, assigns['deferred_count'] assert_equal 1, assigns['deferred_count']
xhr :post, :toggle_check, :id => 15, :_source_view => 'project' xhr :post, :toggle_check, :id => 15, :_source_view => 'project'
assert_equal 0, assigns['deferred_count'] assert_equal 0, assigns['deferred_count']
end end
def test_destroy_todo def test_destroy_todo
login_as(:admin_user) login_as(:admin_user)
xhr :post, :destroy, :id => 1, :_source_view => 'todo' xhr :post, :destroy, :id => 1, :_source_view => 'todo'
assert_rjs :page, "todo_1", :remove assert_rjs :page, "todo_1", :remove
# #assert_rjs :replace_html, "badge-count", '9' # #assert_rjs :replace_html, "badge-count", '9'
end end
def test_create_todo def test_create_todo
assert_difference Todo, :count do assert_difference Todo, :count do
login_as(:admin_user) 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" 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
end end
def test_create_todo_via_xml def test_create_todo_via_xml
login_as(:admin_user) login_as(:admin_user)
assert_difference Todo, :count do 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" } 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 assert_response 201
end end
end end
def test_fail_to_create_todo_via_xml def test_fail_to_create_todo_via_xml
login_as(:admin_user) login_as(:admin_user)
# #try to create with no context, which is not valid # #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" } 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_response 422
assert_xml_select "errors" do assert_xml_select "errors" do
assert_xml_select "error", "Context can't be blank" assert_xml_select "error", "Context can't be blank"
end end
end end
def test_create_deferred_todo def test_create_deferred_todo
original_todo_count = Todo.count original_todo_count = Todo.count
login_as(:admin_user) 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" 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 assert_equal original_todo_count + 1, Todo.count
end end
def test_update_todo_project def test_update_todo_project
t = Todo.find(1) t = Todo.find(1)
login_as(:admin_user) 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" 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) t = Todo.find(1)
assert_equal 1, t.project_id assert_equal 1, t.project_id
end end
def test_update_todo_project_to_none def test_update_todo_project_to_none
t = Todo.find(1) t = Todo.find(1)
login_as(:admin_user) 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" 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) t = Todo.find(1)
assert_nil t.project_id assert_nil t.project_id
end end
def test_update_todo_to_deferred_is_reflected_in_badge_count def test_update_todo_to_deferred_is_reflected_in_badge_count
login_as(:admin_user) login_as(:admin_user)
get :index get :index
assert_equal 11, assigns['count'] 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" 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'] assert_equal 10, assigns['down_count']
end end
def test_update_todo def test_update_todo
t = Todo.find(1) t = Todo.find(1)
login_as(:admin_user) 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" 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) t = Todo.find(1)
assert_equal "Call Warren Buffet to find out how much he makes per day", t.description assert_equal "Call Warren Buffet to find out how much he makes per day", t.description
assert_equal "bar, foo", t.tag_list assert_equal "bar, foo", t.tag_list
expected = Date.new(2006,11,30) expected = Date.new(2006,11,30)
actual = t.due.to_date actual = t.due.to_date
assert_equal expected, actual, "Expected #{expected.to_s(:db)}, was #{actual.to_s(:db)}" assert_equal expected, actual, "Expected #{expected.to_s(:db)}, was #{actual.to_s(:db)}"
end end
def test_update_todos_with_blank_project_name def test_update_todos_with_blank_project_name
t = Todo.find(1) t = Todo.find(1)
login_as(:admin_user) 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" 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 t.reload
assert t.project.nil? assert t.project.nil?
end end
def test_update_todo_tags_to_none def test_update_todo_tags_to_none
t = Todo.find(1) t = Todo.find(1)
login_as(:admin_user) 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"=>"" 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) t = Todo.find(1)
assert_equal true, t.tag_list.empty? assert_equal true, t.tag_list.empty?
end end
def test_update_todo_tags_with_whitespace_and_dots def test_update_todo_tags_with_whitespace_and_dots
t = Todo.find(1) t = Todo.find(1)
login_as(:admin_user) login_as(:admin_user)
taglist = " one , two,three ,four, 8.1.2, version1.5" 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 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) t = Todo.find(1)
assert_equal "8.1.2, four, one, three, two, version1.5", t.tag_list assert_equal "8.1.2, four, one, three, two, version1.5", t.tag_list
end end
def test_find_tagged_with def test_find_tagged_with
login_as(:admin_user) login_as(:admin_user)
@user = User.find(@request.session['user_id']) @user = User.find(@request.session['user_id'])
tag = Tag.find_by_name('foo').todos tag = Tag.find_by_name('foo').todos
@tagged = tag.find(:all, :conditions => ['taggings.user_id = ?', @user.id]).size @tagged = tag.count
get :tag, :name => 'foo' get :tag, :name => 'foo'
assert_response :success assert_response :success
assert_equal 3, @tagged assert_equal 3, @tagged
end end
def test_rss_feed def test_rss_feed
login_as(:admin_user) login_as(:admin_user)
get :index, { :format => "rss" } get :index, { :format => "rss" }
assert_equal 'application/rss+xml', @response.content_type assert_equal 'application/rss+xml', @response.content_type
# puts @response.body # puts @response.body
assert_xml_select 'rss[version="2.0"]' do assert_xml_select 'rss[version="2.0"]' do
assert_select 'channel' do assert_select 'channel' do
assert_select '>title', 'Actions' assert_select '>title', 'Actions'
assert_select '>description', "Actions for #{users(:admin_user).display_name}" assert_select '>description', "Actions for #{users(:admin_user).display_name}"
assert_select 'language', 'en-us' assert_select 'language', 'en-us'
assert_select 'ttl', '40' assert_select 'ttl', '40'
assert_select 'item', 11 do assert_select 'item', 11 do
assert_select 'title', /.+/ assert_select 'title', /.+/
assert_select 'description', /.*/ assert_select 'description', /.*/
assert_select 'link', %r{http://test.host/contexts/.+} assert_select 'link', %r{http://test.host/contexts/.+}
assert_select 'guid', %r{http://test.host/todos/.+} assert_select 'guid', %r{http://test.host/todos/.+}
assert_select 'pubDate', todos(:book).updated_at.to_s(:rfc822) assert_select 'pubDate', todos(:book).updated_at.to_s(:rfc822)
end end
end end
end end
end end
def test_rss_feed_with_limit def test_rss_feed_with_limit
login_as(:admin_user) login_as(:admin_user)
get :index, { :format => "rss", :limit => '5' } get :index, { :format => "rss", :limit => '5' }
assert_xml_select 'rss[version="2.0"]' do assert_xml_select 'rss[version="2.0"]' do
assert_select 'channel' do assert_select 'channel' do
assert_select '>title', 'Actions' assert_select '>title', 'Actions'
assert_select '>description', "Actions for #{users(:admin_user).display_name}" assert_select '>description', "Actions for #{users(:admin_user).display_name}"
assert_select 'item', 5 do assert_select 'item', 5 do
assert_select 'title', /.+/ assert_select 'title', /.+/
assert_select 'description', /.*/ assert_select 'description', /.*/
end end
end end
end end
end end
def test_rss_feed_not_accessible_to_anonymous_user_without_token def test_rss_feed_not_accessible_to_anonymous_user_without_token
login_as nil login_as nil
get :index, { :format => "rss" } get :index, { :format => "rss" }
assert_response 401 assert_response 401
end end
def test_rss_feed_not_accessible_to_anonymous_user_with_invalid_token def test_rss_feed_not_accessible_to_anonymous_user_with_invalid_token
login_as nil login_as nil
get :index, { :format => "rss", :token => 'foo' } get :index, { :format => "rss", :token => 'foo' }
assert_response 401 assert_response 401
end end
def test_rss_feed_accessible_to_anonymous_user_with_valid_token def test_rss_feed_accessible_to_anonymous_user_with_valid_token
login_as nil login_as nil
get :index, { :format => "rss", :token => users(:admin_user).token } get :index, { :format => "rss", :token => users(:admin_user).token }
assert_response :ok assert_response :ok
end end
def test_atom_feed_content def test_atom_feed_content
login_as :admin_user login_as :admin_user
get :index, { :format => "atom" } get :index, { :format => "atom" }
assert_equal 'application/atom+xml', @response.content_type assert_equal 'application/atom+xml', @response.content_type
# #puts @response.body # #puts @response.body
assert_xml_select 'feed[xmlns="http://www.w3.org/2005/Atom"]' do assert_xml_select 'feed[xmlns="http://www.w3.org/2005/Atom"]' do
assert_xml_select '>title', 'Actions' assert_xml_select '>title', 'Actions'
assert_xml_select '>subtitle', "Actions for #{users(:admin_user).display_name}" assert_xml_select '>subtitle', "Actions for #{users(:admin_user).display_name}"
assert_xml_select 'entry', 11 do assert_xml_select 'entry', 11 do
assert_xml_select 'title', /.+/ assert_xml_select 'title', /.+/
assert_xml_select 'content[type="html"]', /.*/ assert_xml_select 'content[type="html"]', /.*/
assert_xml_select 'published', /(#{Regexp.escape(todos(:book).updated_at.xmlschema)}|#{Regexp.escape(projects(:moremoney).updated_at.xmlschema)})/ assert_xml_select 'published', /(#{Regexp.escape(todos(:book).updated_at.xmlschema)}|#{Regexp.escape(projects(:moremoney).updated_at.xmlschema)})/
end end
end end
end end
def test_atom_feed_not_accessible_to_anonymous_user_without_token def test_atom_feed_not_accessible_to_anonymous_user_without_token
login_as nil login_as nil
get :index, { :format => "atom" } get :index, { :format => "atom" }
assert_response 401 assert_response 401
end end
def test_atom_feed_not_accessible_to_anonymous_user_with_invalid_token def test_atom_feed_not_accessible_to_anonymous_user_with_invalid_token
login_as nil login_as nil
get :index, { :format => "atom", :token => 'foo' } get :index, { :format => "atom", :token => 'foo' }
assert_response 401 assert_response 401
end end
def test_atom_feed_accessible_to_anonymous_user_with_valid_token def test_atom_feed_accessible_to_anonymous_user_with_valid_token
login_as nil login_as nil
get :index, { :format => "atom", :token => users(:admin_user).token } get :index, { :format => "atom", :token => users(:admin_user).token }
assert_response :ok assert_response :ok
end end
def test_text_feed_content def test_text_feed_content
login_as(:admin_user) login_as(:admin_user)
get :index, { :format => "txt" } get :index, { :format => "txt" }
assert_equal 'text/plain', @response.content_type assert_equal 'text/plain', @response.content_type
assert !(/&nbsp;/.match(@response.body)) assert !(/&nbsp;/.match(@response.body))
# #puts @response.body # #puts @response.body
end end
def test_text_feed_not_accessible_to_anonymous_user_without_token def test_text_feed_not_accessible_to_anonymous_user_without_token
login_as nil login_as nil
get :index, { :format => "txt" } get :index, { :format => "txt" }
assert_response 401 assert_response 401
end end
def test_text_feed_not_accessible_to_anonymous_user_with_invalid_token def test_text_feed_not_accessible_to_anonymous_user_with_invalid_token
login_as nil login_as nil
get :index, { :format => "txt", :token => 'foo' } get :index, { :format => "txt", :token => 'foo' }
assert_response 401 assert_response 401
end end
def test_text_feed_accessible_to_anonymous_user_with_valid_token def test_text_feed_accessible_to_anonymous_user_with_valid_token
login_as nil login_as nil
get :index, { :format => "txt", :token => users(:admin_user).token } get :index, { :format => "txt", :token => users(:admin_user).token }
assert_response :ok assert_response :ok
end end
def test_ical_feed_content def test_ical_feed_content
login_as :admin_user login_as :admin_user
get :index, { :format => "ics" } get :index, { :format => "ics" }
assert_equal 'text/calendar', @response.content_type assert_equal 'text/calendar', @response.content_type
assert !(/&nbsp;/.match(@response.body)) assert !(/&nbsp;/.match(@response.body))
# #puts @response.body # #puts @response.body
end end
def test_mobile_index_uses_text_html_content_type def test_mobile_index_uses_text_html_content_type
login_as(:admin_user) login_as(:admin_user)
get :index, { :format => "m" } get :index, { :format => "m" }
assert_equal 'text/html', @response.content_type assert_equal 'text/html', @response.content_type
end end
def test_mobile_index_assigns_down_count def test_mobile_index_assigns_down_count
login_as(:admin_user) login_as(:admin_user)
get :index, { :format => "m" } get :index, { :format => "m" }
assert_equal 11, assigns['down_count'] assert_equal 11, assigns['down_count']
end end
def test_mobile_create_action_creates_a_new_todo def test_mobile_create_action_creates_a_new_todo
login_as(:admin_user) login_as(:admin_user)
post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", post :create, {"format"=>"m", "todo"=>{"context_id"=>"2",
"due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2",
"show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"",
"project_id"=>"1", "project_id"=>"1",
"notes"=>"test notes", "description"=>"test_mobile_create_action", "state"=>"0"}} "notes"=>"test notes", "description"=>"test_mobile_create_action", "state"=>"0"}}
t = Todo.find_by_description("test_mobile_create_action") t = Todo.find_by_description("test_mobile_create_action")
assert_not_nil t assert_not_nil t
assert_equal 2, t.context_id assert_equal 2, t.context_id
assert_equal 1, t.project_id assert_equal 1, t.project_id
assert t.active? assert t.active?
assert_equal 'test notes', t.notes assert_equal 'test notes', t.notes
assert_nil t.show_from assert_nil t.show_from
assert_equal Date.new(2007,1,2), t.due.to_date assert_equal Date.new(2007,1,2), t.due.to_date
end end
def test_mobile_create_action_redirects_to_mobile_home_page_when_successful def test_mobile_create_action_redirects_to_mobile_home_page_when_successful
login_as(:admin_user) login_as(:admin_user)
post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", post :create, {"format"=>"m", "todo"=>{"context_id"=>"2",
"due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2",
"show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"",
"project_id"=>"1", "project_id"=>"1",
"notes"=>"test notes", "description"=>"test_mobile_create_action", "state"=>"0"}} "notes"=>"test notes", "description"=>"test_mobile_create_action", "state"=>"0"}}
assert_redirected_to '/m' assert_redirected_to '/m'
end end
def test_mobile_create_action_renders_new_template_when_save_fails def test_mobile_create_action_renders_new_template_when_save_fails
login_as(:admin_user) login_as(:admin_user)
post :create, {"format"=>"m", "todo"=>{"context_id"=>"2", post :create, {"format"=>"m", "todo"=>{"context_id"=>"2",
"due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2", "due(1i)"=>"2007", "due(2i)"=>"1", "due(3i)"=>"2",
"show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"", "show_from(1i)"=>"", "show_from(2i)"=>"", "show_from(3i)"=>"",
"project_id"=>"1", "project_id"=>"1",
"notes"=>"test notes", "state"=>"0"}, "tag_list"=>"test, test2"} "notes"=>"test notes", "state"=>"0"}, "tag_list"=>"test, test2"}
assert_template 'todos/new' assert_template 'todos/new'
end end
def test_index_html_assigns_default_project_name_map def test_index_html_assigns_default_project_name_map
login_as(:admin_user) login_as(:admin_user)
get :index, {"format"=>"html"} get :index, {"format"=>"html"}
assert_equal '"{\\"Build a working time machine\\": \\"lab\\"}"', assigns(:default_project_context_name_map) assert_equal '"{\\"Build a working time machine\\": \\"lab\\"}"', assigns(:default_project_context_name_map)
end end
def test_toggle_check_on_recurring_todo def test_toggle_check_on_recurring_todo
login_as(:admin_user) login_as(:admin_user)
# link todo_1 and recurring_todo_1 # link todo_1 and recurring_todo_1
recurring_todo_1 = RecurringTodo.find(1) recurring_todo_1 = RecurringTodo.find(1)
todo_1 = Todo.find_by_recurring_todo_id(1) todo_1 = Todo.find_by_recurring_todo_id(1)
# mark todo_1 as complete by toggle_check # mark todo_1 as complete by toggle_check
xhr :post, :toggle_check, :id => todo_1.id, :_source_view => 'todo' xhr :post, :toggle_check, :id => todo_1.id, :_source_view => 'todo'
todo_1.reload todo_1.reload
assert todo_1.completed? assert todo_1.completed?
# check that there is only one active todo belonging to recurring_todo # 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'}) count = Todo.count(:all, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'})
assert_equal 1, count assert_equal 1, count
# check there is a new todo linked to the recurring pattern # 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'}) 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 assert_equal "Call Bill Gates every day", next_todo.description
# check that the new todo is not the same as todo_1 # check that the new todo is not the same as todo_1
assert_not_equal todo_1.id, next_todo.id assert_not_equal todo_1.id, next_todo.id
# change recurrence pattern to monthly and set show_from 2 days before due # 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 # date this forces the next todo to be put in the tickler
recurring_todo_1.show_from_delta = 2 recurring_todo_1.show_from_delta = 2
recurring_todo_1.recurring_period = 'monthly' recurring_todo_1.recurring_period = 'monthly'
recurring_todo_1.recurrence_selector = 0 recurring_todo_1.recurrence_selector = 0
recurring_todo_1.every_other1 = 1 recurring_todo_1.every_other1 = 1
recurring_todo_1.every_other2 = 2 recurring_todo_1.every_other2 = 2
recurring_todo_1.every_other3 = 5 recurring_todo_1.every_other3 = 5
recurring_todo_1.save recurring_todo_1.save
# mark next_todo as complete by toggle_check # mark next_todo as complete by toggle_check
xhr :post, :toggle_check, :id => next_todo.id, :_source_view => 'todo' xhr :post, :toggle_check, :id => next_todo.id, :_source_view => 'todo'
next_todo.reload next_todo.reload
assert next_todo.completed? assert next_todo.completed?
# check that there are three todos belonging to recurring_todo: two # check that there are three todos belonging to recurring_todo: two
# completed and one deferred # completed and one deferred
count = Todo.count(:all, :conditions => {:recurring_todo_id => recurring_todo_1.id}) count = Todo.count(:all, :conditions => {:recurring_todo_id => recurring_todo_1.id})
assert_equal 3, count assert_equal 3, count
# check there is a new todo linked to the recurring pattern in the tickler # 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'}) next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'})
assert !next_todo.nil? assert !next_todo.nil?
assert_equal "Call Bill Gates every day", next_todo.description assert_equal "Call Bill Gates every day", next_todo.description
# check that the todo is in the tickler # check that the todo is in the tickler
assert !next_todo.show_from.nil? assert !next_todo.show_from.nil?
end end
def test_toggle_check_on_rec_todo_show_from_today def test_toggle_check_on_rec_todo_show_from_today
login_as(:admin_user) login_as(:admin_user)
# link todo_1 and recurring_todo_1 # link todo_1 and recurring_todo_1
recurring_todo_1 = RecurringTodo.find(1) recurring_todo_1 = RecurringTodo.find(1)
todo_1 = Todo.find_by_recurring_todo_id(1) todo_1 = Todo.find_by_recurring_todo_id(1)
today = Time.now.utc.at_midnight today = Time.now.utc.at_midnight
# change recurrence pattern to monthly and set show_from to today # change recurrence pattern to monthly and set show_from to today
recurring_todo_1.target = 'show_from_date' recurring_todo_1.target = 'show_from_date'
recurring_todo_1.recurring_period = 'monthly' recurring_todo_1.recurring_period = 'monthly'
recurring_todo_1.recurrence_selector = 0 recurring_todo_1.recurrence_selector = 0
recurring_todo_1.every_other1 = today.day recurring_todo_1.every_other1 = today.day
recurring_todo_1.every_other2 = 1 recurring_todo_1.every_other2 = 1
recurring_todo_1.save recurring_todo_1.save
# mark todo_1 as complete by toggle_check, this gets rid of todo_1 that was # 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 # not correctly created from the adjusted recurring pattern we defined
# above. # above.
xhr :post, :toggle_check, :id => todo_1.id, :_source_view => 'todo' xhr :post, :toggle_check, :id => todo_1.id, :_source_view => 'todo'
todo_1.reload todo_1.reload
assert todo_1.completed? assert todo_1.completed?
# locate the new todo. This todo is created from the adjusted recurring # locate the new todo. This todo is created from the adjusted recurring
# pattern defined in this test # pattern defined in this test
new_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'}) new_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'})
assert !new_todo.nil? assert !new_todo.nil?
# mark new_todo as complete by toggle_check # mark new_todo as complete by toggle_check
xhr :post, :toggle_check, :id => new_todo.id, :_source_view => 'todo' xhr :post, :toggle_check, :id => new_todo.id, :_source_view => 'todo'
new_todo.reload new_todo.reload
assert todo_1.completed? assert todo_1.completed?
# locate the new todo in tickler # locate the new todo in tickler
new_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'}) new_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'})
assert !new_todo.nil? assert !new_todo.nil?
assert_equal "Call Bill Gates every day", new_todo.description assert_equal "Call Bill Gates every day", new_todo.description
# check that the new todo is not the same as todo_1 # check that the new todo is not the same as todo_1
assert_not_equal todo_1.id, new_todo.id assert_not_equal todo_1.id, new_todo.id
# check that the new_todo is in the tickler to show next month # check that the new_todo is in the tickler to show next month
assert !new_todo.show_from.nil? assert !new_todo.show_from.nil?
assert_equal Time.utc(today.year, today.month, today.day)+1.month, new_todo.show_from assert_equal Time.utc(today.year, today.month, today.day)+1.month, new_todo.show_from
end end
def test_check_for_next_todo def test_check_for_next_todo
login_as :admin_user login_as :admin_user
recurring_todo_1 = RecurringTodo.find(5) recurring_todo_1 = RecurringTodo.find(5)
@todo = Todo.find_by_recurring_todo_id(1) @todo = Todo.find_by_recurring_todo_id(1)
assert @todo.from_recurring_todo? assert @todo.from_recurring_todo?
# rewire @todo to yearly recurring todo # rewire @todo to yearly recurring todo
@todo.recurring_todo_id = 5 @todo.recurring_todo_id = 5
# make todo due tomorrow and change recurring date also to tomorrow # make todo due tomorrow and change recurring date also to tomorrow
@todo.due = Time.zone.now + 1.day @todo.due = Time.zone.now + 1.day
@todo.save @todo.save
recurring_todo_1.every_other1 = @todo.due.day recurring_todo_1.every_other1 = @todo.due.day
recurring_todo_1.every_other2 = @todo.due.month recurring_todo_1.every_other2 = @todo.due.month
recurring_todo_1.save recurring_todo_1.save
# mark todo complete # mark todo complete
xhr :post, :toggle_check, :id => @todo.id, :_source_view => 'todo' xhr :post, :toggle_check, :id => @todo.id, :_source_view => 'todo'
@todo.reload @todo.reload
assert @todo.completed? assert @todo.completed?
# check that there is no active todo # check that there is no active todo
next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'}) next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'active'})
assert next_todo.nil? assert next_todo.nil?
# check for new deferred todo # check for new deferred todo
next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'}) next_todo = Todo.find(:first, :conditions => {:recurring_todo_id => recurring_todo_1.id, :state => 'deferred'})
assert !next_todo.nil? assert !next_todo.nil?
# check that the due date of the new todo is later than tomorrow # check that the due date of the new todo is later than tomorrow
assert next_todo.due > @todo.due assert next_todo.due > @todo.due
end end
end end

View file

@ -1,283 +1,283 @@
require File.dirname(__FILE__) + '/../test_helper' require File.dirname(__FILE__) + '/../test_helper'
class RecurringTodoTest < Test::Rails::TestCase class RecurringTodoTest < Test::Rails::TestCase
fixtures :todos, :users, :contexts, :preferences, :tags, :taggings, :recurring_todos fixtures :todos, :users, :contexts, :preferences, :tags, :taggings, :recurring_todos
def setup def setup
@every_day = RecurringTodo.find(1).reload @every_day = RecurringTodo.find(1).reload
@every_workday = RecurringTodo.find(2).reload @every_workday = RecurringTodo.find(2).reload
@weekly_every_day = RecurringTodo.find(3).reload @weekly_every_day = RecurringTodo.find(3).reload
@monthly_every_last_friday = RecurringTodo.find(4).reload @monthly_every_last_friday = RecurringTodo.find(4).reload
@yearly = RecurringTodo.find(5).reload @yearly = RecurringTodo.find(5).reload
@today = Time.now.utc @today = Time.now.utc
@tomorrow = @today + 1.day @tomorrow = @today + 1.day
@in_three_days = Time.now.utc + 3.days @in_three_days = Time.now.utc + 3.days
@in_four_days = @in_three_days + 1.day # need a day after start_from @in_four_days = @in_three_days + 1.day # need a day after start_from
@friday = Time.zone.local(2008,6,6) @friday = Time.zone.local(2008,6,6)
@saturday = Time.zone.local(2008,6,7) @saturday = Time.zone.local(2008,6,7)
@sunday = Time.zone.local(2008,6,8) # june 8, 2008 was a sunday @sunday = Time.zone.local(2008,6,8) # june 8, 2008 was a sunday
@monday = Time.zone.local(2008,6,9) @monday = Time.zone.local(2008,6,9)
@tuesday = Time.zone.local(2008,6,10) @tuesday = Time.zone.local(2008,6,10)
@wednesday = Time.zone.local(2008,6,11) @wednesday = Time.zone.local(2008,6,11)
@thursday = Time.zone.local(2008,6,12) @thursday = Time.zone.local(2008,6,12)
end end
def test_pattern_text def test_pattern_text
assert_equal "every day", @every_day.recurrence_pattern assert_equal "every day", @every_day.recurrence_pattern
assert_equal "on work days", @every_workday.recurrence_pattern assert_equal "on work days", @every_workday.recurrence_pattern
assert_equal "every last Friday of every 2 months", @monthly_every_last_friday.recurrence_pattern assert_equal "every last Friday of every 2 months", @monthly_every_last_friday.recurrence_pattern
assert_equal "every year on June 8", @yearly.recurrence_pattern assert_equal "every year on June 8", @yearly.recurrence_pattern
end end
def test_daily_every_day def test_daily_every_day
# every_day should return todays date if there was no previous date # every_day should return todays date if there was no previous date
due_date = @every_day.get_due_date(nil) due_date = @every_day.get_due_date(nil)
# use strftime in compare, because milisec / secs could be different # use strftime in compare, because milisec / secs could be different
assert_equal @today.strftime("%d-%m-%y"), due_date.strftime("%d-%m-%y") assert_equal @today.strftime("%d-%m-%y"), due_date.strftime("%d-%m-%y")
# when the last todo was completed today, the next todo is due tomorrow # when the last todo was completed today, the next todo is due tomorrow
due_date =@every_day.get_due_date(@today) due_date =@every_day.get_due_date(@today)
assert_equal @tomorrow, due_date assert_equal @tomorrow, due_date
# do something every 14 days # do something every 14 days
@every_day.every_other1=14 @every_day.every_other1=14
due_date = @every_day.get_due_date(@today) due_date = @every_day.get_due_date(@today)
assert_equal @today+14.days, due_date assert_equal @today+14.days, due_date
end end
def test_daily_work_days def test_daily_work_days
assert_equal @monday, @every_workday.get_due_date(@friday) assert_equal @monday, @every_workday.get_due_date(@friday)
assert_equal @monday, @every_workday.get_due_date(@saturday) assert_equal @monday, @every_workday.get_due_date(@saturday)
assert_equal @monday, @every_workday.get_due_date(@sunday) assert_equal @monday, @every_workday.get_due_date(@sunday)
assert_equal @tuesday, @every_workday.get_due_date(@monday) assert_equal @tuesday, @every_workday.get_due_date(@monday)
end end
def test_show_from_date def test_show_from_date
# assume that target due_date works fine, i.e. don't do the same tests over # assume that target due_date works fine, i.e. don't do the same tests over
@every_day.target='show_from_date' @every_day.target='show_from_date'
# when recurrence is targeted on show_from, due date shoult remain nil # when recurrence is targeted on show_from, due date shoult remain nil
assert_equal nil, @every_day.get_due_date(nil) assert_equal nil, @every_day.get_due_date(nil)
assert_equal nil, @every_day.get_due_date(@today-3.days) assert_equal nil, @every_day.get_due_date(@today-3.days)
# check show from get the next day # check show from get the next day
assert_equal @today, @every_day.get_show_from_date(@today-1.days) assert_equal @today, @every_day.get_show_from_date(@today-1.days)
assert_equal @today+1.day, @every_day.get_show_from_date(@today) assert_equal @today+1.day, @every_day.get_show_from_date(@today)
@every_day.target='due_date' @every_day.target='due_date'
# when target on due_date, show_from is relative to due date unless delta=0 # when target on due_date, show_from is relative to due date unless delta=0
assert_equal nil, @every_day.get_show_from_date(@today-1.days) assert_equal nil, @every_day.get_show_from_date(@today-1.days)
@every_day.show_from_delta=10 @every_day.show_from_delta=10
assert_equal @today, @every_day.get_show_from_date(@today+9.days) #today+1+9-10 assert_equal @today, @every_day.get_show_from_date(@today+9.days) #today+1+9-10
# TODO: show_from has no use case for daily pattern. Need to test on # TODO: show_from has no use case for daily pattern. Need to test on
# weekly/monthly/yearly # weekly/monthly/yearly
end end
def test_end_date_on_recurring_todo def test_end_date_on_recurring_todo
assert_equal true, @every_day.has_next_todo(@in_three_days) assert_equal true, @every_day.has_next_todo(@in_three_days)
assert_equal true, @every_day.has_next_todo(@in_four_days) assert_equal true, @every_day.has_next_todo(@in_four_days)
@every_day.end_date = @in_four_days @every_day.end_date = @in_four_days
assert_equal false, @every_day.has_next_todo(@in_four_days) assert_equal false, @every_day.has_next_todo(@in_four_days)
end end
def test_weekly_every_day_setters def test_weekly_every_day_setters
@weekly_every_day.every_day = ' ' @weekly_every_day.every_day = ' '
@weekly_every_day.weekly_return_sunday=('s') @weekly_every_day.weekly_return_sunday=('s')
assert_equal 's ', @weekly_every_day.every_day assert_equal 's ', @weekly_every_day.every_day
@weekly_every_day.weekly_return_monday=('m') @weekly_every_day.weekly_return_monday=('m')
assert_equal 'sm ', @weekly_every_day.every_day assert_equal 'sm ', @weekly_every_day.every_day
@weekly_every_day.weekly_return_tuesday=('t') @weekly_every_day.weekly_return_tuesday=('t')
assert_equal 'smt ', @weekly_every_day.every_day assert_equal 'smt ', @weekly_every_day.every_day
@weekly_every_day.weekly_return_wednesday=('w') @weekly_every_day.weekly_return_wednesday=('w')
assert_equal 'smtw ', @weekly_every_day.every_day assert_equal 'smtw ', @weekly_every_day.every_day
@weekly_every_day.weekly_return_thursday=('t') @weekly_every_day.weekly_return_thursday=('t')
assert_equal 'smtwt ', @weekly_every_day.every_day assert_equal 'smtwt ', @weekly_every_day.every_day
@weekly_every_day.weekly_return_friday=('f') @weekly_every_day.weekly_return_friday=('f')
assert_equal 'smtwtf ', @weekly_every_day.every_day assert_equal 'smtwtf ', @weekly_every_day.every_day
@weekly_every_day.weekly_return_saturday=('s') @weekly_every_day.weekly_return_saturday=('s')
assert_equal 'smtwtfs', @weekly_every_day.every_day assert_equal 'smtwtfs', @weekly_every_day.every_day
# test remove # test remove
@weekly_every_day.weekly_return_wednesday=(' ') @weekly_every_day.weekly_return_wednesday=(' ')
assert_equal 'smt tfs', @weekly_every_day.every_day assert_equal 'smt tfs', @weekly_every_day.every_day
end end
def test_weekly_pattern def test_weekly_pattern
assert_equal true, @weekly_every_day.has_next_todo(nil) assert_equal true, @weekly_every_day.has_next_todo(nil)
due_date = @weekly_every_day.get_due_date(@sunday) due_date = @weekly_every_day.get_due_date(@sunday)
assert_equal @monday, due_date assert_equal @monday, due_date
# saturday is last day in week, so the next date should be sunday + n_weeks # saturday is last day in week, so the next date should be sunday + n_weeks
due_date = @weekly_every_day.get_due_date(@saturday) due_date = @weekly_every_day.get_due_date(@saturday)
assert_equal @sunday + 2.weeks, due_date assert_equal @sunday + 2.weeks, due_date
# remove tuesday and wednesday # remove tuesday and wednesday
@weekly_every_day.weekly_return_tuesday=(' ') @weekly_every_day.weekly_return_tuesday=(' ')
@weekly_every_day.weekly_return_wednesday=(' ') @weekly_every_day.weekly_return_wednesday=(' ')
assert_equal 'sm tfs', @weekly_every_day.every_day assert_equal 'sm tfs', @weekly_every_day.every_day
due_date = @weekly_every_day.get_due_date(@monday) due_date = @weekly_every_day.get_due_date(@monday)
assert_equal @thursday, due_date assert_equal @thursday, due_date
@weekly_every_day.every_other1 = 1 @weekly_every_day.every_other1 = 1
@weekly_every_day.every_day = ' tw ' @weekly_every_day.every_day = ' tw '
due_date = @weekly_every_day.get_due_date(@tuesday) due_date = @weekly_every_day.get_due_date(@tuesday)
assert_equal @wednesday, due_date assert_equal @wednesday, due_date
due_date = @weekly_every_day.get_due_date(@wednesday) due_date = @weekly_every_day.get_due_date(@wednesday)
assert_equal @tuesday+1.week, due_date assert_equal @tuesday+1.week, due_date
end end
def test_monthly_pattern def test_monthly_pattern
due_date = @monthly_every_last_friday.get_due_date(@sunday) due_date = @monthly_every_last_friday.get_due_date(@sunday)
assert_equal Time.zone.local(2008,6,27), due_date assert_equal Time.zone.local(2008,6,27), due_date
friday_is_last_day_of_month = Time.zone.local(2008,10,31) friday_is_last_day_of_month = Time.zone.local(2008,10,31)
due_date = @monthly_every_last_friday.get_due_date(friday_is_last_day_of_month-1.day ) due_date = @monthly_every_last_friday.get_due_date(friday_is_last_day_of_month-1.day )
assert_equal friday_is_last_day_of_month , due_date assert_equal friday_is_last_day_of_month , due_date
@monthly_every_third_friday = @monthly_every_last_friday @monthly_every_third_friday = @monthly_every_last_friday
@monthly_every_third_friday.every_other3=3 #third @monthly_every_third_friday.every_other3=3 #third
due_date = @monthly_every_last_friday.get_due_date(@sunday) # june 8th 2008 due_date = @monthly_every_last_friday.get_due_date(@sunday) # june 8th 2008
assert_equal Time.zone.local(2008, 6, 20), due_date assert_equal Time.zone.local(2008, 6, 20), due_date
# set date past third friday of this month # set date past third friday of this month
due_date = @monthly_every_last_friday.get_due_date(Time.zone.local(2008,6,21)) # june 21th 2008 due_date = @monthly_every_last_friday.get_due_date(Time.zone.local(2008,6,21)) # june 21th 2008
assert_equal Time.zone.local(2008, 8, 15), due_date # every 2 months, so aug assert_equal Time.zone.local(2008, 8, 15), due_date # every 2 months, so aug
@monthly = @monthly_every_last_friday @monthly = @monthly_every_last_friday
@monthly.recurrence_selector=0 @monthly.recurrence_selector=0
@monthly.every_other1 = 8 # every 8th day of the month @monthly.every_other1 = 8 # every 8th day of the month
@monthly.every_other2 = 2 # every 2 months @monthly.every_other2 = 2 # every 2 months
due_date = @monthly.get_due_date(@saturday) # june 7th due_date = @monthly.get_due_date(@saturday) # june 7th
assert_equal @sunday, due_date # june 8th assert_equal @sunday, due_date # june 8th
due_date = @monthly.get_due_date(@sunday) # june 8th due_date = @monthly.get_due_date(@sunday) # june 8th
assert_equal Time.zone.local(2008,8,8), due_date # aug 8th assert_equal Time.zone.local(2008,8,8), due_date # aug 8th
end end
def test_yearly_pattern def test_yearly_pattern
# beginning of same year # beginning of same year
due_date = @yearly.get_due_date(Time.zone.local(2008,2,10)) # feb 10th due_date = @yearly.get_due_date(Time.zone.local(2008,2,10)) # feb 10th
assert_equal @sunday, due_date # june 8th assert_equal @sunday, due_date # june 8th
# same month, previous date # same month, previous date
due_date = @yearly.get_due_date(@saturday) # june 7th due_date = @yearly.get_due_date(@saturday) # june 7th
show_from_date = @yearly.get_show_from_date(@saturday) # june 7th show_from_date = @yearly.get_show_from_date(@saturday) # june 7th
assert_equal @sunday, due_date # june 8th assert_equal @sunday, due_date # june 8th
assert_equal @sunday-5.days, show_from_date assert_equal @sunday-5.days, show_from_date
# same month, day after # same month, day after
due_date = @yearly.get_due_date(@monday) # june 9th due_date = @yearly.get_due_date(@monday) # june 9th
assert_equal Time.zone.local(2009,6,8), due_date # june 8th next year assert_equal Time.zone.local(2009,6,8), due_date # june 8th next year
# very overdue # very overdue
due_date = @yearly.get_due_date(@monday+5.months-2.days) # november 7 due_date = @yearly.get_due_date(@monday+5.months-2.days) # november 7
assert_equal Time.zone.local(2009,6,8), due_date # june 8th next year assert_equal Time.zone.local(2009,6,8), due_date # june 8th next year
@yearly.recurrence_selector = 1 @yearly.recurrence_selector = 1
@yearly.every_other3 = 2 # second @yearly.every_other3 = 2 # second
@yearly.every_count = 3 # wednesday @yearly.every_count = 3 # wednesday
# beginning of same year # beginning of same year
due_date = @yearly.get_due_date(Time.zone.local(2008,2,10)) # feb 10th due_date = @yearly.get_due_date(Time.zone.local(2008,2,10)) # feb 10th
assert_equal Time.zone.local(2008,6,11), due_date # june 11th assert_equal Time.zone.local(2008,6,11), due_date # june 11th
# same month, before second wednesday # same month, before second wednesday
due_date = @yearly.get_due_date(@saturday) # june 7th due_date = @yearly.get_due_date(@saturday) # june 7th
assert_equal Time.zone.local(2008,6,11), due_date # june 11th assert_equal Time.zone.local(2008,6,11), due_date # june 11th
# same month, after second wednesday # same month, after second wednesday
due_date = @yearly.get_due_date(Time.zone.local(2008,6,12)) # june 7th due_date = @yearly.get_due_date(Time.zone.local(2008,6,12)) # june 7th
assert_equal Time.zone.local(2009,6,10), due_date # june 10th assert_equal Time.zone.local(2009,6,10), due_date # june 10th
# test handling of nil # test handling of nil
due_date1 = @yearly.get_due_date(nil) due_date1 = @yearly.get_due_date(nil)
due_date2 = @yearly.get_due_date(Time.now.utc + 1.day) due_date2 = @yearly.get_due_date(Time.now.utc + 1.day)
assert_equal due_date1, due_date2 assert_equal due_date1, due_date2
end end
def test_last_sunday_of_march def test_last_sunday_of_march
@yearly.recurrence_selector = 1 @yearly.recurrence_selector = 1
@yearly.every_other2 = 3 # march @yearly.every_other2 = 3 # march
@yearly.every_other3 = 5 # last @yearly.every_other3 = 5 # last
@yearly.every_count = 0 # sunday @yearly.every_count = 0 # sunday
due_date = @yearly.get_due_date(Time.zone.local(2008,10,1)) # oct 1st due_date = @yearly.get_due_date(Time.zone.local(2008,10,1)) # oct 1st
assert_equal Time.zone.local(2009,3,29), due_date # march 29th assert_equal Time.zone.local(2009,3,29), due_date # march 29th
end end
def test_start_from_in_future def test_start_from_in_future
# every_day should return start_day if it is in the future # every_day should return start_day if it is in the future
@every_day.start_from = @in_three_days @every_day.start_from = @in_three_days
due_date = @every_day.get_due_date(nil) due_date = @every_day.get_due_date(nil)
assert_equal @in_three_days, due_date assert_equal @in_three_days, due_date
due_date = @every_day.get_due_date(@tomorrow) due_date = @every_day.get_due_date(@tomorrow)
assert_equal @in_three_days, due_date assert_equal @in_three_days, due_date
# if we give a date in the future for the previous todo, the next to do # if we give a date in the future for the previous todo, the next to do
# should be based on that future date. # should be based on that future date.
due_date = @every_day.get_due_date(@in_four_days) due_date = @every_day.get_due_date(@in_four_days)
assert_equal @in_four_days+1.day, due_date assert_equal @in_four_days+1.day, due_date
@weekly_every_day.start_from = Time.zone.local(2020,1,1) @weekly_every_day.start_from = Time.zone.local(2020,1,1)
assert_equal Time.zone.local(2020,1,1), @weekly_every_day.get_due_date(nil) assert_equal Time.zone.local(2020,1,1), @weekly_every_day.get_due_date(nil)
assert_equal Time.zone.local(2020,1,1), @weekly_every_day.get_due_date(Time.zone.local(2019,10,1)) assert_equal Time.zone.local(2020,1,1), @weekly_every_day.get_due_date(Time.zone.local(2019,10,1))
assert_equal Time.zone.local(2020,1,10), @weekly_every_day.get_due_date(Time.zone.local(2020,1,9)) assert_equal Time.zone.local(2020,1,10), @weekly_every_day.get_due_date(Time.zone.local(2020,1,9))
@monthly_every_last_friday.start_from = Time.zone.local(2020,1,1) @monthly_every_last_friday.start_from = Time.zone.local(2020,1,1)
assert_equal Time.zone.local(2020,1,31), @monthly_every_last_friday.get_due_date(nil) # last friday of jan assert_equal Time.zone.local(2020,1,31), @monthly_every_last_friday.get_due_date(nil) # last friday of jan
assert_equal Time.zone.local(2020,1,31), @monthly_every_last_friday.get_due_date(Time.zone.local(2019,12,1)) # last friday of jan assert_equal Time.zone.local(2020,1,31), @monthly_every_last_friday.get_due_date(Time.zone.local(2019,12,1)) # last friday of jan
assert_equal Time.zone.local(2020,2,28), @monthly_every_last_friday.get_due_date(Time.zone.local(2020,2,1)) # last friday of feb assert_equal Time.zone.local(2020,2,28), @monthly_every_last_friday.get_due_date(Time.zone.local(2020,2,1)) # last friday of feb
# start from after june 8th 2008 # start from after june 8th 2008
@yearly.start_from = Time.zone.local(2020,6,12) @yearly.start_from = Time.zone.local(2020,6,12)
assert_equal Time.zone.local(2021,6,8), @yearly.get_due_date(nil) # jun 8th next year assert_equal Time.zone.local(2021,6,8), @yearly.get_due_date(nil) # jun 8th next year
assert_equal Time.zone.local(2021,6,8), @yearly.get_due_date(Time.zone.local(2019,6,1)) # also next year assert_equal Time.zone.local(2021,6,8), @yearly.get_due_date(Time.zone.local(2019,6,1)) # also next year
assert_equal Time.zone.local(2021,6,8), @yearly.get_due_date(Time.zone.local(2020,6,15)) # also next year assert_equal Time.zone.local(2021,6,8), @yearly.get_due_date(Time.zone.local(2020,6,15)) # also next year
this_year = Time.now.utc.year this_year = Time.now.utc.year
@yearly.start_from = Time.zone.local(this_year+1,6,12) @yearly.start_from = Time.zone.local(this_year+1,6,12)
due_date = @yearly.get_due_date(nil) due_date = @yearly.get_due_date(nil)
assert_equal due_date.year, this_year+2 assert_equal due_date.year, this_year+2
end end
def test_toggle_completion def test_toggle_completion
t = @yearly t = @yearly
assert_equal :active, t.current_state assert_equal :active, t.current_state
t.toggle_completion! t.toggle_completion!
assert_equal :completed, t.current_state assert_equal :completed, t.current_state
t.toggle_completion! t.toggle_completion!
assert_equal :active, t.current_state assert_equal :active, t.current_state
end end
def test_starred def test_starred
@yearly.tag_with("1, 2, starred") @yearly.tag_with("1, 2, starred")
@yearly.tags.reload @yearly.tags.reload
assert_equal true, @yearly.starred? assert_equal true, @yearly.starred?
assert_equal false, @weekly_every_day.starred? assert_equal false, @weekly_every_day.starred?
@yearly.toggle_star! @yearly.toggle_star!
assert_equal false, @yearly.starred? assert_equal false, @yearly.starred?
@yearly.toggle_star! @yearly.toggle_star!
assert_equal true, @yearly.starred? assert_equal true, @yearly.starred?
end end
def test_occurence_count def test_occurence_count
@every_day.number_of_occurences = 2 @every_day.number_of_occurences = 2
assert_equal true, @every_day.has_next_todo(@in_three_days) assert_equal true, @every_day.has_next_todo(@in_three_days)
@every_day.inc_occurences @every_day.inc_occurences
assert_equal true, @every_day.has_next_todo(@in_three_days) assert_equal true, @every_day.has_next_todo(@in_three_days)
@every_day.inc_occurences @every_day.inc_occurences
assert_equal false, @every_day.has_next_todo(@in_three_days) assert_equal false, @every_day.has_next_todo(@in_three_days)
# after completion, when you reactivate the recurring todo, the occurences # after completion, when you reactivate the recurring todo, the occurences
# count should be reset # count should be reset
assert_equal 2, @every_day.occurences_count assert_equal 2, @every_day.occurences_count
@every_day.toggle_completion! @every_day.toggle_completion!
@every_day.toggle_completion! @every_day.toggle_completion!
assert_equal true, @every_day.has_next_todo(@in_three_days) assert_equal true, @every_day.has_next_todo(@in_three_days)
assert_equal 0, @every_day.occurences_count assert_equal 0, @every_day.occurences_count
end end
end end

View file

@ -1,181 +1,181 @@
require File.dirname(__FILE__) + '/../test_helper' require File.dirname(__FILE__) + '/../test_helper'
require 'date' require 'date'
class TodoTest < Test::Rails::TestCase class TodoTest < Test::Rails::TestCase
fixtures :todos, :users, :contexts, :preferences, :tags, :taggings fixtures :todos, :users, :contexts, :preferences, :tags, :taggings
def setup def setup
@not_completed1 = Todo.find(1).reload @not_completed1 = Todo.find(1).reload
@not_completed2 = Todo.find(2).reload @not_completed2 = Todo.find(2).reload
@completed = Todo.find(8).reload @completed = Todo.find(8).reload
end end
# Test loading a todo item # Test loading a todo item
def test_load def test_load
assert_kind_of Todo, @not_completed1 assert_kind_of Todo, @not_completed1
assert_equal 1, @not_completed1.id assert_equal 1, @not_completed1.id
assert_equal 1, @not_completed1.context_id assert_equal 1, @not_completed1.context_id
assert_equal 2, @not_completed1.project_id assert_equal 2, @not_completed1.project_id
assert_equal "Call Bill Gates to find out how much he makes per day", @not_completed1.description assert_equal "Call Bill Gates to find out how much he makes per day", @not_completed1.description
assert_nil @not_completed1.notes assert_nil @not_completed1.notes
assert @not_completed1.completed? == false assert @not_completed1.completed? == false
assert_equal 1.week.ago.beginning_of_day.strftime("%Y-%m-%d %H:%M"), @not_completed1.created_at.strftime("%Y-%m-%d %H:%M") assert_equal 1.week.ago.beginning_of_day.strftime("%Y-%m-%d %H:%M"), @not_completed1.created_at.strftime("%Y-%m-%d %H:%M")
assert_equal 2.week.from_now.beginning_of_day.strftime("%Y-%m-%d"), @not_completed1.due.strftime("%Y-%m-%d") assert_equal 2.week.from_now.beginning_of_day.strftime("%Y-%m-%d"), @not_completed1.due.strftime("%Y-%m-%d")
assert_nil @not_completed1.completed_at assert_nil @not_completed1.completed_at
assert_equal 1, @not_completed1.user_id assert_equal 1, @not_completed1.user_id
end end
def test_completed def test_completed
assert_kind_of Todo, @completed assert_kind_of Todo, @completed
assert @completed.completed? assert @completed.completed?
assert_not_nil @completed.completed_at assert_not_nil @completed.completed_at
end end
def test_completed_at_cleared_after_toggle_to_active def test_completed_at_cleared_after_toggle_to_active
assert_kind_of Todo, @completed assert_kind_of Todo, @completed
assert @completed.completed? assert @completed.completed?
@completed.toggle_completion! @completed.toggle_completion!
assert @completed.active? assert @completed.active?
assert_nil @completed.completed_at assert_nil @completed.completed_at
end end
# Validation tests # Validation tests
# #
def test_validate_presence_of_description def test_validate_presence_of_description
assert_equal "Call dinosaur exterminator", @not_completed2.description assert_equal "Call dinosaur exterminator", @not_completed2.description
@not_completed2.description = "" @not_completed2.description = ""
assert !@not_completed2.save assert !@not_completed2.save
assert_equal 1, @not_completed2.errors.count assert_equal 1, @not_completed2.errors.count
assert_equal "can't be blank", @not_completed2.errors.on(:description) assert_equal "can't be blank", @not_completed2.errors.on(:description)
end end
def test_validate_length_of_description def test_validate_length_of_description
assert_equal "Call dinosaur exterminator", @not_completed2.description assert_equal "Call dinosaur exterminator", @not_completed2.description
@not_completed2.description = generate_random_string(101) @not_completed2.description = generate_random_string(101)
assert !@not_completed2.save assert !@not_completed2.save
assert_equal 1, @not_completed2.errors.count assert_equal 1, @not_completed2.errors.count
assert_equal "is too long (maximum is 100 characters)", @not_completed2.errors.on(:description) assert_equal "is too long (maximum is 100 characters)", @not_completed2.errors.on(:description)
end end
def test_validate_length_of_notes def test_validate_length_of_notes
assert_equal "Ask him if I need to hire a skip for the corpses.", @not_completed2.notes assert_equal "Ask him if I need to hire a skip for the corpses.", @not_completed2.notes
@not_completed2.notes = generate_random_string(60001) @not_completed2.notes = generate_random_string(60001)
assert !@not_completed2.save assert !@not_completed2.save
assert_equal 1, @not_completed2.errors.count assert_equal 1, @not_completed2.errors.count
assert_equal "is too long (maximum is 60000 characters)", @not_completed2.errors.on(:notes) assert_equal "is too long (maximum is 60000 characters)", @not_completed2.errors.on(:notes)
end end
def test_validate_show_from_must_be_a_date_in_the_future def test_validate_show_from_must_be_a_date_in_the_future
t = @not_completed2 t = @not_completed2
t[:show_from] = 1.week.ago # we have to set this via the indexer because show_from=() updates the state t[:show_from] = 1.week.ago # we have to set this via the indexer because show_from=() updates the state
# and actual show_from value appropriately based on the date # and actual show_from value appropriately based on the date
assert !t.save assert !t.save
assert_equal 1, t.errors.count assert_equal 1, t.errors.count
assert_equal "must be a date in the future", t.errors.on(:show_from) assert_equal "must be a date in the future", t.errors.on(:show_from)
end end
def test_defer_an_existing_todo def test_defer_an_existing_todo
@not_completed2 @not_completed2
assert_equal :active, @not_completed2.current_state assert_equal :active, @not_completed2.current_state
@not_completed2.show_from = next_week @not_completed2.show_from = next_week
assert @not_completed2.save, "should have saved successfully" + @not_completed2.errors.to_xml assert @not_completed2.save, "should have saved successfully" + @not_completed2.errors.to_xml
assert_equal :deferred, @not_completed2.current_state assert_equal :deferred, @not_completed2.current_state
end end
def test_create_a_new_deferred_todo def test_create_a_new_deferred_todo
user = users(:other_user) user = users(:other_user)
todo = user.todos.build todo = user.todos.build
todo.show_from = next_week todo.show_from = next_week
todo.context_id = 1 todo.context_id = 1
todo.description = 'foo' todo.description = 'foo'
assert todo.save, "should have saved successfully" + todo.errors.to_xml assert todo.save, "should have saved successfully" + todo.errors.to_xml
assert_equal :deferred, todo.current_state assert_equal :deferred, todo.current_state
end end
def test_create_a_new_deferred_todo_by_passing_attributes def test_create_a_new_deferred_todo_by_passing_attributes
user = users(:other_user) user = users(:other_user)
todo = user.todos.build(:show_from => next_week, :context_id => 1, :description => 'foo') todo = user.todos.build(:show_from => next_week, :context_id => 1, :description => 'foo')
assert todo.save, "should have saved successfully" + todo.errors.to_xml assert todo.save, "should have saved successfully" + todo.errors.to_xml
assert_equal :deferred, todo.current_state assert_equal :deferred, todo.current_state
end end
def test_feed_options def test_feed_options
opts = Todo.feed_options(users(:admin_user)) opts = Todo.feed_options(users(:admin_user))
assert_equal 'Tracks Actions', opts[:title], 'Unexpected value for :title key of feed_options' assert_equal 'Tracks Actions', opts[:title], 'Unexpected value for :title key of feed_options'
assert_equal 'Actions for Admin Schmadmin', opts[:description], 'Unexpected value for :description key of feed_options' assert_equal 'Actions for Admin Schmadmin', opts[:description], 'Unexpected value for :description key of feed_options'
end end
def test_toggle_completion def test_toggle_completion
t = @not_completed1 t = @not_completed1
assert_equal :active, t.current_state assert_equal :active, t.current_state
t.toggle_completion! t.toggle_completion!
assert_equal :completed, t.current_state assert_equal :completed, t.current_state
t.toggle_completion! t.toggle_completion!
assert_equal :active, t.current_state assert_equal :active, t.current_state
end end
def test_activate_also_saves def test_activate_also_saves
t = @not_completed1 t = @not_completed1
t.show_from = 1.week.from_now t.show_from = 1.week.from_now
t.save! t.save!
assert t.deferred? assert t.deferred?
t.reload t.reload
t.activate! t.activate!
assert t.active? assert t.active?
t.reload t.reload
assert t.active? assert t.active?
end end
def test_project_returns_null_object_when_nil def test_project_returns_null_object_when_nil
t = @not_completed1 t = @not_completed1
assert !t.project.is_a?(NullProject) assert !t.project.is_a?(NullProject)
t.project = nil t.project = nil
assert t.project.is_a?(NullProject) assert t.project.is_a?(NullProject)
end end
def test_initial_state_defaults_to_active def test_initial_state_defaults_to_active
t = Todo.new t = Todo.new
t.description = 'foo' t.description = 'foo'
t.context_id = 1 t.context_id = 1
t.save! t.save!
t.reload t.reload
assert_equal :active, t.current_state assert_equal :active, t.current_state
end end
def test_initial_state_is_deferred_when_show_from_in_future def test_initial_state_is_deferred_when_show_from_in_future
t = Todo.new t = Todo.new
t.user = users(:admin_user) t.user = users(:admin_user)
t.description = 'foo' t.description = 'foo'
t.context_id = 1 t.context_id = 1
t.show_from = 1.week.from_now.to_date t.show_from = 1.week.from_now.to_date
t.save! t.save!
t.reload t.reload
assert_equal :deferred, t.current_state assert_equal :deferred, t.current_state
end end
def test_todo_is_not_starred def test_todo_is_not_starred
assert !@not_completed1.starred? assert !@not_completed1.starred?
end end
def test_todo_2_is_not_starred def test_todo_2_is_not_starred
assert !Todo.find(2).starred? assert !Todo.find(2).starred?
end end
def test_todo_is_starred_after_starred_tag_is_added def test_todo_is_starred_after_starred_tag_is_added
@not_completed1._add_tags('starred') @not_completed1._add_tags('starred')
assert @not_completed1.starred? assert @not_completed1.starred?
end end
def test_todo_is_starred_after_toggle_starred def test_todo_is_starred_after_toggle_starred
@not_completed1.toggle_star! @not_completed1.toggle_star!
assert @not_completed1.starred? assert @not_completed1.starred?
end end
def test_todo_is_not_starred_after_toggle_starred_twice def test_todo_is_not_starred_after_toggle_starred_twice
@not_completed1.toggle_star! @not_completed1.toggle_star!
@not_completed1.toggle_star! @not_completed1.toggle_star!
assert !@not_completed1.starred? assert !@not_completed1.starred?
end end
end end