2011-06-06 14:17:44 -04:00
require " cases/helper "
2009-04-23 09:26:52 -04:00
require 'models/post'
2008-01-18 02:31:37 -05:00
require 'models/author'
2008-05-12 10:58:03 -04:00
require 'models/categorization'
2008-01-18 02:31:37 -05:00
require 'models/comment'
require 'models/company'
require 'models/topic'
require 'models/reply'
require 'models/entrant'
2009-05-18 09:43:18 -04:00
require 'models/project'
2008-01-18 02:31:37 -05:00
require 'models/developer'
2008-01-18 22:45:24 -05:00
require 'models/customer'
2010-11-12 17:29:30 -05:00
require 'models/toy'
2005-04-03 07:19:14 -04:00
2008-01-21 12:20:51 -05:00
class FinderTest < ActiveRecord :: TestCase
2009-05-18 09:43:18 -04:00
fixtures :companies , :topics , :entrants , :developers , :developers_projects , :posts , :comments , :accounts , :authors , :customers , :categories , :categorizations
2005-04-03 07:19:14 -04:00
def test_find
2005-06-10 10:58:02 -04:00
assert_equal ( topics ( :first ) . title , Topic . find ( 1 ) . title )
2005-04-03 07:19:14 -04:00
end
2007-05-25 17:56:21 -04:00
2006-04-27 18:39:45 -04:00
# find should handle strings that come from URLs
# (example: Category.find(params[:id]))
def test_find_with_string
assert_equal ( Topic . find ( 1 ) . title , Topic . find ( " 1 " ) . title )
end
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
def test_exists
2006-08-03 18:06:33 -04:00
assert Topic . exists? ( 1 )
assert Topic . exists? ( " 1 " )
assert Topic . exists? ( :author_name = > " David " )
assert Topic . exists? ( :author_name = > " Mary " , :approved = > true )
assert Topic . exists? ( [ " parent_id = ? " , 1 ] )
assert ! Topic . exists? ( 45 )
2007-12-10 20:53:54 -05:00
begin
assert ! Topic . exists? ( " foo " )
rescue ActiveRecord :: StatementInvalid
# PostgreSQL complains about string comparison with integer field
rescue Exception
flunk
end
2006-08-03 18:06:33 -04:00
assert_raise ( NoMethodError ) { Topic . exists? ( [ 1 , 2 ] ) }
2005-04-03 07:19:14 -04:00
end
2009-04-23 09:26:52 -04:00
2009-01-31 21:32:49 -05:00
def test_exists_returns_true_with_one_record_and_no_args
assert Topic . exists?
end
2009-04-23 09:26:52 -04:00
2011-08-10 13:55:29 -04:00
# exists? should handle nil for id's that come from URLs and always return false
# (example: Topic.exists?(params[:id])) where params[:id] is nil
def test_exists_with_nil_arg
assert ! Topic . exists? ( nil )
assert Topic . exists?
assert ! Topic . first . replies . exists? ( nil )
assert Topic . first . replies . exists?
end
2009-01-31 21:32:49 -05:00
def test_does_not_exist_with_empty_table_and_no_args_given
Topic . delete_all
assert ! Topic . exists?
end
2009-04-23 09:26:52 -04:00
2008-01-18 22:45:24 -05:00
def test_exists_with_aggregate_having_three_mappings
existing_address = customers ( :david ) . address
assert Customer . exists? ( :address = > existing_address )
end
def test_exists_with_aggregate_having_three_mappings_with_one_difference
existing_address = customers ( :david ) . address
assert ! Customer . exists? ( :address = >
Address . new ( existing_address . street , existing_address . city , existing_address . country + " 1 " ) )
assert ! Customer . exists? ( :address = >
Address . new ( existing_address . street , existing_address . city + " 1 " , existing_address . country ) )
assert ! Customer . exists? ( :address = >
Address . new ( existing_address . street + " 1 " , existing_address . city , existing_address . country ) )
end
2009-05-14 03:30:16 -04:00
def test_exists_with_scoped_include
2009-12-28 17:07:23 -05:00
Developer . send ( :with_scope , :find = > { :include = > :projects , :order = > " projects.name " } ) do
2009-05-14 03:30:16 -04:00
assert Developer . exists?
end
end
2011-03-29 07:51:58 -04:00
def test_exists_does_not_instantiate_records
Developer . expects ( :instantiate ) . never
Developer . exists?
end
2005-04-03 07:19:14 -04:00
def test_find_by_array_of_one_id
assert_kind_of ( Array , Topic . find ( [ 1 ] ) )
assert_equal ( 1 , Topic . find ( [ 1 ] ) . length )
end
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
def test_find_by_ids
2007-05-25 17:56:21 -04:00
assert_equal 2 , Topic . find ( 1 , 2 ) . size
assert_equal topics ( :second ) . title , Topic . find ( [ 2 ] ) . first . title
end
def test_find_by_ids_with_limit_and_offset
2007-05-25 18:05:57 -04:00
assert_equal 2 , Entrant . find ( [ 1 , 3 , 2 ] , :limit = > 2 ) . size
2007-05-25 17:56:21 -04:00
assert_equal 1 , Entrant . find ( [ 1 , 3 , 2 ] , :limit = > 3 , :offset = > 2 ) . size
2007-05-31 13:15:56 -04:00
# Also test an edge case: If you have 11 results, and you set a
# limit of 3 and offset of 9, then you should find that there
# will be only 2 results, regardless of the limit.
devs = Developer . find :all
last_devs = Developer . find devs . map ( & :id ) , :limit = > 3 , :offset = > 9
assert_equal 2 , last_devs . size
2005-04-03 07:19:14 -04:00
end
2005-06-21 12:36:18 -04:00
def test_find_an_empty_array
assert_equal [ ] , Topic . find ( [ ] )
end
2005-04-03 07:19:14 -04:00
def test_find_by_ids_missing_one
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . find ( 1 , 2 , 45 ) }
2005-04-03 07:19:14 -04:00
end
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
def test_find_all_with_limit
2009-08-07 21:12:27 -04:00
assert_equal ( 2 , Entrant . find ( :all , :limit = > 2 ) . size )
assert_equal ( 0 , Entrant . find ( :all , :limit = > 0 ) . size )
2005-04-03 07:19:14 -04:00
end
def test_find_all_with_prepared_limit_and_offset
2005-10-26 08:57:11 -04:00
entrants = Entrant . find ( :all , :order = > " id ASC " , :limit = > 2 , :offset = > 1 )
2005-04-03 07:19:14 -04:00
2005-10-26 08:57:11 -04:00
assert_equal ( 2 , entrants . size )
assert_equal ( entrants ( :second ) . name , entrants . first . name )
2005-07-03 08:34:22 -04:00
2009-08-07 21:12:27 -04:00
assert_equal 3 , Entrant . count
2005-10-26 08:57:11 -04:00
entrants = Entrant . find ( :all , :order = > " id ASC " , :limit = > 2 , :offset = > 2 )
assert_equal ( 1 , entrants . size )
assert_equal ( entrants ( :third ) . name , entrants . first . name )
2005-04-03 07:19:14 -04:00
end
2007-05-25 17:56:21 -04:00
2009-08-07 21:12:27 -04:00
def test_find_all_with_limit_and_offset_and_multiple_order_clauses
first_three_posts = Post . find :all , :order = > 'author_id, id' , :limit = > 3 , :offset = > 0
second_three_posts = Post . find :all , :order = > ' author_id,id ' , :limit = > 3 , :offset = > 3
2010-10-18 19:27:40 -04:00
third_three_posts = Post . find :all , :order = > ' author_id, id ' , :limit = > 3 , :offset = > 6
last_posts = Post . find :all , :order = > ' author_id, id ' , :limit = > 3 , :offset = > 9
2007-05-25 17:56:21 -04:00
2009-08-07 21:12:27 -04:00
assert_equal [ [ 0 , 3 ] , [ 1 , 1 ] , [ 1 , 2 ] ] , first_three_posts . map { | p | [ p . author_id , p . id ] }
assert_equal [ [ 1 , 4 ] , [ 1 , 5 ] , [ 1 , 6 ] ] , second_three_posts . map { | p | [ p . author_id , p . id ] }
2010-10-18 19:27:40 -04:00
assert_equal [ [ 2 , 7 ] , [ 2 , 9 ] , [ 2 , 11 ] ] , third_three_posts . map { | p | [ p . author_id , p . id ] }
assert_equal [ [ 3 , 8 ] , [ 3 , 10 ] ] , last_posts . map { | p | [ p . author_id , p . id ] }
2005-10-28 05:20:05 -04:00
end
2005-04-03 07:19:14 -04:00
2009-08-07 21:12:27 -04:00
2008-09-11 16:41:55 -04:00
def test_find_with_group
2011-07-07 23:20:10 -04:00
developers = Developer . find ( :all , :group = > " salary " , :select = > " salary " )
2008-09-11 16:41:55 -04:00
assert_equal 4 , developers . size
2008-09-11 18:14:06 -04:00
assert_equal 4 , developers . map ( & :salary ) . uniq . size
2008-09-11 16:41:55 -04:00
end
2008-11-21 17:20:33 -05:00
def test_find_with_group_and_having
2011-07-07 23:20:10 -04:00
developers = Developer . find ( :all , :group = > " salary " , :having = > " sum(salary) > 10000 " , :select = > " salary " )
2008-11-21 17:20:33 -05:00
assert_equal 3 , developers . size
assert_equal 3 , developers . map ( & :salary ) . uniq . size
2011-07-07 23:20:10 -04:00
assert developers . all? { | developer | developer . salary > 10000 }
2008-11-21 17:20:33 -05:00
end
2009-03-06 17:29:36 -05:00
def test_find_with_group_and_sanitized_having
2011-07-07 23:20:10 -04:00
developers = Developer . find ( :all , :group = > " salary " , :having = > [ " sum(salary) > ? " , 10000 ] , :select = > " salary " )
2009-03-06 17:29:36 -05:00
assert_equal 3 , developers . size
assert_equal 3 , developers . map ( & :salary ) . uniq . size
2011-07-07 23:20:10 -04:00
assert developers . all? { | developer | developer . salary > 10000 }
2009-03-06 17:29:36 -05:00
end
2011-07-07 23:16:32 -04:00
def test_find_with_group_and_sanitized_having_method
developers = Developer . group ( :salary ) . having ( " sum(salary) > ? " , 10000 ) . select ( 'salary' ) . all
assert_equal 3 , developers . size
assert_equal 3 , developers . map ( & :salary ) . uniq . size
assert developers . all? { | developer | developer . salary > 10000 }
end
2005-04-03 07:19:14 -04:00
def test_find_with_entire_select_statement
topics = Topic . find_by_sql " SELECT * FROM topics WHERE author_name = 'Mary' "
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
assert_equal ( 1 , topics . size )
2005-06-10 10:58:02 -04:00
assert_equal ( topics ( :second ) . title , topics . first . title )
2005-04-03 07:19:14 -04:00
end
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
def test_find_with_prepared_select_statement
topics = Topic . find_by_sql [ " SELECT * FROM topics WHERE author_name = ? " , " Mary " ]
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
assert_equal ( 1 , topics . size )
2005-06-10 10:58:02 -04:00
assert_equal ( topics ( :second ) . title , topics . first . title )
2005-04-03 07:19:14 -04:00
end
2007-05-25 17:56:21 -04:00
2006-08-23 23:36:48 -04:00
def test_find_by_sql_with_sti_on_joined_table
accounts = Account . find_by_sql ( " SELECT * FROM accounts INNER JOIN companies ON companies.id = accounts.firm_id " )
assert_equal [ Account ] , accounts . collect ( & :class ) . uniq
end
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
def test_find_first
first = Topic . find ( :first , :conditions = > " title = 'The First Topic' " )
2005-06-10 10:58:02 -04:00
assert_equal ( topics ( :first ) . title , first . title )
2005-04-03 07:19:14 -04:00
end
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
def test_find_first_failing
first = Topic . find ( :first , :conditions = > " title = 'The First Topic!' " )
assert_nil ( first )
end
2008-09-01 12:36:42 -04:00
2008-03-24 15:59:22 -04:00
def test_first
2009-12-26 15:20:03 -05:00
assert_equal topics ( :second ) . title , Topic . where ( " title = 'The Second Topic of the day' " ) . first . title
2008-03-24 15:59:22 -04:00
end
2008-09-01 12:36:42 -04:00
2008-03-24 15:59:22 -04:00
def test_first_failing
2009-12-26 15:20:03 -05:00
assert_nil Topic . where ( " title = 'The Second Topic of the day!' " ) . first
2008-03-24 15:59:22 -04:00
end
2005-04-03 07:19:14 -04:00
2011-03-24 00:52:53 -04:00
def test_first_bang_present
assert_nothing_raised do
assert_equal topics ( :second ) , Topic . where ( " title = 'The Second Topic of the day' " ) . first!
end
end
def test_first_bang_missing
assert_raises ActiveRecord :: RecordNotFound do
Topic . where ( " title = 'This title does not exist' " ) . first!
end
end
2011-03-29 10:08:40 -04:00
def test_model_class_responds_to_first_bang
2011-03-29 20:50:39 -04:00
assert Topic . first!
Topic . delete_all
2011-03-29 10:08:40 -04:00
assert_raises ActiveRecord :: RecordNotFound do
Topic . first!
end
end
2011-03-24 00:52:53 -04:00
def test_last_bang_present
assert_nothing_raised do
assert_equal topics ( :second ) , Topic . where ( " title = 'The Second Topic of the day' " ) . last!
end
end
def test_last_bang_missing
assert_raises ActiveRecord :: RecordNotFound do
Topic . where ( " title = 'This title does not exist' " ) . last!
end
end
2011-03-29 10:08:40 -04:00
def test_model_class_responds_to_last_bang
assert_equal topics ( :fourth ) , Topic . last!
assert_raises ActiveRecord :: RecordNotFound do
Topic . delete_all
Topic . last!
end
end
2011-09-05 07:40:49 -04:00
def test_first_and_last_with_integer_should_use_sql_limit
2011-09-07 07:40:55 -04:00
assert_sql ( / LIMIT 2|ROWNUM <= 2 / ) { Topic . first ( 2 ) . entries }
assert_sql ( / LIMIT 5|ROWNUM <= 5 / ) { Topic . last ( 5 ) . entries }
2011-09-05 07:40:49 -04:00
end
def test_last_with_integer_and_order_should_keep_the_order
assert_equal Topic . order ( " title " ) . to_a . last ( 2 ) , Topic . order ( " title " ) . last ( 2 )
end
def test_last_with_integer_and_order_should_not_use_sql_limit
query = assert_sql { Topic . order ( " title " ) . last ( 5 ) . entries }
assert_equal 1 , query . length
assert_no_match ( / LIMIT / , query . first )
end
def test_last_with_integer_and_reorder_should_not_use_sql_limit
query = assert_sql { Topic . reorder ( " title " ) . last ( 5 ) . entries }
assert_equal 1 , query . length
assert_no_match ( / LIMIT / , query . first )
2011-09-01 05:24:19 -04:00
end
def test_first_and_last_with_integer_should_return_an_array
assert_kind_of Array , Topic . first ( 5 )
assert_kind_of Array , Topic . last ( 5 )
end
2005-04-03 07:19:14 -04:00
def test_unexisting_record_exception_handling
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: RecordNotFound ) {
2005-04-03 07:19:14 -04:00
Topic . find ( 1 ) . parent
}
2007-05-25 17:56:21 -04:00
2006-03-05 13:43:56 -05:00
Topic . find ( 2 ) . topic
2005-04-03 07:19:14 -04:00
end
2007-05-25 17:56:21 -04:00
2005-07-14 03:18:26 -04:00
def test_find_only_some_columns
2005-10-22 12:43:39 -04:00
topic = Topic . find ( 1 , :select = > " author_name " )
2009-08-05 00:36:05 -04:00
assert_raise ( ActiveModel :: MissingAttributeError ) { topic . title }
2011-04-15 08:27:08 -04:00
assert_nil topic . read_attribute ( " title " )
2005-10-22 12:43:39 -04:00
assert_equal " David " , topic . author_name
assert ! topic . attribute_present? ( " title " )
2011-04-15 08:27:08 -04:00
assert ! topic . attribute_present? ( :title )
2005-10-22 12:43:39 -04:00
assert topic . attribute_present? ( " author_name " )
2010-05-19 15:14:51 -04:00
assert_respond_to topic , " author_name "
2005-07-14 03:18:26 -04:00
end
2008-01-18 02:30:42 -05:00
2007-05-25 20:35:49 -04:00
def test_find_on_blank_conditions
[ nil , " " , [ ] , { } ] . each do | blank |
assert_nothing_raised { Topic . find ( :first , :conditions = > blank ) }
end
end
2008-01-18 02:30:42 -05:00
2007-05-25 20:35:49 -04:00
def test_find_on_blank_bind_conditions
[ [ " " ] , [ " " , { } ] ] . each do | blank |
assert_nothing_raised { Topic . find ( :first , :conditions = > blank ) }
end
end
2005-04-03 07:19:14 -04:00
2006-06-03 18:15:06 -04:00
def test_find_on_array_conditions
2005-10-06 00:15:14 -04:00
assert Topic . find ( 1 , :conditions = > [ " approved = ? " , false ] )
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . find ( 1 , :conditions = > [ " approved = ? " , true ] ) }
2005-04-03 07:19:14 -04:00
end
2007-05-25 17:56:21 -04:00
2006-06-03 18:15:06 -04:00
def test_find_on_hash_conditions
assert Topic . find ( 1 , :conditions = > { :approved = > false } )
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . find ( 1 , :conditions = > { :approved = > true } ) }
2006-06-03 18:15:06 -04:00
end
2007-05-25 17:56:21 -04:00
2007-10-16 04:08:08 -04:00
def test_find_on_hash_conditions_with_explicit_table_name
assert Topic . find ( 1 , :conditions = > { 'topics.approved' = > false } )
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . find ( 1 , :conditions = > { 'topics.approved' = > true } ) }
2007-10-16 04:08:08 -04:00
end
2008-06-27 20:27:25 -04:00
def test_find_on_hash_conditions_with_hashed_table_name
assert Topic . find ( 1 , :conditions = > { :topics = > { :approved = > false } } )
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . find ( 1 , :conditions = > { :topics = > { :approved = > true } } ) }
2008-06-27 20:27:25 -04:00
end
def test_find_with_hash_conditions_on_joined_table
2009-12-26 13:41:31 -05:00
firms = Firm . joins ( :account ) . where ( :accounts = > { :credit_limit = > 50 } )
2008-06-27 20:27:25 -04:00
assert_equal 1 , firms . size
assert_equal companies ( :first_firm ) , firms . first
end
def test_find_with_hash_conditions_on_joined_table_and_with_range
firms = DependentFirm . all :joins = > :account , :conditions = > { :name = > 'RailsCore' , :accounts = > { :credit_limit = > 55 .. 60 } }
assert_equal 1 , firms . size
assert_equal companies ( :rails_core ) , firms . first
end
2008-01-18 22:45:24 -05:00
def test_find_on_hash_conditions_with_explicit_table_name_and_aggregate
david = customers ( :david )
assert Customer . find ( david . id , :conditions = > { 'customers.name' = > david . name , :address = > david . address } )
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: RecordNotFound ) {
2008-01-18 22:45:24 -05:00
Customer . find ( david . id , :conditions = > { 'customers.name' = > david . name + " 1 " , :address = > david . address } )
}
end
2007-06-26 22:56:11 -04:00
def test_find_on_association_proxy_conditions
2010-10-06 07:06:51 -04:00
assert_equal [ 1 , 2 , 3 , 5 , 6 , 7 , 8 , 9 , 10 , 12 ] , Comment . find_all_by_post_id ( authors ( :david ) . posts ) . map ( & :id ) . sort
2007-06-26 22:56:11 -04:00
end
2007-01-10 05:13:18 -05:00
def test_find_on_hash_conditions_with_range
assert_equal [ 1 , 2 ] , Topic . find ( :all , :conditions = > { :id = > 1 .. 2 } ) . map ( & :id ) . sort
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . find ( 1 , :conditions = > { :id = > 2 .. 3 } ) }
2007-01-10 05:13:18 -05:00
end
2007-05-25 17:56:21 -04:00
2009-02-03 19:01:03 -05:00
def test_find_on_hash_conditions_with_end_exclusive_range
assert_equal [ 1 , 2 , 3 ] , Topic . find ( :all , :conditions = > { :id = > 1 .. 3 } ) . map ( & :id ) . sort
assert_equal [ 1 , 2 ] , Topic . find ( :all , :conditions = > { :id = > 1 ... 3 } ) . map ( & :id ) . sort
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . find ( 3 , :conditions = > { :id = > 2 ... 3 } ) }
2009-02-03 19:01:03 -05:00
end
2007-01-10 05:13:18 -05:00
def test_find_on_hash_conditions_with_multiple_ranges
assert_equal [ 1 , 2 , 3 ] , Comment . find ( :all , :conditions = > { :id = > 1 .. 3 , :post_id = > 1 .. 2 } ) . map ( & :id ) . sort
assert_equal [ 1 ] , Comment . find ( :all , :conditions = > { :id = > 1 .. 1 , :post_id = > 1 .. 10 } ) . map ( & :id ) . sort
end
2007-05-25 17:56:21 -04:00
2006-06-03 18:15:06 -04:00
def test_find_on_multiple_hash_conditions
assert Topic . find ( 1 , :conditions = > { :author_name = > " David " , :title = > " The First Topic " , :replies_count = > 1 , :approved = > false } )
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . find ( 1 , :conditions = > { :author_name = > " David " , :title = > " The First Topic " , :replies_count = > 1 , :approved = > true } ) }
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . find ( 1 , :conditions = > { :author_name = > " David " , :title = > " HHC " , :replies_count = > 1 , :approved = > false } ) }
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . find ( 1 , :conditions = > { :author_name = > " David " , :title = > " The First Topic " , :replies_count = > 1 , :approved = > true } ) }
2006-06-03 18:15:06 -04:00
end
2007-05-25 17:56:21 -04:00
2007-06-11 03:45:56 -04:00
def test_condition_interpolation
assert_kind_of Firm , Company . find ( :first , :conditions = > [ " name = '%s' " , " 37signals " ] )
assert_nil Company . find ( :first , :conditions = > [ " name = '%s' " , " 37signals! " ] )
assert_nil Company . find ( :first , :conditions = > [ " name = '%s' " , " 37signals!' OR 1=1 " ] )
assert_kind_of Time , Topic . find ( :first , :conditions = > [ " id = %d " , 1 ] ) . written_on
end
2006-06-03 18:15:06 -04:00
def test_condition_array_interpolation
2005-04-03 07:19:14 -04:00
assert_kind_of Firm , Company . find ( :first , :conditions = > [ " name = '%s' " , " 37signals " ] )
assert_nil Company . find ( :first , :conditions = > [ " name = '%s' " , " 37signals! " ] )
assert_nil Company . find ( :first , :conditions = > [ " name = '%s' " , " 37signals!' OR 1=1 " ] )
assert_kind_of Time , Topic . find ( :first , :conditions = > [ " id = %d " , 1 ] ) . written_on
end
2007-05-25 17:56:21 -04:00
2006-06-03 18:15:06 -04:00
def test_condition_hash_interpolation
assert_kind_of Firm , Company . find ( :first , :conditions = > { :name = > " 37signals " } )
assert_nil Company . find ( :first , :conditions = > { :name = > " 37signals! " } )
assert_kind_of Time , Topic . find ( :first , :conditions = > { :id = > 1 } ) . written_on
end
2007-05-25 17:56:21 -04:00
2006-06-03 18:15:06 -04:00
def test_hash_condition_find_malformed
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: StatementInvalid ) {
2006-06-03 18:15:06 -04:00
Company . find ( :first , :conditions = > { :id = > 2 , :dhh = > true } )
}
end
2006-11-05 16:27:51 -05:00
2006-06-03 18:15:06 -04:00
def test_hash_condition_find_with_escaped_characters
Company . create ( " name " = > " Ain't noth'n like' \# stuff " )
2006-11-05 16:27:51 -05:00
assert Company . find ( :first , :conditions = > { :name = > " Ain't noth'n like' \# stuff " } )
end
def test_hash_condition_find_with_array
p1 , p2 = Post . find ( :all , :limit = > 2 , :order = > 'id asc' )
assert_equal [ p1 , p2 ] , Post . find ( :all , :conditions = > { :id = > [ p1 , p2 ] } , :order = > 'id asc' )
assert_equal [ p1 , p2 ] , Post . find ( :all , :conditions = > { :id = > [ p1 , p2 . id ] } , :order = > 'id asc' )
end
def test_hash_condition_find_with_nil
topic = Topic . find ( :first , :conditions = > { :last_read = > nil } )
assert_not_nil topic
assert_nil topic . last_read
2006-06-03 18:15:06 -04:00
end
2005-04-03 07:19:14 -04:00
2008-01-18 22:45:24 -05:00
def test_hash_condition_find_with_aggregate_having_one_mapping
balance = customers ( :david ) . balance
assert_kind_of Money , balance
found_customer = Customer . find ( :first , :conditions = > { :balance = > balance } )
assert_equal customers ( :david ) , found_customer
end
def test_hash_condition_find_with_aggregate_attribute_having_same_name_as_field_and_key_value_being_aggregate
gps_location = customers ( :david ) . gps_location
assert_kind_of GpsLocation , gps_location
found_customer = Customer . find ( :first , :conditions = > { :gps_location = > gps_location } )
assert_equal customers ( :david ) , found_customer
end
def test_hash_condition_find_with_aggregate_having_one_mapping_and_key_value_being_attribute_value
balance = customers ( :david ) . balance
assert_kind_of Money , balance
found_customer = Customer . find ( :first , :conditions = > { :balance = > balance . amount } )
assert_equal customers ( :david ) , found_customer
end
def test_hash_condition_find_with_aggregate_attribute_having_same_name_as_field_and_key_value_being_attribute_value
gps_location = customers ( :david ) . gps_location
assert_kind_of GpsLocation , gps_location
found_customer = Customer . find ( :first , :conditions = > { :gps_location = > gps_location . gps_location } )
assert_equal customers ( :david ) , found_customer
end
def test_hash_condition_find_with_aggregate_having_three_mappings
address = customers ( :david ) . address
assert_kind_of Address , address
found_customer = Customer . find ( :first , :conditions = > { :address = > address } )
assert_equal customers ( :david ) , found_customer
end
def test_hash_condition_find_with_one_condition_being_aggregate_and_another_not
address = customers ( :david ) . address
assert_kind_of Address , address
found_customer = Customer . find ( :first , :conditions = > { :address = > address , :name = > customers ( :david ) . name } )
assert_equal customers ( :david ) , found_customer
end
2009-08-03 22:54:40 -04:00
def test_condition_utc_time_interpolation_with_default_timezone_local
with_env_tz 'America/New_York' do
with_active_record_default_timezone :local do
topic = Topic . first
assert_equal topic , Topic . find ( :first , :conditions = > [ 'written_on = ?' , topic . written_on . getutc ] )
end
end
end
def test_hash_condition_utc_time_interpolation_with_default_timezone_local
with_env_tz 'America/New_York' do
with_active_record_default_timezone :local do
topic = Topic . first
assert_equal topic , Topic . find ( :first , :conditions = > { :written_on = > topic . written_on . getutc } )
end
end
end
def test_condition_local_time_interpolation_with_default_timezone_utc
with_env_tz 'America/New_York' do
with_active_record_default_timezone :utc do
topic = Topic . first
assert_equal topic , Topic . find ( :first , :conditions = > [ 'written_on = ?' , topic . written_on . getlocal ] )
end
end
end
def test_hash_condition_local_time_interpolation_with_default_timezone_utc
with_env_tz 'America/New_York' do
with_active_record_default_timezone :utc do
topic = Topic . first
assert_equal topic , Topic . find ( :first , :conditions = > { :written_on = > topic . written_on . getlocal } )
end
end
end
2005-04-03 07:19:14 -04:00
def test_bind_variables
assert_kind_of Firm , Company . find ( :first , :conditions = > [ " name = ? " , " 37signals " ] )
assert_nil Company . find ( :first , :conditions = > [ " name = ? " , " 37signals! " ] )
assert_nil Company . find ( :first , :conditions = > [ " name = ? " , " 37signals!' OR 1=1 " ] )
assert_kind_of Time , Topic . find ( :first , :conditions = > [ " id = ? " , 1 ] ) . written_on
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: PreparedStatementInvalid ) {
2005-04-03 07:19:14 -04:00
Company . find ( :first , :conditions = > [ " id=? AND name = ? " , 2 ] )
}
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: PreparedStatementInvalid ) {
2008-09-11 16:38:20 -04:00
Company . find ( :first , :conditions = > [ " id=? " , 2 , 3 , 4 ] )
2005-04-03 07:19:14 -04:00
}
end
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
def test_bind_variables_with_quotes
Company . create ( " name " = > " 37signals' go'es agains " )
assert Company . find ( :first , :conditions = > [ " name = ? " , " 37signals' go'es agains " ] )
end
def test_named_bind_variables_with_quotes
Company . create ( " name " = > " 37signals' go'es agains " )
assert Company . find ( :first , :conditions = > [ " name = :name " , { :name = > " 37signals' go'es agains " } ] )
end
def test_bind_arity
assert_nothing_raised { bind '' }
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: PreparedStatementInvalid ) { bind '' , 1 }
2007-05-25 17:56:21 -04:00
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: PreparedStatementInvalid ) { bind '?' }
2005-04-03 07:19:14 -04:00
assert_nothing_raised { bind '?' , 1 }
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: PreparedStatementInvalid ) { bind '?' , 1 , 1 }
2005-04-03 07:19:14 -04:00
end
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
def test_named_bind_variables
assert_equal '1' , bind ( ':a' , :a = > 1 ) # ' ruby-mode
assert_equal '1 1' , bind ( ':a :a' , :a = > 1 ) # ' ruby-mode
2008-09-01 12:36:42 -04:00
2008-02-27 18:05:59 -05:00
assert_nothing_raised { bind ( " '+00:00' " , :foo = > " bar " ) }
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
assert_kind_of Firm , Company . find ( :first , :conditions = > [ " name = :name " , { :name = > " 37signals " } ] )
assert_nil Company . find ( :first , :conditions = > [ " name = :name " , { :name = > " 37signals! " } ] )
assert_nil Company . find ( :first , :conditions = > [ " name = :name " , { :name = > " 37signals!' OR 1=1 " } ] )
assert_kind_of Time , Topic . find ( :first , :conditions = > [ " id = :id " , { :id = > 1 } ] ) . written_on
end
2010-03-22 12:51:44 -04:00
class SimpleEnumerable
include Enumerable
def initialize ( ary )
@ary = ary
end
def each ( & b )
@ary . each ( & b )
end
end
2005-06-16 02:44:48 -04:00
def test_bind_enumerable
2007-08-16 02:26:30 -04:00
quoted_abc = %( #{ ActiveRecord :: Base . connection . quote ( 'a' ) } , #{ ActiveRecord :: Base . connection . quote ( 'b' ) } , #{ ActiveRecord :: Base . connection . quote ( 'c' ) } )
2005-04-03 07:19:14 -04:00
assert_equal '1,2,3' , bind ( '?' , [ 1 , 2 , 3 ] )
2007-08-16 02:26:30 -04:00
assert_equal quoted_abc , bind ( '?' , %w( a b c ) )
2005-04-03 07:19:14 -04:00
assert_equal '1,2,3' , bind ( ':a' , :a = > [ 1 , 2 , 3 ] )
2007-08-16 02:26:30 -04:00
assert_equal quoted_abc , bind ( ':a' , :a = > %w( a b c ) ) # '
2005-06-16 02:44:48 -04:00
2010-03-22 12:51:44 -04:00
assert_equal '1,2,3' , bind ( '?' , SimpleEnumerable . new ( [ 1 , 2 , 3 ] ) )
assert_equal quoted_abc , bind ( '?' , SimpleEnumerable . new ( %w( a b c ) ) )
2005-06-16 02:44:48 -04:00
2010-03-22 12:51:44 -04:00
assert_equal '1,2,3' , bind ( ':a' , :a = > SimpleEnumerable . new ( [ 1 , 2 , 3 ] ) )
assert_equal quoted_abc , bind ( ':a' , :a = > SimpleEnumerable . new ( %w( a b c ) ) ) # '
2005-04-03 07:19:14 -04:00
end
2006-05-31 21:43:20 -04:00
def test_bind_empty_enumerable
quoted_nil = ActiveRecord :: Base . connection . quote ( nil )
assert_equal quoted_nil , bind ( '?' , [ ] )
assert_equal " in ( #{ quoted_nil } ) " , bind ( ' in (?)' , [ ] )
assert_equal " foo in ( #{ quoted_nil } ) " , bind ( 'foo in (?)' , [ ] )
end
2009-05-13 04:10:37 -04:00
def test_bind_empty_string
quoted_empty = ActiveRecord :: Base . connection . quote ( '' )
assert_equal quoted_empty , bind ( '?' , '' )
2005-06-16 06:13:37 -04:00
end
2008-09-11 16:38:20 -04:00
def test_bind_chars
quoted_bambi = ActiveRecord :: Base . connection . quote ( " Bambi " )
quoted_bambi_and_thumper = ActiveRecord :: Base . connection . quote ( " Bambi \n and \n Thumper " )
assert_equal " name= #{ quoted_bambi } " , bind ( 'name=?' , " Bambi " )
assert_equal " name= #{ quoted_bambi_and_thumper } " , bind ( 'name=?' , " Bambi \n and \n Thumper " )
2008-09-21 12:01:15 -04:00
assert_equal " name= #{ quoted_bambi } " , bind ( 'name=?' , " Bambi " . mb_chars )
assert_equal " name= #{ quoted_bambi_and_thumper } " , bind ( 'name=?' , " Bambi \n and \n Thumper " . mb_chars )
2008-09-11 16:38:20 -04:00
end
2006-05-31 21:43:20 -04:00
def test_bind_record
o = Struct . new ( :quoted_id ) . new ( 1 )
assert_equal '1' , bind ( '?' , o )
os = [ o ] * 3
assert_equal '1,1,1' , bind ( '?' , os )
end
2008-05-12 10:58:03 -04:00
def test_named_bind_with_postgresql_type_casts
l = Proc . new { bind ( " :a::integer '2009-01-01'::date " , :a = > '10' ) }
assert_nothing_raised ( & l )
assert_equal " #{ ActiveRecord :: Base . quote_value ( '10' ) } ::integer '2009-01-01'::date " , l . call
end
2005-04-03 07:19:14 -04:00
def test_string_sanitation
2010-04-24 19:27:20 -04:00
assert_not_equal " 'something ' 1=1' " , ActiveRecord :: Base . sanitize ( " something ' 1=1 " )
assert_equal " 'something; select table' " , ActiveRecord :: Base . sanitize ( " something; select table " )
2005-04-03 07:19:14 -04:00
end
def test_count
2006-09-26 13:02:45 -04:00
assert_equal ( 0 , Entrant . count ( :conditions = > " id > 3 " ) )
assert_equal ( 1 , Entrant . count ( :conditions = > [ " id > ? " , 2 ] ) )
assert_equal ( 2 , Entrant . count ( :conditions = > [ " id > ? " , 1 ] ) )
2005-04-03 07:19:14 -04:00
end
def test_count_by_sql
assert_equal ( 0 , Entrant . count_by_sql ( " SELECT COUNT(*) FROM entrants WHERE id > 3 " ) )
assert_equal ( 1 , Entrant . count_by_sql ( [ " SELECT COUNT(*) FROM entrants WHERE id > ? " , 2 ] ) )
assert_equal ( 2 , Entrant . count_by_sql ( [ " SELECT COUNT(*) FROM entrants WHERE id > ? " , 1 ] ) )
end
def test_find_by_one_attribute
2005-06-10 10:58:02 -04:00
assert_equal topics ( :first ) , Topic . find_by_title ( " The First Topic " )
2005-04-03 07:19:14 -04:00
assert_nil Topic . find_by_title ( " The First Topic! " )
end
2008-01-18 02:30:42 -05:00
2008-08-26 00:28:53 -04:00
def test_find_by_one_attribute_bang
assert_equal topics ( :first ) , Topic . find_by_title! ( " The First Topic " )
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . find_by_title! ( " The First Topic! " ) }
2008-08-26 00:28:53 -04:00
end
2006-01-22 04:34:41 -05:00
def test_find_by_one_attribute_with_order_option
2006-01-22 15:55:14 -05:00
assert_equal accounts ( :signals37 ) , Account . find_by_credit_limit ( 50 , :order = > 'id' )
2006-01-22 04:34:41 -05:00
assert_equal accounts ( :rails_core_account ) , Account . find_by_credit_limit ( 50 , :order = > 'id DESC' )
end
def test_find_by_one_attribute_with_conditions
assert_equal accounts ( :rails_core_account ) , Account . find_by_credit_limit ( 50 , :conditions = > [ 'firm_id = ?' , 6 ] )
end
2008-01-18 22:45:24 -05:00
def test_find_by_one_attribute_that_is_an_aggregate
address = customers ( :david ) . address
assert_kind_of Address , address
found_customer = Customer . find_by_address ( address )
assert_equal customers ( :david ) , found_customer
end
def test_find_by_one_attribute_that_is_an_aggregate_with_one_attribute_difference
address = customers ( :david ) . address
assert_kind_of Address , address
missing_address = Address . new ( address . street , address . city , address . country + " 1 " )
assert_nil Customer . find_by_address ( missing_address )
missing_address = Address . new ( address . street , address . city + " 1 " , address . country )
assert_nil Customer . find_by_address ( missing_address )
missing_address = Address . new ( address . street + " 1 " , address . city , address . country )
assert_nil Customer . find_by_address ( missing_address )
end
def test_find_by_two_attributes_that_are_both_aggregates
balance = customers ( :david ) . balance
address = customers ( :david ) . address
assert_kind_of Money , balance
assert_kind_of Address , address
found_customer = Customer . find_by_balance_and_address ( balance , address )
assert_equal customers ( :david ) , found_customer
end
def test_find_by_two_attributes_with_one_being_an_aggregate
balance = customers ( :david ) . balance
assert_kind_of Money , balance
found_customer = Customer . find_by_balance_and_name ( balance , customers ( :david ) . name )
assert_equal customers ( :david ) , found_customer
end
2007-09-18 06:04:11 -04:00
def test_dynamic_finder_on_one_attribute_with_conditions_returns_same_results_after_caching
# ensure this test can run independently of order
2008-04-06 18:26:15 -04:00
class << Account ; self ; end . send ( :remove_method , :find_by_credit_limit ) if Account . public_methods . any? { | m | m . to_s == 'find_by_credit_limit' }
2007-09-18 06:04:11 -04:00
a = Account . find_by_credit_limit ( 50 , :conditions = > [ 'firm_id = ?' , 6 ] )
assert_equal a , Account . find_by_credit_limit ( 50 , :conditions = > [ 'firm_id = ?' , 6 ] ) # find_by_credit_limit has been cached
end
2006-01-22 04:34:41 -05:00
def test_find_by_one_attribute_with_several_options
assert_equal accounts ( :unknown ) , Account . find_by_credit_limit ( 50 , :order = > 'id DESC' , :conditions = > [ 'id != ?' , 3 ] )
end
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
def test_find_by_one_missing_attribute
2009-03-08 16:11:58 -04:00
assert_raise ( NoMethodError ) { Topic . find_by_undertitle ( " The First Topic! " ) }
2005-04-03 07:19:14 -04:00
end
2007-05-25 17:56:21 -04:00
2006-12-27 15:35:19 -05:00
def test_find_by_invalid_method_syntax
2009-03-08 16:11:58 -04:00
assert_raise ( NoMethodError ) { Topic . fail_to_find_by_title ( " The First Topic " ) }
assert_raise ( NoMethodError ) { Topic . find_by_title? ( " The First Topic " ) }
assert_raise ( NoMethodError ) { Topic . fail_to_find_or_create_by_title ( " Nonexistent Title " ) }
assert_raise ( NoMethodError ) { Topic . find_or_create_by_title? ( " Nonexistent Title " ) }
2006-12-27 15:35:19 -05:00
end
2005-04-03 07:19:14 -04:00
def test_find_by_two_attributes
2005-06-10 10:58:02 -04:00
assert_equal topics ( :first ) , Topic . find_by_title_and_author_name ( " The First Topic " , " David " )
2005-04-03 07:19:14 -04:00
assert_nil Topic . find_by_title_and_author_name ( " The First Topic " , " Mary " )
end
2011-07-17 18:41:02 -04:00
def test_find_by_two_attributes_but_passing_only_one
assert_raise ( ArgumentError ) { Topic . find_by_title_and_author_name ( " The First Topic " ) }
end
2008-09-01 12:36:42 -04:00
def test_find_last_by_one_attribute
assert_equal Topic . last , Topic . find_last_by_title ( Topic . last . title )
assert_nil Topic . find_last_by_title ( " A title with no matches " )
end
def test_find_last_by_invalid_method_syntax
2009-03-08 16:11:58 -04:00
assert_raise ( NoMethodError ) { Topic . fail_to_find_last_by_title ( " The First Topic " ) }
assert_raise ( NoMethodError ) { Topic . find_last_by_title? ( " The First Topic " ) }
2008-09-01 12:36:42 -04:00
end
def test_find_last_by_one_attribute_with_several_options
assert_equal accounts ( :signals37 ) , Account . find_last_by_credit_limit ( 50 , :order = > 'id DESC' , :conditions = > [ 'id != ?' , 3 ] )
end
def test_find_last_by_one_missing_attribute
2009-03-08 16:11:58 -04:00
assert_raise ( NoMethodError ) { Topic . find_last_by_undertitle ( " The Last Topic! " ) }
2008-09-01 12:36:42 -04:00
end
def test_find_last_by_two_attributes
topic = Topic . last
assert_equal topic , Topic . find_last_by_title_and_author_name ( topic . title , topic . author_name )
assert_nil Topic . find_last_by_title_and_author_name ( topic . title , " Anonymous " )
end
2011-05-07 19:19:02 -04:00
def test_find_last_with_limit_gives_same_result_when_loaded_and_unloaded
scope = Topic . limit ( 2 )
unloaded_last = scope . last
loaded_last = scope . all . last
assert_equal loaded_last , unloaded_last
end
def test_find_last_with_limit_and_offset_gives_same_result_when_loaded_and_unloaded
scope = Topic . offset ( 2 ) . limit ( 2 )
unloaded_last = scope . last
loaded_last = scope . all . last
assert_equal loaded_last , unloaded_last
end
def test_find_last_with_offset_gives_same_result_when_loaded_and_unloaded
scope = Topic . offset ( 3 )
unloaded_last = scope . last
loaded_last = scope . all . last
assert_equal loaded_last , unloaded_last
end
2005-04-03 07:19:14 -04:00
def test_find_all_by_one_attribute
topics = Topic . find_all_by_content ( " Have a nice day " )
assert_equal 2 , topics . size
2005-06-10 10:58:02 -04:00
assert topics . include? ( topics ( :first ) )
2005-04-03 07:19:14 -04:00
assert_equal [ ] , Topic . find_all_by_title ( " The First Topic!! " )
end
2007-05-25 17:56:21 -04:00
2010-08-03 14:37:46 -04:00
def test_find_all_by_one_attribute_which_is_a_symbol
topics = Topic . find_all_by_content ( " Have a nice day " . to_sym )
assert_equal 2 , topics . size
assert topics . include? ( topics ( :first ) )
assert_equal [ ] , Topic . find_all_by_title ( " The First Topic!! " )
end
2008-01-18 22:45:24 -05:00
def test_find_all_by_one_attribute_that_is_an_aggregate
balance = customers ( :david ) . balance
assert_kind_of Money , balance
found_customers = Customer . find_all_by_balance ( balance )
assert_equal 1 , found_customers . size
assert_equal customers ( :david ) , found_customers . first
end
def test_find_all_by_two_attributes_that_are_both_aggregates
balance = customers ( :david ) . balance
address = customers ( :david ) . address
assert_kind_of Money , balance
assert_kind_of Address , address
found_customers = Customer . find_all_by_balance_and_address ( balance , address )
assert_equal 1 , found_customers . size
assert_equal customers ( :david ) , found_customers . first
end
def test_find_all_by_two_attributes_with_one_being_an_aggregate
balance = customers ( :david ) . balance
assert_kind_of Money , balance
found_customers = Customer . find_all_by_balance_and_name ( balance , customers ( :david ) . name )
assert_equal 1 , found_customers . size
assert_equal customers ( :david ) , found_customers . first
end
2005-04-17 13:16:24 -04:00
def test_find_all_by_one_attribute_with_options
topics = Topic . find_all_by_content ( " Have a nice day " , :order = > " id DESC " )
2010-05-16 09:37:57 -04:00
assert_equal topics ( :first ) , topics . last
2005-04-17 13:16:24 -04:00
topics = Topic . find_all_by_content ( " Have a nice day " , :order = > " id " )
2010-05-16 09:37:57 -04:00
assert_equal topics ( :first ) , topics . first
2005-04-17 13:16:24 -04:00
end
2005-04-03 07:19:14 -04:00
2005-05-02 01:34:27 -04:00
def test_find_all_by_array_attribute
2008-03-23 22:50:02 -04:00
assert_equal 2 , Topic . find_all_by_title ( [ " The First Topic " , " The Second Topic of the day " ] ) . size
2005-05-02 01:34:27 -04:00
end
2005-04-03 07:19:14 -04:00
def test_find_all_by_boolean_attribute
topics = Topic . find_all_by_approved ( false )
assert_equal 1 , topics . size
2005-06-10 10:58:02 -04:00
assert topics . include? ( topics ( :first ) )
2005-04-03 07:19:14 -04:00
topics = Topic . find_all_by_approved ( true )
2008-03-23 22:50:02 -04:00
assert_equal 3 , topics . size
2005-06-10 10:58:02 -04:00
assert topics . include? ( topics ( :second ) )
2005-04-03 07:19:14 -04:00
end
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
def test_find_by_nil_attribute
topic = Topic . find_by_last_read nil
assert_not_nil topic
assert_nil topic . last_read
end
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
def test_find_all_by_nil_attribute
topics = Topic . find_all_by_last_read nil
2008-03-23 22:50:02 -04:00
assert_equal 3 , topics . size
assert topics . collect ( & :last_read ) . all? ( & :nil? )
2005-04-03 07:19:14 -04:00
end
2007-05-25 17:56:21 -04:00
2005-04-03 07:19:14 -04:00
def test_find_by_nil_and_not_nil_attributes
topic = Topic . find_by_last_read_and_author_name nil , " Mary "
assert_equal " Mary " , topic . author_name
end
def test_find_all_by_nil_and_not_nil_attributes
topics = Topic . find_all_by_last_read_and_author_name nil , " Mary "
assert_equal 1 , topics . size
assert_equal " Mary " , topics [ 0 ] . author_name
end
2005-11-04 14:39:50 -05:00
def test_find_or_create_from_one_attribute
number_of_companies = Company . count
sig38 = Company . find_or_create_by_name ( " 38signals " )
assert_equal number_of_companies + 1 , Company . count
assert_equal sig38 , Company . find_or_create_by_name ( " 38signals " )
2010-11-07 09:05:18 -05:00
assert sig38 . persisted?
2005-11-04 14:39:50 -05:00
end
def test_find_or_create_from_two_attributes
2006-02-18 23:06:37 -05:00
number_of_topics = Topic . count
another = Topic . find_or_create_by_title_and_author_name ( " Another topic " , " John " )
assert_equal number_of_topics + 1 , Topic . count
assert_equal another , Topic . find_or_create_by_title_and_author_name ( " Another topic " , " John " )
2010-11-07 09:05:18 -05:00
assert another . persisted?
2006-06-20 18:48:52 -04:00
end
2007-05-25 17:56:21 -04:00
2008-01-18 22:45:24 -05:00
def test_find_or_create_from_two_attributes_with_one_being_an_aggregate
number_of_customers = Customer . count
created_customer = Customer . find_or_create_by_balance_and_name ( Money . new ( 123 ) , " Elizabeth " )
assert_equal number_of_customers + 1 , Customer . count
assert_equal created_customer , Customer . find_or_create_by_balance ( Money . new ( 123 ) , " Elizabeth " )
2010-11-07 09:05:18 -05:00
assert created_customer . persisted?
2008-01-18 22:45:24 -05:00
end
2007-03-13 21:08:45 -04:00
def test_find_or_create_from_one_attribute_and_hash
number_of_companies = Company . count
sig38 = Company . find_or_create_by_name ( { :name = > " 38signals " , :firm_id = > 17 , :client_of = > 23 } )
assert_equal number_of_companies + 1 , Company . count
assert_equal sig38 , Company . find_or_create_by_name ( { :name = > " 38signals " , :firm_id = > 17 , :client_of = > 23 } )
2010-11-07 09:05:18 -05:00
assert sig38 . persisted?
2007-03-13 21:08:45 -04:00
assert_equal " 38signals " , sig38 . name
assert_equal 17 , sig38 . firm_id
assert_equal 23 , sig38 . client_of
end
2008-01-18 22:45:24 -05:00
def test_find_or_create_from_one_aggregate_attribute
number_of_customers = Customer . count
created_customer = Customer . find_or_create_by_balance ( Money . new ( 123 ) )
assert_equal number_of_customers + 1 , Customer . count
assert_equal created_customer , Customer . find_or_create_by_balance ( Money . new ( 123 ) )
2010-11-07 09:05:18 -05:00
assert created_customer . persisted?
2008-01-18 22:45:24 -05:00
end
def test_find_or_create_from_one_aggregate_attribute_and_hash
number_of_customers = Customer . count
balance = Money . new ( 123 )
name = " Elizabeth "
created_customer = Customer . find_or_create_by_balance ( { :balance = > balance , :name = > name } )
assert_equal number_of_customers + 1 , Customer . count
assert_equal created_customer , Customer . find_or_create_by_balance ( { :balance = > balance , :name = > name } )
2010-11-07 09:05:18 -05:00
assert created_customer . persisted?
2008-01-18 22:45:24 -05:00
assert_equal balance , created_customer . balance
assert_equal name , created_customer . name
end
2006-06-20 18:48:52 -04:00
def test_find_or_initialize_from_one_attribute
sig38 = Company . find_or_initialize_by_name ( " 38signals " )
assert_equal " 38signals " , sig38 . name
2010-11-07 09:05:18 -05:00
assert ! sig38 . persisted?
2006-06-20 18:48:52 -04:00
end
2008-01-18 02:30:42 -05:00
2008-01-18 22:45:24 -05:00
def test_find_or_initialize_from_one_aggregate_attribute
new_customer = Customer . find_or_initialize_by_balance ( Money . new ( 123 ) )
assert_equal 123 , new_customer . balance . amount
2010-11-07 09:05:18 -05:00
assert ! new_customer . persisted?
2008-01-18 22:45:24 -05:00
end
2008-03-25 19:56:48 -04:00
def test_find_or_initialize_from_one_attribute_should_not_set_attribute_even_when_protected
c = Company . find_or_initialize_by_name ( { :name = > " Fortune 1000 " , :rating = > 1000 } )
assert_equal " Fortune 1000 " , c . name
assert_not_equal 1000 , c . rating
assert c . valid?
2010-11-07 09:05:18 -05:00
assert ! c . persisted?
2008-03-25 19:56:48 -04:00
end
2010-05-06 22:47:23 -04:00
def test_find_or_create_from_one_attribute_should_not_set_attribute_even_when_protected
2008-03-25 19:56:48 -04:00
c = Company . find_or_create_by_name ( { :name = > " Fortune 1000 " , :rating = > 1000 } )
assert_equal " Fortune 1000 " , c . name
assert_not_equal 1000 , c . rating
assert c . valid?
2010-11-07 09:05:18 -05:00
assert c . persisted?
2008-03-25 19:56:48 -04:00
end
2007-10-10 15:11:50 -04:00
def test_find_or_initialize_from_one_attribute_should_set_attribute_even_when_protected
c = Company . find_or_initialize_by_name_and_rating ( " Fortune 1000 " , 1000 )
assert_equal " Fortune 1000 " , c . name
assert_equal 1000 , c . rating
assert c . valid?
2010-11-07 09:05:18 -05:00
assert ! c . persisted?
2007-10-10 15:11:50 -04:00
end
def test_find_or_create_from_one_attribute_should_set_attribute_even_when_protected
c = Company . find_or_create_by_name_and_rating ( " Fortune 1000 " , 1000 )
assert_equal " Fortune 1000 " , c . name
assert_equal 1000 , c . rating
assert c . valid?
2010-11-07 09:05:18 -05:00
assert c . persisted?
2007-10-10 15:11:50 -04:00
end
2007-05-25 17:56:21 -04:00
2010-05-06 22:47:23 -04:00
def test_find_or_initialize_from_one_attribute_should_set_attribute_even_when_protected_and_also_set_the_hash
c = Company . find_or_initialize_by_rating ( 1000 , { :name = > " Fortune 1000 " } )
assert_equal " Fortune 1000 " , c . name
assert_equal 1000 , c . rating
assert c . valid?
2010-11-07 09:05:18 -05:00
assert ! c . persisted?
2010-05-06 22:47:23 -04:00
end
def test_find_or_create_from_one_attribute_should_set_attribute_even_when_protected_and_also_set_the_hash
c = Company . find_or_create_by_rating ( 1000 , { :name = > " Fortune 1000 " } )
assert_equal " Fortune 1000 " , c . name
assert_equal 1000 , c . rating
assert c . valid?
2010-11-07 09:05:18 -05:00
assert c . persisted?
2010-05-06 22:47:23 -04:00
end
2008-03-25 19:56:48 -04:00
def test_find_or_initialize_should_set_protected_attributes_if_given_as_block
c = Company . find_or_initialize_by_name ( :name = > " Fortune 1000 " ) { | f | f . rating = 1000 }
assert_equal " Fortune 1000 " , c . name
assert_equal 1000 . to_f , c . rating . to_f
assert c . valid?
2010-11-07 09:05:18 -05:00
assert ! c . persisted?
2008-03-25 19:56:48 -04:00
end
def test_find_or_create_should_set_protected_attributes_if_given_as_block
c = Company . find_or_create_by_name ( :name = > " Fortune 1000 " ) { | f | f . rating = 1000 }
assert_equal " Fortune 1000 " , c . name
assert_equal 1000 . to_f , c . rating . to_f
assert c . valid?
2010-11-07 09:05:18 -05:00
assert c . persisted?
2008-03-25 19:56:48 -04:00
end
2008-09-01 12:36:42 -04:00
2008-10-15 20:34:57 -04:00
def test_find_or_create_should_work_with_block_on_first_call
class << Company
undef_method ( :find_or_create_by_name ) if method_defined? ( :find_or_create_by_name )
end
c = Company . find_or_create_by_name ( :name = > " Fortune 1000 " ) { | f | f . rating = 1000 }
assert_equal " Fortune 1000 " , c . name
assert_equal 1000 . to_f , c . rating . to_f
assert c . valid?
2010-11-07 09:05:18 -05:00
assert c . persisted?
2008-10-15 20:34:57 -04:00
end
2006-06-20 18:48:52 -04:00
def test_find_or_initialize_from_two_attributes
another = Topic . find_or_initialize_by_title_and_author_name ( " Another topic " , " John " )
assert_equal " Another topic " , another . title
assert_equal " John " , another . author_name
2010-11-07 09:05:18 -05:00
assert ! another . persisted?
2005-11-04 14:39:50 -05:00
end
2007-05-25 17:56:21 -04:00
2011-07-17 18:41:02 -04:00
def test_find_or_initialize_from_two_attributes_but_passing_only_one
assert_raise ( ArgumentError ) { Topic . find_or_initialize_by_title_and_author_name ( " Another topic " ) }
end
2008-01-18 22:45:24 -05:00
def test_find_or_initialize_from_one_aggregate_attribute_and_one_not
new_customer = Customer . find_or_initialize_by_balance_and_name ( Money . new ( 123 ) , " Elizabeth " )
assert_equal 123 , new_customer . balance . amount
assert_equal " Elizabeth " , new_customer . name
2010-11-07 09:05:18 -05:00
assert ! new_customer . persisted?
2008-01-18 22:45:24 -05:00
end
2007-03-13 21:08:45 -04:00
def test_find_or_initialize_from_one_attribute_and_hash
sig38 = Company . find_or_initialize_by_name ( { :name = > " 38signals " , :firm_id = > 17 , :client_of = > 23 } )
assert_equal " 38signals " , sig38 . name
assert_equal 17 , sig38 . firm_id
assert_equal 23 , sig38 . client_of
2010-11-07 09:05:18 -05:00
assert ! sig38 . persisted?
2007-03-13 21:08:45 -04:00
end
2005-11-04 14:39:50 -05:00
2008-01-18 22:45:24 -05:00
def test_find_or_initialize_from_one_aggregate_attribute_and_hash
balance = Money . new ( 123 )
name = " Elizabeth "
new_customer = Customer . find_or_initialize_by_balance ( { :balance = > balance , :name = > name } )
assert_equal balance , new_customer . balance
assert_equal name , new_customer . name
2010-11-07 09:05:18 -05:00
assert ! new_customer . persisted?
2008-01-18 22:45:24 -05:00
end
2005-04-03 07:19:14 -04:00
def test_find_with_bad_sql
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: StatementInvalid ) { Topic . find_by_sql " select 1 from badtable " }
2005-04-03 07:19:14 -04:00
end
2005-10-06 18:21:10 -04:00
def test_find_with_invalid_params
2009-03-08 16:11:58 -04:00
assert_raise ( ArgumentError ) { Topic . find :first , :join = > " It should be `joins' " }
assert_raise ( ArgumentError ) { Topic . find :first , :conditions = > '1 = 1' , :join = > " It should be `joins' " }
2005-10-06 18:21:10 -04:00
end
2007-09-18 06:04:11 -04:00
def test_dynamic_finder_with_invalid_params
2009-03-08 16:11:58 -04:00
assert_raise ( ArgumentError ) { Topic . find_by_title 'No Title' , :join = > " It should be `joins' " }
2007-09-18 06:04:11 -04:00
end
2005-05-19 13:23:28 -04:00
def test_find_all_with_join
2005-06-25 07:47:37 -04:00
developers_on_project_one = Developer . find (
2007-05-25 17:56:21 -04:00
:all ,
:joins = > 'LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id' ,
2005-06-25 07:47:37 -04:00
:conditions = > 'project_id=1'
)
2006-03-15 22:24:40 -05:00
assert_equal 3 , developers_on_project_one . length
2005-06-11 22:27:19 -04:00
developer_names = developers_on_project_one . map { | d | d . name }
assert developer_names . include? ( 'David' )
assert developer_names . include? ( 'Jamis' )
2005-05-19 13:23:28 -04:00
end
2005-09-24 19:58:13 -04:00
2007-07-06 22:42:42 -04:00
def test_joins_dont_clobber_id
first = Firm . find (
:first ,
2009-08-03 07:13:03 -04:00
:joins = > 'INNER JOIN companies clients ON clients.firm_id = companies.id' ,
2007-07-06 22:42:42 -04:00
:conditions = > 'companies.id = 1'
)
assert_equal 1 , first . id
end
2008-09-23 16:32:17 -04:00
def test_joins_with_string_array
person_with_reader_and_post = Post . find (
:all ,
:joins = > [
" INNER JOIN categorizations ON categorizations.post_id = posts.id " ,
" INNER JOIN categories ON categories.id = categorizations.category_id AND categories.type = 'SpecialCategory' "
]
)
assert_equal 1 , person_with_reader_and_post . size
end
2005-09-24 19:58:13 -04:00
def test_find_by_id_with_conditions_with_or
assert_nothing_raised do
Post . find ( [ 1 , 2 , 3 ] ,
2005-11-16 03:16:54 -05:00
:conditions = > " posts.id <= 3 OR posts. #{ QUOTED_TYPE } = 'Post' " )
2005-09-24 19:58:13 -04:00
end
end
2005-05-19 13:23:28 -04:00
2007-01-28 03:49:23 -05:00
# http://dev.rubyonrails.org/ticket/6778
def test_find_ignores_previously_inserted_record
2010-11-16 20:06:50 -05:00
Post . create! ( :title = > 'test' , :body = > 'it out' )
2007-01-28 03:49:23 -05:00
assert_equal [ ] , Post . find_all_by_id ( nil )
end
2006-05-31 21:43:20 -04:00
def test_find_by_empty_ids
assert_equal [ ] , Post . find ( [ ] )
end
def test_find_by_empty_in_condition
assert_equal [ ] , Post . find ( :all , :conditions = > [ 'id in (?)' , [ ] ] )
end
def test_find_by_records
2006-05-31 22:04:35 -04:00
p1 , p2 = Post . find ( :all , :limit = > 2 , :order = > 'id asc' )
assert_equal [ p1 , p2 ] , Post . find ( :all , :conditions = > [ 'id in (?)' , [ p1 , p2 ] ] , :order = > 'id asc' )
assert_equal [ p1 , p2 ] , Post . find ( :all , :conditions = > [ 'id in (?)' , [ p1 , p2 . id ] ] , :order = > 'id asc' )
2006-05-31 21:43:20 -04:00
end
2005-09-24 15:50:57 -04:00
def test_select_value
assert_equal " 37signals " , Company . connection . select_value ( " SELECT name FROM companies WHERE id = 1 " )
assert_nil Company . connection . select_value ( " SELECT name FROM companies WHERE id = -1 " )
# make sure we didn't break count...
assert_equal 0 , Company . count_by_sql ( " SELECT COUNT(*) FROM companies WHERE name = 'Halliburton' " )
assert_equal 1 , Company . count_by_sql ( " SELECT COUNT(*) FROM companies WHERE name = '37signals' " )
end
def test_select_values
2009-06-30 18:55:09 -04:00
assert_equal [ " 1 " , " 2 " , " 3 " , " 4 " , " 5 " , " 6 " , " 7 " , " 8 " , " 9 " , " 10 " ] , Company . connection . select_values ( " SELECT id FROM companies ORDER BY id " ) . map! { | i | i . to_s }
assert_equal [ " 37signals " , " Summit " , " Microsoft " , " Flamboyant Software " , " Ex Nihilo " , " RailsCore " , " Leetsoft " , " Jadedpixel " , " Odegy " , " Ex Nihilo Part Deux " ] , Company . connection . select_values ( " SELECT name FROM companies ORDER BY id " )
2005-09-24 15:50:57 -04:00
end
2007-09-15 23:32:47 -04:00
def test_select_rows
assert_equal (
2010-12-25 18:19:59 -05:00
[ [ " 1 " , " 1 " , nil , " 37signals " ] ,
2007-09-15 23:32:47 -04:00
[ " 2 " , " 1 " , " 2 " , " Summit " ] ,
[ " 3 " , " 1 " , " 1 " , " Microsoft " ] ] ,
2007-10-22 19:50:12 -04:00
Company . connection . select_rows ( " SELECT id, firm_id, client_of, name FROM companies WHERE id IN (1,2,3) ORDER BY id " ) . map! { | i | i . map! { | j | j . to_s unless j . nil? } } )
2007-09-15 23:32:47 -04:00
assert_equal [ [ " 1 " , " 37signals " ] , [ " 2 " , " Summit " ] , [ " 3 " , " Microsoft " ] ] ,
2007-10-22 19:50:12 -04:00
Company . connection . select_rows ( " SELECT id, name FROM companies WHERE id IN (1,2,3) ORDER BY id " ) . map! { | i | i . map! { | j | j . to_s unless j . nil? } }
2007-09-15 23:32:47 -04:00
end
2008-05-03 23:49:18 -04:00
def test_find_with_order_on_included_associations_with_construct_finder_sql_for_association_limiting_and_is_distinct
2008-05-04 15:08:19 -04:00
assert_equal 2 , Post . find ( :all , :include = > { :authors = > :author_address } , :order = > ' author_addresses.id DESC ' , :limit = > 2 ) . size
2008-05-03 23:49:18 -04:00
2008-05-04 15:08:19 -04:00
assert_equal 3 , Post . find ( :all , :include = > { :author = > :author_address , :authors = > :author_address } ,
:order = > ' author_addresses_authors.id DESC ' , :limit = > 3 ) . size
2008-05-03 23:49:18 -04:00
end
2011-04-29 14:01:59 -04:00
def test_find_with_nil_inside_set_passed_for_one_attribute
2011-02-12 07:42:20 -05:00
client_of = Company . find (
:all ,
:conditions = > {
:client_of = > [ 2 , 1 , nil ] ,
:name = > [ '37signals' , 'Summit' , 'Microsoft' ] } ,
:order = > 'client_of DESC'
) . map { | x | x . client_of }
2011-04-29 14:01:59 -04:00
assert client_of . include? ( nil )
assert_equal [ 2 , 1 ] . sort , client_of . compact . sort
2011-02-12 07:42:20 -05:00
end
def test_find_with_nil_inside_set_passed_for_attribute
client_of = Company . find (
:all ,
:conditions = > { :client_of = > [ nil ] } ,
:order = > 'client_of DESC'
) . map { | x | x . client_of }
2011-04-29 14:01:59 -04:00
assert_equal [ ] , client_of . compact
2011-02-12 07:42:20 -05:00
end
2008-05-04 15:08:19 -04:00
def test_with_limiting_with_custom_select
2008-05-25 18:28:56 -04:00
posts = Post . find ( :all , :include = > :author , :select = > ' posts.*, authors.id as "author_id"' , :limit = > 3 , :order = > 'posts.id' )
2008-05-15 08:41:54 -04:00
assert_equal 3 , posts . size
assert_equal [ 0 , 1 , 1 ] , posts . map ( & :author_id ) . sort
2008-05-04 15:08:19 -04:00
end
2008-05-03 23:49:18 -04:00
2009-03-06 13:36:30 -05:00
def test_finder_with_scoped_from
2009-07-21 19:21:03 -04:00
all_topics = Topic . find ( :all )
2009-03-06 13:36:30 -05:00
2009-12-28 17:07:23 -05:00
Topic . send ( :with_scope , :find = > { :from = > 'fake_topics' } ) do
2009-12-27 17:26:20 -05:00
assert_equal all_topics , Topic . from ( 'topics' ) . to_a
2009-03-06 13:36:30 -05:00
end
end
2010-11-12 17:29:30 -05:00
def test_find_one_message_with_custom_primary_key
Toy . set_primary_key :name
begin
Toy . find 'Hello World!'
rescue ActiveRecord :: RecordNotFound = > e
assert_equal 'Couldn\'t find Toy with name=Hello World!' , e . message
end
end
2005-04-03 07:19:14 -04:00
protected
def bind ( statement , * vars )
if vars . first . is_a? ( Hash )
ActiveRecord :: Base . send ( :replace_named_bind_variables , statement , vars . first )
else
ActiveRecord :: Base . send ( :replace_bind_variables , statement , vars )
end
end
2009-08-03 22:54:40 -04:00
def with_env_tz ( new_tz = 'US/Eastern' )
old_tz , ENV [ 'TZ' ] = ENV [ 'TZ' ] , new_tz
yield
ensure
old_tz ? ENV [ 'TZ' ] = old_tz : ENV . delete ( 'TZ' )
end
def with_active_record_default_timezone ( zone )
old_zone , ActiveRecord :: Base . default_timezone = ActiveRecord :: Base . default_timezone , zone
yield
ensure
ActiveRecord :: Base . default_timezone = old_zone
end
2005-04-03 07:19:14 -04:00
end