2017-08-15 01:08:09 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2022-01-06 08:19:00 +08:00
|
|
|
require "shellwords"
|
2016-08-07 01:28:46 +08:00
|
|
|
require "rake/testtask"
|
2004-11-24 09:04:44 +08:00
|
|
|
|
2016-08-07 01:38:55 +08:00
|
|
|
task default: :test
|
2013-01-01 18:03:40 +08:00
|
|
|
|
2016-02-01 02:01:03 +08:00
|
|
|
task :package
|
|
|
|
|
2013-01-01 18:03:40 +08:00
|
|
|
desc "Run all unit tests"
|
2016-08-07 01:38:55 +08:00
|
|
|
task test: "test:isolated"
|
2007-09-26 09:24:07 +08:00
|
|
|
|
2009-11-11 08:50:15 +08:00
|
|
|
namespace :test do
|
|
|
|
task :isolated do
|
2019-04-09 11:24:58 +08:00
|
|
|
estimated_duration = {
|
2021-10-28 17:57:59 +08:00
|
|
|
"test/application/test_runner_test.rb" => 179,
|
|
|
|
"test/application/assets_test.rb" => 20,
|
|
|
|
"test/application/rake/migrations_test.rb" => 90,
|
|
|
|
"test/generators/scaffold_generator_test.rb" => 78,
|
|
|
|
"test/generators/plugin_test_runner_test.rb" => 73,
|
|
|
|
"test/application/test_test.rb" => 25,
|
|
|
|
"test/application/configuration_test.rb" => 106,
|
|
|
|
"test/generators/app_generator_test.rb" => 150,
|
|
|
|
"test/application/rake/dbs_test.rb" => 82,
|
2019-04-09 11:24:58 +08:00
|
|
|
"test/application/rake_test.rb" => 33,
|
2021-10-28 17:57:59 +08:00
|
|
|
"test/generators/plugin_generator_test.rb" => 37,
|
|
|
|
"test/railties/engine_test.rb" => 39,
|
|
|
|
"test/generators/scaffold_controller_generator_test.rb" => 27,
|
|
|
|
"test/railties/generators_test.rb" => 25,
|
|
|
|
"test/application/console_test.rb" => 20,
|
|
|
|
"test/engine/commands_test.rb" => 17,
|
|
|
|
"test/application/routing_test.rb" => 21,
|
|
|
|
"test/application/mailer_previews_test.rb" => 20,
|
|
|
|
"test/application/rake/multi_dbs_test.rb" => 100,
|
|
|
|
"test/application/asset_debugging_test.rb" => 5,
|
|
|
|
"test/application/bin_setup_test.rb" => 13,
|
|
|
|
"test/engine/test_test.rb" => 16,
|
|
|
|
"test/application/runner_test.rb" => 13,
|
|
|
|
"test/commands/routes_test.rb" => 7,
|
|
|
|
"test/application/initializers/i18n_test.rb" => 8,
|
|
|
|
"test/application/middleware/cache_test.rb" => 7,
|
|
|
|
"test/application/middleware_test.rb" => 10,
|
|
|
|
"test/generators/test_runner_in_engine_test.rb" => 7,
|
|
|
|
"test/application/initializers/frameworks_test.rb" => 18,
|
|
|
|
"test/application/middleware/exceptions_test.rb" => 12,
|
|
|
|
"test/application/content_security_policy_test.rb" => 5,
|
2019-04-09 11:24:58 +08:00
|
|
|
}
|
|
|
|
estimated_duration.default = 1
|
|
|
|
|
2017-09-02 21:15:16 +08:00
|
|
|
dash_i = [
|
|
|
|
"test",
|
|
|
|
"lib",
|
|
|
|
"../activesupport/lib",
|
|
|
|
"../actionpack/lib",
|
|
|
|
"../actionview/lib",
|
|
|
|
"../activemodel/lib"
|
|
|
|
].map { |dir| File.expand_path(dir, __dir__) }
|
|
|
|
|
|
|
|
dash_i.reverse_each do |x|
|
|
|
|
$:.unshift(x) unless $:.include?(x)
|
|
|
|
end
|
|
|
|
$-w = true
|
|
|
|
|
|
|
|
require "bundler/setup" unless defined?(Bundler)
|
|
|
|
require "active_support"
|
|
|
|
|
Make Webpacker the default JavaScript compiler for Rails 6 (#33079)
* Use Webpacker by default on new apps
* Stop including coffee-rails by default
* Drop using a js_compressor by default
* Drop extra test for coffeescript inclusion by default
* Stick with skip_javascript to signify skipping webpack
* Don't install a JS runtime by default any more
* app/javascript will be the new default directory for JS
* Make it clear that this is just for configuring the default Webpack framework setup now
* Start using the Webpack tag in the default layout
* Irrelevant test
* jQuery is long gone
* Stop having asset pipeline compile default application.js
* Add rails-ujs by default to the Webpack setup
* Add Active Storage JavaScript to application.js pack by default
* Consistent quoting
* Add Turbolinks to default pack
* Add Action Cable to default pack
Need some work on how to set the global consumer that channels will
work with. @javan?
* Require all channels by default and use a separate consumer stub
* Channel generator now targets Webpack style
* Update task docs to match new generator style
* Use uniform import style
* Drop the JS assets generator
It was barely helpful as it was. It’s no longer helpful in a Webpacked
world. Sayonara!
* Add app/javascript to the stats directories
* Simpler import style
Which match the other imports.
* Address test failures from dropping JS compilation (and compression)
* webpacker-default: Modify `AssetsGeneratorTest`
Before:
```
$ bin/test test/generators/assets_generator_test.rb
Run options: --seed 46201
F
Failure:
AssetsGeneratorTest#test_assets [/Users/ttanimichi/ghq/github.com/ttanimichi/rails/railties/test/generators/assets_generator_test.rb:12]:
Expected file "app/assets/javascripts/posts.js" to exist, but does not
bin/test /Users/ttanimichi/ghq/github.com/ttanimichi/rails/railties/test/generators/assets_generator_test.rb:10
.
Finished in 0.031343s, 63.8101 runs/s, 95.7152 assertions/s.
2 runs, 3 assertions, 1 failures, 0 errors, 0 skips
```
After:
```
$ bin/test test/generators/assets_generator_test.rb
Run options: --seed 43571
..
Finished in 0.030370s, 65.8545 runs/s, 65.8545 assertions/s.
2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
```
* webpacker-default: Modify `ChannelGeneratorTest`
Before:
```
$ bin/test test/generators/channel_generator_test.rb
Run options: --seed 8986
.F
Failure:
ChannelGeneratorTest#test_channel_with_multiple_actions_is_created [/Users/ttanimichi/ghq/github.com/ttanimichi/rails/railties/test/generators/channel_generator_test.rb:43]:
Expected file "app/assets/javascripts/channels/chat.js" to exist, but does not
bin/test /Users/ttanimichi/ghq/github.com/ttanimichi/rails/railties/test/generators/channel_generator_test.rb:34
.F
Failure:
ChannelGeneratorTest#test_channel_is_created [/Users/ttanimichi/ghq/github.com/ttanimichi/rails/railties/test/generators/channel_generator_test.rb:29]:
Expected file "app/assets/javascripts/channels/chat.js" to exist, but does not
bin/test /Users/ttanimichi/ghq/github.com/ttanimichi/rails/railties/test/generators/channel_generator_test.rb:22
E
Error:
ChannelGeneratorTest#test_cable_js_is_created_if_not_present_already:
Errno::ENOENT: No such file or directory @ apply2files - /Users/ttanimichi/ghq/github.com/ttanimichi/rails/railties/test/fixtures/tmp/app/assets/javascripts/cable.js
bin/test /Users/ttanimichi/ghq/github.com/ttanimichi/rails/railties/test/generators/channel_generator_test.rb:60
F
Failure:
ChannelGeneratorTest#test_channel_suffix_is_not_duplicated [/Users/ttanimichi/ghq/github.com/ttanimichi/rails/railties/test/generators/channel_generator_test.rb:87]:
Expected file "app/assets/javascripts/channels/chat.js" to exist, but does not
bin/test /Users/ttanimichi/ghq/github.com/ttanimichi/rails/railties/test/generators/channel_generator_test.rb:80
F
Failure:
ChannelGeneratorTest#test_channel_on_revoke [/Users/ttanimichi/ghq/github.com/ttanimichi/rails/railties/test/generators/channel_generator_test.rb:77]:
Expected file "app/assets/javascripts/cable.js" to exist, but does not
bin/test /Users/ttanimichi/ghq/github.com/ttanimichi/rails/railties/test/generators/channel_generator_test.rb:68
Finished in 0.064384s, 108.7227 runs/s, 481.4861 assertions/s.
7 runs, 31 assertions, 4 failures, 1 errors, 0 skips
```
After:
```
$ bin/test test/generators/channel_generator_test.rb
Run options: --seed 44857
.......
Finished in 0.060243s, 116.1961 runs/s, 697.1764 assertions/s.
7 runs, 42 assertions, 0 failures, 0 errors, 0 skips
```
* Fix shared generator tests.
* webpacker-default: Modify `ControllerGeneratorTest`
The JS assets generator was dropped. ref. https://github.com/rails/rails/commit/46215b179483d3e4d264555f5a4952f43eb8142a
* Revert "Simpler import style". It's currently failing with an error of "TypeError: undefined is not an object (evaluating '__WEBPACK_IMPORTED_MODULE_2_activestorage___default.a.start')". Waiting for @javan to have a look.
This reverts commit 5d3ebb71059f635d3756cbda4ab9752027e09256.
* require webpacker in test app
* Add webpacker without making the build hang/timeout. (#33640)
* use yarn workspaces to allow for installing unreleased packages and only generate js/bootsnap when required
* no longer need to have webpacker in env templates as webpacker moved this config to yml file
* Fix rubocop violation
* Got the test passing for the running scaffold
* update expected lines of code
* update middleware tests to account for webpacker
* disable js in plugins be default to get the tests passing (#34009)
* clear codeclimate report issues
* Anything newer than currently released is good
* Use Webpacker development version during development of Rails
* Edge should get development webpacker as well
* Add changelog entry for Webpacker change
2018-10-01 13:31:21 +08:00
|
|
|
# Only generate the template app once.
|
|
|
|
require_relative "test/isolation/abstract_unit"
|
|
|
|
|
2017-09-02 21:45:43 +08:00
|
|
|
failing_files = []
|
|
|
|
|
2013-04-08 18:16:33 +08:00
|
|
|
dirs = (ENV["TEST_DIR"] || ENV["TEST_DIRS"] || "**").split(",")
|
2018-07-01 05:43:58 +08:00
|
|
|
test_options = ENV["TESTOPTS"].to_s.split(/[\s]+/)
|
|
|
|
|
2019-02-05 22:50:06 +08:00
|
|
|
test_patterns = dirs.map { |dir| "test/#{dir}/*_test.rb" }
|
|
|
|
test_files = Dir[*test_patterns].select do |file|
|
2019-02-07 09:10:27 +08:00
|
|
|
!file.start_with?("test/fixtures/") && !file.start_with?("test/isolation/assets/")
|
2019-04-09 11:24:58 +08:00
|
|
|
end
|
2017-09-02 21:15:16 +08:00
|
|
|
|
2019-02-05 22:50:06 +08:00
|
|
|
if ENV["BUILDKITE_PARALLEL_JOB_COUNT"]
|
|
|
|
n = ENV["BUILDKITE_PARALLEL_JOB"].to_i
|
|
|
|
m = ENV["BUILDKITE_PARALLEL_JOB_COUNT"].to_i
|
|
|
|
|
2019-04-09 11:24:58 +08:00
|
|
|
buckets = Array.new(m) { [] }
|
|
|
|
allocations = Array.new(m) { 0 }
|
|
|
|
test_files.sort_by { |file| [-estimated_duration[file], file] }.each do |file|
|
|
|
|
idx = allocations.index(allocations.min)
|
|
|
|
buckets[idx] << file
|
|
|
|
allocations[idx] += estimated_duration[file]
|
|
|
|
end
|
|
|
|
|
|
|
|
puts "Running #{buckets[n].size} of #{test_files.size} test files, estimated duration #{allocations[n]}s"
|
|
|
|
|
|
|
|
test_files = buckets[n]
|
2019-02-05 22:50:06 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
test_files.each do |file|
|
|
|
|
puts "--- #{file}"
|
2017-09-02 21:15:16 +08:00
|
|
|
fake_command = Shellwords.join([
|
|
|
|
FileUtils::RUBY,
|
|
|
|
"-w",
|
|
|
|
*dash_i.map { |dir| "-I#{Pathname.new(dir).relative_path_from(Pathname.pwd)}" },
|
|
|
|
file,
|
|
|
|
])
|
|
|
|
puts fake_command
|
|
|
|
|
2019-04-27 06:22:29 +08:00
|
|
|
if Process.respond_to?(:fork)
|
|
|
|
# We could run these in parallel, but pretty much all of the
|
|
|
|
# railties tests already run in parallel, so ¯\_(⊙︿⊙)_/¯
|
|
|
|
Process.waitpid fork {
|
|
|
|
ARGV.clear.concat test_options
|
|
|
|
Rake.application = nil
|
|
|
|
|
|
|
|
load file
|
|
|
|
}
|
|
|
|
else
|
|
|
|
Process.wait spawn(fake_command)
|
|
|
|
end
|
2017-09-02 21:15:16 +08:00
|
|
|
|
|
|
|
unless $?.success?
|
2017-09-02 21:45:43 +08:00
|
|
|
failing_files << file
|
2019-02-05 22:50:06 +08:00
|
|
|
puts "^^^ +++"
|
2017-09-02 21:15:16 +08:00
|
|
|
end
|
2010-06-24 16:56:16 +08:00
|
|
|
end
|
2017-09-02 21:45:43 +08:00
|
|
|
|
2019-02-05 22:50:06 +08:00
|
|
|
puts "--- All tests completed"
|
2017-09-02 21:45:43 +08:00
|
|
|
unless failing_files.empty?
|
2019-02-05 22:50:06 +08:00
|
|
|
puts "^^^ +++"
|
2017-09-02 21:45:43 +08:00
|
|
|
puts
|
|
|
|
puts "Failed in:"
|
|
|
|
failing_files.each do |file|
|
|
|
|
puts " #{file}"
|
|
|
|
end
|
|
|
|
puts
|
|
|
|
|
2019-02-05 22:50:06 +08:00
|
|
|
exit 1
|
2017-09-02 21:45:43 +08:00
|
|
|
end
|
2009-11-11 08:50:15 +08:00
|
|
|
end
|
2006-11-02 11:34:03 +08:00
|
|
|
end
|
|
|
|
|
2016-08-07 01:28:46 +08:00
|
|
|
Rake::TestTask.new("test:regular") do |t|
|
2017-05-15 22:17:28 +08:00
|
|
|
t.libs << "test" << "#{__dir__}/../activesupport/lib"
|
2016-08-07 01:28:46 +08:00
|
|
|
t.pattern = "test/**/*_test.rb"
|
2018-05-24 04:52:15 +08:00
|
|
|
t.warning = true
|
2006-08-29 17:15:28 +08:00
|
|
|
t.verbose = true
|
2014-09-27 22:37:44 +08:00
|
|
|
t.ruby_opts = ["--dev"] if defined?(JRUBY_VERSION)
|
2006-08-29 17:15:28 +08:00
|
|
|
end
|