From 39b305c0b7287689efadc94870ca5be3a189544f Mon Sep 17 00:00:00 2001 From: Yasuo Honda Date: Mon, 30 Aug 2021 20:20:00 +0900 Subject: [PATCH 1/4] Extract `list_tests` from `Rails::TestUnit::Runner.load_tests` This commit has been made for a future change for Active Record bin/test to run its own database adapter related tests. --- railties/lib/rails/test_unit/runner.rb | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/railties/lib/rails/test_unit/runner.rb b/railties/lib/rails/test_unit/runner.rb index ca6e52bf7a588..d6755c6ea8cfe 100644 --- a/railties/lib/rails/test_unit/runner.rb +++ b/railties/lib/rails/test_unit/runner.rb @@ -43,10 +43,7 @@ def run(argv = []) end def load_tests(argv) - patterns = extract_filters(argv) - - tests = Rake::FileList[patterns.any? ? patterns : default_test_glob] - tests.exclude(default_test_exclude_glob) if patterns.empty? + tests = list_tests(argv) tests.to_a.each { |path| require File.expand_path(path) } end @@ -94,6 +91,14 @@ def regexp_filter?(arg) def path_argument?(arg) %r"^[/\\]?\w+[/\\]".match?(arg) end + + def list_tests(argv) + patterns = extract_filters(argv) + + tests = Rake::FileList[patterns.any? ? patterns : default_test_glob] + tests.exclude(default_test_exclude_glob) if patterns.empty? + tests + end end end From a3f1eb5ebeee3791e70afd6b000555f0f3cbec88 Mon Sep 17 00:00:00 2001 From: Yasuo Honda Date: Mon, 30 Aug 2021 21:42:11 +0900 Subject: [PATCH 2/4] Active Record bin/test command runs only its own adapter tests There are two ways to run unit tests. `bundle exec rake test` and `bin/test`. Active Record `bundle exec rake test` only executes its own adapter specific tests. on the other hand, `bin/test` executes all adapter specfic tests then some test files need to have `if current_adapter?`, which can be removed. - Removed `require_relative "../../tools/test"` to require its own one - `default_test_exclude_glob` excludes all of adapter specific tests. - `list_tests(argv)` adds its own adapter specific tests - `adapter_short` method extracted to get the short hand adapter name like `sqlite3`, `mysql2` and `postgresql` via `ENV["ARCONN"]` --- activerecord/bin/test | 2 +- activerecord/test/support/tools.rb | 35 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 activerecord/test/support/tools.rb diff --git a/activerecord/bin/test b/activerecord/bin/test index 9ecf27ce67259..0c911085d76cf 100755 --- a/activerecord/bin/test +++ b/activerecord/bin/test @@ -8,7 +8,7 @@ if adapter_index end COMPONENT_ROOT = File.expand_path("..", __dir__) -require_relative "../../tools/test" +require_relative "../test/support/tools" module Minitest def self.plugin_active_record_options(opts, options) diff --git a/activerecord/test/support/tools.rb b/activerecord/test/support/tools.rb new file mode 100644 index 0000000000000..1004ae4a52a35 --- /dev/null +++ b/activerecord/test/support/tools.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +$: << File.expand_path("test", COMPONENT_ROOT) + +require "bundler/setup" + +require "rails/test_unit/runner" +require "rails/test_unit/reporter" +require "rails/test_unit/line_filtering" +require "active_support" +require "active_support/test_case" + +require "rake/testtask" +Rails::TestUnit::Runner.singleton_class.prepend Module.new { + private + def list_tests(argv) + tests = super + tests.concat FileList["test/cases/adapters/#{adapter_short}/**/*_test.rb"] + end + + def default_test_exclude_glob + ENV["DEFAULT_TEST_EXCLUDE"] || "test/cases/adapters/*/*_test.rb" + end + + def adapter_short + ENV["ARCONN"] || "sqlite3" + end + } + +ActiveSupport::TestCase.extend Rails::LineFiltering +Rails::TestUnitReporter.app_root = COMPONENT_ROOT +Rails::TestUnitReporter.executable = "bin/test" + +Rails::TestUnit::Runner.parse_options(ARGV) +Rails::TestUnit::Runner.run(ARGV) From c344d61e3fc500f220168e465c28edbc83b188ec Mon Sep 17 00:00:00 2001 From: Yasuo Honda Date: Mon, 30 Aug 2021 20:18:44 +0900 Subject: [PATCH 3/4] Remove `if current_adapter?(:PostgreSQLAdapter)` because Active Record `bin/test` only executes its own adapter tests. Test files under `test/cases/adapters` directory does not have to say `if current_adapter?` anymore. --- activerecord/test/cases/adapters/postgresql/datatype_test.rb | 2 +- activerecord/test/cases/adapters/postgresql/geometric_test.rb | 2 +- activerecord/test/cases/adapters/postgresql/interval_test.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/activerecord/test/cases/adapters/postgresql/datatype_test.rb b/activerecord/test/cases/adapters/postgresql/datatype_test.rb index ff9ac166a6f59..2cfa35760df6e 100644 --- a/activerecord/test/cases/adapters/postgresql/datatype_test.rb +++ b/activerecord/test/cases/adapters/postgresql/datatype_test.rb @@ -7,7 +7,7 @@ class PostgresqlTime < ActiveRecord::Base # Declare attributes to get rid from deprecation warnings on ActiveRecord 6.1 attribute :time_interval, :string attribute :scaled_time_interval, :interval -end if current_adapter?(:PostgreSQLAdapter) +end class PostgresqlOid < ActiveRecord::Base end diff --git a/activerecord/test/cases/adapters/postgresql/geometric_test.rb b/activerecord/test/cases/adapters/postgresql/geometric_test.rb index 1e4f741f5fe5d..f312b6e23d7a0 100644 --- a/activerecord/test/cases/adapters/postgresql/geometric_test.rb +++ b/activerecord/test/cases/adapters/postgresql/geometric_test.rb @@ -16,7 +16,7 @@ class PostgresqlPoint < ActiveRecord::Base attribute :legacy_x, :legacy_point attribute :legacy_y, :legacy_point attribute :legacy_z, :legacy_point - end if current_adapter?(:PostgreSQLAdapter) + end def setup @connection = ActiveRecord::Base.connection diff --git a/activerecord/test/cases/adapters/postgresql/interval_test.rb b/activerecord/test/cases/adapters/postgresql/interval_test.rb index fc134be532279..f6f53e68dae43 100644 --- a/activerecord/test/cases/adapters/postgresql/interval_test.rb +++ b/activerecord/test/cases/adapters/postgresql/interval_test.rb @@ -12,7 +12,7 @@ class IntervalDataType < ActiveRecord::Base attribute :default_term, :interval attribute :all_terms, :interval, array: true attribute :legacy_term, :string - end if current_adapter?(:PostgreSQLAdapter) + end class DeprecatedIntervalDataType < ActiveRecord::Base; end From 6d10aafce612c167ca82e761b3d42972c66f9ba3 Mon Sep 17 00:00:00 2001 From: Yasuo Honda Date: Tue, 21 Sep 2021 08:26:04 +0900 Subject: [PATCH 4/4] Rename `adapter_short` to `adapter_name` --- activerecord/test/support/tools.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/activerecord/test/support/tools.rb b/activerecord/test/support/tools.rb index 1004ae4a52a35..e546dcaa8b6e5 100644 --- a/activerecord/test/support/tools.rb +++ b/activerecord/test/support/tools.rb @@ -15,14 +15,14 @@ private def list_tests(argv) tests = super - tests.concat FileList["test/cases/adapters/#{adapter_short}/**/*_test.rb"] + tests.concat FileList["test/cases/adapters/#{adapter_name}/**/*_test.rb"] end def default_test_exclude_glob ENV["DEFAULT_TEST_EXCLUDE"] || "test/cases/adapters/*/*_test.rb" end - def adapter_short + def adapter_name ENV["ARCONN"] || "sqlite3" end }