2019-05-03 06:17:27 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2023-09-07 13:46:23 +08:00
|
|
|
# The Rake tasks in this file are designed to be used inside the `discourse/discourse_test:release` image.
|
|
|
|
# Running it anywhere else is not supported.
|
|
|
|
|
|
|
|
def run_or_fail(command)
|
|
|
|
log(command)
|
|
|
|
pid = Process.spawn(command)
|
|
|
|
Process.wait(pid)
|
|
|
|
$?.exitstatus == 0
|
|
|
|
end
|
|
|
|
|
|
|
|
def log(message)
|
|
|
|
puts "[#{Time.now.strftime("%Y-%m-%d %H:%M:%S")}] #{message}"
|
|
|
|
end
|
|
|
|
|
|
|
|
def setup_postgres(skip_init:)
|
|
|
|
unless skip_init
|
|
|
|
log "Initializing postgres"
|
|
|
|
system("script/start_test_db.rb --skip-run", exception: true)
|
|
|
|
end
|
|
|
|
|
|
|
|
log "Starting postgres"
|
|
|
|
Process.spawn("script/start_test_db.rb --skip-setup --exec")
|
|
|
|
end
|
|
|
|
|
|
|
|
def setup_redis
|
|
|
|
log "Starting background redis"
|
|
|
|
data_directory = "#{Rails.root}/tmp/test_data/redis"
|
|
|
|
`rm -rf #{data_directory} && mkdir -p #{data_directory}`
|
|
|
|
Process.spawn("redis-server --dir #{data_directory} --port 1234")
|
|
|
|
end
|
|
|
|
|
|
|
|
def migrate_databases(parallel: false, load_plugins: false)
|
|
|
|
migrate_env = load_plugins ? "LOAD_PLUGINS=1" : "LOAD_PLUGINS=0"
|
|
|
|
|
|
|
|
success = run_or_fail("#{migrate_env} bundle exec rake db:migrate")
|
|
|
|
success &&= run_or_fail("#{migrate_env} bundle exec rake parallel:migrate") if parallel
|
|
|
|
success
|
|
|
|
end
|
|
|
|
|
|
|
|
desc "Setups up the test environment"
|
|
|
|
task "docker:test:setup" do
|
|
|
|
setup_redis
|
|
|
|
setup_postgres(skip_init: false)
|
|
|
|
migrate_databases(parallel: true, load_plugins: true)
|
|
|
|
end
|
|
|
|
|
2017-07-21 08:59:54 +08:00
|
|
|
# Environment Variables (specific to this rake task)
|
2017-08-22 20:47:29 +08:00
|
|
|
# => SKIP_LINT set to 1 to skip linting (eslint and rubocop)
|
|
|
|
# => SKIP_TESTS set to 1 to skip all tests
|
2017-07-26 21:07:46 +08:00
|
|
|
# => SKIP_CORE set to 1 to skip core tests (rspec and qunit)
|
|
|
|
# => SKIP_PLUGINS set to 1 to skip plugin tests (rspec and qunit)
|
2021-05-21 09:43:47 +08:00
|
|
|
# => SKIP_INSTALL_PLUGINS comma separated list of plugins you want to skip installing
|
2017-07-21 08:59:54 +08:00
|
|
|
# => INSTALL_OFFICIAL_PLUGINS set to 1 to install all core plugins before running tests
|
2023-03-16 05:33:47 +08:00
|
|
|
# => RUN_SYSTEM_TESTS set to 1 to run the system tests as well
|
2017-07-21 08:59:54 +08:00
|
|
|
# => RUBY_ONLY set to 1 to skip all qunit tests
|
2017-07-26 21:07:46 +08:00
|
|
|
# => JS_ONLY set to 1 to skip all rspec tests
|
|
|
|
# => SINGLE_PLUGIN set to plugin name to only run plugin-specific rspec tests (you'll probably want to SKIP_CORE as well)
|
|
|
|
# => BISECT set to 1 to run rspec --bisect (applies to core rspec tests only)
|
|
|
|
# => RSPEC_SEED set to seed to use for rspec tests (applies to core rspec tests only)
|
2018-04-11 14:39:39 +08:00
|
|
|
# => PAUSE_ON_TERMINATE set to 1 to pause prior to terminating redis and pg
|
2019-03-19 00:39:25 +08:00
|
|
|
# => JS_TIMEOUT set timeout for qunit tests in ms
|
2019-10-26 03:31:05 +08:00
|
|
|
# => WARMUP_TMP_FOLDER runs a single spec to warmup the tmp folder and obtain accurate results when profiling specs.
|
2017-07-21 08:59:54 +08:00
|
|
|
#
|
|
|
|
# Other useful environment variables (not specific to this rake task)
|
|
|
|
# => COMMIT_HASH used by the discourse_test docker image to load a specific commit of discourse
|
|
|
|
# this can also be set to a branch, e.g. "origin/tests-passed"
|
|
|
|
#
|
|
|
|
# Example usage:
|
2017-07-26 21:07:46 +08:00
|
|
|
# Run all core and plugin tests:
|
2017-07-21 08:59:54 +08:00
|
|
|
# docker run discourse/discourse_test:release
|
2017-07-25 14:27:09 +08:00
|
|
|
# Run only rspec tests:
|
2017-07-21 08:59:54 +08:00
|
|
|
# docker run -e RUBY_ONLY=1 discourse/discourse_test:release
|
2017-07-26 21:07:46 +08:00
|
|
|
# Run all plugin tests (with a plugin mounted from host filesystem):
|
|
|
|
# docker run -e SKIP_CORE=1 -v $(pwd)/my-awesome-plugin:/var/www/discourse/plugins/my-awesome-plugin discourse/discourse_test:release
|
|
|
|
# Run tests for a specific plugin (with a plugin mounted from host filesystem):
|
|
|
|
# docker run -e SKIP_CORE=1 SINGLE_PLUGIN='my-awesome-plugin' -v $(pwd)/my-awesome-plugin:/var/www/discourse/plugins/my-awesome-plugin discourse/discourse_test:release
|
2014-06-18 15:31:25 +08:00
|
|
|
desc "Run all tests (JS and code in a standalone environment)"
|
|
|
|
task "docker:test" do
|
2023-09-07 13:46:23 +08:00
|
|
|
def run_or_fail_prettier(*patterns)
|
|
|
|
if patterns.any? { |p| Dir[p].any? }
|
|
|
|
patterns = patterns.map { |p| "'#{p}'" }.join(" ")
|
|
|
|
run_or_fail("yarn pprettier --list-different #{patterns}")
|
|
|
|
else
|
|
|
|
puts "Skipping prettier. Pattern not found."
|
|
|
|
true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-06-18 15:31:25 +08:00
|
|
|
begin
|
2017-08-22 20:47:29 +08:00
|
|
|
@good = true
|
2022-08-09 19:28:52 +08:00
|
|
|
@good &&= run_or_fail("yarn install")
|
2021-06-03 02:29:47 +08:00
|
|
|
|
2017-08-22 20:47:29 +08:00
|
|
|
unless ENV["SKIP_LINT"]
|
2018-06-08 17:49:31 +08:00
|
|
|
puts "Running linters/prettyfiers"
|
2018-08-30 15:55:36 +08:00
|
|
|
puts "eslint #{`yarn eslint -v`}"
|
|
|
|
puts "prettier #{`yarn prettier -v`}"
|
2018-06-21 00:34:49 +08:00
|
|
|
|
2017-08-22 20:47:29 +08:00
|
|
|
if ENV["SINGLE_PLUGIN"]
|
|
|
|
@good &&= run_or_fail("bundle exec rubocop --parallel plugins/#{ENV["SINGLE_PLUGIN"]}")
|
2020-06-04 03:35:08 +08:00
|
|
|
@good &&=
|
|
|
|
run_or_fail(
|
|
|
|
"bundle exec ruby script/i18n_lint.rb plugins/#{ENV["SINGLE_PLUGIN"]}/config/locales/{client,server}.en.yml",
|
2021-11-18 03:52:22 +08:00
|
|
|
)
|
|
|
|
@good &&=
|
|
|
|
run_or_fail(
|
|
|
|
"yarn eslint --ext .js,.js.es6 --no-error-on-unmatched-pattern plugins/#{ENV["SINGLE_PLUGIN"]}",
|
2023-01-09 20:10:19 +08:00
|
|
|
)
|
|
|
|
|
2018-06-08 23:38:29 +08:00
|
|
|
puts "Listing prettier offenses in #{ENV["SINGLE_PLUGIN"]}:"
|
2020-08-20 18:36:52 +08:00
|
|
|
@good &&=
|
|
|
|
run_or_fail_prettier(
|
|
|
|
"plugins/#{ENV["SINGLE_PLUGIN"]}/**/*.scss",
|
|
|
|
"plugins/#{ENV["SINGLE_PLUGIN"]}/**/*.{js,es6}",
|
|
|
|
)
|
2017-08-22 20:47:29 +08:00
|
|
|
else
|
2019-06-15 01:50:15 +08:00
|
|
|
@good &&= run_or_fail("bundle exec rake plugin:update_all") unless ENV["SKIP_PLUGINS"]
|
2017-08-22 20:47:29 +08:00
|
|
|
@good &&= run_or_fail("bundle exec rubocop --parallel") unless ENV["SKIP_CORE"]
|
2018-08-30 15:55:36 +08:00
|
|
|
@good &&= run_or_fail("yarn eslint app/assets/javascripts") unless ENV["SKIP_CORE"]
|
2021-11-18 03:52:22 +08:00
|
|
|
@good &&=
|
|
|
|
run_or_fail(
|
|
|
|
"yarn eslint --ext .js,.js.es6 --no-error-on-unmatched-pattern plugins",
|
|
|
|
) unless ENV["SKIP_PLUGINS"]
|
2023-01-09 20:10:19 +08:00
|
|
|
|
2020-06-04 03:35:08 +08:00
|
|
|
@good &&=
|
|
|
|
run_or_fail(
|
|
|
|
'bundle exec ruby script/i18n_lint.rb "config/locales/{client,server}.en.yml"',
|
|
|
|
) unless ENV["SKIP_CORE"]
|
|
|
|
@good &&=
|
|
|
|
run_or_fail(
|
|
|
|
'bundle exec ruby script/i18n_lint.rb "plugins/**/locales/{client,server}.en.yml"',
|
|
|
|
) unless ENV["SKIP_PLUGINS"]
|
|
|
|
|
2018-06-08 23:38:29 +08:00
|
|
|
unless ENV["SKIP_CORE"]
|
|
|
|
puts "Listing prettier offenses in core:"
|
2022-07-07 13:29:14 +08:00
|
|
|
@good &&=
|
|
|
|
run_or_fail(
|
|
|
|
'yarn pprettier --list-different "app/assets/stylesheets/**/*.scss" "app/assets/javascripts/**/*.js"',
|
|
|
|
)
|
2018-06-08 23:38:29 +08:00
|
|
|
end
|
2018-06-08 17:49:31 +08:00
|
|
|
|
2018-06-08 23:38:29 +08:00
|
|
|
unless ENV["SKIP_PLUGINS"]
|
|
|
|
puts "Listing prettier offenses in plugins:"
|
2022-07-07 13:29:14 +08:00
|
|
|
@good &&=
|
|
|
|
run_or_fail(
|
|
|
|
'yarn pprettier --list-different "plugins/**/assets/stylesheets/**/*.scss" "plugins/**/assets/javascripts/**/*.{js,es6}"',
|
|
|
|
)
|
2018-06-08 23:38:29 +08:00
|
|
|
end
|
2017-08-22 20:47:29 +08:00
|
|
|
end
|
|
|
|
end
|
2014-06-19 13:11:55 +08:00
|
|
|
|
2017-08-22 20:47:29 +08:00
|
|
|
unless ENV["SKIP_TESTS"]
|
2023-09-07 13:46:23 +08:00
|
|
|
@redis_pid = setup_redis
|
|
|
|
@pg_pid = setup_postgres(skip_init: ENV["SKIP_DB_CREATE"].present?)
|
2017-07-20 00:17:18 +08:00
|
|
|
|
2017-08-22 20:47:29 +08:00
|
|
|
ENV["RAILS_ENV"] = "test"
|
2019-03-21 09:50:16 +08:00
|
|
|
# this shaves all the creation of the multisite db off
|
|
|
|
# for js tests
|
|
|
|
ENV["SKIP_MULTISITE"] = "1" if ENV["JS_ONLY"]
|
2017-07-20 00:17:18 +08:00
|
|
|
|
2022-03-21 20:21:06 +08:00
|
|
|
@good &&= run_or_fail("bundle exec rake db:create") unless ENV["SKIP_DB_CREATE"]
|
2019-06-26 23:54:39 +08:00
|
|
|
|
2019-07-09 02:27:51 +08:00
|
|
|
@good &&= run_or_fail("bundle exec rake parallel:create") if ENV["USE_TURBO"]
|
2018-06-07 16:15:12 +08:00
|
|
|
|
2018-10-23 05:30:33 +08:00
|
|
|
if ENV["INSTALL_OFFICIAL_PLUGINS"]
|
|
|
|
@good &&= run_or_fail("bundle exec rake plugin:install_all_official")
|
|
|
|
end
|
|
|
|
|
2019-06-13 21:58:57 +08:00
|
|
|
@good &&= run_or_fail("bundle exec rake plugin:update_all") if ENV["UPDATE_ALL_PLUGINS"]
|
|
|
|
|
2020-06-05 23:59:23 +08:00
|
|
|
if skip_install = ENV["SKIP_INSTALL_PLUGINS"]
|
|
|
|
skip_install
|
|
|
|
.split(",")
|
|
|
|
.map(&:strip)
|
|
|
|
.each do |plugin|
|
|
|
|
puts "[SKIP_INSTALL_PLUGINS] Removing #{plugin}"
|
|
|
|
`rm -fr plugins/#{plugin}`
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-09-07 13:46:23 +08:00
|
|
|
@good &&= migrate_databases(parallel: ENV["USE_TURBO"], load_plugins: !ENV["SKIP_PLUGINS"])
|
2018-06-07 15:20:06 +08:00
|
|
|
|
2018-09-12 23:43:21 +08:00
|
|
|
unless ENV["JS_ONLY"]
|
2019-10-26 03:31:05 +08:00
|
|
|
if ENV["WARMUP_TMP_FOLDER"]
|
2019-11-14 05:34:10 +08:00
|
|
|
run_or_fail("bundle exec rspec ./spec/requests/groups_controller_spec.rb")
|
2019-10-26 03:31:05 +08:00
|
|
|
end
|
|
|
|
|
2017-08-22 20:47:29 +08:00
|
|
|
unless ENV["SKIP_CORE"]
|
|
|
|
params = []
|
2019-06-27 00:04:29 +08:00
|
|
|
|
|
|
|
unless ENV["USE_TURBO"]
|
|
|
|
params << "--profile"
|
|
|
|
params << "--fail-fast"
|
|
|
|
params << "--bisect" if ENV["BISECT"]
|
|
|
|
params << "--seed #{ENV["RSPEC_SEED"]}" if ENV["RSPEC_SEED"]
|
2017-08-22 20:47:29 +08:00
|
|
|
end
|
2019-03-01 05:36:22 +08:00
|
|
|
|
2019-06-26 23:54:39 +08:00
|
|
|
if ENV["USE_TURBO"]
|
2020-08-08 00:04:55 +08:00
|
|
|
@good &&=
|
|
|
|
run_or_fail("bundle exec ./bin/turbo_rspec --verbose #{params.join(" ")}".strip)
|
2019-06-26 23:54:39 +08:00
|
|
|
else
|
|
|
|
@good &&= run_or_fail("bundle exec rspec #{params.join(" ")}".strip)
|
|
|
|
end
|
2023-03-16 05:33:47 +08:00
|
|
|
|
2023-03-18 02:20:49 +08:00
|
|
|
if ENV["RUN_SYSTEM_TESTS"]
|
|
|
|
@good &&= run_or_fail("bin/ember-cli --build")
|
2023-05-03 01:12:03 +08:00
|
|
|
@good &&= run_or_fail("timeout --verbose 1800 bundle exec rspec spec/system")
|
2023-03-18 02:20:49 +08:00
|
|
|
end
|
2017-07-21 08:59:54 +08:00
|
|
|
end
|
2017-07-25 14:27:09 +08:00
|
|
|
|
2017-08-22 20:47:29 +08:00
|
|
|
unless ENV["SKIP_PLUGINS"]
|
|
|
|
if ENV["SINGLE_PLUGIN"]
|
|
|
|
@good &&= run_or_fail("bundle exec rake plugin:spec['#{ENV["SINGLE_PLUGIN"]}']")
|
|
|
|
else
|
2019-11-23 02:27:47 +08:00
|
|
|
fail_fast = "RSPEC_FAILFAST=1" unless ENV["SKIP_FAILFAST"]
|
|
|
|
@good &&= run_or_fail("#{fail_fast} bundle exec rake plugin:spec")
|
2017-08-22 20:47:29 +08:00
|
|
|
end
|
2023-03-16 05:33:47 +08:00
|
|
|
|
|
|
|
if ENV["RUN_SYSTEM_TESTS"]
|
2023-05-02 02:23:48 +08:00
|
|
|
@good &&=
|
|
|
|
run_or_fail(
|
2023-05-03 01:12:03 +08:00
|
|
|
"LOAD_PLUGINS=1 timeout --verbose 1600 bundle exec rspec plugins/*/spec/system".strip,
|
2023-05-02 02:23:48 +08:00
|
|
|
)
|
2023-03-16 05:33:47 +08:00
|
|
|
end
|
2017-08-22 20:47:29 +08:00
|
|
|
end
|
2017-07-26 21:07:46 +08:00
|
|
|
end
|
2017-07-27 23:29:18 +08:00
|
|
|
|
2017-08-22 20:47:29 +08:00
|
|
|
unless ENV["RUBY_ONLY"]
|
2019-03-19 00:39:25 +08:00
|
|
|
js_timeout = ENV["JS_TIMEOUT"].presence || 900_000 # 15 minutes
|
|
|
|
|
2017-08-22 20:47:29 +08:00
|
|
|
unless ENV["SKIP_CORE"]
|
2022-10-26 19:00:35 +08:00
|
|
|
@good &&=
|
|
|
|
run_or_fail(
|
|
|
|
"cd app/assets/javascripts/discourse && CI=1 yarn ember exam --load-balance --parallel=3 --random",
|
|
|
|
)
|
2017-08-22 20:47:29 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
unless ENV["SKIP_PLUGINS"]
|
|
|
|
if ENV["SINGLE_PLUGIN"]
|
2022-06-20 22:33:05 +08:00
|
|
|
@good &&=
|
|
|
|
run_or_fail(
|
|
|
|
"CI=1 bundle exec rake plugin:qunit['#{ENV["SINGLE_PLUGIN"]}','#{js_timeout}']",
|
|
|
|
)
|
2017-08-22 20:47:29 +08:00
|
|
|
else
|
2022-06-20 22:33:05 +08:00
|
|
|
@good &&= run_or_fail("CI=1 bundle exec rake plugin:qunit['*','#{js_timeout}']")
|
2021-04-30 01:51:34 +08:00
|
|
|
end
|
|
|
|
end
|
2017-08-22 20:47:29 +08:00
|
|
|
end
|
2014-06-20 07:27:09 +08:00
|
|
|
end
|
2014-06-18 15:31:25 +08:00
|
|
|
ensure
|
|
|
|
puts "Terminating"
|
|
|
|
|
2018-04-11 14:39:39 +08:00
|
|
|
if ENV["PAUSE_ON_TERMINATE"]
|
|
|
|
puts "Pausing prior to termination"
|
2018-04-11 14:46:27 +08:00
|
|
|
sleep
|
2018-04-11 14:39:39 +08:00
|
|
|
end
|
|
|
|
|
2017-08-22 20:47:29 +08:00
|
|
|
Process.kill("TERM", @redis_pid) if @redis_pid
|
|
|
|
Process.kill("TERM", @pg_pid) if @pg_pid
|
|
|
|
Process.wait @redis_pid if @redis_pid
|
|
|
|
Process.wait @pg_pid if @pg_pid
|
2014-06-18 15:31:25 +08:00
|
|
|
end
|
|
|
|
|
2021-06-03 02:29:47 +08:00
|
|
|
exit 1 unless @good
|
2014-06-18 15:31:25 +08:00
|
|
|
end
|