ibm_db 2.5.9-x86-mswin32-60 → 2.5.10-x86-mswin32-60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,6 +13,7 @@ require 'models/comment'
13
13
  require 'models/sponsor'
14
14
  require 'models/member'
15
15
  require 'models/essay'
16
+ require 'models/toy'
16
17
 
17
18
  class BelongsToAssociationsTest < ActiveRecord::TestCase
18
19
  fixtures :accounts, :companies, :developers, :projects, :topics,
@@ -300,6 +301,15 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
300
301
  assert_equal 1, Topic.find(topic.id)[:replies_count]
301
302
  end
302
303
 
304
+ def test_belongs_to_counter_when_update_column
305
+ topic = Topic.create!(:title => "37s")
306
+ topic.replies.create!(:title => "re: 37s", :content => "rails")
307
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
308
+
309
+ topic.update_column(:content, "rails is wonderfull")
310
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
311
+ end
312
+
303
313
  def test_assignment_before_child_saved
304
314
  final_cut = Client.new("name" => "Final Cut")
305
315
  firm = Firm.find(1)
@@ -347,6 +357,12 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
347
357
  assert_equal members(:groucho), sponsor.sponsorable
348
358
  end
349
359
 
360
+ def test_dont_find_target_when_foreign_key_is_null
361
+ tagging = taggings(:thinking_general)
362
+ queries = assert_sql { tagging.super_tag }
363
+ assert_equal 0, queries.length
364
+ end
365
+
350
366
  def test_field_name_same_as_foreign_key
351
367
  computer = Computer.find(1)
352
368
  assert_not_nil computer.developer, ":foreign key == attribute didn't lock up" # '
@@ -685,4 +701,11 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
685
701
  assert_equal nil, comment.reload.parent
686
702
  assert_equal 0, comments(:greetings).reload.children_count
687
703
  end
704
+
705
+ def test_polymorphic_with_custom_primary_key
706
+ toy = Toy.create!
707
+ sponsor = Sponsor.create!(:sponsorable => toy)
708
+
709
+ assert_equal toy, sponsor.reload.sponsorable
710
+ end
688
711
  end
@@ -8,10 +8,12 @@ require 'models/company'
8
8
  require 'models/topic'
9
9
  require 'models/reply'
10
10
  require 'models/person'
11
+ require 'models/vertex'
12
+ require 'models/edge'
11
13
 
12
14
  class CascadedEagerLoadingTest < ActiveRecord::TestCase
13
15
  fixtures :authors, :mixins, :companies, :posts, :topics, :accounts, :comments,
14
- :categorizations, :people, :categories
16
+ :categorizations, :people, :categories, :edges, :vertices
15
17
 
16
18
  def test_eager_association_loading_with_cascaded_two_levels
17
19
  authors = Author.find(:all, :include=>{:posts=>:comments}, :order=>"authors.id")
@@ -166,12 +168,6 @@ class CascadedEagerLoadingTest < ActiveRecord::TestCase
166
168
  authors[2].post_about_thinking.comments.first
167
169
  end
168
170
  end
169
- end
170
-
171
- require 'models/vertex'
172
- require 'models/edge'
173
- class CascadedEagerLoadingTest < ActiveRecord::TestCase
174
- fixtures :edges, :vertices
175
171
 
176
172
  def test_eager_association_loading_with_recursive_cascading_four_levels_has_many_through
177
173
  source = Vertex.find(:first, :include=>{:sinks=>{:sinks=>{:sinks=>:sinks}}}, :order => 'vertices.id')
@@ -23,7 +23,7 @@ require 'models/treaty'
23
23
  require 'active_support/core_ext/string/conversions'
24
24
 
25
25
  class ProjectWithAfterCreateHook < ActiveRecord::Base
26
- set_table_name 'projects'
26
+ self.table_name = 'projects'
27
27
  has_and_belongs_to_many :developers,
28
28
  :class_name => "DeveloperForProjectWithAfterCreateHook",
29
29
  :join_table => "developers_projects",
@@ -39,7 +39,7 @@ class ProjectWithAfterCreateHook < ActiveRecord::Base
39
39
  end
40
40
 
41
41
  class DeveloperForProjectWithAfterCreateHook < ActiveRecord::Base
42
- set_table_name 'developers'
42
+ self.table_name = 'developers'
43
43
  has_and_belongs_to_many :projects,
44
44
  :class_name => "ProjectWithAfterCreateHook",
45
45
  :join_table => "developers_projects",
@@ -48,7 +48,7 @@ class DeveloperForProjectWithAfterCreateHook < ActiveRecord::Base
48
48
  end
49
49
 
50
50
  class ProjectWithSymbolsForKeys < ActiveRecord::Base
51
- set_table_name 'projects'
51
+ self.table_name = 'projects'
52
52
  has_and_belongs_to_many :developers,
53
53
  :class_name => "DeveloperWithSymbolsForKeys",
54
54
  :join_table => :developers_projects,
@@ -57,7 +57,7 @@ class ProjectWithSymbolsForKeys < ActiveRecord::Base
57
57
  end
58
58
 
59
59
  class DeveloperWithSymbolsForKeys < ActiveRecord::Base
60
- set_table_name 'developers'
60
+ self.table_name = 'developers'
61
61
  has_and_belongs_to_many :projects,
62
62
  :class_name => "ProjectWithSymbolsForKeys",
63
63
  :join_table => :developers_projects,
@@ -66,7 +66,7 @@ class DeveloperWithSymbolsForKeys < ActiveRecord::Base
66
66
  end
67
67
 
68
68
  class DeveloperWithCounterSQL < ActiveRecord::Base
69
- set_table_name 'developers'
69
+ self.table_name = 'developers'
70
70
  has_and_belongs_to_many :projects,
71
71
  :class_name => "DeveloperWithCounterSQL",
72
72
  :join_table => "developers_projects",
@@ -77,7 +77,7 @@ end
77
77
 
78
78
  class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
79
79
  fixtures :accounts, :companies, :categories, :posts, :categories_posts, :developers, :projects, :developers_projects,
80
- :parrots, :pirates, :treasures, :price_estimates, :tags, :taggings
80
+ :parrots, :pirates, :parrots_pirates, :treasures, :price_estimates, :tags, :taggings
81
81
 
82
82
  def setup_data_for_habtm_case
83
83
  ActiveRecord::Base.connection.execute('delete from countries_treaties')
@@ -100,10 +100,13 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
100
100
  assert_equal 'c1', record[0]
101
101
  assert_equal 't1', record[1]
102
102
  end
103
-
103
+
104
104
  def test_proper_usage_of_primary_keys_and_join_table
105
105
  setup_data_for_habtm_case
106
106
 
107
+ assert_equal 'country_id', Country.primary_key
108
+ assert_equal 'treaty_id', Treaty.primary_key
109
+
107
110
  country = Country.first
108
111
  assert_equal 1, country.treaties.count
109
112
  end
@@ -442,6 +445,26 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
442
445
  assert david.projects(true).empty?
443
446
  end
444
447
 
448
+ def test_destroy_associations_destroys_multiple_associations
449
+ george = parrots(:george)
450
+ assert !george.pirates.empty?
451
+ assert !george.treasures.empty?
452
+
453
+ assert_no_difference "Pirate.count" do
454
+ assert_no_difference "Treasure.count" do
455
+ george.destroy_associations
456
+ end
457
+ end
458
+
459
+ join_records = Parrot.connection.select_all("SELECT * FROM parrots_pirates WHERE parrot_id = #{george.id}")
460
+ assert join_records.empty?
461
+ assert george.pirates(true).empty?
462
+
463
+ join_records = Parrot.connection.select_all("SELECT * FROM parrots_treasures WHERE parrot_id = #{george.id}")
464
+ assert join_records.empty?
465
+ assert george.treasures(true).empty?
466
+ end
467
+
445
468
  def test_deprecated_push_with_attributes_was_removed
446
469
  jamis = developers(:jamis)
447
470
  assert_raise(NoMethodError) do
@@ -647,6 +670,14 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
647
670
  assert_respond_to categories(:technology).select_testing_posts.find(:first), :correctness_marker
648
671
  end
649
672
 
673
+ def test_habtm_selects_all_columns_by_default
674
+ assert_equal Project.column_names.sort, developers(:david).projects.first.attributes.keys.sort
675
+ end
676
+
677
+ def test_habtm_respects_select_query_method
678
+ assert_equal ['id'], developers(:david).projects.select(:id).first.attributes.keys
679
+ end
680
+
650
681
  def test_join_table_alias
651
682
  assert_equal 3, Developer.find(:all, :include => {:projects => :developers}, :conditions => 'developers_projects_join.joined_on IS NOT NULL').size
652
683
  end
@@ -794,12 +825,11 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
794
825
  # clear cache possibly created by other tests
795
826
  david.projects.reset_column_information
796
827
 
797
- # One query for columns, one for primary key
798
- assert_queries(2) { david.projects.columns; david.projects.columns }
828
+ assert_queries(1) { david.projects.columns; david.projects.columns }
799
829
 
800
830
  ## and again to verify that reset_column_information clears the cache correctly
801
831
  david.projects.reset_column_information
802
- assert_queries(2) { david.projects.columns; david.projects.columns }
832
+ assert_queries(1) { david.projects.columns; david.projects.columns }
803
833
  end
804
834
 
805
835
  def test_attributes_are_being_set_when_initialized_from_habm_association_with_where_clause
@@ -403,7 +403,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
403
403
  end
404
404
 
405
405
  def test_has_many_through_polymorphic_has_one
406
- assert_equal Tagging.find(1,2).sort_by { |t| t.id }, authors(:david).tagging
406
+ assert_equal Tagging.find(1,2).sort_by { |t| t.id }, authors(:david).tagging.order(:id)
407
407
  end
408
408
 
409
409
  def test_has_many_through_polymorphic_has_many
@@ -455,7 +455,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
455
455
  end
456
456
 
457
457
  def test_has_many_through_uses_conditions_specified_on_the_has_many_association
458
- author = Author.find(:first)
458
+ author = Author.order(:id).first
459
459
  assert_present author.comments
460
460
  assert_blank author.nonexistant_comments
461
461
  end
@@ -652,7 +652,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
652
652
  end
653
653
 
654
654
  def test_preload_polymorph_many_types
655
- taggings = Tagging.find :all, :include => :taggable, :conditions => ['taggable_type != ?', 'FakeModel']
655
+ taggings = Tagging.find :all, :include => :taggable, :conditions => ['taggable_type != ?', 'FakeModel'], :order => 'id'
656
656
  assert_no_queries do
657
657
  taggings.first.taggable.id
658
658
  taggings[1].taggable.id
@@ -736,7 +736,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
736
736
  class_name = "PostWith#{association.to_s.classify}#{dependency.to_s.classify}"
737
737
  Post.find(post_id).update_column :type, class_name
738
738
  klass = Object.const_set(class_name, Class.new(ActiveRecord::Base))
739
- klass.set_table_name 'posts'
739
+ klass.table_name = 'posts'
740
740
  klass.send(association, association_name, :as => :taggable, :dependent => dependency)
741
741
  klass.find(post_id)
742
742
  end
@@ -30,9 +30,36 @@ class AttributeMethodsTest < ActiveRecord::TestCase
30
30
  t = Topic.new
31
31
  t.title = "hello there!"
32
32
  t.written_on = Time.now
33
+ t.author_name = ""
33
34
  assert t.attribute_present?("title")
34
35
  assert t.attribute_present?("written_on")
35
36
  assert !t.attribute_present?("content")
37
+ assert !t.attribute_present?("author_name")
38
+
39
+ end
40
+
41
+ def test_attribute_present_with_booleans
42
+ b1 = Boolean.new
43
+ b1.value = false
44
+ assert b1.attribute_present?(:value)
45
+
46
+ b2 = Boolean.new
47
+ b2.value = true
48
+ assert b2.attribute_present?(:value)
49
+
50
+ b3 = Boolean.new
51
+ assert !b3.attribute_present?(:value)
52
+
53
+ b4 = Boolean.new
54
+ b4.value = false
55
+ b4.save!
56
+ assert Boolean.find(b4.id).attribute_present?(:value)
57
+ end
58
+
59
+ def test_caching_nil_primary_key
60
+ klass = Class.new(Minimalistic)
61
+ klass.expects(:reset_primary_key).returns(nil).once
62
+ 2.times { klass.primary_key }
36
63
  end
37
64
 
38
65
  def test_attribute_keys_on_new_instance
@@ -90,6 +117,11 @@ class AttributeMethodsTest < ActiveRecord::TestCase
90
117
  assert !topic.respond_to?(:nothingness)
91
118
  end
92
119
 
120
+ def test_deprecated_underscore_method
121
+ topic = Topic.find(1)
122
+ assert_equal topic.title, assert_deprecated { topic._title }
123
+ end
124
+
93
125
  def test_respond_to_with_custom_primary_key
94
126
  keyboard = Keyboard.create
95
127
  assert_not_nil keyboard.key_number
@@ -109,6 +141,15 @@ class AttributeMethodsTest < ActiveRecord::TestCase
109
141
  assert_respond_to topic, :title
110
142
  end
111
143
 
144
+ # IRB inspects the return value of "MyModel.allocate"
145
+ # by inspecting it.
146
+ def test_allocated_object_can_be_inspected
147
+ topic = Topic.allocate
148
+ topic.instance_eval { @attributes = nil }
149
+ assert_nothing_raised { topic.inspect }
150
+ assert topic.inspect, "#<Topic not initialized>"
151
+ end
152
+
112
153
  def test_array_content
113
154
  topic = Topic.new
114
155
  topic.content = %w( one two three )
@@ -228,8 +269,14 @@ class AttributeMethodsTest < ActiveRecord::TestCase
228
269
  topic.send(:write_attribute, :title, "Still another topic")
229
270
  assert_equal "Still another topic", topic.title
230
271
 
231
- topic.send(:write_attribute, "title", "Still another topic: part 2")
272
+ topic[:title] = "Still another topic: part 2"
232
273
  assert_equal "Still another topic: part 2", topic.title
274
+
275
+ topic.send(:write_attribute, "title", "Still another topic: part 3")
276
+ assert_equal "Still another topic: part 3", topic.title
277
+
278
+ topic["title"] = "Still another topic: part 4"
279
+ assert_equal "Still another topic: part 4", topic.title
233
280
  end
234
281
 
235
282
  def test_read_attribute
@@ -282,6 +329,39 @@ class AttributeMethodsTest < ActiveRecord::TestCase
282
329
  # puts ""
283
330
  end
284
331
 
332
+ def test_overridden_write_attribute
333
+ topic = Topic.new
334
+ def topic.write_attribute(attr_name, value)
335
+ super(attr_name, value.downcase)
336
+ end
337
+
338
+ topic.send(:write_attribute, :title, "Yet another topic")
339
+ assert_equal "yet another topic", topic.title
340
+
341
+ topic[:title] = "Yet another topic: part 2"
342
+ assert_equal "yet another topic: part 2", topic.title
343
+
344
+ topic.send(:write_attribute, "title", "Yet another topic: part 3")
345
+ assert_equal "yet another topic: part 3", topic.title
346
+
347
+ topic["title"] = "Yet another topic: part 4"
348
+ assert_equal "yet another topic: part 4", topic.title
349
+ end
350
+
351
+ def test_overridden_read_attribute
352
+ topic = Topic.new
353
+ topic.title = "Stop changing the topic"
354
+ def topic.read_attribute(attr_name)
355
+ super(attr_name).upcase
356
+ end
357
+
358
+ assert_equal "STOP CHANGING THE TOPIC", topic.send(:read_attribute, "title")
359
+ assert_equal "STOP CHANGING THE TOPIC", topic["title"]
360
+
361
+ assert_equal "STOP CHANGING THE TOPIC", topic.send(:read_attribute, :title)
362
+ assert_equal "STOP CHANGING THE TOPIC", topic[:title]
363
+ end
364
+
285
365
  def test_read_overridden_attribute
286
366
  topic = Topic.new(:title => 'a')
287
367
  def topic.title() 'b' end
@@ -422,30 +502,6 @@ class AttributeMethodsTest < ActiveRecord::TestCase
422
502
  assert topic.is_test?
423
503
  end
424
504
 
425
- def test_kernel_methods_not_implemented_in_activerecord
426
- %w(test name display y).each do |method|
427
- assert !ActiveRecord::Base.instance_method_already_implemented?(method), "##{method} is defined"
428
- end
429
- end
430
-
431
- def test_defined_kernel_methods_implemented_in_model
432
- %w(test name display y).each do |method|
433
- klass = Class.new ActiveRecord::Base
434
- klass.class_eval "def #{method}() 'defined #{method}' end"
435
- assert klass.instance_method_already_implemented?(method), "##{method} is not defined"
436
- end
437
- end
438
-
439
- def test_defined_kernel_methods_implemented_in_model_abstract_subclass
440
- %w(test name display y).each do |method|
441
- abstract = Class.new ActiveRecord::Base
442
- abstract.class_eval "def #{method}() 'defined #{method}' end"
443
- abstract.abstract_class = true
444
- klass = Class.new abstract
445
- assert klass.instance_method_already_implemented?(method), "##{method} is not defined"
446
- end
447
- end
448
-
449
505
  def test_raises_dangerous_attribute_error_when_defining_activerecord_method_in_model
450
506
  %w(save create_or_update).each do |method|
451
507
  klass = Class.new ActiveRecord::Base
@@ -539,6 +595,17 @@ class AttributeMethodsTest < ActiveRecord::TestCase
539
595
  end
540
596
  end
541
597
 
598
+ def test_setting_time_zone_aware_read_attribute
599
+ utc_time = Time.utc(2008, 1, 1)
600
+ cst_time = utc_time.in_time_zone("Central Time (US & Canada)")
601
+ in_time_zone "Pacific Time (US & Canada)" do
602
+ record = @target.create(:written_on => cst_time).reload
603
+ assert_equal utc_time, record[:written_on]
604
+ assert_equal ActiveSupport::TimeZone["Pacific Time (US & Canada)"], record[:written_on].time_zone
605
+ assert_equal Time.utc(2007, 12, 31, 16), record[:written_on].time
606
+ end
607
+ end
608
+
542
609
  def test_setting_time_zone_aware_attribute_with_string
543
610
  utc_time = Time.utc(2008, 1, 1)
544
611
  (-11..13).each do |timezone_offset|
@@ -558,6 +625,7 @@ class AttributeMethodsTest < ActiveRecord::TestCase
558
625
  record = @target.new
559
626
  record.written_on = ' '
560
627
  assert_nil record.written_on
628
+ assert_nil record[:written_on]
561
629
  end
562
630
  end
563
631
 
@@ -599,7 +667,7 @@ class AttributeMethodsTest < ActiveRecord::TestCase
599
667
  topic = @target.new(:title => "The pros and cons of programming naked.")
600
668
  assert !topic.respond_to?(:title)
601
669
  exception = assert_raise(NoMethodError) { topic.title }
602
- assert_match %r(^Attempt to call private method), exception.message
670
+ assert exception.message.include?("private method")
603
671
  assert_equal "I'm private", topic.send(:title)
604
672
  end
605
673
 
@@ -609,7 +677,7 @@ class AttributeMethodsTest < ActiveRecord::TestCase
609
677
  topic = @target.new
610
678
  assert !topic.respond_to?(:title=)
611
679
  exception = assert_raise(NoMethodError) { topic.title = "Pants"}
612
- assert_match %r(^Attempt to call private method), exception.message
680
+ assert exception.message.include?("private method")
613
681
  topic.send(:title=, "Very large pants")
614
682
  end
615
683
 
@@ -619,7 +687,7 @@ class AttributeMethodsTest < ActiveRecord::TestCase
619
687
  topic = @target.new(:title => "Isaac Newton's pants")
620
688
  assert !topic.respond_to?(:title?)
621
689
  exception = assert_raise(NoMethodError) { topic.title? }
622
- assert_match %r(^Attempt to call private method), exception.message
690
+ assert exception.message.include?("private method")
623
691
  assert topic.send(:title?)
624
692
  end
625
693
 
@@ -650,19 +718,87 @@ class AttributeMethodsTest < ActiveRecord::TestCase
650
718
  assert_equal %w(preferences), Contact.serialized_attributes.keys
651
719
  end
652
720
 
721
+ def test_instance_method_should_be_defined_on_the_base_class
722
+ subklass = Class.new(Topic)
723
+
724
+ Topic.define_attribute_methods
725
+
726
+ instance = subklass.new
727
+ instance.id = 5
728
+ assert_equal 5, instance.id
729
+ assert subklass.method_defined?(:id), "subklass is missing id method"
730
+
731
+ Topic.undefine_attribute_methods
732
+
733
+ assert_equal 5, instance.id
734
+ assert subklass.method_defined?(:id), "subklass is missing id method"
735
+ end
736
+
737
+ def test_dispatching_column_attributes_through_method_missing_deprecated
738
+ Topic.define_attribute_methods
739
+
740
+ topic = Topic.new(:id => 5)
741
+ topic.id = 5
742
+
743
+ topic.method(:id).owner.send(:undef_method, :id)
744
+
745
+ assert_deprecated do
746
+ assert_equal 5, topic.id
747
+ end
748
+ ensure
749
+ Topic.undefine_attribute_methods
750
+ end
751
+
752
+ def test_read_attribute_with_nil_should_not_asplode
753
+ assert_equal nil, Topic.new.read_attribute(nil)
754
+ end
755
+
756
+ # If B < A, and A defines an accessor for 'foo', we don't want to override
757
+ # that by defining a 'foo' method in the generated methods module for B.
758
+ # (That module will be inserted between the two, e.g. [B, <GeneratedAttributes>, A].)
759
+ def test_inherited_custom_accessors
760
+ klass = Class.new(ActiveRecord::Base) do
761
+ self.table_name = "topics"
762
+ self.abstract_class = true
763
+ def title; "omg"; end
764
+ def title=(val); self.author_name = val; end
765
+ end
766
+ subklass = Class.new(klass)
767
+ [klass, subklass].each(&:define_attribute_methods)
768
+
769
+ topic = subklass.find(1)
770
+ assert_equal "omg", topic.title
771
+
772
+ topic.title = "lol"
773
+ assert_equal "lol", topic.author_name
774
+ end
775
+
776
+ def test_inherited_hook_removed
777
+ parent = Class.new(ActiveRecord::Base)
778
+ parent.table_name = "posts"
779
+ def parent.inherited(k)
780
+ end
781
+
782
+ klass = Class.new(parent)
783
+ assert_deprecated { klass.define_attribute_methods }
784
+ end
785
+
786
+ def test_setting_new_attributes_deprecated
787
+ t = Topic.new
788
+ assert_deprecated { t[:foo] = "bar" }
789
+ assert_equal "bar", t.foo
790
+ assert_equal "bar", t[:foo]
791
+ end
792
+
653
793
  private
654
794
  def cached_columns
655
- @cached_columns ||= (time_related_columns_on_topic + serialized_columns_on_topic).map(&:name)
795
+ @cached_columns ||= time_related_columns_on_topic.map(&:name)
656
796
  end
657
797
 
658
798
  def time_related_columns_on_topic
659
799
  Topic.columns.select { |c| c.type.in?([:time, :date, :datetime, :timestamp]) }
660
800
  end
661
801
 
662
- def serialized_columns_on_topic
663
- Topic.columns.select { |c| Topic.serialized_attributes.include?(c.name) }
664
- end
665
-
666
802
  def in_time_zone(zone)
667
803
  old_zone = Time.zone
668
804
  old_tz = ActiveRecord::Base.time_zone_aware_attributes