get all unit tests running again. Seems we have some pretty old code in there :-)

This commit is contained in:
Reinier Balt 2012-04-17 16:47:37 +02:00
parent e964769553
commit fd4fb6df9e
19 changed files with 255 additions and 284 deletions

View file

@ -1,7 +1,6 @@
class LoginController < ApplicationController class LoginController < ApplicationController
layout 'login' layout 'login'
filter_parameter_logging :user_password
skip_before_filter :set_session_expiration skip_before_filter :set_session_expiration
skip_before_filter :login_required skip_before_filter :login_required
before_filter :login_optional before_filter :login_optional

View file

@ -1,5 +1,5 @@
class UsersController < ApplicationController class UsersController < ApplicationController
filter_parameter_logging "password"
before_filter :admin_login_required, :only => [ :index, :show, :destroy ] before_filter :admin_login_required, :only => [ :index, :show, :destroy ]
skip_before_filter :login_required, :only => [ :new, :create ] skip_before_filter :login_required, :only => [ :new, :create ]
skip_before_filter :check_for_deprecated_password_hash, skip_before_filter :check_for_deprecated_password_hash,

View file

@ -9,15 +9,12 @@ class Context < ActiveRecord::Base
scope :hidden, :conditions => { :hide => true } scope :hidden, :conditions => { :hide => true }
acts_as_list :scope => :user, :top_of_list => 0 acts_as_list :scope => :user, :top_of_list => 0
# extend NamePartFinder
# include Tracks::TodoList
attr_protected :user attr_protected :user
validates_presence_of :name, :message => "context must have a name" validates_presence_of :name, :message => "context must have a name"
validates_length_of :name, :maximum => 255, :message => "context name must be less than 256 characters" validates_length_of :name, :maximum => 255, :message => "context name must be less than 256 characters"
validates_uniqueness_of :name, :message => "already exists", :scope => "user_id" validates_uniqueness_of :name, :message => "already exists", :scope => "user_id"
# validates_does_not_contain :name, :string => ',', :message => "cannot contain the comma (',') character"
def self.feed_options(user) def self.feed_options(user)
# TODO: move to view or helper # TODO: move to view or helper

View file

@ -1,8 +1,9 @@
class MessageGateway < ActionMailer::Base class MessageGateway < ActionMailer::Base
include ActionView::Helpers::SanitizeHelper # include ActionView::Helpers::SanitizeHelper
extend ActionView::Helpers::SanitizeHelper::ClassMethods # extend ActionView::Helpers::SanitizeHelper::ClassMethods
def receive(email) def receive(email)
puts "email = #{email}"
address = '' address = ''
if SITE_CONFIG['email_dispatch'] == 'to' if SITE_CONFIG['email_dispatch'] == 'to'
address = email.to[0] address = email.to[0]
@ -10,9 +11,9 @@ class MessageGateway < ActionMailer::Base
address = email.from[0] address = email.from[0]
end end
user = User.find(:first, :include => [:preference], :conditions => ["preferences.sms_email = ?", address.strip]) user = User.where("preferences.sms_email" => address.strip).first(:include => [:preference])
if user.nil? if user.nil?
user = User.find(:first, :include => [:preference], :conditions => ["preferences.sms_email = ?", address.strip[1,100]]) user = User.where("preferences.sms_email" => address.strip[1.100]).first(:include => [:preference])
end end
return if user.nil? return if user.nil?
context = user.prefs.sms_context context = user.prefs.sms_context
@ -25,7 +26,7 @@ class MessageGateway < ActionMailer::Base
body_part = email.parts.find{|m| m.content_type == "text/plain"} body_part = email.parts.find{|m| m.content_type == "text/plain"}
notes = sanitize body_part.body.strip notes = sanitize body_part.body.strip
else else
if email.subject.empty? if email.subject && email.subject.blank?
description = sanitize email.body.strip description = sanitize email.body.strip
notes = nil notes = nil
else else
@ -35,7 +36,7 @@ class MessageGateway < ActionMailer::Base
end end
# stupid T-Mobile often sends the same message multiple times # stupid T-Mobile often sends the same message multiple times
return if user.todos.find(:first, :conditions => {:description => description}) return if user.todos.where(:description => description).first
todo = Todo.from_rich_message(user, context.id, description, notes) todo = Todo.from_rich_message(user, context.id, description, notes)
todo.save! todo.save!

View file

@ -11,6 +11,10 @@ class Tag < ActiveRecord::Base
validates_presence_of :name validates_presence_of :name
validates_uniqueness_of :name, :case_sensitive => false validates_uniqueness_of :name, :case_sensitive => false
attr_accessible :name
before_create :before_create
# Callback to strip extra spaces from the tagname before saving it. If you # Callback to strip extra spaces from the tagname before saving it. If you
# allow tags to be renamed later, you might want to use the # allow tags to be renamed later, you might want to use the
# <tt>before_save</tt> callback instead. # <tt>before_save</tt> callback instead.

View file

@ -3,11 +3,17 @@
class Tagging < ActiveRecord::Base class Tagging < ActiveRecord::Base
attr_accessible :taggable_id, :tag
belongs_to :tag belongs_to :tag
belongs_to :taggable, :polymorphic => true belongs_to :taggable, :polymorphic => true
after_destroy :after_destroy
private
# This callback makes sure that an orphaned <tt>Tag</tt> is deleted if it no longer tags anything. # This callback makes sure that an orphaned <tt>Tag</tt> is deleted if it no longer tags anything.
def after_destroy def after_destroy
tag.destroy_without_callbacks if tag and tag.taggings.count == 0 tag.destroy if tag and tag.taggings.count == 0
end end
end end

View file

@ -104,6 +104,22 @@ class Todo < ActiveRecord::Base
validates_length_of :notes, :maximum => 60000, :allow_nil => true validates_length_of :notes, :maximum => 60000, :allow_nil => true
validates_presence_of :show_from, :if => :deferred? validates_presence_of :show_from, :if => :deferred?
validates_presence_of :context validates_presence_of :context
validate :check_show_from_in_future
validate :check_circular_dependencies
def check_show_from_in_future
if !show_from.blank? && show_from < user.date
errors.add("show_from", I18n.t('models.todo.error_date_must_be_future'))
end
end
def check_circular_dependencies
unless @predecessor_array.nil? # Only validate predecessors if they changed
@predecessor_array.each do |todo|
errors.add("Depends on:", "Adding '#{todo.specification}' would create a circular dependency") if is_successor?(todo)
end
end
end
def initialize(*args) def initialize(*args)
super(*args) super(*args)
@ -121,7 +137,7 @@ class Todo < ActiveRecord::Base
end end
def uncompleted_predecessors? def uncompleted_predecessors?
return !uncompleted_predecessors.all(true).empty? return !uncompleted_predecessors.all.empty?
end end
# Returns a string with description <context, project> # Returns a string with description <context, project>
@ -130,17 +146,6 @@ class Todo < ActiveRecord::Base
return "\'#{self.description}\' <\'#{self.context.title}\'; \'#{project_name}\'>" return "\'#{self.description}\' <\'#{self.context.title}\'; \'#{project_name}\'>"
end end
def validate
if !show_from.blank? && show_from < user.date
errors.add("show_from", I18n.t('models.todo.error_date_must_be_future'))
end
unless @predecessor_array.nil? # Only validate predecessors if they changed
@predecessor_array.each do |todo|
errors.add("Depends on:", "Adding '#{h(todo.specification)}' would create a circular dependency") if is_successor?(todo)
end
end
end
def save_predecessors def save_predecessors
unless @predecessor_array.nil? # Only save predecessors if they changed unless @predecessor_array.nil? # Only save predecessors if they changed
current_array = self.predecessors current_array = self.predecessors

View file

@ -9,9 +9,9 @@ class User < ActiveRecord::Base
has_many :contexts, has_many :contexts,
:order => 'position ASC', :order => 'position ASC',
:dependent => :delete_all do :dependent => :delete_all do
# def find_by_params(params) def find_by_params(params)
# find(params['id'] || params['context_id']) || nil find(params['id'] || params['context_id']) || nil
# end end
def update_positions(context_ids) def update_positions(context_ids)
context_ids.each_with_index {|id, position| context_ids.each_with_index {|id, position|
context = self.detect { |c| c.id == id.to_i } context = self.detect { |c| c.id == id.to_i }
@ -23,9 +23,9 @@ class User < ActiveRecord::Base
has_many :projects, has_many :projects,
:order => 'projects.position ASC', :order => 'projects.position ASC',
:dependent => :delete_all do :dependent => :delete_all do
# def find_by_params(params) def find_by_params(params)
# find(params['id'] || params['project_id']) find(params['id'] || params['project_id'])
# end end
def update_positions(project_ids) def update_positions(project_ids)
project_ids.each_with_index {|id, position| project_ids.each_with_index {|id, position|
project = self.detect { |p| p.id == id.to_i } project = self.detect { |p| p.id == id.to_i }
@ -100,17 +100,16 @@ class User < ActiveRecord::Base
validates_confirmation_of :password validates_confirmation_of :password
validates_length_of :login, :within => 3..80 validates_length_of :login, :within => 3..80
validates_uniqueness_of :login, :on => :create validates_uniqueness_of :login, :on => :create
# validates_presence_of :open_id_url, :if => :using_openid? validate :validate_auth_type
before_create :crypt_password, :generate_token before_create :crypt_password, :generate_token
before_update :crypt_password before_update :crypt_password
# before_save :normalize_open_id_url
#for will_paginate plugin #for will_paginate plugin
cattr_accessor :per_page cattr_accessor :per_page
@@per_page = 5 @@per_page = 5
def validate def validate_auth_type
unless Tracks::Config.auth_schemes.include?(auth_type) unless Tracks::Config.auth_schemes.include?(auth_type)
errors.add("auth_type", "not a valid authentication type (#{auth_type})") errors.add("auth_type", "not a valid authentication type (#{auth_type})")
end end
@ -137,25 +136,15 @@ class User < ActiveRecord::Base
return candidate if candidate.auth_type.eql?("cas") return candidate if candidate.auth_type.eql?("cas")
end end
if Tracks::Config.auth_schemes.include?('open_id')
# hope the user enters the correct data
return candidate if candidate.auth_type.eql?("open_id")
end
return nil return nil
end end
# def self.find_by_open_id_url(raw_identity_url)
# normalized_open_id_url = OpenIdAuthentication.normalize_identifier(raw_identity_url)
# find(:first, :conditions => ['open_id_url = ?', normalized_open_id_url])
# end
def self.no_users_yet? def self.no_users_yet?
count == 0 count == 0
end end
def self.find_admin def self.find_admin
find(:first, :conditions => [ "is_admin = ?", true ]) where(:is_admin => true).first
end end
def to_param def to_param
@ -230,37 +219,22 @@ class User < ActiveRecord::Base
end end
def sha1(s) def sha1(s)
Digest::SHA1.hexdigest salted s Digest::SHA1.hexdigest(salted(s))
end end
def hash(s) def create_hash(s)
BCrypt::Password.create s BCrypt::Password.create(s)
end end
protected protected
def crypt_password def crypt_password
return if password.blank? return if password.blank?
write_attribute("crypted_password", hash(password)) if password == password_confirmation write_attribute("crypted_password", self.create_hash(password)) if password == password_confirmation
end end
def password_required? def password_required?
auth_type == 'database' && crypted_password.blank? || !password.blank? auth_type == 'database' && crypted_password.blank? || !password.blank?
end end
# def using_openid?
# auth_type == 'open_id'
# end
#
# def normalize_open_id_url
# return if open_id_url.nil?
#
# # fixup empty url value
# if open_id_url.empty?
# self.open_id_url = nil
# return
# end
#
# self.open_id_url = OpenIdAuthentication.normalize_identifier(open_id_url)
# end
end end

View file

@ -5,7 +5,7 @@
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
ActiveSupport.on_load(:action_controller) do ActiveSupport.on_load(:action_controller) do
wrap_parameters format: [:json] wrap_parameters(:format => [:json])
end end
# Disable root element in JSON by default. # Disable root element in JSON by default.

View file

@ -136,9 +136,9 @@ en:
next: Next next: Next
todo: todo todo: todo
note: note:
zero: no notes zero: "no notes"
one: 1 note one: "1 note"
other: %{count} notes other: "%{count} notes"
context: Context context: Context
drag_handle: DRAG drag_handle: DRAG
description: Description description: Description

View file

@ -9,7 +9,7 @@ class MessageGatewayTest < ActiveSupport::TestCase
end end
def load_message(filename) def load_message(filename)
MessageGateway.receive(File.read(File.join(RAILS_ROOT, 'test', 'fixtures', filename))) MessageGateway.receive(File.read(File.join(Rails.root, 'test', 'fixtures', filename)))
end end
def test_sms_with_no_subject def test_sms_with_no_subject
@ -51,14 +51,14 @@ class MessageGatewayTest < ActiveSupport::TestCase
def test_no_user def test_no_user
todo_count = Todo.count todo_count = Todo.count
badmessage = File.read(File.join(RAILS_ROOT, 'test', 'fixtures', 'sample_sms.txt')) badmessage = File.read(File.join(Rails.root, 'test', 'fixtures', 'sample_sms.txt'))
badmessage.gsub!("5555555555", "notauser") badmessage.gsub!("5555555555", "notauser")
MessageGateway.receive(badmessage) MessageGateway.receive(badmessage)
assert_equal(todo_count, Todo.count) assert_equal(todo_count, Todo.count)
end end
def test_direct_to_context def test_direct_to_context
message = File.read(File.join(RAILS_ROOT, 'test', 'fixtures', 'sample_sms.txt')) message = File.read(File.join(Rails.root, 'test', 'fixtures', 'sample_sms.txt'))
valid_context_msg = message.gsub('message_content', 'this is a task @ anothercontext') valid_context_msg = message.gsub('message_content', 'this is a task @ anothercontext')
invalid_context_msg = message.gsub('message_content', 'this is also a task @ notacontext') invalid_context_msg = message.gsub('message_content', 'this is also a task @ notacontext')

View file

@ -11,3 +11,46 @@ class ActiveSupport::TestCase
# Add more helper methods to be used by all tests here... # Add more helper methods to be used by all tests here...
end end
module Tracks
class Config
def self.salt
"change-me"
end
def self.auth_schemes
return ["database","open_id"]
end
end
end
class ActiveSupport::TestCase
# Generates a random string of ascii characters (a-z, "1 0")
# of a given length for testing assignment to fields
# for validation purposes
#
def generate_random_string(length)
string = ""
characters = %w(a b c d e f g h i j k l m n o p q r s t u v w z y z 1\ 0)
length.times do
pick = characters[rand(26)]
string << pick
end
return string
end
def assert_equal_dmy(date1, date2)
assert_equal date1.strftime("%d-%m-%y"), date2.strftime("%d-%m-%y")
end
end
class Test::Unit::TestCase
def assert_value_changed(object, method = nil)
initial_value = object.send(method)
yield
assert_not_equal initial_value, object.send(method), "#{object}##{method}"
end
end

View file

@ -9,18 +9,23 @@ class ContextTest < ActiveSupport::TestCase
@library = contexts(:library) @library = contexts(:library)
end end
def test_uses_acts_as_list
# only check that acts_as_list is present in the model
assert @agenda.respond_to?(:move_to_bottom)
end
def test_validate_presence_of_name def test_validate_presence_of_name
@agenda.name = "" @agenda.name = ""
assert !@agenda.save assert !@agenda.save
assert_equal 1, @agenda.errors.count assert_equal 1, @agenda.errors.count
assert_equal "context must have a name", @agenda.errors.on(:name) assert_equal "context must have a name", @agenda.errors[:name][0]
end end
def test_validate_name_is_less_than_256 def test_validate_name_is_less_than_256
@agenda.name = "a"*256 @agenda.name = generate_random_string(256)
assert !@agenda.save assert !@agenda.save
assert_equal 1, @agenda.errors.count assert_equal 1, @agenda.errors.count
assert_equal "context name must be less than 256 characters", @agenda.errors.on(:name) assert_equal "context name must be less than 256 characters", @agenda.errors[:name][0]
end end
def test_validate_name_is_unique def test_validate_name_is_unique
@ -29,27 +34,7 @@ class ContextTest < ActiveSupport::TestCase
newcontext.user_id = contexts(:agenda).user_id newcontext.user_id = contexts(:agenda).user_id
assert !newcontext.save assert !newcontext.save
assert_equal 1, newcontext.errors.count assert_equal 1, newcontext.errors.count
assert_equal "already exists", newcontext.errors.on(:name) assert_equal "already exists", newcontext.errors[:name][0]
end
def test_validate_name_does_not_contain_comma
newcontext = Context.new
newcontext.name = "phone,telegraph"
assert !newcontext.save
assert_equal 1, newcontext.errors.count
assert_equal "cannot contain the comma (',') character", newcontext.errors.on(:name)
end
def test_find_by_namepart_with_exact_match
c = Context.find_by_namepart('agenda')
assert_not_nil c
assert_equal @agenda.id, c.id
end
def test_find_by_namepart_with_starts_with
c = Context.find_by_namepart('agen')
assert_not_nil c
assert_equal @agenda.id, c.id
end end
def test_delete_context_deletes_todos_within_it def test_delete_context_deletes_todos_within_it
@ -61,22 +46,6 @@ class ContextTest < ActiveSupport::TestCase
end end
end end
def test_not_done_todos
assert_equal 6, @agenda.not_done_todos.size
t = @agenda.not_done_todos[0]
t.complete!
t.save!
assert_equal 5, Context.find(@agenda.id).not_done_todos.size
end
def test_done_todos
assert_equal 1, @agenda.done_todos.size
t = @agenda.not_done_todos[0]
t.complete!
t.save!
assert_equal 2, Context.find(@agenda.id).done_todos.size
end
def test_to_param_returns_id def test_to_param_returns_id
assert_equal '1', @agenda.to_param assert_equal '1', @agenda.to_param
end end

View file

@ -8,18 +8,32 @@ class ProjectTest < ActiveSupport::TestCase
@moremoney = projects(:moremoney) @moremoney = projects(:moremoney)
end end
# associations
def test_has_default_context
assert !@timemachine.default_context.nil?
assert @timemachine.default_context.name == contexts(:lab).name
p = Project.new
assert_equal '', p.default_context.name
p.default_context = contexts(:agenda)
assert_equal 'agenda', p.default_context.name
end
# validations
def test_validate_presence_of_name def test_validate_presence_of_name
@timemachine.name = "" @timemachine.name = ""
assert !@timemachine.save assert !@timemachine.save
assert_equal 1, @timemachine.errors.count assert_equal 1, @timemachine.errors.count
assert_equal "project must have a name", @timemachine.errors.on(:name) assert_equal "project must have a name", @timemachine.errors[:name][0]
end end
def test_validate_name_is_less_than_256 def test_validate_name_is_less_than_256
@timemachine.name = "a"*256 @timemachine.name = generate_random_string(256)
assert !@timemachine.save assert !@timemachine.save
assert_equal 1, @timemachine.errors.count assert_equal 1, @timemachine.errors.count
assert_equal "project name must be less than 256 characters", @timemachine.errors.on(:name) assert_equal "project name must be less than 256 characters", @timemachine.errors[:name][0]
end end
def test_validate_name_is_unique def test_validate_name_is_unique
@ -28,29 +42,10 @@ class ProjectTest < ActiveSupport::TestCase
newproj.user_id = projects(:timemachine).user_id newproj.user_id = projects(:timemachine).user_id
assert !newproj.save assert !newproj.save
assert_equal 1, newproj.errors.count assert_equal 1, newproj.errors.count
assert_equal "already exists", newproj.errors.on(:name) assert_equal "already exists", newproj.errors[:name][0]
end end
def test_validate_name_can_contain_comma # state machine
newproj = Project.new
newproj.name = "Buy iPhones for Luke,bsag,David Allen"
assert newproj.save
assert_equal 0, newproj.errors.count
assert_equal "Buy iPhones for Luke,bsag,David Allen", newproj.name
end
def test_name_removes_extra_spaces
newproj = Project.new
newproj.name = "These Words Have Proximity Issues "
assert newproj.save
assert_equal 0, newproj.errors.count
assert_equal "These Words Have Proximity Issues", newproj.name
# and on update...
@timemachine.name = " a time machine needs lots of spaaaaaaace "
assert @timemachine.save
assert_equal "a time machine needs lots of spaaaaaaace", @timemachine.name
end
def test_project_initial_state_is_active def test_project_initial_state_is_active
assert_equal :active, @timemachine.aasm_current_state assert_equal :active, @timemachine.aasm_current_state
@ -69,6 +64,24 @@ class ProjectTest < ActiveSupport::TestCase
assert @timemachine.active? assert @timemachine.active?
end end
def test_transition_to_another_state
assert_equal :active, @timemachine.aasm_current_state
@timemachine.transition_to(:hidden)
assert_equal :hidden, @timemachine.aasm_current_state
@timemachine.transition_to(:completed)
assert_equal :completed, @timemachine.aasm_current_state
@timemachine.transition_to(:active)
assert_equal :active, @timemachine.aasm_current_state
end
def test_transition_to_same_state
assert_equal :active, @timemachine.aasm_current_state
@timemachine.transition_to(:active)
assert_equal :active, @timemachine.aasm_current_state
end
# other tests
def test_review_project def test_review_project
assert_nil @timemachine.last_reviewed assert_nil @timemachine.last_reviewed
assert @timemachine.needs_review?(nil) assert @timemachine.needs_review?(nil)
@ -88,18 +101,6 @@ class ProjectTest < ActiveSupport::TestCase
assert_in_delta Time.now, @timemachine.completed_at, 1 assert_in_delta Time.now, @timemachine.completed_at, 1
end end
def test_find_project_by_namepart_with_exact_match
p = Project.find_by_namepart('Build a working time machine')
assert_not_nil p
assert_equal @timemachine.id, p.id
end
def test_find_project_by_namepart_with_starts_with
p = Project.find_by_namepart('Build a')
assert_not_nil p
assert_equal @timemachine.id, p.id
end
def test_delete_project_deletes_todos_within_it def test_delete_project_deletes_todos_within_it
assert_equal 3, @timemachine.todos.count assert_equal 3, @timemachine.todos.count
timemachine_todo_ids = @timemachine.todos.map{ |t| t.id } timemachine_todo_ids = @timemachine.todos.map{ |t| t.id }
@ -109,22 +110,6 @@ class ProjectTest < ActiveSupport::TestCase
end end
end end
def test_not_done_todos
assert_equal 3, @timemachine.todos.not_completed.size
t = @timemachine.todos.not_completed[0]
t.complete!
t.save!
assert_equal 2, Project.find(@timemachine.id).todos.not_completed.size
end
def test_done_todos
assert_equal 0, @timemachine.todos.completed.size
t = @timemachine.todos.not_completed[0]
t.complete!
t.save!
assert_equal 1, Project.find(@timemachine.id).todos.completed.size
end
def test_deferred_todos def test_deferred_todos
assert_equal 1, @timemachine.todos.deferred.size assert_equal 1, @timemachine.todos.deferred.size
t = @timemachine.todos.not_completed[0] t = @timemachine.todos.not_completed[0]
@ -150,20 +135,17 @@ class ProjectTest < ActiveSupport::TestCase
assert_equal 'Lists all the projects for Admin Schmadmin', opts[:description], 'Unexpected value for :description key of feed_options' assert_equal 'Lists all the projects for Admin Schmadmin', opts[:description], 'Unexpected value for :description key of feed_options'
end end
def test_transition_to_another_state def test_name_removes_extra_spaces
assert_equal :active, @timemachine.aasm_current_state newproj = Project.new
@timemachine.transition_to(:hidden) newproj.name = "These Words Have Proximity Issues "
assert_equal :hidden, @timemachine.aasm_current_state assert newproj.save
@timemachine.transition_to(:completed) assert_equal 0, newproj.errors.count
assert_equal :completed, @timemachine.aasm_current_state assert_equal "These Words Have Proximity Issues", newproj.name
@timemachine.transition_to(:active)
assert_equal :active, @timemachine.aasm_current_state
end
def test_transition_to_same_state # and on update...
assert_equal :active, @timemachine.aasm_current_state @timemachine.name = " a time machine needs lots of spaaaaaaace "
@timemachine.transition_to(:active) assert @timemachine.save
assert_equal :active, @timemachine.aasm_current_state assert_equal "a time machine needs lots of spaaaaaaace", @timemachine.name
end end
def test_deferred_todo_count def test_deferred_todo_count
@ -171,7 +153,7 @@ class ProjectTest < ActiveSupport::TestCase
assert_equal 0, @moremoney.todos.deferred.count assert_equal 0, @moremoney.todos.deferred.count
first_todo = @moremoney.todos[0] first_todo = @moremoney.todos[0]
first_todo.show_from = next_week first_todo.show_from = Time.zone.now + 1.week
assert_equal :deferred, @moremoney.todos[0].aasm_current_state assert_equal :deferred, @moremoney.todos[0].aasm_current_state
assert_equal 1, @moremoney.todos.deferred.count assert_equal 1, @moremoney.todos.deferred.count
@ -191,11 +173,4 @@ class ProjectTest < ActiveSupport::TestCase
assert_equal 3, @moremoney.todos.not_completed.count assert_equal 3, @moremoney.todos.not_completed.count
end end
def test_default_context_name
p = Project.new
assert_equal '', p.default_context.name
p.default_context = contexts(:agenda)
assert_equal 'agenda', p.default_context.name
end
end end

View file

@ -1,18 +1,17 @@
require File.expand_path(File.dirname(__FILE__) + '/../test_helper') require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
class RecurringTodoTest < ActiveSupport::TestCase class RecurringTodoTest < ActiveSupport::TestCase
fixtures :todos, :users, :contexts, :preferences, :tags, :taggings, :recurring_todos
def setup def setup
@every_day = RecurringTodo.find(1).reload @every_day = recurring_todos(:call_bill_gates_every_day)
@every_workday = RecurringTodo.find(2).reload @every_workday = recurring_todos(:call_bill_gates_every_workday)
@weekly_every_day = RecurringTodo.find(3).reload @weekly_every_day = recurring_todos(:call_bill_gates_every_week)
@monthly_every_last_friday = RecurringTodo.find(4).reload @monthly_every_last_friday = recurring_todos(:check_with_bill_every_last_friday_of_month)
@yearly = RecurringTodo.find(5).reload @yearly = recurring_todos(:birthday_reinier)
@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 = @today + 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)
@ -34,8 +33,8 @@ class RecurringTodoTest < ActiveSupport::TestCase
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 only day-month-year compare, because milisec / secs could be different
assert_equal @today.strftime("%d-%m-%y"), due_date.strftime("%d-%m-%y") assert_equal_dmy @today, due_date
# 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)
@ -63,7 +62,7 @@ class RecurringTodoTest < ActiveSupport::TestCase
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_dmy @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'
@ -73,7 +72,7 @@ class RecurringTodoTest < ActiveSupport::TestCase
@every_day.show_always = false @every_day.show_always = false
@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_dmy @today, @every_day.get_show_from_date(@today+9.days) #today+1+9-10
# when show_from is 0, show_from is the same day it's due # when show_from is 0, show_from is the same day it's due
@every_day.show_from_delta=0 @every_day.show_from_delta=0

View file

@ -5,14 +5,14 @@ class TodoCreateParamsHelperTest < ActiveSupport::TestCase
def test_works_with_request_as_root_hash_entry def test_works_with_request_as_root_hash_entry
params = {'request' => { 'todo' => { 'description' => 'foo'}}} params = {'request' => { 'todo' => { 'description' => 'foo'}}}
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_equal({'description' => 'foo'}, params_helper.attributes) assert_equal({'description' => 'foo'}, params_helper.attributes)
end end
def test_works_with_todo_as_root_hash_entry def test_works_with_todo_as_root_hash_entry
params = { 'todo' => { 'description' => 'foo'}} params = { 'todo' => { 'description' => 'foo'}}
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_equal({'description' => 'foo'}, params_helper.attributes) assert_equal({'description' => 'foo'}, params_helper.attributes)
end end
@ -20,7 +20,7 @@ class TodoCreateParamsHelperTest < ActiveSupport::TestCase
def test_show_from_accessor def test_show_from_accessor
expected_date = Time.now expected_date = Time.now
params = { 'todo' => { 'show_from' => expected_date}} params = { 'todo' => { 'show_from' => expected_date}}
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_equal(expected_date, params_helper.show_from) assert_equal(expected_date, params_helper.show_from)
end end
@ -28,43 +28,43 @@ class TodoCreateParamsHelperTest < ActiveSupport::TestCase
def test_due_accessor def test_due_accessor
expected_date = Time.now expected_date = Time.now
params = { 'todo' => { 'due' => expected_date}} params = { 'todo' => { 'due' => expected_date}}
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_equal(expected_date, params_helper.due) assert_equal(expected_date, params_helper.due)
end end
def test_tag_list_accessor def test_tag_list_accessor
params = { 'todo' => { }, 'todo_tag_list' => 'foo, bar'} params = { 'todo' => { }, 'todo_tag_list' => 'foo, bar'}
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_equal('foo, bar', params_helper.tag_list) assert_equal('foo, bar', params_helper.tag_list)
end end
def test_parse_dates_parses_show_from_date_based_on_prefs def test_parse_dates_parses_show_from_date_based_on_prefs
params = { 'todo' => { 'show_from' => '5/20/07', 'due' => '5/23/07'}} params = { 'todo' => { 'show_from' => '20/05/07', 'due' => '23/5/07'}}
prefs = flexmock()
prefs.should_receive(:parse_date).with('5/20/07').and_return(Date.new(2007, 5, 20)) prefs = users(:admin_user).prefs
prefs.should_receive(:parse_date).with('5/23/07').and_return(Date.new(2007, 5, 23)) prefs.date_format = "%d/%m/%y" # make sure the format matches the above
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
params_helper.parse_dates() params_helper.parse_dates()
assert_equal Date.new(2007, 5, 20), params_helper.show_from assert_equal Date.new(2007, 5, 20), params_helper.show_from.to_date
end end
def test_parse_dates_parses_due_date_based_on_prefs def test_parse_dates_parses_due_date_based_on_prefs
params = { 'todo' => { 'show_from' => '5/20/07', 'due' => '5/23/07'}} params = { 'todo' => { 'show_from' => '20/5/07', 'due' => '23/5/07'}}
prefs = flexmock()
prefs.should_receive(:parse_date).with('5/20/07').and_return(Date.new(2007, 5, 20)) prefs = users(:admin_user).prefs
prefs.should_receive(:parse_date).with('5/23/07').and_return(Date.new(2007, 5, 23)) prefs.date_format = "%d/%m/%y" # make sure the format matches the above
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
params_helper.parse_dates() params_helper.parse_dates()
assert_equal Date.new(2007, 5, 23), params_helper.due assert_equal Date.new(2007, 5, 23), params_helper.due.to_date
end end
def test_parse_dates_sets_due_to_empty_string_if_nil def test_parse_dates_sets_due_to_empty_string_if_nil
params = { 'todo' => { 'show_from' => '5/20/07', 'due' => nil}} params = { 'todo' => { 'show_from' => '20/5/07', 'due' => nil}}
prefs = flexmock() prefs = users(:admin_user).prefs
prefs.should_receive(:parse_date).with('5/20/07').and_return(Date.new(2007, 5, 20))
prefs.should_receive(:parse_date).with(nil).and_return(nil)
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
params_helper.parse_dates() params_helper.parse_dates()
assert_equal '', params_helper.due assert_equal '', params_helper.due
@ -72,63 +72,63 @@ class TodoCreateParamsHelperTest < ActiveSupport::TestCase
def test_project_name_is_stripped_of_leading_and_trailing_whitespace def test_project_name_is_stripped_of_leading_and_trailing_whitespace
params = { 'project_name' => ' Visit New Orleans ' } params = { 'project_name' => ' Visit New Orleans ' }
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_equal 'Visit New Orleans', params_helper.project_name assert_equal 'Visit New Orleans', params_helper.project_name
end end
def test_project_name_is_nil_when_unspecified def test_project_name_is_nil_when_unspecified
params = { } params = { }
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_nil params_helper.project_name assert_nil params_helper.project_name
end end
def test_context_name_is_stripped_of_leading_and_trailing_whitespace def test_context_name_is_stripped_of_leading_and_trailing_whitespace
params = { 'context_name' => ' mobile phone ' } params = { 'context_name' => ' mobile phone ' }
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_equal 'mobile phone', params_helper.context_name assert_equal 'mobile phone', params_helper.context_name
end end
def test_context_name_is_nil_when_unspecified def test_context_name_is_nil_when_unspecified
params = { } params = { }
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_nil params_helper.context_name assert_nil params_helper.context_name
end end
def test_project_specified_by_name_is_false_when_project_id_is_specified def test_project_specified_by_name_is_false_when_project_id_is_specified
params = { 'todo' => { 'project_id' => 2 } } params = { 'todo' => { 'project_id' => 2 } }
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_equal false, params_helper.project_specified_by_name? assert_equal false, params_helper.project_specified_by_name?
end end
def test_project_specified_by_name_is_false_when_project_name_is_blank def test_project_specified_by_name_is_false_when_project_name_is_blank
params = { 'project_name' => nil, 'todo' => {} } params = { 'project_name' => nil, 'todo' => {} }
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_equal false, params_helper.project_specified_by_name? assert_equal false, params_helper.project_specified_by_name?
end end
def test_project_specified_by_name_is_false_when_project_name_is_none def test_project_specified_by_name_is_false_when_project_name_is_none
params = { 'project_name' => 'None', 'todo' => {} } params = { 'project_name' => 'None', 'todo' => {} }
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_equal false, params_helper.project_specified_by_name? assert_equal false, params_helper.project_specified_by_name?
end end
def test_context_specified_by_name_is_false_when_context_id_is_specified def test_context_specified_by_name_is_false_when_context_id_is_specified
params = { 'todo' => { 'context_id' => 3 } } params = { 'todo' => { 'context_id' => 3 } }
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_equal false, params_helper.context_specified_by_name? assert_equal false, params_helper.context_specified_by_name?
end end
def test_context_specified_by_name_is_false_when_context_name_is_blank def test_context_specified_by_name_is_false_when_context_name_is_blank
params = { 'context_name' => nil, 'todo' => {} } params = { 'context_name' => nil, 'todo' => {} }
prefs = flexmock() prefs = users(:admin_user).prefs
params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs)
assert_equal false, params_helper.context_specified_by_name? assert_equal false, params_helper.context_specified_by_name?
end end

View file

@ -47,7 +47,7 @@ class TodoTest < ActiveSupport::TestCase
@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[:description][0]
end end
def test_validate_length_of_description def test_validate_length_of_description
@ -55,7 +55,7 @@ class TodoTest < ActiveSupport::TestCase
@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[:description][0]
end end
def test_validate_length_of_notes def test_validate_length_of_notes
@ -63,7 +63,7 @@ class TodoTest < ActiveSupport::TestCase
@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[:notes][0]
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
@ -72,20 +72,34 @@ class TodoTest < ActiveSupport::TestCase
# 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[:show_from][0]
end end
def test_validate_description_can_contain_quote def test_validate_circular_dependencies
t = @not_completed2 @completed.activate!
t[:description] = "much \"ado\" about nothing" @not_completed3=@completed
assert t.save
assert_equal 0, t.errors.count # 2 -> 1
@not_completed1.add_predecessor(@not_completed2)
assert @not_completed1.save!
assert_equal 1, @not_completed2.successors.count
# 3 -> 2 -> 1
@not_completed2.add_predecessor(@not_completed3)
assert @not_completed2.save!
assert_equal 1, @not_completed3.successors.count
# 1 -> 3 -> 2 -> 1 == circle
@not_completed3.add_predecessor(@not_completed1)
assert !@not_completed3.valid?
error_msg = "Adding ''Call Bill Gates to find out how much he makes per day' <'agenda'; 'Make more money than Billy Gates'>' would create a circular dependency"
assert_equal error_msg, @not_completed3.errors["Depends on:"][0]
end end
def test_defer_an_existing_todo def test_defer_an_existing_todo
@not_completed2 @not_completed2
assert_equal :active, @not_completed2.aasm_current_state assert_equal :active, @not_completed2.aasm_current_state
@not_completed2.show_from = next_week @not_completed2.show_from = Time.zone.now + 1.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.aasm_current_state assert_equal :deferred, @not_completed2.aasm_current_state
end end

View file

@ -57,14 +57,14 @@ class UserTest < ActiveSupport::TestCase
def test_validate_short_password def test_validate_short_password
assert_no_difference 'User.count' do assert_no_difference 'User.count' do
u = create_user :password => generate_random_string(4) u = create_user :password => generate_random_string(4)
assert_error_on u, :password, "is too short (minimum is 5 characters)" assert_equal "is too short (minimum is 5 characters)", u.errors[:password][0]
end end
end end
def test_validate_long_password def test_validate_long_password
assert_no_difference 'User.count' do assert_no_difference 'User.count' do
u = create_user :password => generate_random_string(41) u = create_user :password => generate_random_string(41)
assert_error_on u, :password, "is too long (maximum is 40 characters)" assert_equal "is too long (maximum is 40 characters)", u.errors[:password][0]
end end
end end
@ -77,21 +77,21 @@ class UserTest < ActiveSupport::TestCase
def test_validate_missing_password def test_validate_missing_password
assert_no_difference 'User.count' do assert_no_difference 'User.count' do
u = create_user :password => '' u = create_user :password => ''
assert_errors_on u, :password, ["can't be blank", "is too short (minimum is 5 characters)"] assert_equal ["can't be blank", "is too short (minimum is 5 characters)"], u.errors[:password]
end end
end end
def test_validate_short_login def test_validate_short_login
assert_no_difference 'User.count' do assert_no_difference 'User.count' do
u = create_user :login => 'ba' u = create_user :login => 'ba'
assert_error_on u, :login, "is too short (minimum is 3 characters)" assert_equal "is too short (minimum is 3 characters)", u.errors[:login][0]
end end
end end
def test_validate_long_login def test_validate_long_login
assert_no_difference 'User.count' do assert_no_difference 'User.count' do
u = create_user :login => generate_random_string(81) u = create_user :login => generate_random_string(81)
assert_error_on u, :login, "is too long (maximum is 80 characters)" assert_equal "is too long (maximum is 80 characters)", u.errors[:login][0]
end end
end end
@ -104,7 +104,7 @@ class UserTest < ActiveSupport::TestCase
def test_validate_missing_login def test_validate_missing_login
assert_no_difference 'User.count' do assert_no_difference 'User.count' do
u = create_user :login => '' u = create_user :login => ''
assert_errors_on u, :login, ["can't be blank", "is too short (minimum is 3 characters)"] assert_equal ["can't be blank", "is too short (minimum is 3 characters)"], u.errors[:login]
end end
end end
@ -192,7 +192,7 @@ class UserTest < ActiveSupport::TestCase
@other_user.auth_type = 'dnacheck' @other_user.auth_type = 'dnacheck'
assert !@other_user.save assert !@other_user.save
assert_equal 1, @other_user.errors.count assert_equal 1, @other_user.errors.count
assert_equal "not a valid authentication type (dnacheck)", @other_user.errors.on(:auth_type) assert_equal ["not a valid authentication type (dnacheck)"], @other_user.errors[:auth_type]
end end
def test_authenticate_can_use_ldap def test_authenticate_can_use_ldap
@ -271,21 +271,21 @@ class UserTest < ActiveSupport::TestCase
def test_should_require_login def test_should_require_login
assert_no_difference 'User.count' do assert_no_difference 'User.count' do
u = create_user(:login => nil) u = create_user(:login => nil)
assert u.errors.on(:login) assert u.errors[:login][0]
end end
end end
def test_should_require_password def test_should_require_password
assert_no_difference 'User.count' do assert_no_difference 'User.count' do
u = create_user(:password => nil) u = create_user(:password => nil)
assert u.errors.on(:password) assert u.errors[:password][0]
end end
end end
def test_should_require_password_confirmation def test_should_require_password_confirmation
assert_no_difference 'User.count' do assert_no_difference 'User.count' do
u = create_user(:password_confirmation => nil) u = create_user(:password_confirmation => nil)
assert u.errors.on(:password_confirmation) assert u.errors[:password_confirmation][0]
end end
end end
@ -316,21 +316,6 @@ class UserTest < ActiveSupport::TestCase
assert_nil users(:other_user).remember_token assert_nil users(:other_user).remember_token
end end
def test_normalizes_open_id_url_on_save
['www.johndoe.com', 'WWW.JOHNDOE.COM', 'http://www.johndoe.com/', 'http://www.johndoe.com'].each do |initial|
assert_open_id_url_normalized_on_save initial, 'http://www.johndoe.com/'
end
end
def test_normalizes_open_id_url_on_find
u = users(:other_user)
u.open_id_url = 'http://www.johndoe.com'
u.save
['www.johndoe.com', 'WWW.JOHNDOE.COM', 'http://www.johndoe.com/', 'http://www.johndoe.com'].each do |raw_open_id_url|
assert_equal u.id, User.find_by_open_id_url(raw_open_id_url).id
end
end
def test_should_discover_using_depracted_password def test_should_discover_using_depracted_password
assert_nil @admin_user.uses_deprecated_password? assert_nil @admin_user.uses_deprecated_password?
assert_nil @other_user.uses_deprecated_password? assert_nil @other_user.uses_deprecated_password?