diff options
Diffstat (limited to 'activerecord/test')
13 files changed, 243 insertions, 19 deletions
diff --git a/activerecord/test/cases/associations/has_and_belongs_to_many_associations_test.rb b/activerecord/test/cases/associations/has_and_belongs_to_many_associations_test.rb index 1bbca84bb2..e27f16b6e4 100644 --- a/activerecord/test/cases/associations/has_and_belongs_to_many_associations_test.rb +++ b/activerecord/test/cases/associations/has_and_belongs_to_many_associations_test.rb @@ -156,7 +156,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase      warning = capture(:stderr) do        country.treaties << treaty      end -    assert_no_match(/WARNING: Rails does not support composite primary key\./, warning) +    assert_no_match(/WARNING: Active Record does not support composite primary key\./, warning)    end    def test_has_and_belongs_to_many diff --git a/activerecord/test/cases/associations/has_many_associations_test.rb b/activerecord/test/cases/associations/has_many_associations_test.rb index 7ec0dfce7a..61a5c2c3b7 100644 --- a/activerecord/test/cases/associations/has_many_associations_test.rb +++ b/activerecord/test/cases/associations/has_many_associations_test.rb @@ -244,8 +244,9 @@ class HasManyAssociationsTest < ActiveRecord::TestCase    def test_do_not_call_callbacks_for_delete_all      car = Car.create(:name => 'honda')      car.funky_bulbs.create! +    assert_equal 1, car.funky_bulbs.count      assert_nothing_raised { car.reload.funky_bulbs.delete_all } -    assert_equal 0, Bulb.count, "bulbs should have been deleted using :delete_all strategy" +    assert_equal 0, car.funky_bulbs.count, "bulbs should have been deleted using :delete_all strategy"    end    def test_delete_all_on_association_is_the_same_as_not_loaded diff --git a/activerecord/test/cases/batches_test.rb b/activerecord/test/cases/batches_test.rb index db71840658..8a4c1bd615 100644 --- a/activerecord/test/cases/batches_test.rb +++ b/activerecord/test/cases/batches_test.rb @@ -68,10 +68,26 @@ class EachTest < ActiveRecord::TestCase      end    end -  def test_warn_if_limit_scope_is_set -    assert_called(ActiveRecord::Base.logger, :warn) do -      Post.limit(1).find_each { |post| post } +  test 'find_each should honor limit if passed a block' do +    limit = @total - 1 +    total = 0 + +    Post.limit(limit).find_each do |post| +      total += 1 +    end + +    assert_equal limit, total +  end + +  test 'find_each should honor limit if no block is passed' do +    limit = @total - 1 +    total = 0 + +    Post.limit(limit).find_each.each do |post| +      total += 1      end + +    assert_equal limit, total    end    def test_warn_if_order_scope_is_set @@ -84,7 +100,7 @@ class EachTest < ActiveRecord::TestCase      previous_logger = ActiveRecord::Base.logger      ActiveRecord::Base.logger = nil      assert_nothing_raised do -      Post.limit(1).find_each { |post| post } +      Post.order('comments_count DESC').find_each { |post| post }      end    ensure      ActiveRecord::Base.logger = previous_logger @@ -172,26 +188,26 @@ class EachTest < ActiveRecord::TestCase    def test_find_in_batches_should_not_error_if_config_overridden      # Set the config option which will be overridden -    prev = ActiveRecord::Base.error_on_ignored_order_or_limit -    ActiveRecord::Base.error_on_ignored_order_or_limit = true +    prev = ActiveRecord::Base.error_on_ignored_order +    ActiveRecord::Base.error_on_ignored_order = true      assert_nothing_raised do        PostWithDefaultScope.find_in_batches(error_on_ignore: false){}      end    ensure      # Set back to default -    ActiveRecord::Base.error_on_ignored_order_or_limit = prev +    ActiveRecord::Base.error_on_ignored_order = prev    end    def test_find_in_batches_should_error_on_config_specified_to_error      # Set the config option -    prev = ActiveRecord::Base.error_on_ignored_order_or_limit -    ActiveRecord::Base.error_on_ignored_order_or_limit = true +    prev = ActiveRecord::Base.error_on_ignored_order +    ActiveRecord::Base.error_on_ignored_order = true      assert_raise(ArgumentError) do        PostWithDefaultScope.find_in_batches(){}      end    ensure      # Set back to default -    ActiveRecord::Base.error_on_ignored_order_or_limit = prev +    ActiveRecord::Base.error_on_ignored_order = prev    end    def test_find_in_batches_should_not_error_by_default @@ -249,6 +265,28 @@ class EachTest < ActiveRecord::TestCase      end    end +  test 'find_in_batches should honor limit if passed a block' do +    limit = @total - 1 +    total = 0 + +    Post.limit(limit).find_in_batches do |batch| +      total += batch.size +    end + +    assert_equal limit, total +  end + +  test 'find_in_batches should honor limit if no block is passed' do +    limit = @total - 1 +    total = 0 + +    Post.limit(limit).find_in_batches.each do |batch| +      total += batch.size +    end + +    assert_equal limit, total +  end +    def test_in_batches_should_not_execute_any_query      assert_no_queries do        assert_kind_of ActiveRecord::Batches::BatchEnumerator, Post.in_batches(of: 2) @@ -486,4 +524,94 @@ class EachTest < ActiveRecord::TestCase        assert_equal 1, Post.find_in_batches(:batch_size => 10_000).size      end    end + +  [true, false].each do |load| +    test "in_batches should return limit records when limit is less than batch size and load is #{load}" do +      limit      = 3 +      batch_size = 5 +      total      = 0 + +      Post.limit(limit).in_batches(of: batch_size, load: load) do |batch| +        total += batch.count +      end + +      assert_equal limit, total +    end + +    test "in_batches should return limit records when limit is greater than batch size and load is #{load}" do +      limit      = 5 +      batch_size = 3 +      total      = 0 + +      Post.limit(limit).in_batches(of: batch_size, load: load) do |batch| +        total += batch.count +      end + +      assert_equal limit, total +    end + +    test "in_batches should return limit records when limit is a multiple of the batch size and load is #{load}" do +      limit      = 6 +      batch_size = 3 +      total      = 0 + +      Post.limit(limit).in_batches(of: batch_size, load: load) do |batch| +        total += batch.count +      end + +      assert_equal limit, total +    end + +    test "in_batches should return no records if the limit is 0 and load is #{load}" do +      limit      = 0 +      batch_size = 1 +      total      = 0 + +      Post.limit(limit).in_batches(of: batch_size, load: load) do |batch| +        total += batch.count +      end + +      assert_equal limit, total +    end + +    test "in_batches should return all if the limit is greater than the number of records when load is #{load}" do +      limit      = @total + 1 +      batch_size = 1 +      total      = 0 + +      Post.limit(limit).in_batches(of: batch_size, load: load) do |batch| +        total += batch.count +      end + +      assert_equal @total, total +    end +  end + +  test '.error_on_ignored_order_or_limit= is deprecated' do +    begin +      prev = ActiveRecord::Base.error_on_ignored_order +      assert_deprecated 'Please use error_on_ignored_order= instead.' do +        ActiveRecord::Base.error_on_ignored_order_or_limit = true +      end +      assert ActiveRecord::Base.error_on_ignored_order +    ensure +      ActiveRecord::Base.error_on_ignored_order = prev +    end +  end + +  test '.error_on_ignored_order_or_limit is deprecated' do +    expected = ActiveRecord::Base.error_on_ignored_order +    actual = assert_deprecated 'Please use error_on_ignored_order instead.' do +      ActiveRecord::Base.error_on_ignored_order_or_limit +    end +    assert_equal expected, actual +  end + +  test '#error_on_ignored_order_or_limit is deprecated' do +    expected = ActiveRecord::Base.error_on_ignored_order +    actual = assert_deprecated 'Please use error_on_ignored_order instead.' do +      Post.new.error_on_ignored_order_or_limit +    end +    assert_equal expected, actual +  end  end diff --git a/activerecord/test/cases/bind_parameter_test.rb b/activerecord/test/cases/bind_parameter_test.rb index fa924fe4cb..3f01885489 100644 --- a/activerecord/test/cases/bind_parameter_test.rb +++ b/activerecord/test/cases/bind_parameter_test.rb @@ -57,10 +57,13 @@ module ActiveRecord        end        def test_logs_bind_vars_after_type_cast +        binds = [Relation::QueryAttribute.new("id", "10", Type::Integer.new)] +        type_casted_binds = binds.map { |attr| type_cast(attr.value_for_database) }          payload = {            :name  => 'SQL',            :sql   => 'select * from topics where id = ?', -          :binds => [Relation::QueryAttribute.new("id", "10", Type::Integer.new)] +          :binds => binds, +          :type_casted_binds => type_casted_binds          }          event  = ActiveSupport::Notifications::Event.new(            'foo', @@ -84,6 +87,12 @@ module ActiveRecord          logger.sql event          assert_match([[@pk.name, 10]].inspect, logger.debugs.first)        end + +      private + +      def type_cast(value) +        ActiveRecord::Base.connection.type_cast(value) +      end      end    end  end diff --git a/activerecord/test/cases/calculations_test.rb b/activerecord/test/cases/calculations_test.rb index cfae700159..6acfec0621 100644 --- a/activerecord/test/cases/calculations_test.rb +++ b/activerecord/test/cases/calculations_test.rb @@ -1,4 +1,5 @@  require "cases/helper" +require "models/book"  require 'models/club'  require 'models/company'  require "models/contract" @@ -25,7 +26,7 @@ class NumericData < ActiveRecord::Base  end  class CalculationsTest < ActiveRecord::TestCase -  fixtures :companies, :accounts, :topics, :speedometers, :minivans +  fixtures :companies, :accounts, :topics, :speedometers, :minivans, :books    def test_should_sum_field      assert_equal 318, Account.sum(:credit_limit) @@ -793,4 +794,8 @@ class CalculationsTest < ActiveRecord::TestCase      assert_equal 50, result[1].credit_limit      assert_equal 50, result[2].credit_limit    end + +  def test_group_by_attribute_with_custom_type +    assert_equal({ "proposed" => 2, "published" => 2 }, Book.group(:status).count) +  end  end diff --git a/activerecord/test/cases/connection_pool_test.rb b/activerecord/test/cases/connection_pool_test.rb index 09e7848bda..bbcb42d58e 100644 --- a/activerecord/test/cases/connection_pool_test.rb +++ b/activerecord/test/cases/connection_pool_test.rb @@ -341,6 +341,18 @@ module ActiveRecord          end        end +      def test_connection_notification_is_called +        payloads = [] +        subscription = ActiveSupport::Notifications.subscribe('!connection.active_record') do |name, started, finished, unique_id, payload| +          payloads << payload +        end +        ActiveRecord::Base.establish_connection :arunit +        assert_equal [:config, :connection_id, :spec_name], payloads[0].keys.sort +        assert_equal 'primary', payloads[0][:spec_name] +      ensure +        ActiveSupport::Notifications.unsubscribe(subscription) if subscription +      end +        def test_pool_sets_connection_schema_cache          connection = pool.checkout          schema_cache = SchemaCache.new connection diff --git a/activerecord/test/cases/fixtures_test.rb b/activerecord/test/cases/fixtures_test.rb index 9455d4886c..df53bbf950 100644 --- a/activerecord/test/cases/fixtures_test.rb +++ b/activerecord/test/cases/fixtures_test.rb @@ -622,6 +622,46 @@ class TransactionalFixturesOnCustomConnectionTest < ActiveRecord::TestCase    end  end +class TransactionalFixturesOnConnectionNotification < ActiveRecord::TestCase +  self.use_transactional_tests = true +  self.use_instantiated_fixtures = false + +  def test_transaction_created_on_connection_notification +    connection = stub(:transaction_open? => false) +    connection.expects(:begin_transaction).with(joinable: false) +    fire_connection_notification(connection) +  end + +  def test_notification_established_transactions_are_rolled_back +    # Mocha is not thread-safe so define our own stub to test +    connection = Class.new do +      attr_accessor :rollback_transaction_called +      def transaction_open?; true; end +      def begin_transaction(*args); end +      def rollback_transaction(*args) +        @rollback_transaction_called = true +      end +    end.new +    fire_connection_notification(connection) +    teardown_fixtures +    assert(connection.rollback_transaction_called, "Expected <mock connection>#rollback_transaction to be called but was not") +  end + +  private + +    def fire_connection_notification(connection) +      ActiveRecord::Base.connection_handler.stubs(:retrieve_connection).with('book').returns(connection) +      message_bus = ActiveSupport::Notifications.instrumenter +      payload = { +        spec_name: 'book', +        config: nil, +        connection_id: connection.object_id +      } + +      message_bus.instrument('!connection.active_record', payload) {} +    end +end +  class InvalidTableNameFixturesTest < ActiveRecord::TestCase    fixtures :funny_jokes    # Set to false to blow away fixtures cache and ensure our fixtures are loaded diff --git a/activerecord/test/cases/migration/references_statements_test.rb b/activerecord/test/cases/migration/references_statements_test.rb index 70c64f3e71..5dddb35c4c 100644 --- a/activerecord/test/cases/migration/references_statements_test.rb +++ b/activerecord/test/cases/migration/references_statements_test.rb @@ -35,7 +35,7 @@ module ActiveRecord          assert_not index_exists?(table_name, :user_id)        end -      def test_create_reference_id_index_even_if_index_option_is_passed +      def test_create_reference_id_index_even_if_index_option_is_not_passed          add_reference table_name, :user          assert index_exists?(table_name, :user_id)        end diff --git a/activerecord/test/cases/multiparameter_attributes_test.rb b/activerecord/test/cases/multiparameter_attributes_test.rb index d05cb22740..59c340ceb7 100644 --- a/activerecord/test/cases/multiparameter_attributes_test.rb +++ b/activerecord/test/cases/multiparameter_attributes_test.rb @@ -202,6 +202,20 @@ class MultiParameterAttributeTest < ActiveRecord::TestCase      Topic.reset_column_information    end +  def test_multiparameter_attributes_on_time_with_time_zone_aware_attributes_and_invalid_time_params +    with_timezone_config aware_attributes: true do +      Topic.reset_column_information +      attributes = { +        "written_on(1i)" => "2004", "written_on(2i)" => "", "written_on(3i)" => "" +      } +      topic = Topic.find(1) +      topic.attributes = attributes +      assert_nil topic.written_on +    end +  ensure +    Topic.reset_column_information +  end +    def test_multiparameter_attributes_on_time_with_time_zone_aware_attributes_false      with_timezone_config default: :local, aware_attributes: false, zone: -28800 do        attributes = { diff --git a/activerecord/test/cases/primary_keys_test.rb b/activerecord/test/cases/primary_keys_test.rb index 4267ad4a24..ea36c199f4 100644 --- a/activerecord/test/cases/primary_keys_test.rb +++ b/activerecord/test/cases/primary_keys_test.rb @@ -255,6 +255,7 @@ class CompositePrimaryKeyTest < ActiveRecord::TestCase    def setup      @connection = ActiveRecord::Base.connection +    @connection.schema_cache.clear!      @connection.create_table(:barcodes, primary_key: ["region", "code"], force: true) do |t|        t.string :region        t.integer :code @@ -270,10 +271,15 @@ class CompositePrimaryKeyTest < ActiveRecord::TestCase    end    def test_primary_key_issues_warning +    model = Class.new(ActiveRecord::Base) do +      def self.table_name +        "barcodes" +      end +    end      warning = capture(:stderr) do -      assert_nil @connection.primary_key("barcodes") +      assert_nil model.primary_key      end -    assert_match(/WARNING: Rails does not support composite primary key\./, warning) +    assert_match(/WARNING: Active Record does not support composite primary key\./, warning)    end    def test_collectly_dump_composite_primary_key diff --git a/activerecord/test/cases/query_cache_test.rb b/activerecord/test/cases/query_cache_test.rb index 03ec063671..085636553e 100644 --- a/activerecord/test/cases/query_cache_test.rb +++ b/activerecord/test/cases/query_cache_test.rb @@ -6,6 +6,8 @@ require 'models/post'  require 'rack'  class QueryCacheTest < ActiveRecord::TestCase +  self.use_transactional_tests = false +    fixtures :tasks, :topics, :categories, :posts, :categories_posts    teardown do diff --git a/activerecord/test/cases/relation/mutation_test.rb b/activerecord/test/cases/relation/mutation_test.rb index ffb2da7a26..36cb898010 100644 --- a/activerecord/test/cases/relation/mutation_test.rb +++ b/activerecord/test/cases/relation/mutation_test.rb @@ -44,8 +44,8 @@ module ActiveRecord      end      test "#_select!" do -      assert relation.public_send("_select!", :foo).equal?(relation) -      assert_equal [:foo], relation.public_send("select_values") +      assert relation._select!(:foo).equal?(relation) +      assert_equal [:foo], relation.select_values      end      test '#order!' do diff --git a/activerecord/test/cases/scoping/named_scoping_test.rb b/activerecord/test/cases/scoping/named_scoping_test.rb index 0e277ed235..f0dac07acc 100644 --- a/activerecord/test/cases/scoping/named_scoping_test.rb +++ b/activerecord/test/cases/scoping/named_scoping_test.rb @@ -46,6 +46,13 @@ class NamedScopingTest < ActiveRecord::TestCase      assert_equal Topic.average(:replies_count), Topic.base.average(:replies_count)    end +  def test_calling_merge_at_first_in_scope +    Topic.class_eval do +      scope :calling_merge_at_first_in_scope, Proc.new { merge(Topic.replied) } +    end +    assert_equal Topic.calling_merge_at_first_in_scope.to_a, Topic.replied.to_a +  end +    def test_method_missing_priority_when_delegating      klazz = Class.new(ActiveRecord::Base) do        self.table_name = "topics"  | 
