discourse/lib/tasks/qunit.rake
Loïc Guitaut 301713ef96 DEV: Upgrade the MessageFormat library (JS)
This patch upgrades the MessageFormat library to version 3.3.0 from
0.1.5.

Our `I18n.messageFormat` method signature is unchanged, and now uses the
new API under the hood.

We don’t need dedicated locale files for handling pluralization rules
anymore as everything is now included by the library itself.

The compilation of the messages now happens through our
`messageformat-wrapper` gem. It then outputs an ES module that includes
all its needed dependencies.

Most of the changes happen in `JsLocaleHelper` and in the `ExtraLocales`
controller.

A new method called `.output_MF` has been introduced in
`JsLocaleHelper`. It handles all the fetching, compiling and
transpiling to generate the proper MF messages in JS. Overrides and
fallbacks are also handled directly in this method.

The other main change is that now the MF translations are served through
the `ExtraLocales` controller instead of being statically compiled in a
JS file, then having to patch the messages using overrides and
fallbacks. Now the MF translations are just another bundle that is
created on the fly and cached by the client.
2024-07-10 09:51:25 +02:00

154 lines
4.0 KiB
Ruby

# frozen_string_literal: true
desc "Runs the qunit test suite"
task "qunit:test", %i[timeout qunit_path filter] do |_, args|
require "socket"
require "chrome_installed_checker"
begin
ChromeInstalledChecker.run
rescue ChromeInstalledChecker::ChromeError => err
abort err.message
end
unless system("command -v yarn >/dev/null;")
abort "Yarn is not installed. Download from https://yarnpkg.com/lang/en/docs/install/"
end
report_requests = ENV["REPORT_REQUESTS"] == "1"
system("yarn install", exception: true)
# ensure we have this port available
def port_available?(port)
server = TCPServer.open port
server.close
true
rescue Errno::EADDRINUSE
false
end
if ENV["QUNIT_EMBER_CLI"] == "0"
puts "The 'legacy' ember environment is discontinued - running tests with ember-cli assets..."
end
port = ENV["TEST_SERVER_PORT"] || 60_099
port += 1 while !port_available? port
unicorn_port = 60_098
unicorn_port += 1 while unicorn_port == port || !port_available?(unicorn_port)
env = {
"RAILS_ENV" => ENV["QUNIT_RAILS_ENV"] || "test",
"SKIP_ENFORCE_HOSTNAME" => "1",
"UNICORN_PID_PATH" => "#{Rails.root}/tmp/pids/unicorn_test_#{unicorn_port}.pid", # So this can run alongside development
"UNICORN_PORT" => unicorn_port.to_s,
"UNICORN_SIDEKIQS" => "0",
"DISCOURSE_SKIP_CSS_WATCHER" => "1",
"UNICORN_LISTENER" => "127.0.0.1:#{unicorn_port}",
"LOGSTASH_UNICORN_URI" => nil,
"UNICORN_WORKERS" => "1",
"UNICORN_TIMEOUT" => "90",
}
pid = Process.spawn(env, "#{Rails.root}/bin/unicorn", pgroup: true)
begin
success = true
qunit_path = args[:qunit_path]
filter = args[:filter]
options = { seed: (ENV["QUNIT_SEED"] || Random.new.seed), hidepassed: 1 }
%w[
module
filter
qunit_skip_core
qunit_single_plugin
theme_name
theme_url
theme_id
target
].each { |arg| options[arg] = ENV[arg.upcase] if ENV[arg.upcase].present? }
options["report_requests"] = "1" if report_requests
query = options.to_query
@now = Time.now
def elapsed
Time.now - @now
end
# wait for server to accept connections
require "net/http"
uri = URI("http://localhost:#{unicorn_port}/srv/status")
puts "Warming up Rails server"
begin
Net::HTTP.get(uri)
rescue Errno::ECONNREFUSED,
Errno::EADDRNOTAVAIL,
Net::ReadTimeout,
Net::HTTPBadResponse,
EOFError
sleep 1
retry if elapsed() <= 60
puts "Timed out. Can not connect to forked server!"
exit 1
end
puts "Rails server is warmed up"
env = { "UNICORN_PORT" => unicorn_port.to_s }
cmd = []
parallel = ENV["QUNIT_PARALLEL"]
if qunit_path
# Bypass `ember test` - it only works properly for the `/tests` path.
# We have to trigger a `build` manually so that JS is available for rails to serve.
system(
"yarn",
"ember",
"build",
chdir: "#{Rails.root}/app/assets/javascripts/discourse",
exception: true,
)
env["THEME_TEST_PAGES"] = if ENV["THEME_IDS"]
ENV["THEME_IDS"]
.split("|")
.map { |theme_id| "#{qunit_path}?#{query}&testem=1&id=#{theme_id}" }
.join(",")
else
"#{qunit_path}?#{query}&testem=1"
end
cmd += %w[yarn testem ci -f testem.js]
cmd += ["--parallel", parallel] if parallel
else
cmd += ["yarn", "ember", "exam", "--query", query]
cmd += ["--load-balance", "--parallel", parallel] if parallel
cmd += ["--filter", filter] if filter
cmd << "--write-execution-file" if ENV["QUNIT_WRITE_EXECUTION_FILE"]
end
# Print out all env for debugging purposes
p env
system(env, *cmd, chdir: "#{Rails.root}/app/assets/javascripts/discourse")
success &&= $?.success?
ensure
# was having issues with HUP
Process.kill "-KILL", pid
FileUtils.rm("#{Rails.root}/tmp/pids/unicorn_test_#{unicorn_port}.pid")
end
if success
puts "\nTests Passed"
else
puts "\nTests Failed"
exit(1)
end
end