ibm_db 0.10.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,7 @@
1
1
  require "cases/helper"
2
2
  require 'models/company'
3
3
  require 'models/topic'
4
+ require 'models/edge'
4
5
 
5
6
  Company.has_many :accounts
6
7
 
@@ -17,8 +18,8 @@ class CalculationsTest < ActiveRecord::TestCase
17
18
 
18
19
  def test_should_average_field
19
20
  value = Account.average(:credit_limit)
20
- assert_kind_of Float, value
21
- assert_in_delta 53.0, value, 0.001
21
+ assert_kind_of BigDecimal, value
22
+ assert_equal BigDecimal.new('53.0'), value
22
23
  end
23
24
 
24
25
  def test_should_return_nil_as_average
@@ -99,6 +100,12 @@ class CalculationsTest < ActiveRecord::TestCase
99
100
 
100
101
  def test_should_return_zero_if_sum_conditions_return_nothing
101
102
  assert_equal 0, Account.sum(:credit_limit, :conditions => '1 = 2')
103
+ assert_equal 0, companies(:rails_core).companies.sum(:id, :conditions => '1 = 2')
104
+ end
105
+
106
+ def test_sum_should_return_valid_values_for_decimals
107
+ NumericData.create(:bank_balance => 19.83)
108
+ assert_equal 19.83, NumericData.sum(:bank_balance)
102
109
  end
103
110
 
104
111
  def test_should_group_by_summed_field_with_conditions
@@ -269,7 +276,52 @@ class CalculationsTest < ActiveRecord::TestCase
269
276
  if current_adapter?(:IBM_DBAdapter) && !ActiveRecord::Base.connection.servertype.class.name.include?('::IBM_IDS')
270
277
  assert_equal 636, Account.sum("2 * credit_limit")
271
278
  else
272
- assert_equal "636", Account.sum("2 * credit_limit")
279
+ assert_equal '636', Account.sum("2 * credit_limit")
273
280
  end
274
281
  end
282
+
283
+ def test_count_with_from_option
284
+ assert_equal Company.count(:all), Company.count(:all, :from => 'companies')
285
+ assert_equal Account.count(:all, :conditions => "credit_limit = 50"),
286
+ Account.count(:all, :from => 'accounts', :conditions => "credit_limit = 50")
287
+ assert_equal Company.count(:type, :conditions => {:type => "Firm"}),
288
+ Company.count(:type, :conditions => {:type => "Firm"}, :from => 'companies')
289
+ end
290
+
291
+ def test_sum_with_from_option
292
+ assert_equal Account.sum(:credit_limit), Account.sum(:credit_limit, :from => 'accounts')
293
+ assert_equal Account.sum(:credit_limit, :conditions => "credit_limit > 50"),
294
+ Account.sum(:credit_limit, :from => 'accounts', :conditions => "credit_limit > 50")
295
+ end
296
+
297
+ def test_average_with_from_option
298
+ assert_equal Account.average(:credit_limit), Account.average(:credit_limit, :from => 'accounts')
299
+ assert_equal Account.average(:credit_limit, :conditions => "credit_limit > 50"),
300
+ Account.average(:credit_limit, :from => 'accounts', :conditions => "credit_limit > 50")
301
+ end
302
+
303
+ def test_minimum_with_from_option
304
+ assert_equal Account.minimum(:credit_limit), Account.minimum(:credit_limit, :from => 'accounts')
305
+ assert_equal Account.minimum(:credit_limit, :conditions => "credit_limit > 50"),
306
+ Account.minimum(:credit_limit, :from => 'accounts', :conditions => "credit_limit > 50")
307
+ end
308
+
309
+ def test_maximum_with_from_option
310
+ assert_equal Account.maximum(:credit_limit), Account.maximum(:credit_limit, :from => 'accounts')
311
+ assert_equal Account.maximum(:credit_limit, :conditions => "credit_limit > 50"),
312
+ Account.maximum(:credit_limit, :from => 'accounts', :conditions => "credit_limit > 50")
313
+ end
314
+
315
+ def test_from_option_with_specified_index
316
+ if Edge.connection.adapter_name == 'MySQL'
317
+ assert_equal Edge.count(:all), Edge.count(:all, :from => 'edges USE INDEX(unique_edge_index)')
318
+ assert_equal Edge.count(:all, :conditions => 'sink_id < 5'),
319
+ Edge.count(:all, :from => 'edges USE INDEX(unique_edge_index)', :conditions => 'sink_id < 5')
320
+ end
321
+ end
322
+
323
+ def test_from_option_with_table_different_than_class
324
+ assert_equal Account.count(:all), Company.count(:all, :from => 'accounts')
325
+ end
326
+
275
327
  end
@@ -1,5 +1,6 @@
1
1
  require "cases/helper"
2
2
  require 'models/author'
3
+ require 'models/categorization'
3
4
  require 'models/comment'
4
5
  require 'models/company'
5
6
  require 'models/topic'
@@ -51,11 +52,11 @@ class FinderTest < ActiveRecord::TestCase
51
52
  def test_exists_with_aggregate_having_three_mappings_with_one_difference
52
53
  existing_address = customers(:david).address
53
54
  assert !Customer.exists?(:address =>
54
- Address.new(existing_address.street, existing_address.city, existing_address.country + "1"))
55
+ Address.new(existing_address.street, existing_address.city, existing_address.country + "1"))
55
56
  assert !Customer.exists?(:address =>
56
- Address.new(existing_address.street, existing_address.city + "1", existing_address.country))
57
+ Address.new(existing_address.street, existing_address.city + "1", existing_address.country))
57
58
  assert !Customer.exists?(:address =>
58
- Address.new(existing_address.street + "1", existing_address.city, existing_address.country))
59
+ Address.new(existing_address.street + "1", existing_address.city, existing_address.country))
59
60
  end
60
61
 
61
62
  def test_find_by_array_of_one_id
@@ -323,7 +324,7 @@ class FinderTest < ActiveRecord::TestCase
323
324
  Company.find(:first, :conditions => ["id=? AND name = ?", 2])
324
325
  }
325
326
  assert_raises(ActiveRecord::PreparedStatementInvalid) {
326
- Company.find(:first, :conditions => ["id=?", 2, 3, 4])
327
+ Company.find(:first, :conditions => ["id=?", 2, 3, 4])
327
328
  }
328
329
  end
329
330
 
@@ -385,7 +386,15 @@ class FinderTest < ActiveRecord::TestCase
385
386
  def test_bind_string
386
387
  assert_equal ActiveRecord::Base.connection.quote(''), bind('?', '')
387
388
  end
388
-
389
+
390
+ def test_bind_string_with_nl
391
+ assert_equal ActiveRecord::Base.connection.quote("a\nb"), bind('?', "a\nb")
392
+ end
393
+
394
+ def test_bind_mb_string_with_nl
395
+ assert_equal ActiveRecord::Base.connection.quote("a\nb"), bind('?', "a\nb".chars)
396
+ end
397
+
389
398
  def test_bind_record
390
399
  o = Struct.new(:quoted_id).new(1)
391
400
  assert_equal '1', bind('?', o)
@@ -393,7 +402,13 @@ class FinderTest < ActiveRecord::TestCase
393
402
  os = [o] * 3
394
403
  assert_equal '1,1,1', bind('?', os)
395
404
  end
396
-
405
+
406
+ def test_named_bind_with_postgresql_type_casts
407
+ l = Proc.new { bind(":a::integer '2009-01-01'::date", :a => '10') }
408
+ assert_nothing_raised(&l)
409
+ assert_equal "#{ActiveRecord::Base.quote_value('10')}::integer '2009-01-01'::date", l.call
410
+ end
411
+
397
412
  def test_string_sanitation
398
413
  assert_not_equal "#{ActiveRecord::Base.connection.quoted_string_prefix}'something ' 1=1'", ActiveRecord::Base.sanitize("something ' 1=1")
399
414
  assert_equal "#{ActiveRecord::Base.connection.quoted_string_prefix}'something; select table'", ActiveRecord::Base.sanitize("something; select table")
@@ -419,467 +434,467 @@ class FinderTest < ActiveRecord::TestCase
419
434
  def test_find_by_one_attribute_caches_dynamic_finder
420
435
  # ensure this test can run independently of order
421
436
  class << Topic; self; end.send(:remove_method, :find_by_title) if Topic.public_methods.any? { |m| m.to_s == 'find_by_title' }
422
- assert !Topic.public_methods.any? { |m| m.to_s == 'find_by_title' }
423
- t = Topic.find_by_title("The First Topic")
424
- assert Topic.public_methods.any? { |m| m.to_s == 'find_by_title' }
437
+ assert !Topic.public_methods.any? { |m| m.to_s == 'find_by_title' }
438
+ t = Topic.find_by_title("The First Topic")
439
+ assert Topic.public_methods.any? { |m| m.to_s == 'find_by_title' }
440
+ end
441
+
442
+ def test_dynamic_finder_returns_same_results_after_caching
443
+ # ensure this test can run independently of order
444
+ class << Topic; self; end.send(:remove_method, :find_by_title) if Topic.public_method_defined?(:find_by_title)
445
+ t = Topic.find_by_title("The First Topic")
446
+ assert_equal t, Topic.find_by_title("The First Topic") # find_by_title has been cached
447
+ end
448
+
449
+ def test_find_by_one_attribute_with_order_option
450
+ assert_equal accounts(:signals37), Account.find_by_credit_limit(50, :order => 'id')
451
+ assert_equal accounts(:rails_core_account), Account.find_by_credit_limit(50, :order => 'id DESC')
452
+ end
453
+
454
+ def test_find_by_one_attribute_with_conditions
455
+ assert_equal accounts(:rails_core_account), Account.find_by_credit_limit(50, :conditions => ['firm_id = ?', 6])
456
+ end
457
+
458
+ def test_find_by_one_attribute_that_is_an_aggregate
459
+ address = customers(:david).address
460
+ assert_kind_of Address, address
461
+ found_customer = Customer.find_by_address(address)
462
+ assert_equal customers(:david), found_customer
463
+ end
464
+
465
+ def test_find_by_one_attribute_that_is_an_aggregate_with_one_attribute_difference
466
+ address = customers(:david).address
467
+ assert_kind_of Address, address
468
+ missing_address = Address.new(address.street, address.city, address.country + "1")
469
+ assert_nil Customer.find_by_address(missing_address)
470
+ missing_address = Address.new(address.street, address.city + "1", address.country)
471
+ assert_nil Customer.find_by_address(missing_address)
472
+ missing_address = Address.new(address.street + "1", address.city, address.country)
473
+ assert_nil Customer.find_by_address(missing_address)
474
+ end
475
+
476
+ def test_find_by_two_attributes_that_are_both_aggregates
477
+ balance = customers(:david).balance
478
+ address = customers(:david).address
479
+ assert_kind_of Money, balance
480
+ assert_kind_of Address, address
481
+ found_customer = Customer.find_by_balance_and_address(balance, address)
482
+ assert_equal customers(:david), found_customer
483
+ end
484
+
485
+ def test_find_by_two_attributes_with_one_being_an_aggregate
486
+ balance = customers(:david).balance
487
+ assert_kind_of Money, balance
488
+ found_customer = Customer.find_by_balance_and_name(balance, customers(:david).name)
489
+ assert_equal customers(:david), found_customer
490
+ end
491
+
492
+ def test_dynamic_finder_on_one_attribute_with_conditions_caches_method
493
+ # ensure this test can run independently of order
494
+ class << Account; self; end.send(:remove_method, :find_by_credit_limit) if Account.public_methods.any? { |m| m.to_s == 'find_by_credit_limit' }
495
+ assert !Account.public_methods.any? { |m| m.to_s == 'find_by_credit_limit' }
496
+ a = Account.find_by_credit_limit(50, :conditions => ['firm_id = ?', 6])
497
+ assert Account.public_methods.any? { |m| m.to_s == 'find_by_credit_limit' }
498
+ end
499
+
500
+ def test_dynamic_finder_on_one_attribute_with_conditions_returns_same_results_after_caching
501
+ # ensure this test can run independently of order
502
+ class << Account; self; end.send(:remove_method, :find_by_credit_limit) if Account.public_methods.any? { |m| m.to_s == 'find_by_credit_limit' }
503
+ a = Account.find_by_credit_limit(50, :conditions => ['firm_id = ?', 6])
504
+ assert_equal a, Account.find_by_credit_limit(50, :conditions => ['firm_id = ?', 6]) # find_by_credit_limit has been cached
505
+ end
506
+
507
+ def test_find_by_one_attribute_with_several_options
508
+ assert_equal accounts(:unknown), Account.find_by_credit_limit(50, :order => 'id DESC', :conditions => ['id != ?', 3])
509
+ end
510
+
511
+ def test_find_by_one_missing_attribute
512
+ assert_raises(NoMethodError) { Topic.find_by_undertitle("The First Topic!") }
513
+ end
514
+
515
+ def test_find_by_invalid_method_syntax
516
+ assert_raises(NoMethodError) { Topic.fail_to_find_by_title("The First Topic") }
517
+ assert_raises(NoMethodError) { Topic.find_by_title?("The First Topic") }
518
+ assert_raises(NoMethodError) { Topic.fail_to_find_or_create_by_title("Nonexistent Title") }
519
+ assert_raises(NoMethodError) { Topic.find_or_create_by_title?("Nonexistent Title") }
520
+ end
521
+
522
+ def test_find_by_two_attributes
523
+ assert_equal topics(:first), Topic.find_by_title_and_author_name("The First Topic", "David")
524
+ assert_nil Topic.find_by_title_and_author_name("The First Topic", "Mary")
525
+ end
526
+
527
+ def test_find_all_by_one_attribute
528
+ topics = Topic.find_all_by_content("Have a nice day")
529
+ assert_equal 2, topics.size
530
+ assert topics.include?(topics(:first))
531
+
532
+ assert_equal [], Topic.find_all_by_title("The First Topic!!")
533
+ end
534
+
535
+ def test_find_all_by_one_attribute_that_is_an_aggregate
536
+ balance = customers(:david).balance
537
+ assert_kind_of Money, balance
538
+ found_customers = Customer.find_all_by_balance(balance)
539
+ assert_equal 1, found_customers.size
540
+ assert_equal customers(:david), found_customers.first
541
+ end
542
+
543
+ def test_find_all_by_two_attributes_that_are_both_aggregates
544
+ balance = customers(:david).balance
545
+ address = customers(:david).address
546
+ assert_kind_of Money, balance
547
+ assert_kind_of Address, address
548
+ found_customers = Customer.find_all_by_balance_and_address(balance, address)
549
+ assert_equal 1, found_customers.size
550
+ assert_equal customers(:david), found_customers.first
551
+ end
552
+
553
+ def test_find_all_by_two_attributes_with_one_being_an_aggregate
554
+ balance = customers(:david).balance
555
+ assert_kind_of Money, balance
556
+ found_customers = Customer.find_all_by_balance_and_name(balance, customers(:david).name)
557
+ assert_equal 1, found_customers.size
558
+ assert_equal customers(:david), found_customers.first
559
+ end
560
+
561
+ def test_find_all_by_one_attribute_with_options
562
+ topics = Topic.find_all_by_content("Have a nice day", :order => "id DESC")
563
+ assert topics(:first), topics.last
564
+
565
+ topics = Topic.find_all_by_content("Have a nice day", :order => "id")
566
+ assert topics(:first), topics.first
567
+ end
568
+
569
+ def test_find_all_by_array_attribute
570
+ assert_equal 2, Topic.find_all_by_title(["The First Topic", "The Second Topic of the day"]).size
571
+ end
572
+
573
+ def test_find_all_by_boolean_attribute
574
+ topics = Topic.find_all_by_approved(false)
575
+ assert_equal 1, topics.size
576
+ assert topics.include?(topics(:first))
577
+
578
+ topics = Topic.find_all_by_approved(true)
579
+ assert_equal 3, topics.size
580
+ assert topics.include?(topics(:second))
581
+ end
582
+
583
+ def test_find_by_nil_attribute
584
+ topic = Topic.find_by_last_read nil
585
+ assert_not_nil topic
586
+ assert_nil topic.last_read
587
+ end
588
+
589
+ def test_find_all_by_nil_attribute
590
+ topics = Topic.find_all_by_last_read nil
591
+ assert_equal 3, topics.size
592
+ assert topics.collect(&:last_read).all?(&:nil?)
593
+ end
594
+
595
+ def test_find_by_nil_and_not_nil_attributes
596
+ topic = Topic.find_by_last_read_and_author_name nil, "Mary"
597
+ assert_equal "Mary", topic.author_name
598
+ end
599
+
600
+ def test_find_all_by_nil_and_not_nil_attributes
601
+ topics = Topic.find_all_by_last_read_and_author_name nil, "Mary"
602
+ assert_equal 1, topics.size
603
+ assert_equal "Mary", topics[0].author_name
604
+ end
605
+
606
+ def test_find_or_create_from_one_attribute
607
+ number_of_companies = Company.count
608
+ sig38 = Company.find_or_create_by_name("38signals")
609
+ assert_equal number_of_companies + 1, Company.count
610
+ assert_equal sig38, Company.find_or_create_by_name("38signals")
611
+ assert !sig38.new_record?
612
+ end
613
+
614
+ def test_find_or_create_from_two_attributes
615
+ number_of_topics = Topic.count
616
+ another = Topic.find_or_create_by_title_and_author_name("Another topic","John")
617
+ assert_equal number_of_topics + 1, Topic.count
618
+ assert_equal another, Topic.find_or_create_by_title_and_author_name("Another topic", "John")
619
+ assert !another.new_record?
620
+ end
621
+
622
+ def test_find_or_create_from_two_attributes_with_one_being_an_aggregate
623
+ number_of_customers = Customer.count
624
+ created_customer = Customer.find_or_create_by_balance_and_name(Money.new(123), "Elizabeth")
625
+ assert_equal number_of_customers + 1, Customer.count
626
+ assert_equal created_customer, Customer.find_or_create_by_balance(Money.new(123), "Elizabeth")
627
+ assert !created_customer.new_record?
628
+ end
629
+
630
+ def test_find_or_create_from_one_attribute_and_hash
631
+ number_of_companies = Company.count
632
+ sig38 = Company.find_or_create_by_name({:name => "38signals", :firm_id => 17, :client_of => 23})
633
+ assert_equal number_of_companies + 1, Company.count
634
+ assert_equal sig38, Company.find_or_create_by_name({:name => "38signals", :firm_id => 17, :client_of => 23})
635
+ assert !sig38.new_record?
636
+ assert_equal "38signals", sig38.name
637
+ assert_equal 17, sig38.firm_id
638
+ assert_equal 23, sig38.client_of
639
+ end
640
+
641
+ def test_find_or_create_from_one_aggregate_attribute
642
+ number_of_customers = Customer.count
643
+ created_customer = Customer.find_or_create_by_balance(Money.new(123))
644
+ assert_equal number_of_customers + 1, Customer.count
645
+ assert_equal created_customer, Customer.find_or_create_by_balance(Money.new(123))
646
+ assert !created_customer.new_record?
647
+ end
648
+
649
+ def test_find_or_create_from_one_aggregate_attribute_and_hash
650
+ number_of_customers = Customer.count
651
+ balance = Money.new(123)
652
+ name = "Elizabeth"
653
+ created_customer = Customer.find_or_create_by_balance({:balance => balance, :name => name})
654
+ assert_equal number_of_customers + 1, Customer.count
655
+ assert_equal created_customer, Customer.find_or_create_by_balance({:balance => balance, :name => name})
656
+ assert !created_customer.new_record?
657
+ assert_equal balance, created_customer.balance
658
+ assert_equal name, created_customer.name
659
+ end
660
+
661
+ def test_find_or_initialize_from_one_attribute
662
+ sig38 = Company.find_or_initialize_by_name("38signals")
663
+ assert_equal "38signals", sig38.name
664
+ assert sig38.new_record?
665
+ end
666
+
667
+ def test_find_or_initialize_from_one_aggregate_attribute
668
+ new_customer = Customer.find_or_initialize_by_balance(Money.new(123))
669
+ assert_equal 123, new_customer.balance.amount
670
+ assert new_customer.new_record?
671
+ end
672
+
673
+ def test_find_or_initialize_from_one_attribute_should_not_set_attribute_even_when_protected
674
+ c = Company.find_or_initialize_by_name({:name => "Fortune 1000", :rating => 1000})
675
+ assert_equal "Fortune 1000", c.name
676
+ assert_not_equal 1000, c.rating
677
+ assert c.valid?
678
+ assert c.new_record?
679
+ end
680
+
681
+ def test_find_or_create_from_one_attribute_should_set_not_attribute_even_when_protected
682
+ c = Company.find_or_create_by_name({:name => "Fortune 1000", :rating => 1000})
683
+ assert_equal "Fortune 1000", c.name
684
+ assert_not_equal 1000, c.rating
685
+ assert c.valid?
686
+ assert !c.new_record?
687
+ end
688
+
689
+ def test_find_or_initialize_from_one_attribute_should_set_attribute_even_when_protected
690
+ c = Company.find_or_initialize_by_name_and_rating("Fortune 1000", 1000)
691
+ assert_equal "Fortune 1000", c.name
692
+ assert_equal 1000, c.rating
693
+ assert c.valid?
694
+ assert c.new_record?
695
+ end
696
+
697
+ def test_find_or_create_from_one_attribute_should_set_attribute_even_when_protected
698
+ c = Company.find_or_create_by_name_and_rating("Fortune 1000", 1000)
699
+ assert_equal "Fortune 1000", c.name
700
+ assert_equal 1000, c.rating
701
+ assert c.valid?
702
+ assert !c.new_record?
703
+ end
704
+
705
+ def test_find_or_initialize_should_set_protected_attributes_if_given_as_block
706
+ c = Company.find_or_initialize_by_name(:name => "Fortune 1000") { |f| f.rating = 1000 }
707
+ assert_equal "Fortune 1000", c.name
708
+ assert_equal 1000.to_f, c.rating.to_f
709
+ assert c.valid?
710
+ assert c.new_record?
711
+ end
712
+
713
+ def test_find_or_create_should_set_protected_attributes_if_given_as_block
714
+ c = Company.find_or_create_by_name(:name => "Fortune 1000") { |f| f.rating = 1000 }
715
+ assert_equal "Fortune 1000", c.name
716
+ assert_equal 1000.to_f, c.rating.to_f
717
+ assert c.valid?
718
+ assert !c.new_record?
719
+ end
720
+
721
+ def test_dynamic_find_or_initialize_from_one_attribute_caches_method
722
+ class << Company; self; end.send(:remove_method, :find_or_initialize_by_name) if Company.public_methods.any? { |m| m.to_s == 'find_or_initialize_by_name' }
723
+ assert !Company.public_methods.any? { |m| m.to_s == 'find_or_initialize_by_name' }
724
+ sig38 = Company.find_or_initialize_by_name("38signals")
725
+ assert Company.public_methods.any? { |m| m.to_s == 'find_or_initialize_by_name' }
726
+ end
727
+
728
+ def test_find_or_initialize_from_two_attributes
729
+ another = Topic.find_or_initialize_by_title_and_author_name("Another topic","John")
730
+ assert_equal "Another topic", another.title
731
+ assert_equal "John", another.author_name
732
+ assert another.new_record?
733
+ end
734
+
735
+ def test_find_or_initialize_from_one_aggregate_attribute_and_one_not
736
+ new_customer = Customer.find_or_initialize_by_balance_and_name(Money.new(123), "Elizabeth")
737
+ assert_equal 123, new_customer.balance.amount
738
+ assert_equal "Elizabeth", new_customer.name
739
+ assert new_customer.new_record?
740
+ end
741
+
742
+ def test_find_or_initialize_from_one_attribute_and_hash
743
+ sig38 = Company.find_or_initialize_by_name({:name => "38signals", :firm_id => 17, :client_of => 23})
744
+ assert_equal "38signals", sig38.name
745
+ assert_equal 17, sig38.firm_id
746
+ assert_equal 23, sig38.client_of
747
+ assert sig38.new_record?
748
+ end
749
+
750
+ def test_find_or_initialize_from_one_aggregate_attribute_and_hash
751
+ balance = Money.new(123)
752
+ name = "Elizabeth"
753
+ new_customer = Customer.find_or_initialize_by_balance({:balance => balance, :name => name})
754
+ assert_equal balance, new_customer.balance
755
+ assert_equal name, new_customer.name
756
+ assert new_customer.new_record?
757
+ end
758
+
759
+ def test_find_with_bad_sql
760
+ assert_raises(ActiveRecord::StatementInvalid) { Topic.find_by_sql "select 1 from badtable" }
761
+ end
762
+
763
+ def test_find_with_invalid_params
764
+ assert_raises(ArgumentError) { Topic.find :first, :join => "It should be `joins'" }
765
+ assert_raises(ArgumentError) { Topic.find :first, :conditions => '1 = 1', :join => "It should be `joins'" }
766
+ end
767
+
768
+ def test_dynamic_finder_with_invalid_params
769
+ assert_raises(ArgumentError) { Topic.find_by_title 'No Title', :join => "It should be `joins'" }
770
+ end
771
+
772
+ def test_find_all_with_limit
773
+ first_five_developers = Developer.find :all, :order => 'id ASC', :limit => 5
774
+ assert_equal 5, first_five_developers.length
775
+ assert_equal 'David', first_five_developers.first.name
776
+ assert_equal 'fixture_5', first_five_developers.last.name
777
+
778
+ no_developers = Developer.find :all, :order => 'id ASC', :limit => 0
779
+ assert_equal 0, no_developers.length
780
+ end
781
+
782
+ def test_find_all_with_limit_and_offset
783
+ first_three_developers = Developer.find :all, :order => 'id ASC', :limit => 3, :offset => 0
784
+ second_three_developers = Developer.find :all, :order => 'id ASC', :limit => 3, :offset => 3
785
+ last_two_developers = Developer.find :all, :order => 'id ASC', :limit => 2, :offset => 8
786
+
787
+ assert_equal 3, first_three_developers.length
788
+ assert_equal 3, second_three_developers.length
789
+ assert_equal 2, last_two_developers.length
790
+
791
+ assert_equal 'David', first_three_developers.first.name
792
+ assert_equal 'fixture_4', second_three_developers.first.name
793
+ assert_equal 'fixture_9', last_two_developers.first.name
794
+ end
795
+
796
+ def test_find_all_with_limit_and_offset_and_multiple_order_clauses
797
+ first_three_posts = Post.find :all, :order => 'author_id, id', :limit => 3, :offset => 0
798
+ second_three_posts = Post.find :all, :order => ' author_id,id ', :limit => 3, :offset => 3
799
+ last_posts = Post.find :all, :order => ' author_id, id ', :limit => 3, :offset => 6
800
+
801
+ assert_equal [[0,3],[1,1],[1,2]], first_three_posts.map { |p| [p.author_id, p.id] }
802
+ assert_equal [[1,4],[1,5],[1,6]], second_three_posts.map { |p| [p.author_id, p.id] }
803
+ assert_equal [[2,7]], last_posts.map { |p| [p.author_id, p.id] }
804
+ end
805
+
806
+ def test_find_all_with_join
807
+ developers_on_project_one = Developer.find(
808
+ :all,
809
+ :joins => 'LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id',
810
+ :conditions => 'project_id=1'
811
+ )
812
+ assert_equal 3, developers_on_project_one.length
813
+ developer_names = developers_on_project_one.map { |d| d.name }
814
+ assert developer_names.include?('David')
815
+ assert developer_names.include?('Jamis')
816
+ end
817
+
818
+ def test_joins_dont_clobber_id
819
+ first = Firm.find(
820
+ :first,
821
+ :joins => 'INNER JOIN companies AS clients ON clients.firm_id = companies.id',
822
+ :conditions => 'companies.id = 1'
823
+ )
824
+ assert_equal 1, first.id
825
+ end
826
+
827
+ def test_find_by_id_with_conditions_with_or
828
+ assert_nothing_raised do
829
+ Post.find([1,2,3],
830
+ :conditions => "posts.id <= 3 OR posts.#{QUOTED_TYPE} = 'Post'")
425
831
  end
426
-
427
- def test_dynamic_finder_returns_same_results_after_caching
428
- # ensure this test can run independently of order
429
- class << Topic; self; end.send(:remove_method, :find_by_title) if Topic.public_method_defined?(:find_by_title)
430
- t = Topic.find_by_title("The First Topic")
431
- assert_equal t, Topic.find_by_title("The First Topic") # find_by_title has been cached
432
- end
433
-
434
- def test_find_by_one_attribute_with_order_option
435
- assert_equal accounts(:signals37), Account.find_by_credit_limit(50, :order => 'id')
436
- assert_equal accounts(:rails_core_account), Account.find_by_credit_limit(50, :order => 'id DESC')
437
- end
438
-
439
- def test_find_by_one_attribute_with_conditions
440
- assert_equal accounts(:rails_core_account), Account.find_by_credit_limit(50, :conditions => ['firm_id = ?', 6])
441
- end
442
-
443
- def test_find_by_one_attribute_that_is_an_aggregate
444
- address = customers(:david).address
445
- assert_kind_of Address, address
446
- found_customer = Customer.find_by_address(address)
447
- assert_equal customers(:david), found_customer
448
- end
449
-
450
- def test_find_by_one_attribute_that_is_an_aggregate_with_one_attribute_difference
451
- address = customers(:david).address
452
- assert_kind_of Address, address
453
- missing_address = Address.new(address.street, address.city, address.country + "1")
454
- assert_nil Customer.find_by_address(missing_address)
455
- missing_address = Address.new(address.street, address.city + "1", address.country)
456
- assert_nil Customer.find_by_address(missing_address)
457
- missing_address = Address.new(address.street + "1", address.city, address.country)
458
- assert_nil Customer.find_by_address(missing_address)
459
- end
460
-
461
- def test_find_by_two_attributes_that_are_both_aggregates
462
- balance = customers(:david).balance
463
- address = customers(:david).address
464
- assert_kind_of Money, balance
465
- assert_kind_of Address, address
466
- found_customer = Customer.find_by_balance_and_address(balance, address)
467
- assert_equal customers(:david), found_customer
468
- end
469
-
470
- def test_find_by_two_attributes_with_one_being_an_aggregate
471
- balance = customers(:david).balance
472
- assert_kind_of Money, balance
473
- found_customer = Customer.find_by_balance_and_name(balance, customers(:david).name)
474
- assert_equal customers(:david), found_customer
832
+ end
833
+
834
+ # http://dev.rubyonrails.org/ticket/6778
835
+ def test_find_ignores_previously_inserted_record
836
+ post = Post.create!(:title => 'test', :body => 'it out')
837
+ assert_equal [], Post.find_all_by_id(nil)
838
+ end
839
+
840
+ def test_find_by_empty_ids
841
+ assert_equal [], Post.find([])
842
+ end
843
+
844
+ def test_find_by_empty_in_condition
845
+ assert_equal [], Post.find(:all, :conditions => ['id in (?)', []])
846
+ end
847
+
848
+ def test_find_by_records
849
+ p1, p2 = Post.find(:all, :limit => 2, :order => 'id asc')
850
+ assert_equal [p1, p2], Post.find(:all, :conditions => ['id in (?)', [p1, p2]], :order => 'id asc')
851
+ assert_equal [p1, p2], Post.find(:all, :conditions => ['id in (?)', [p1, p2.id]], :order => 'id asc')
852
+ end
853
+
854
+ def test_select_value
855
+ assert_equal "37signals", Company.connection.select_value("SELECT name FROM companies WHERE id = 1")
856
+ assert_nil Company.connection.select_value("SELECT name FROM companies WHERE id = -1")
857
+ # make sure we didn't break count...
858
+ assert_equal 0, Company.count_by_sql("SELECT COUNT(*) FROM companies WHERE name = 'Halliburton'")
859
+ assert_equal 1, Company.count_by_sql("SELECT COUNT(*) FROM companies WHERE name = '37signals'")
860
+ end
861
+
862
+ def test_select_values
863
+ assert_equal ["1","2","3","4","5","6","7","8","9"], Company.connection.select_values("SELECT id FROM companies ORDER BY id").map! { |i| i.to_s }
864
+ assert_equal ["37signals","Summit","Microsoft", "Flamboyant Software", "Ex Nihilo", "RailsCore", "Leetsoft", "Jadedpixel", "Odegy"], Company.connection.select_values("SELECT name FROM companies ORDER BY id")
865
+ end
866
+
867
+ def test_select_rows
868
+ assert_equal(
869
+ [["1", nil, nil, "37signals"],
870
+ ["2", "1", "2", "Summit"],
871
+ ["3", "1", "1", "Microsoft"]],
872
+ 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?}})
873
+ assert_equal [["1", "37signals"], ["2", "Summit"], ["3", "Microsoft"]],
874
+ 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?}}
875
+ end
876
+
877
+ unless current_adapter?(:IBM_DBAdapter)
878
+ def test_find_with_order_on_included_associations_with_construct_finder_sql_for_association_limiting_and_is_distinct
879
+ assert_equal 2, Post.find(:all, :include => { :authors => :author_address }, :order => ' author_addresses.id DESC ', :limit => 2).size
880
+
881
+ assert_equal 3, Post.find(:all, :include => { :author => :author_address, :authors => :author_address},
882
+ :order => ' author_addresses_authors.id DESC ', :limit => 3).size
883
+ end
884
+ end
885
+
886
+ def test_with_limiting_with_custom_select
887
+ posts = Post.find(:all, :include => :author, :select => ' posts.*, authors.id as "author_id"', :limit => 3, :order => 'posts.id')
888
+ assert_equal 3, posts.size
889
+ assert_equal [0, 1, 1], posts.map(&:author_id).sort
890
+ end
891
+
892
+ protected
893
+ def bind(statement, *vars)
894
+ if vars.first.is_a?(Hash)
895
+ ActiveRecord::Base.send(:replace_named_bind_variables, statement, vars.first)
896
+ else
897
+ ActiveRecord::Base.send(:replace_bind_variables, statement, vars)
475
898
  end
476
-
477
- def test_dynamic_finder_on_one_attribute_with_conditions_caches_method
478
- # ensure this test can run independently of order
479
- class << Account; self; end.send(:remove_method, :find_by_credit_limit) if Account.public_methods.any? { |m| m.to_s == 'find_by_credit_limit' }
480
- assert !Account.public_methods.any? { |m| m.to_s == 'find_by_credit_limit' }
481
- a = Account.find_by_credit_limit(50, :conditions => ['firm_id = ?', 6])
482
- assert Account.public_methods.any? { |m| m.to_s == 'find_by_credit_limit' }
483
- end
484
-
485
- def test_dynamic_finder_on_one_attribute_with_conditions_returns_same_results_after_caching
486
- # ensure this test can run independently of order
487
- class << Account; self; end.send(:remove_method, :find_by_credit_limit) if Account.public_methods.any? { |m| m.to_s == 'find_by_credit_limit' }
488
- a = Account.find_by_credit_limit(50, :conditions => ['firm_id = ?', 6])
489
- assert_equal a, Account.find_by_credit_limit(50, :conditions => ['firm_id = ?', 6]) # find_by_credit_limit has been cached
490
- end
491
-
492
- def test_find_by_one_attribute_with_several_options
493
- assert_equal accounts(:unknown), Account.find_by_credit_limit(50, :order => 'id DESC', :conditions => ['id != ?', 3])
494
- end
495
-
496
- def test_find_by_one_missing_attribute
497
- assert_raises(NoMethodError) { Topic.find_by_undertitle("The First Topic!") }
498
- end
499
-
500
- def test_find_by_invalid_method_syntax
501
- assert_raises(NoMethodError) { Topic.fail_to_find_by_title("The First Topic") }
502
- assert_raises(NoMethodError) { Topic.find_by_title?("The First Topic") }
503
- assert_raises(NoMethodError) { Topic.fail_to_find_or_create_by_title("Nonexistent Title") }
504
- assert_raises(NoMethodError) { Topic.find_or_create_by_title?("Nonexistent Title") }
505
- end
506
-
507
- def test_find_by_two_attributes
508
- assert_equal topics(:first), Topic.find_by_title_and_author_name("The First Topic", "David")
509
- assert_nil Topic.find_by_title_and_author_name("The First Topic", "Mary")
510
- end
511
-
512
- def test_find_all_by_one_attribute
513
- topics = Topic.find_all_by_content("Have a nice day")
514
- assert_equal 2, topics.size
515
- assert topics.include?(topics(:first))
516
-
517
- assert_equal [], Topic.find_all_by_title("The First Topic!!")
518
- end
519
-
520
- def test_find_all_by_one_attribute_that_is_an_aggregate
521
- balance = customers(:david).balance
522
- assert_kind_of Money, balance
523
- found_customers = Customer.find_all_by_balance(balance)
524
- assert_equal 1, found_customers.size
525
- assert_equal customers(:david), found_customers.first
526
- end
527
-
528
- def test_find_all_by_two_attributes_that_are_both_aggregates
529
- balance = customers(:david).balance
530
- address = customers(:david).address
531
- assert_kind_of Money, balance
532
- assert_kind_of Address, address
533
- found_customers = Customer.find_all_by_balance_and_address(balance, address)
534
- assert_equal 1, found_customers.size
535
- assert_equal customers(:david), found_customers.first
536
- end
537
-
538
- def test_find_all_by_two_attributes_with_one_being_an_aggregate
539
- balance = customers(:david).balance
540
- assert_kind_of Money, balance
541
- found_customers = Customer.find_all_by_balance_and_name(balance, customers(:david).name)
542
- assert_equal 1, found_customers.size
543
- assert_equal customers(:david), found_customers.first
544
- end
545
-
546
- def test_find_all_by_one_attribute_with_options
547
- topics = Topic.find_all_by_content("Have a nice day", :order => "id DESC")
548
- assert topics(:first), topics.last
549
-
550
- topics = Topic.find_all_by_content("Have a nice day", :order => "id")
551
- assert topics(:first), topics.first
552
- end
553
-
554
- def test_find_all_by_array_attribute
555
- assert_equal 2, Topic.find_all_by_title(["The First Topic", "The Second Topic of the day"]).size
556
- end
557
-
558
- def test_find_all_by_boolean_attribute
559
- topics = Topic.find_all_by_approved(false)
560
- assert_equal 1, topics.size
561
- assert topics.include?(topics(:first))
562
-
563
- topics = Topic.find_all_by_approved(true)
564
- assert_equal 3, topics.size
565
- assert topics.include?(topics(:second))
566
- end
567
-
568
- def test_find_by_nil_attribute
569
- topic = Topic.find_by_last_read nil
570
- assert_not_nil topic
571
- assert_nil topic.last_read
572
- end
573
-
574
- def test_find_all_by_nil_attribute
575
- topics = Topic.find_all_by_last_read nil
576
- assert_equal 3, topics.size
577
- assert topics.collect(&:last_read).all?(&:nil?)
578
- end
579
-
580
- def test_find_by_nil_and_not_nil_attributes
581
- topic = Topic.find_by_last_read_and_author_name nil, "Mary"
582
- assert_equal "Mary", topic.author_name
583
- end
584
-
585
- def test_find_all_by_nil_and_not_nil_attributes
586
- topics = Topic.find_all_by_last_read_and_author_name nil, "Mary"
587
- assert_equal 1, topics.size
588
- assert_equal "Mary", topics[0].author_name
589
- end
590
-
591
- def test_find_or_create_from_one_attribute
592
- number_of_companies = Company.count
593
- sig38 = Company.find_or_create_by_name("38signals")
594
- assert_equal number_of_companies + 1, Company.count
595
- assert_equal sig38, Company.find_or_create_by_name("38signals")
596
- assert !sig38.new_record?
597
- end
598
-
599
- def test_find_or_create_from_two_attributes
600
- number_of_topics = Topic.count
601
- another = Topic.find_or_create_by_title_and_author_name("Another topic","John")
602
- assert_equal number_of_topics + 1, Topic.count
603
- assert_equal another, Topic.find_or_create_by_title_and_author_name("Another topic", "John")
604
- assert !another.new_record?
605
- end
606
-
607
- def test_find_or_create_from_two_attributes_with_one_being_an_aggregate
608
- number_of_customers = Customer.count
609
- created_customer = Customer.find_or_create_by_balance_and_name(Money.new(123), "Elizabeth")
610
- assert_equal number_of_customers + 1, Customer.count
611
- assert_equal created_customer, Customer.find_or_create_by_balance(Money.new(123), "Elizabeth")
612
- assert !created_customer.new_record?
613
- end
614
-
615
- def test_find_or_create_from_one_attribute_and_hash
616
- number_of_companies = Company.count
617
- sig38 = Company.find_or_create_by_name({:name => "38signals", :firm_id => 17, :client_of => 23})
618
- assert_equal number_of_companies + 1, Company.count
619
- assert_equal sig38, Company.find_or_create_by_name({:name => "38signals", :firm_id => 17, :client_of => 23})
620
- assert !sig38.new_record?
621
- assert_equal "38signals", sig38.name
622
- assert_equal 17, sig38.firm_id
623
- assert_equal 23, sig38.client_of
624
- end
625
-
626
- def test_find_or_create_from_one_aggregate_attribute
627
- number_of_customers = Customer.count
628
- created_customer = Customer.find_or_create_by_balance(Money.new(123))
629
- assert_equal number_of_customers + 1, Customer.count
630
- assert_equal created_customer, Customer.find_or_create_by_balance(Money.new(123))
631
- assert !created_customer.new_record?
632
- end
633
-
634
- def test_find_or_create_from_one_aggregate_attribute_and_hash
635
- number_of_customers = Customer.count
636
- balance = Money.new(123)
637
- name = "Elizabeth"
638
- created_customer = Customer.find_or_create_by_balance({:balance => balance, :name => name})
639
- assert_equal number_of_customers + 1, Customer.count
640
- assert_equal created_customer, Customer.find_or_create_by_balance({:balance => balance, :name => name})
641
- assert !created_customer.new_record?
642
- assert_equal balance, created_customer.balance
643
- assert_equal name, created_customer.name
644
- end
645
-
646
- def test_find_or_initialize_from_one_attribute
647
- sig38 = Company.find_or_initialize_by_name("38signals")
648
- assert_equal "38signals", sig38.name
649
- assert sig38.new_record?
650
- end
651
-
652
- def test_find_or_initialize_from_one_aggregate_attribute
653
- new_customer = Customer.find_or_initialize_by_balance(Money.new(123))
654
- assert_equal 123, new_customer.balance.amount
655
- assert new_customer.new_record?
656
- end
657
-
658
- def test_find_or_initialize_from_one_attribute_should_not_set_attribute_even_when_protected
659
- c = Company.find_or_initialize_by_name({:name => "Fortune 1000", :rating => 1000})
660
- assert_equal "Fortune 1000", c.name
661
- assert_not_equal 1000, c.rating
662
- assert c.valid?
663
- assert c.new_record?
664
- end
665
-
666
- def test_find_or_create_from_one_attribute_should_set_not_attribute_even_when_protected
667
- c = Company.find_or_create_by_name({:name => "Fortune 1000", :rating => 1000})
668
- assert_equal "Fortune 1000", c.name
669
- assert_not_equal 1000, c.rating
670
- assert c.valid?
671
- assert !c.new_record?
672
- end
673
-
674
- def test_find_or_initialize_from_one_attribute_should_set_attribute_even_when_protected
675
- c = Company.find_or_initialize_by_name_and_rating("Fortune 1000", 1000)
676
- assert_equal "Fortune 1000", c.name
677
- assert_equal 1000, c.rating
678
- assert c.valid?
679
- assert c.new_record?
680
- end
681
-
682
- def test_find_or_create_from_one_attribute_should_set_attribute_even_when_protected
683
- c = Company.find_or_create_by_name_and_rating("Fortune 1000", 1000)
684
- assert_equal "Fortune 1000", c.name
685
- assert_equal 1000, c.rating
686
- assert c.valid?
687
- assert !c.new_record?
688
- end
689
-
690
- def test_find_or_initialize_should_set_protected_attributes_if_given_as_block
691
- c = Company.find_or_initialize_by_name(:name => "Fortune 1000") { |f| f.rating = 1000 }
692
- assert_equal "Fortune 1000", c.name
693
- assert_equal 1000.to_f, c.rating.to_f
694
- assert c.valid?
695
- assert c.new_record?
696
- end
697
-
698
- def test_find_or_create_should_set_protected_attributes_if_given_as_block
699
- c = Company.find_or_create_by_name(:name => "Fortune 1000") { |f| f.rating = 1000 }
700
- assert_equal "Fortune 1000", c.name
701
- assert_equal 1000.to_f, c.rating.to_f
702
- assert c.valid?
703
- assert !c.new_record?
704
- end
705
-
706
- def test_dynamic_find_or_initialize_from_one_attribute_caches_method
707
- class << Company; self; end.send(:remove_method, :find_or_initialize_by_name) if Company.public_methods.any? { |m| m.to_s == 'find_or_initialize_by_name' }
708
- assert !Company.public_methods.any? { |m| m.to_s == 'find_or_initialize_by_name' }
709
- sig38 = Company.find_or_initialize_by_name("38signals")
710
- assert Company.public_methods.any? { |m| m.to_s == 'find_or_initialize_by_name' }
711
- end
712
-
713
- def test_find_or_initialize_from_two_attributes
714
- another = Topic.find_or_initialize_by_title_and_author_name("Another topic","John")
715
- assert_equal "Another topic", another.title
716
- assert_equal "John", another.author_name
717
- assert another.new_record?
718
- end
719
-
720
- def test_find_or_initialize_from_one_aggregate_attribute_and_one_not
721
- new_customer = Customer.find_or_initialize_by_balance_and_name(Money.new(123), "Elizabeth")
722
- assert_equal 123, new_customer.balance.amount
723
- assert_equal "Elizabeth", new_customer.name
724
- assert new_customer.new_record?
725
- end
726
-
727
- def test_find_or_initialize_from_one_attribute_and_hash
728
- sig38 = Company.find_or_initialize_by_name({:name => "38signals", :firm_id => 17, :client_of => 23})
729
- assert_equal "38signals", sig38.name
730
- assert_equal 17, sig38.firm_id
731
- assert_equal 23, sig38.client_of
732
- assert sig38.new_record?
733
- end
734
-
735
- def test_find_or_initialize_from_one_aggregate_attribute_and_hash
736
- balance = Money.new(123)
737
- name = "Elizabeth"
738
- new_customer = Customer.find_or_initialize_by_balance({:balance => balance, :name => name})
739
- assert_equal balance, new_customer.balance
740
- assert_equal name, new_customer.name
741
- assert new_customer.new_record?
742
- end
743
-
744
- def test_find_with_bad_sql
745
- assert_raises(ActiveRecord::StatementInvalid) { Topic.find_by_sql "select 1 from badtable" }
746
- end
747
-
748
- def test_find_with_invalid_params
749
- assert_raises(ArgumentError) { Topic.find :first, :join => "It should be `joins'" }
750
- assert_raises(ArgumentError) { Topic.find :first, :conditions => '1 = 1', :join => "It should be `joins'" }
751
- end
752
-
753
- def test_dynamic_finder_with_invalid_params
754
- assert_raises(ArgumentError) { Topic.find_by_title 'No Title', :join => "It should be `joins'" }
755
- end
756
-
757
- def test_find_all_with_limit
758
- first_five_developers = Developer.find :all, :order => 'id ASC', :limit => 5
759
- assert_equal 5, first_five_developers.length
760
- assert_equal 'David', first_five_developers.first.name
761
- assert_equal 'fixture_5', first_five_developers.last.name
762
-
763
- no_developers = Developer.find :all, :order => 'id ASC', :limit => 0
764
- assert_equal 0, no_developers.length
765
- end
766
-
767
- def test_find_all_with_limit_and_offset
768
- first_three_developers = Developer.find :all, :order => 'id ASC', :limit => 3, :offset => 0
769
- second_three_developers = Developer.find :all, :order => 'id ASC', :limit => 3, :offset => 3
770
- last_two_developers = Developer.find :all, :order => 'id ASC', :limit => 2, :offset => 8
771
-
772
- assert_equal 3, first_three_developers.length
773
- assert_equal 3, second_three_developers.length
774
- assert_equal 2, last_two_developers.length
775
-
776
- assert_equal 'David', first_three_developers.first.name
777
- assert_equal 'fixture_4', second_three_developers.first.name
778
- assert_equal 'fixture_9', last_two_developers.first.name
779
- end
780
-
781
- def test_find_all_with_limit_and_offset_and_multiple_order_clauses
782
- first_three_posts = Post.find :all, :order => 'author_id, id', :limit => 3, :offset => 0
783
- second_three_posts = Post.find :all, :order => ' author_id,id ', :limit => 3, :offset => 3
784
- last_posts = Post.find :all, :order => ' author_id, id ', :limit => 3, :offset => 6
785
-
786
- assert_equal [[0,3],[1,1],[1,2]], first_three_posts.map { |p| [p.author_id, p.id] }
787
- assert_equal [[1,4],[1,5],[1,6]], second_three_posts.map { |p| [p.author_id, p.id] }
788
- assert_equal [[2,7]], last_posts.map { |p| [p.author_id, p.id] }
789
- end
790
-
791
- def test_find_all_with_join
792
- developers_on_project_one = Developer.find(
793
- :all,
794
- :joins => 'LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id',
795
- :conditions => 'project_id=1'
796
- )
797
- assert_equal 3, developers_on_project_one.length
798
- developer_names = developers_on_project_one.map { |d| d.name }
799
- assert developer_names.include?('David')
800
- assert developer_names.include?('Jamis')
801
- end
802
-
803
- def test_joins_dont_clobber_id
804
- first = Firm.find(
805
- :first,
806
- :joins => 'INNER JOIN companies AS clients ON clients.firm_id = companies.id',
807
- :conditions => 'companies.id = 1'
808
- )
809
- assert_equal 1, first.id
810
- end
811
-
812
- def test_find_by_id_with_conditions_with_or
813
- assert_nothing_raised do
814
- Post.find([1,2,3],
815
- :conditions => "posts.id <= 3 OR posts.#{QUOTED_TYPE} = 'Post'")
816
- end
817
- end
818
-
819
- # http://dev.rubyonrails.org/ticket/6778
820
- def test_find_ignores_previously_inserted_record
821
- post = Post.create!(:title => 'test', :body => 'it out')
822
- assert_equal [], Post.find_all_by_id(nil)
823
- end
824
-
825
- def test_find_by_empty_ids
826
- assert_equal [], Post.find([])
827
- end
828
-
829
- def test_find_by_empty_in_condition
830
- assert_equal [], Post.find(:all, :conditions => ['id in (?)', []])
831
- end
832
-
833
- def test_find_by_records
834
- p1, p2 = Post.find(:all, :limit => 2, :order => 'id asc')
835
- assert_equal [p1, p2], Post.find(:all, :conditions => ['id in (?)', [p1, p2]], :order => 'id asc')
836
- assert_equal [p1, p2], Post.find(:all, :conditions => ['id in (?)', [p1, p2.id]], :order => 'id asc')
837
- end
838
-
839
- def test_select_value
840
- assert_equal "37signals", Company.connection.select_value("SELECT name FROM companies WHERE id = 1")
841
- assert_nil Company.connection.select_value("SELECT name FROM companies WHERE id = -1")
842
- # make sure we didn't break count...
843
- assert_equal 0, Company.count_by_sql("SELECT COUNT(*) FROM companies WHERE name = 'Halliburton'")
844
- assert_equal 1, Company.count_by_sql("SELECT COUNT(*) FROM companies WHERE name = '37signals'")
845
- end
846
-
847
- def test_select_values
848
- assert_equal ["1","2","3","4","5","6","7","8","9"], Company.connection.select_values("SELECT id FROM companies ORDER BY id").map! { |i| i.to_s }
849
- assert_equal ["37signals","Summit","Microsoft", "Flamboyant Software", "Ex Nihilo", "RailsCore", "Leetsoft", "Jadedpixel", "Odegy"], Company.connection.select_values("SELECT name FROM companies ORDER BY id")
850
- end
851
-
852
- def test_select_rows
853
- assert_equal(
854
- [["1", nil, nil, "37signals"],
855
- ["2", "1", "2", "Summit"],
856
- ["3", "1", "1", "Microsoft"]],
857
- 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?}})
858
- assert_equal [["1", "37signals"], ["2", "Summit"], ["3", "Microsoft"]],
859
- 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?}}
860
- end
861
-
862
- unless current_adapter?(:IBM_DBAdapter)
863
- def test_find_with_order_on_included_associations_with_construct_finder_sql_for_association_limiting_and_is_distinct
864
- assert_equal 2, Post.find(:all, :include => { :authors => :author_address }, :order => ' author_addresses.id DESC ', :limit => 2).size
865
-
866
- assert_equal 3, Post.find(:all, :include => { :author => :author_address, :authors => :author_address},
867
- :order => ' author_addresses_authors.id DESC ', :limit => 3).size
868
- end
869
- end
870
-
871
- def test_with_limiting_with_custom_select
872
- posts = Post.find(:all, :include => :author, :select => ' posts.*, authors.id as "author_id"', :limit => 3, :order => 'posts.id')
873
- assert_equal 3, posts.size
874
- assert_equal [0, 1, 1], posts.map(&:author_id).sort
875
- end
876
-
877
- protected
878
- def bind(statement, *vars)
879
- if vars.first.is_a?(Hash)
880
- ActiveRecord::Base.send(:replace_named_bind_variables, statement, vars.first)
881
- else
882
- ActiveRecord::Base.send(:replace_bind_variables, statement, vars)
883
- end
884
- end
885
- end
899
+ end
900
+ end