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'
2014-08-18 17:18:34 -04:00
require 'models/tagging'
2008-01-18 02:31:37 -05:00
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'
2014-11-14 03:55:32 -05:00
require 'models/computer'
2008-01-18 22:45:24 -05:00
require 'models/customer'
2010-11-12 17:29:30 -05:00
require 'models/toy'
2013-10-15 14:58:45 -04:00
require 'models/matey'
2013-12-10 21:05:16 -05:00
require 'models/dog'
2014-12-22 17:38:58 -05:00
require 'models/car'
require 'models/tyre'
2005-04-03 07:19:14 -04:00
2008-01-21 12:20:51 -05:00
class FinderTest < ActiveRecord :: TestCase
2015-11-12 08:06:07 -05:00
fixtures :companies , :topics , :entrants , :developers , :developers_projects , :posts , :comments , :accounts , :authors , :author_addresses , :customers , :categories , :categorizations , :cars
2005-04-03 07:19:14 -04:00
2012-12-23 14:07:07 -05:00
def test_find_by_id_with_hash
assert_raises ( ActiveRecord :: StatementInvalid ) do
Post . find_by_id ( :limit = > 1 )
end
end
def test_find_by_title_and_id_with_hash
assert_raises ( ActiveRecord :: StatementInvalid ) do
Post . find_by_title_and_id ( 'foo' , :limit = > 1 )
end
end
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
2014-06-09 04:18:43 -04:00
def test_find_with_proc_parameter_and_block
2014-06-10 10:48:57 -04:00
exception = assert_raises ( RuntimeError ) do
2014-06-09 04:18:43 -04:00
Topic . all . find ( - > { raise " should happen " } ) { | e | e . title == " non-existing-title " }
end
2014-06-10 10:48:57 -04:00
assert_equal " should happen " , exception . message
2014-06-09 04:18:43 -04:00
assert_nothing_raised ( RuntimeError ) do
Topic . all . find ( - > { raise " should not happen " } ) { | e | e . title == topics ( :first ) . title }
end
end
2015-05-29 16:42:54 -04:00
def test_find_with_ids_returning_ordered
records = Topic . find ( [ 4 , 2 , 5 ] )
assert_equal 'The Fourth Topic of the day' , records [ 0 ] . title
assert_equal 'The Second Topic of the day' , records [ 1 ] . title
assert_equal 'The Fifth Topic of the day' , records [ 2 ] . title
records = Topic . find ( 4 , 2 , 5 )
assert_equal 'The Fourth Topic of the day' , records [ 0 ] . title
assert_equal 'The Second Topic of the day' , records [ 1 ] . title
assert_equal 'The Fifth Topic of the day' , records [ 2 ] . title
2015-06-03 20:09:34 -04:00
records = Topic . find ( [ '4' , '2' , '5' ] )
assert_equal 'The Fourth Topic of the day' , records [ 0 ] . title
assert_equal 'The Second Topic of the day' , records [ 1 ] . title
assert_equal 'The Fifth Topic of the day' , records [ 2 ] . title
records = Topic . find ( '4' , '2' , '5' )
assert_equal 'The Fourth Topic of the day' , records [ 0 ] . title
assert_equal 'The Second Topic of the day' , records [ 1 ] . title
assert_equal 'The Fifth Topic of the day' , records [ 2 ] . title
end
def test_find_with_ids_and_order_clause
# The order clause takes precedence over the informed ids
records = Topic . order ( :author_name ) . find ( [ 5 , 3 , 1 ] )
assert_equal 'The Third Topic of the day' , records [ 0 ] . title
assert_equal 'The First Topic' , records [ 1 ] . title
assert_equal 'The Fifth Topic of the day' , records [ 2 ] . title
2015-06-05 16:18:03 -04:00
records = Topic . order ( :id ) . find ( [ 5 , 3 , 1 ] )
assert_equal 'The First Topic' , records [ 0 ] . title
assert_equal 'The Third Topic of the day' , records [ 1 ] . title
assert_equal 'The Fifth Topic of the day' , records [ 2 ] . title
2015-05-29 16:42:54 -04:00
end
2015-06-19 15:30:16 -04:00
def test_find_with_ids_with_limit_and_order_clause
# The order clause takes precedence over the informed ids
records = Topic . limit ( 2 ) . order ( :id ) . find ( [ 5 , 3 , 1 ] )
2015-06-03 21:07:37 -04:00
assert_equal 2 , records . size
2015-06-19 15:30:16 -04:00
assert_equal 'The First Topic' , records [ 0 ] . title
assert_equal 'The Third Topic of the day' , records [ 1 ] . title
end
def test_find_with_ids_and_limit
records = Topic . limit ( 3 ) . find ( [ 3 , 2 , 5 , 1 , 4 ] )
assert_equal 3 , records . size
assert_equal 'The Third Topic of the day' , records [ 0 ] . title
2015-06-03 21:07:37 -04:00
assert_equal 'The Second Topic of the day' , records [ 1 ] . title
2015-06-19 15:30:16 -04:00
assert_equal 'The Fifth Topic of the day' , records [ 2 ] . title
end
2015-08-07 16:11:10 -04:00
def test_find_with_ids_where_and_limit
# Please note that Topic 1 is the only not approved so
# if it were among the first 3 it would raise a ActiveRecord::RecordNotFound
records = Topic . where ( approved : true ) . limit ( 3 ) . find ( [ 3 , 2 , 5 , 1 , 4 ] )
assert_equal 3 , records . size
assert_equal 'The Third Topic of the day' , records [ 0 ] . title
assert_equal 'The Second Topic of the day' , records [ 1 ] . title
assert_equal 'The Fifth Topic of the day' , records [ 2 ] . title
end
2015-12-18 00:24:04 -05:00
def test_find_with_ids_and_offset
2015-06-19 15:30:16 -04:00
records = Topic . offset ( 2 ) . find ( [ 3 , 2 , 5 , 1 , 4 ] )
assert_equal 3 , records . size
assert_equal 'The Fifth Topic of the day' , records [ 0 ] . title
assert_equal 'The First Topic' , records [ 1 ] . title
assert_equal 'The Fourth Topic of the day' , records [ 2 ] . title
2015-06-03 21:07:37 -04:00
end
2014-03-13 15:10:04 -04:00
def test_find_passing_active_record_object_is_deprecated
assert_deprecated do
Topic . find ( Topic . last )
end
end
2013-03-05 17:34:54 -05:00
def test_symbols_table_ref
2015-01-04 13:03:36 -05:00
gc_disabled = GC . disable
2014-08-14 11:08:47 -04:00
Post . where ( " author_id " = > nil ) # warm up
2013-03-05 17:34:54 -05:00
x = Symbol . all_symbols . count
Post . where ( " title " = > { " xxxqqqq " = > " bar " } )
assert_equal x , Symbol . all_symbols . count
2014-12-03 21:47:22 -05:00
ensure
GC . enable if gc_disabled == false
2013-03-05 17:34:54 -05:00
end
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
2013-08-19 08:17:49 -04:00
assert_equal true , Topic . exists? ( 1 )
assert_equal true , Topic . exists? ( " 1 " )
assert_equal true , Topic . exists? ( title : " The First Topic " )
assert_equal true , Topic . exists? ( heading : " The First Topic " )
assert_equal true , Topic . exists? ( :author_name = > " Mary " , :approved = > true )
assert_equal true , Topic . exists? ( [ " parent_id = ? " , 1 ] )
2013-09-04 19:46:16 -04:00
assert_equal true , Topic . exists? ( id : [ 1 , 9999 ] )
2013-08-19 08:17:49 -04:00
assert_equal false , Topic . exists? ( 45 )
2014-03-13 14:40:35 -04:00
assert_equal false , Topic . exists? ( Topic . new . id )
2007-12-10 20:53:54 -05:00
2014-03-03 11:44:55 -05:00
assert_raise ( NoMethodError ) { Topic . exists? ( [ 1 , 2 ] ) }
end
2014-08-18 17:18:34 -04:00
def test_exists_with_polymorphic_relation
post = Post . create! ( title : 'Post' , body : 'default' , taggings : [ Tagging . new ( comment : 'tagging comment' ) ] )
relation = Post . tagged_with_comment ( 'tagging comment' )
assert_equal true , relation . exists? ( title : [ 'Post' ] )
assert_equal true , relation . exists? ( [ 'title LIKE ?' , 'Post%' ] )
assert_equal true , relation . exists?
assert_equal true , relation . exists? ( post . id )
assert_equal true , relation . exists? ( post . id . to_s )
assert_equal false , relation . exists? ( false )
end
2014-03-13 14:57:35 -04:00
def test_exists_passing_active_record_object_is_deprecated
assert_deprecated do
Topic . exists? ( Topic . new )
end
end
2014-03-03 11:44:55 -05:00
def test_exists_fails_when_parameter_has_invalid_type
2014-10-31 13:23:24 -04:00
assert_raises ( RangeError ) do
2014-03-10 10:07:10 -04:00
assert_equal false , Topic . exists? ( ( " 9 " * 53 ) . to_i ) # number that's bigger than int
end
2014-10-31 13:23:24 -04:00
assert_equal false , Topic . exists? ( " foo " )
2005-04-03 07:19:14 -04:00
end
2009-04-23 09:26:52 -04:00
2012-06-10 15:57:03 -04:00
def test_exists_does_not_select_columns_without_alias
2012-06-10 22:41:07 -04:00
assert_sql ( / SELECT \ W+1 AS one FROM ["`]topics["`] /i ) do
2012-06-10 15:57:03 -04:00
Topic . exists?
end
end
2009-01-31 21:32:49 -05:00
def test_exists_returns_true_with_one_record_and_no_args
2013-08-19 08:17:49 -04:00
assert_equal true , Topic . exists?
2009-01-31 21:32:49 -05:00
end
2009-04-23 09:26:52 -04:00
2012-05-29 17:36:28 -04:00
def test_exists_returns_false_with_false_arg
2013-08-19 08:17:49 -04:00
assert_equal false , Topic . exists? ( false )
2012-05-29 17:36:28 -04:00
end
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
2013-08-19 08:17:49 -04:00
assert_equal false , Topic . exists? ( nil )
assert_equal true , Topic . exists?
assert_equal false , Topic . first . replies . exists? ( nil )
assert_equal true , Topic . first . replies . exists?
2011-08-10 13:55:29 -04:00
end
2011-11-08 14:46:11 -05:00
# ensures +exists?+ runs valid SQL by excluding order value
def test_exists_with_order
2013-08-19 08:17:49 -04:00
assert_equal true , Topic . order ( :id ) . distinct . exists?
2011-11-08 14:46:11 -05:00
end
2012-05-28 12:52:27 -04:00
def test_exists_with_includes_limit_and_empty_result
2013-08-19 08:17:49 -04:00
assert_equal false , Topic . includes ( :replies ) . limit ( 0 ) . exists?
assert_equal false , Topic . includes ( :replies ) . limit ( 1 ) . where ( '0 = 1' ) . exists?
2012-05-28 12:52:27 -04:00
end
2012-05-28 15:23:37 -04:00
def test_exists_with_distinct_association_includes_and_limit
author = Author . first
2013-08-19 08:17:49 -04:00
assert_equal false , author . unique_categorized_posts . includes ( :special_comments ) . limit ( 0 ) . exists?
assert_equal true , author . unique_categorized_posts . includes ( :special_comments ) . limit ( 1 ) . exists?
2012-05-28 15:23:37 -04:00
end
def test_exists_with_distinct_association_includes_limit_and_order
author = Author . first
2014-06-15 11:19:54 -04:00
assert_equal false , author . unique_categorized_posts . includes ( :special_comments ) . order ( 'comments.tags_count DESC' ) . limit ( 0 ) . exists?
assert_equal true , author . unique_categorized_posts . includes ( :special_comments ) . order ( 'comments.tags_count DESC' ) . limit ( 1 ) . exists?
2012-05-28 15:23:37 -04:00
end
2012-05-28 12:52:27 -04:00
def test_exists_with_empty_table_and_no_args_given
2009-01-31 21:32:49 -05:00
Topic . delete_all
2013-08-19 08:17:49 -04:00
assert_equal false , Topic . exists?
2009-01-31 21:32:49 -05:00
end
2009-04-23 09:26:52 -04:00
2012-07-27 17:21:29 -04:00
def test_exists_with_aggregate_having_three_mappings
existing_address = customers ( :david ) . address
2013-08-19 08:17:49 -04:00
assert_equal true , Customer . exists? ( :address = > existing_address )
2012-07-27 17:21:29 -04:00
end
def test_exists_with_aggregate_having_three_mappings_with_one_difference
existing_address = customers ( :david ) . address
2013-08-19 08:17:49 -04:00
assert_equal false , Customer . exists? ( :address = >
2012-07-27 17:21:29 -04:00
Address . new ( existing_address . street , existing_address . city , existing_address . country + " 1 " ) )
2013-08-19 08:17:49 -04:00
assert_equal false , Customer . exists? ( :address = >
2012-07-27 17:21:29 -04:00
Address . new ( existing_address . street , existing_address . city + " 1 " , existing_address . country ) )
2013-08-19 08:17:49 -04:00
assert_equal false , Customer . exists? ( :address = >
2012-07-27 17:21:29 -04:00
Address . new ( existing_address . street + " 1 " , existing_address . city , existing_address . country ) )
end
2011-03-29 07:51:58 -04:00
def test_exists_does_not_instantiate_records
2015-09-09 15:00:40 -04:00
assert_not_called ( Developer , :instantiate ) do
Developer . exists?
end
2011-03-29 07:51:58 -04:00
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
2013-11-09 16:01:46 -05:00
assert_equal 2 , Entrant . limit ( 2 ) . find ( [ 1 , 3 , 2 ] ) . size
2015-06-19 15:30:16 -04:00
entrants = Entrant . limit ( 3 ) . offset ( 2 ) . find ( [ 1 , 3 , 2 ] )
assert_equal 1 , entrants . size
assert_equal 'Ruby Guru' , entrants . first . name
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.
2012-08-03 06:51:52 -04:00
devs = Developer . all
2013-11-09 16:01:46 -05:00
last_devs = Developer . limit ( 3 ) . offset ( 9 ) . find devs . map ( & :id )
2007-05-31 13:15:56 -04:00
assert_equal 2 , last_devs . size
2015-06-19 15:30:16 -04:00
assert_equal 'fixture_10' , last_devs [ 0 ] . name
assert_equal 'Jamis' , last_devs [ 1 ] . name
2005-04-03 07:19:14 -04:00
end
2014-10-31 13:23:24 -04:00
def test_find_with_large_number
assert_raises ( ActiveRecord :: RecordNotFound ) { Topic . find ( '9999999999999999999999999999999' ) }
end
def test_find_by_with_large_number
assert_nil Topic . find_by ( id : '9999999999999999999999999999999' )
end
def test_find_by_id_with_large_number
assert_nil Topic . find_by_id ( '9999999999999999999999999999999' )
end
2014-11-02 15:53:54 -05:00
def test_find_on_relation_with_large_number
assert_nil Topic . where ( '1=1' ) . find_by ( id : 9999999999999999999999999999999 )
end
def test_find_by_bang_on_relation_with_large_number
assert_raises ( ActiveRecord :: RecordNotFound ) do
Topic . where ( '1=1' ) . find_by! ( id : 9999999999999999999999999999999 )
end
end
2005-06-21 12:36:18 -04:00
def test_find_an_empty_array
assert_equal [ ] , Topic . find ( [ ] )
end
2012-05-05 11:07:20 -04:00
def test_find_doesnt_have_implicit_ordering
assert_sql ( / ^((?!ORDER).)*$ / ) { Topic . find ( 1 ) }
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
2011-07-07 23:16:32 -04:00
def test_find_with_group_and_sanitized_having_method
2012-07-27 07:01:25 -04:00
developers = Developer . group ( :salary ) . having ( " sum(salary) > ? " , 10000 ) . select ( 'salary' ) . to_a
2011-07-07 23:16:32 -04:00
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
2015-07-20 12:31:48 -04:00
def test_find_by_association_subquery
author = authors ( :david )
assert_equal author . post , Post . find_by ( author : Author . where ( id : author ) )
assert_equal author . post , Post . find_by ( author_id : Author . where ( id : author ) )
end
2012-04-26 20:03:25 -04:00
def test_take
assert_equal topics ( :first ) , Topic . take
end
def test_take_failing
assert_nil Topic . where ( " title = 'This title does not exist' " ) . take
end
def test_take_bang_present
assert_nothing_raised do
assert_equal topics ( :second ) , Topic . where ( " title = 'The Second Topic of the day' " ) . take!
end
end
def test_take_bang_missing
2014-06-17 22:44:00 -04:00
assert_raises_with_message ActiveRecord :: RecordNotFound , " Couldn't find Topic " do
2012-04-26 20:03:25 -04:00
Topic . where ( " title = 'This title does not exist' " ) . take!
end
end
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
2014-06-17 22:44:00 -04:00
assert_raises_with_message ActiveRecord :: RecordNotFound , " Couldn't find Topic " do
2011-03-24 00:52:53 -04:00
Topic . where ( " title = 'This title does not exist' " ) . first!
end
end
2012-04-26 18:27:55 -04:00
def test_first_have_primary_key_order_by_default
expected = topics ( :first )
expected . touch # PostgreSQL changes the default order if no order clause is used
assert_equal expected , Topic . first
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
2014-06-17 22:44:00 -04:00
assert_raises_with_message ActiveRecord :: RecordNotFound , " Couldn't find Topic " do
2011-03-29 10:08:40 -04:00
Topic . first!
end
end
2014-01-18 00:51:34 -05:00
def test_second
assert_equal topics ( :second ) . title , Topic . second . title
end
def test_second_with_offset
assert_equal topics ( :fifth ) , Topic . offset ( 3 ) . second
end
def test_second_have_primary_key_order_by_default
expected = topics ( :second )
expected . touch # PostgreSQL changes the default order if no order clause is used
assert_equal expected , Topic . second
end
def test_model_class_responds_to_second_bang
assert Topic . second!
Topic . delete_all
2014-06-17 22:44:00 -04:00
assert_raises_with_message ActiveRecord :: RecordNotFound , " Couldn't find Topic " do
2014-01-18 00:51:34 -05:00
Topic . second!
end
end
def test_third
assert_equal topics ( :third ) . title , Topic . third . title
end
def test_third_with_offset
assert_equal topics ( :fifth ) , Topic . offset ( 2 ) . third
end
def test_third_have_primary_key_order_by_default
expected = topics ( :third )
expected . touch # PostgreSQL changes the default order if no order clause is used
assert_equal expected , Topic . third
end
def test_model_class_responds_to_third_bang
assert Topic . third!
Topic . delete_all
2014-06-17 22:44:00 -04:00
assert_raises_with_message ActiveRecord :: RecordNotFound , " Couldn't find Topic " do
2014-01-18 00:51:34 -05:00
Topic . third!
end
end
def test_fourth
assert_equal topics ( :fourth ) . title , Topic . fourth . title
end
def test_fourth_with_offset
assert_equal topics ( :fifth ) , Topic . offset ( 1 ) . fourth
end
def test_fourth_have_primary_key_order_by_default
expected = topics ( :fourth )
expected . touch # PostgreSQL changes the default order if no order clause is used
assert_equal expected , Topic . fourth
end
def test_model_class_responds_to_fourth_bang
assert Topic . fourth!
Topic . delete_all
2014-06-17 22:44:00 -04:00
assert_raises_with_message ActiveRecord :: RecordNotFound , " Couldn't find Topic " do
2014-01-18 00:51:34 -05:00
Topic . fourth!
end
end
def test_fifth
assert_equal topics ( :fifth ) . title , Topic . fifth . title
end
def test_fifth_with_offset
assert_equal topics ( :fifth ) , Topic . offset ( 0 ) . fifth
end
def test_fifth_have_primary_key_order_by_default
expected = topics ( :fifth )
expected . touch # PostgreSQL changes the default order if no order clause is used
assert_equal expected , Topic . fifth
end
def test_model_class_responds_to_fifth_bang
assert Topic . fifth!
Topic . delete_all
2014-06-17 22:44:00 -04:00
assert_raises_with_message ActiveRecord :: RecordNotFound , " Couldn't find Topic " do
2014-01-18 00:51:34 -05:00
Topic . fifth!
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
2014-06-17 22:44:00 -04:00
assert_raises_with_message ActiveRecord :: RecordNotFound , " Couldn't find Topic " do
2011-03-24 00:52:53 -04:00
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
2014-01-18 00:51:34 -05:00
assert_equal topics ( :fifth ) , Topic . last!
2014-06-17 22:44:00 -04:00
assert_raises_with_message ActiveRecord :: RecordNotFound , " Couldn't find Topic " do
2011-03-29 10:08:40 -04:00
Topic . delete_all
Topic . last!
end
end
2016-02-01 16:03:12 -05:00
def test_take_and_first_and_last_with_integer_should_use_sql_limit
2015-12-14 10:34:14 -05:00
assert_sql ( / LIMIT|ROWNUM <= / ) { Topic . take ( 3 ) . entries }
assert_sql ( / LIMIT|ROWNUM <= / ) { Topic . first ( 2 ) . entries }
assert_sql ( / LIMIT|ROWNUM <= / ) { 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
2016-02-01 16:03:12 -05:00
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 )
2011-09-05 07:40:49 -04:00
end
2016-02-01 16:03:12 -05:00
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
2012-04-26 20:03:25 -04:00
def test_take_and_first_and_last_with_integer_should_return_an_array
assert_kind_of Array , Topic . take ( 5 )
2011-09-01 05:24:19 -04:00
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
2013-11-09 16:01:46 -05:00
topic = Topic . select ( " author_name " ) . find ( 1 )
2009-08-05 00:36:05 -04:00
assert_raise ( ActiveModel :: MissingAttributeError ) { topic . title }
2012-09-06 15:39:42 -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
2006-06-03 18:15:06 -04:00
def test_find_on_array_conditions
2013-11-09 16:01:46 -05:00
assert Topic . where ( [ " approved = ? " , false ] ) . find ( 1 )
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . where ( [ " approved = ? " , true ] ) . find ( 1 ) }
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
2013-11-09 16:01:46 -05:00
assert Topic . where ( approved : false ) . find ( 1 )
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . where ( approved : true ) . find ( 1 ) }
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
2013-11-09 16:01:46 -05:00
assert Topic . where ( 'topics.approved' = > false ) . find ( 1 )
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . where ( 'topics.approved' = > true ) . find ( 1 ) }
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
2013-11-09 16:01:46 -05:00
assert Topic . where ( topics : { approved : false } ) . find ( 1 )
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . where ( topics : { approved : true } ) . find ( 1 ) }
2008-06-27 20:27:25 -04:00
end
2014-12-01 16:02:21 -05:00
def test_find_on_combined_explicit_and_hashed_table_names
assert Topic . where ( 'topics.approved' = > false , topics : { author_name : " David " } ) . find ( 1 )
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . where ( 'topics.approved' = > true , topics : { author_name : " David " } ) . find ( 1 ) }
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . where ( 'topics.approved' = > false , topics : { author_name : " Melanie " } ) . find ( 1 ) }
end
2008-06-27 20:27:25 -04:00
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
2013-11-09 16:01:46 -05:00
firms = DependentFirm . joins ( :account ) . where ( name : 'RailsCore' , accounts : { credit_limit : 55 .. 60 } )
2008-06-27 20:27:25 -04:00
assert_equal 1 , firms . size
assert_equal companies ( :rails_core ) , firms . first
end
2012-07-27 17:21:29 -04:00
def test_find_on_hash_conditions_with_explicit_table_name_and_aggregate
david = customers ( :david )
assert Customer . where ( 'customers.name' = > david . name , :address = > david . address ) . find ( david . id )
assert_raise ( ActiveRecord :: RecordNotFound ) {
Customer . where ( 'customers.name' = > david . name + " 1 " , :address = > david . address ) . find ( david . id )
}
end
2007-06-26 22:56:11 -04:00
def test_find_on_association_proxy_conditions
2012-05-18 09:46:54 -04:00
assert_equal [ 1 , 2 , 3 , 5 , 6 , 7 , 8 , 9 , 10 , 12 ] , Comment . where ( 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
2013-11-09 16:01:46 -05:00
assert_equal [ 1 , 2 ] , Topic . where ( id : 1 .. 2 ) . to_a . map ( & :id ) . sort
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . where ( id : 2 .. 3 ) . find ( 1 ) }
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
2013-11-09 16:01:46 -05:00
assert_equal [ 1 , 2 , 3 ] , Topic . where ( id : 1 .. 3 ) . to_a . map ( & :id ) . sort
assert_equal [ 1 , 2 ] , Topic . where ( id : 1 ... 3 ) . to_a . map ( & :id ) . sort
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . where ( id : 2 ... 3 ) . find ( 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
2013-11-09 16:01:46 -05:00
assert_equal [ 1 , 2 , 3 ] , Comment . where ( id : 1 .. 3 , post_id : 1 .. 2 ) . to_a . map ( & :id ) . sort
assert_equal [ 1 ] , Comment . where ( id : 1 .. 1 , post_id : 1 .. 10 ) . to_a . map ( & :id ) . sort
2007-01-10 05:13:18 -05:00
end
2007-05-25 17:56:21 -04:00
2011-11-01 06:40:30 -04:00
def test_find_on_hash_conditions_with_array_of_integers_and_ranges
2013-11-09 16:01:46 -05:00
assert_equal [ 1 , 2 , 3 , 5 , 6 , 7 , 8 , 9 ] , Comment . where ( id : [ 1 .. 2 , 3 , 5 , 6 .. 8 , 9 ] ) . to_a . map ( & :id ) . sort
2011-11-01 06:40:30 -04:00
end
2014-09-06 03:25:36 -04:00
def test_find_on_hash_conditions_with_array_of_ranges
assert_equal [ 1 , 2 , 6 , 7 , 8 ] , Comment . where ( id : [ 1 .. 2 , 6 .. 8 ] ) . to_a . map ( & :id ) . sort
end
2006-06-03 18:15:06 -04:00
def test_find_on_multiple_hash_conditions
2013-11-09 16:01:46 -05:00
assert Topic . where ( author_name : " David " , title : " The First Topic " , replies_count : 1 , approved : false ) . find ( 1 )
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . where ( author_name : " David " , title : " The First Topic " , replies_count : 1 , approved : true ) . find ( 1 ) }
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . where ( author_name : " David " , title : " HHC " , replies_count : 1 , approved : false ) . find ( 1 ) }
assert_raise ( ActiveRecord :: RecordNotFound ) { Topic . where ( author_name : " David " , title : " The First Topic " , replies_count : 1 , approved : true ) . find ( 1 ) }
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
2012-04-27 06:42:22 -04:00
assert_kind_of Firm , Company . where ( " name = '%s' " , " 37signals " ) . first
2013-11-09 16:01:46 -05:00
assert_nil Company . where ( [ " name = '%s' " , " 37signals! " ] ) . first
assert_nil Company . where ( [ " name = '%s' " , " 37signals!' OR 1=1 " ] ) . first
assert_kind_of Time , Topic . where ( [ " id = %d " , 1 ] ) . first . written_on
2007-06-11 03:45:56 -04:00
end
2006-06-03 18:15:06 -04:00
def test_condition_array_interpolation
2013-11-09 16:01:46 -05:00
assert_kind_of Firm , Company . where ( [ " name = '%s' " , " 37signals " ] ) . first
assert_nil Company . where ( [ " name = '%s' " , " 37signals! " ] ) . first
assert_nil Company . where ( [ " name = '%s' " , " 37signals!' OR 1=1 " ] ) . first
assert_kind_of Time , Topic . where ( [ " id = %d " , 1 ] ) . first . written_on
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_condition_hash_interpolation
2013-11-09 16:01:46 -05:00
assert_kind_of Firm , Company . where ( name : " 37signals " ) . first
assert_nil Company . where ( name : " 37signals! " ) . first
assert_kind_of Time , Topic . where ( id : 1 ) . first . written_on
2006-06-03 18:15:06 -04:00
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 ) {
2013-11-09 16:01:46 -05:00
Company . where ( id : 2 , dhh : true ) . first
2006-06-03 18:15:06 -04:00
}
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 " )
2013-11-09 16:01:46 -05:00
assert Company . where ( name : " Ain't noth'n like' \# stuff " ) . first
2006-11-05 16:27:51 -05:00
end
def test_hash_condition_find_with_array
2013-11-09 16:01:46 -05:00
p1 , p2 = Post . limit ( 2 ) . order ( 'id asc' ) . to_a
assert_equal [ p1 , p2 ] , Post . where ( id : [ p1 , p2 ] ) . order ( 'id asc' ) . to_a
assert_equal [ p1 , p2 ] , Post . where ( id : [ p1 , p2 . id ] ) . order ( 'id asc' ) . to_a
2006-11-05 16:27:51 -05:00
end
def test_hash_condition_find_with_nil
2013-11-09 16:01:46 -05:00
topic = Topic . where ( last_read : nil ) . first
2006-11-05 16:27:51 -05:00
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
2012-07-27 17:21:29 -04:00
def test_hash_condition_find_with_aggregate_having_one_mapping
balance = customers ( :david ) . balance
assert_kind_of Money , balance
found_customer = Customer . where ( :balance = > balance ) . first
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 . where ( :gps_location = > gps_location ) . first
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 . where ( :balance = > balance . amount ) . first
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 . where ( :gps_location = > gps_location . gps_location ) . first
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 . where ( :address = > address ) . first
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 . where ( :address = > address , :name = > customers ( :david ) . name ) . first
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
2013-10-24 15:26:23 -04:00
with_timezone_config default : :local do
2009-08-03 22:54:40 -04:00
topic = Topic . first
2013-11-09 16:01:46 -05:00
assert_equal topic , Topic . where ( [ 'written_on = ?' , topic . written_on . getutc ] ) . first
2009-08-03 22:54:40 -04:00
end
end
end
def test_hash_condition_utc_time_interpolation_with_default_timezone_local
with_env_tz 'America/New_York' do
2013-10-24 15:26:23 -04:00
with_timezone_config default : :local do
2009-08-03 22:54:40 -04:00
topic = Topic . first
2013-11-09 16:01:46 -05:00
assert_equal topic , Topic . where ( written_on : topic . written_on . getutc ) . first
2009-08-03 22:54:40 -04:00
end
end
end
def test_condition_local_time_interpolation_with_default_timezone_utc
with_env_tz 'America/New_York' do
2013-10-24 15:26:23 -04:00
with_timezone_config default : :utc do
2009-08-03 22:54:40 -04:00
topic = Topic . first
2013-11-09 16:01:46 -05:00
assert_equal topic , Topic . where ( [ 'written_on = ?' , topic . written_on . getlocal ] ) . first
2009-08-03 22:54:40 -04:00
end
end
end
def test_hash_condition_local_time_interpolation_with_default_timezone_utc
with_env_tz 'America/New_York' do
2013-10-24 15:26:23 -04:00
with_timezone_config default : :utc do
2009-08-03 22:54:40 -04:00
topic = Topic . first
2013-11-09 16:01:46 -05:00
assert_equal topic , Topic . where ( written_on : topic . written_on . getlocal ) . first
2009-08-03 22:54:40 -04:00
end
end
end
2005-04-03 07:19:14 -04:00
def test_bind_variables
2013-11-09 16:01:46 -05:00
assert_kind_of Firm , Company . where ( [ " name = ? " , " 37signals " ] ) . first
assert_nil Company . where ( [ " name = ? " , " 37signals! " ] ) . first
assert_nil Company . where ( [ " name = ? " , " 37signals!' OR 1=1 " ] ) . first
assert_kind_of Time , Topic . where ( [ " id = ? " , 1 ] ) . first . written_on
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: PreparedStatementInvalid ) {
2013-11-09 16:01:46 -05:00
Company . where ( [ " id=? AND name = ? " , 2 ] ) . first
2005-04-03 07:19:14 -04:00
}
2009-03-08 16:11:58 -04:00
assert_raise ( ActiveRecord :: PreparedStatementInvalid ) {
2013-11-09 16:01:46 -05:00
Company . where ( [ " id=? " , 2 , 3 , 4 ] ) . first
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 " )
2013-11-09 16:01:46 -05:00
assert Company . where ( [ " name = ? " , " 37signals' go'es agains " ] ) . first
2005-04-03 07:19:14 -04:00
end
def test_named_bind_variables_with_quotes
Company . create ( " name " = > " 37signals' go'es agains " )
2013-11-09 16:01:46 -05:00
assert Company . where ( [ " name = :name " , { name : " 37signals' go'es agains " } ] ) . first
2005-04-03 07:19:14 -04:00
end
def test_named_bind_variables
2013-11-09 16:01:46 -05:00
assert_kind_of Firm , Company . where ( [ " name = :name " , { name : " 37signals " } ] ) . first
assert_nil Company . where ( [ " name = :name " , { name : " 37signals! " } ] ) . first
assert_nil Company . where ( [ " name = :name " , { name : " 37signals!' OR 1=1 " } ] ) . first
assert_kind_of Time , Topic . where ( [ " id = :id " , { id : 1 } ] ) . first . written_on
2005-04-03 07:19:14 -04:00
end
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_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 " )
2014-06-17 22:44:00 -04:00
assert_raises_with_message ( ActiveRecord :: RecordNotFound , " Couldn't find Topic " ) do
Topic . find_by_title! ( " The First Topic! " )
end
2008-08-26 00:28:53 -04:00
end
2013-12-10 21:05:16 -05:00
def test_find_by_on_attribute_that_is_a_reserved_word
dog_alias = 'Dog'
dog = Dog . create ( alias : dog_alias )
assert_equal dog , Dog . find_by_alias ( dog_alias )
end
2012-06-22 10:44:01 -04:00
def test_find_by_one_attribute_that_is_an_alias
assert_equal topics ( :first ) , Topic . find_by_heading ( " The First Topic " )
assert_nil Topic . find_by_heading ( " The First Topic! " )
end
2012-11-13 09:39:07 -05:00
def test_find_by_one_attribute_bang_with_blank_defined
2012-11-13 11:54:47 -05:00
blank_topic = BlankTopic . create ( title : " The Blank One " )
assert_equal blank_topic , BlankTopic . find_by_title! ( " The Blank One " )
2012-11-13 09:39:07 -05:00
end
2006-01-22 04:34:41 -05:00
def test_find_by_one_attribute_with_conditions
2012-04-26 07:44:20 -04:00
assert_equal accounts ( :rails_core_account ) , Account . where ( 'firm_id = ?' , 6 ) . find_by_credit_limit ( 50 )
2006-01-22 04:34:41 -05:00
end
2012-07-27 17:21:29 -04: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
2012-06-04 15:59:34 -04:00
class << Account ; self ; end . send ( :remove_method , :find_by_credit_limit ) if Account . public_methods . include? ( :find_by_credit_limit )
2012-04-26 07:44:20 -04:00
a = Account . where ( 'firm_id = ?' , 6 ) . find_by_credit_limit ( 50 )
assert_equal a , Account . where ( 'firm_id = ?' , 6 ) . find_by_credit_limit ( 50 ) # find_by_credit_limit has been cached
2007-09-18 06:04:11 -04:00
end
2006-01-22 04:34:41 -05:00
def test_find_by_one_attribute_with_several_options
2012-04-26 07:44:20 -04:00
assert_equal accounts ( :unknown ) , Account . order ( 'id DESC' ) . where ( 'id != ?' , 3 ) . find_by_credit_limit ( 50 )
2006-01-22 04:34:41 -05:00
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
2013-12-03 13:33:34 -05:00
def test_find_last_with_offset
2013-12-05 13:32:00 -05:00
devs = Developer . order ( 'id' )
2013-12-03 13:33:34 -05:00
assert_equal devs [ 2 ] , Developer . offset ( 2 ) . first
assert_equal devs [ - 3 ] , Developer . offset ( 2 ) . last
assert_equal devs [ - 3 ] , Developer . offset ( 2 ) . last
assert_equal devs [ - 3 ] , Developer . offset ( 2 ) . order ( 'id DESC' ) . first
end
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_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_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-05-19 13:23:28 -04:00
def test_find_all_with_join
2013-11-09 16:01:46 -05:00
developers_on_project_one = Developer .
joins ( 'LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id' ) .
where ( 'project_id=1' ) . to_a
2006-03-15 22:24:40 -05:00
assert_equal 3 , developers_on_project_one . length
2014-10-27 12:28:53 -04:00
developer_names = developers_on_project_one . map ( & :name )
2005-06-11 22:27:19 -04:00
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
2013-11-09 16:01:46 -05:00
first = Firm .
joins ( 'INNER JOIN companies clients ON clients.firm_id = companies.id' ) .
where ( 'companies.id = 1' ) . first
2007-07-06 22:42:42 -04:00
assert_equal 1 , first . id
end
2008-09-23 16:32:17 -04:00
def test_joins_with_string_array
2013-11-09 16:01:46 -05:00
person_with_reader_and_post = Post .
joins ( [ " INNER JOIN categorizations ON categorizations.post_id = posts.id " ,
" INNER JOIN categories ON categories.id = categorizations.category_id AND categories.type = 'SpecialCategory' "
] )
2008-09-23 16:32:17 -04:00
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
2012-04-27 09:17:28 -04:00
Post . where ( " posts.id <= 3 OR posts. #{ QUOTED_TYPE } = 'Post' " ) . find ( [ 1 , 2 , 3 ] )
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
def test_find_ignores_previously_inserted_record
2010-11-16 20:06:50 -05:00
Post . create! ( :title = > 'test' , :body = > 'it out' )
2012-05-18 09:46:54 -04:00
assert_equal [ ] , Post . where ( id : nil )
2007-01-28 03:49:23 -05:00
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
2012-04-27 06:42:22 -04:00
assert_equal [ ] , Post . where ( 'id in (?)' , [ ] )
2006-05-31 21:43:20 -04:00
end
def test_find_by_records
2013-11-09 16:01:46 -05:00
p1 , p2 = Post . limit ( 2 ) . order ( 'id asc' ) . to_a
assert_equal [ p1 , p2 ] , Post . where ( [ 'id in (?)' , [ p1 , p2 ] ] ) . order ( 'id asc' )
assert_equal [ p1 , p2 ] , Post . where ( [ '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
2014-10-27 12:28:53 -04:00
assert_equal [ " 1 " , " 2 " , " 3 " , " 4 " , " 5 " , " 6 " , " 7 " , " 8 " , " 9 " , " 10 " , " 11 " ] , Company . connection . select_values ( " SELECT id FROM companies ORDER BY id " ) . map! ( & :to_s )
Ensure AR #second, #third, etc. finders work through associations
This commit fixes two regressions introduced in cafe31a078 where
newly created finder methods #second, #third, #forth, and #fifth
caused a NoMethodError error on reload associations and where we
were pulling the wrong element out of cached associations.
Examples:
some_book.authors.reload.second
# Before
# => NoMethodError: undefined method 'first' for nil:NilClass
# After
# => #<Author id: 2, name: "Sally Second", ...>
some_book.first.authors.first
some_book.first.authors.second
# Before
# => #<Author id: 1, name: "Freddy First", ...>
# => #<Author id: 1, name: "Freddy First", ...>
# After
# => #<Author id: 1, name: "Freddy First", ...>
# => #<Author id: 2, name: "Sally Second", ...>
Fixes #13783.
2014-01-21 17:34:39 -05:00
assert_equal [ " 37signals " , " Summit " , " Microsoft " , " Flamboyant Software " , " Ex Nihilo " , " RailsCore " , " Leetsoft " , " Jadedpixel " , " Odegy " , " Ex Nihilo Part Deux " , " Apex " ] , 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
2015-11-12 08:06:07 -05:00
assert_equal 2 , Post . includes ( authors : :author_address ) .
where . not ( author_addresses : { id : nil } ) .
order ( 'author_addresses.id DESC' ) . limit ( 2 ) . to_a . size
2008-05-03 23:49:18 -04:00
2013-11-09 16:01:46 -05:00
assert_equal 3 , Post . includes ( author : :author_address , authors : :author_address ) .
2015-11-12 08:06:07 -05:00
where . not ( author_addresses_authors : { id : nil } ) .
order ( 'author_addresses_authors.id DESC' ) . limit ( 3 ) . to_a . 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
2013-11-09 16:01:46 -05:00
client_of = Company .
where ( client_of : [ 2 , 1 , nil ] ,
name : [ '37signals' , 'Summit' , 'Microsoft' ] ) .
order ( 'client_of DESC' ) .
2014-10-27 12:28:53 -04:00
map ( & :client_of )
2011-02-12 07:42:20 -05:00
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
2013-02-08 14:22:10 -05:00
def test_find_with_nil_inside_set_passed_for_attribute
2013-11-09 16:01:46 -05:00
client_of = Company .
where ( client_of : [ nil ] ) .
order ( 'client_of DESC' ) .
2014-10-27 12:28:53 -04:00
map ( & :client_of )
2013-02-08 14:22:10 -05:00
assert_equal [ ] , client_of . compact
end
2008-05-04 15:08:19 -04:00
def test_with_limiting_with_custom_select
2012-07-27 12:27:47 -04:00
posts = Post . references ( :authors ) . merge (
2013-12-13 08:37:19 -05:00
:includes = > :author , :select = > 'posts.*, authors.id as "author_id"' ,
2012-04-13 13:26:04 -04:00
:limit = > 3 , :order = > 'posts.id'
2012-07-27 07:01:25 -04:00
) . to_a
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
2010-11-12 17:29:30 -05:00
def test_find_one_message_with_custom_primary_key
2014-01-24 15:59:23 -05:00
table_with_custom_primary_key do | model |
model . primary_key = :name
e = assert_raises ( ActiveRecord :: RecordNotFound ) do
model . find 'Hello World!'
end
assert_equal %Q{ Couldn't find MercedesCar with 'name'=Hello World! } , e . message
end
end
def test_find_some_message_with_custom_primary_key
table_with_custom_primary_key do | model |
model . primary_key = :name
e = assert_raises ( ActiveRecord :: RecordNotFound ) do
model . find 'Hello' , 'World!'
end
assert_equal %Q{ Couldn't find all MercedesCars with 'name': (Hello, World!) (found 0 results, but was looking for 2) } , e . message
2010-11-12 17:29:30 -05:00
end
end
2013-10-15 14:58:45 -04:00
def test_find_without_primary_key
assert_raises ( ActiveRecord :: UnknownPrimaryKey ) do
Matey . find ( 1 )
end
end
2012-01-11 06:45:55 -05:00
def test_finder_with_offset_string
2013-11-09 16:01:46 -05:00
assert_nothing_raised ( ActiveRecord :: StatementInvalid ) { Topic . offset ( " 3 " ) . to_a }
2012-01-11 06:45:55 -05:00
end
2014-08-24 07:42:12 -04:00
test " find_by with hash conditions returns the first matching record " do
assert_equal posts ( :eager_other ) , Post . find_by ( id : posts ( :eager_other ) . id )
end
test " find_by with non-hash conditions returns the first matching record " do
assert_equal posts ( :eager_other ) , Post . find_by ( " id = #{ posts ( :eager_other ) . id } " )
end
test " find_by with multi-arg conditions returns the first matching record " do
assert_equal posts ( :eager_other ) , Post . find_by ( 'id = ?' , posts ( :eager_other ) . id )
end
test " find_by returns nil if the record is missing " do
assert_equal nil , Post . find_by ( " 1 = 0 " )
end
2014-09-20 04:53:49 -04:00
test " find_by with associations " do
assert_equal authors ( :david ) , Post . find_by ( author : authors ( :david ) ) . author
assert_equal authors ( :mary ) , Post . find_by ( author : authors ( :mary ) ) . author
end
2014-08-24 07:42:12 -04:00
test " find_by doesn't have implicit ordering " do
assert_sql ( / ^((?!ORDER).)*$ / ) { Post . find_by ( id : posts ( :eager_other ) . id ) }
end
2014-08-24 08:01:59 -04:00
test " find_by! with hash conditions returns the first matching record " do
assert_equal posts ( :eager_other ) , Post . find_by! ( id : posts ( :eager_other ) . id )
end
test " find_by! with non-hash conditions returns the first matching record " do
assert_equal posts ( :eager_other ) , Post . find_by! ( " id = #{ posts ( :eager_other ) . id } " )
end
test " find_by! with multi-arg conditions returns the first matching record " do
assert_equal posts ( :eager_other ) , Post . find_by! ( 'id = ?' , posts ( :eager_other ) . id )
end
test " find_by! doesn't have implicit ordering " do
assert_sql ( / ^((?!ORDER).)*$ / ) { Post . find_by! ( id : posts ( :eager_other ) . id ) }
end
test " find_by! raises RecordNotFound if the record is missing " do
assert_raises ( ActiveRecord :: RecordNotFound ) do
Post . find_by! ( " 1 = 0 " )
end
end
2014-12-22 17:38:58 -05:00
test " find on a scope does not perform statement caching " do
honda = cars ( :honda )
zyke = cars ( :zyke )
tyre = honda . tyres . create!
tyre2 = zyke . tyres . create!
assert_equal tyre , honda . tyres . custom_find ( tyre . id )
assert_equal tyre2 , zyke . tyres . custom_find ( tyre2 . id )
end
test " find_by on a scope does not perform statement caching " do
honda = cars ( :honda )
zyke = cars ( :zyke )
tyre = honda . tyres . create!
tyre2 = zyke . tyres . create!
assert_equal tyre , honda . tyres . custom_find_by ( id : tyre . id )
assert_equal tyre2 , zyke . tyres . custom_find_by ( id : tyre2 . id )
end
2005-04-03 07:19:14 -04:00
protected
2014-01-24 15:59:23 -05:00
def table_with_custom_primary_key
yield ( Class . new ( Toy ) do
def self . name
'MercedesCar'
end
end )
end
2014-06-17 22:44:00 -04:00
def assert_raises_with_message ( exception_class , message , & block )
err = assert_raises ( exception_class ) { block . call }
assert_match message , err . message
end
2005-04-03 07:19:14 -04:00
end