discourse/spec/system/ember_deprecation_spec.rb
David Taylor 07caa5bc03
FEATURE: Show warning banner for critical JS deprecations to admins (#25091)
Ported from d95706b25a

This is enabled by default, but can be disabled via the `warn_critical_js_deprecations` hidden site setting.

The `warn_critical_js_deprecations_message` site setting can be used by hosting providers to add a sentence to the warning message (e.g. a date when they will be deploying the Ember 5 upgrade).
2024-01-03 11:41:09 +00:00

56 lines
2.0 KiB
Ruby

# frozen_string_literal: true
describe "JS Deprecation Handling", type: :system do
it "can successfully print a deprecation message after applying production-mode shims" do
visit("/latest")
expect(find("#main-outlet-wrapper")).to be_visible
# Intercept console.warn so we can enumerate calls later
page.execute_script <<~JS
window.intercepted_warnings = [];
console.warn = (msg) => window.intercepted_warnings.push([msg, (new Error()).stack])
JS
# Apply deprecate shims. These are applied automatically in production
# builds, but running a full production build for system specs would be
# too slow
page.execute_script <<~JS
require("discourse/lib/deprecate-shim").applyShim();
JS
# Trigger a deprecation, then return the console.warn calls
warn_calls = page.execute_script <<~JS
const { deprecate } = require('@ember/debug');
deprecate("Some message", false, { id: "some.id" })
return window.intercepted_warnings
JS
expect(warn_calls.size).to eq(1)
call, backtrace = warn_calls[0]
expect(call).to eq("DEPRECATION: Some message [deprecation id: some.id]")
expect(backtrace).to include("shimLogDeprecationToConsole")
end
it "shows warnings to admins for critical deprecations" do
sign_in Fabricate(:admin)
SiteSetting.warn_critical_js_deprecations = true
SiteSetting.warn_critical_js_deprecations_message =
"Discourse core changes will be applied to your site on Jan 15."
visit("/latest")
page.execute_script <<~JS
const deprecated = require("discourse-common/lib/deprecated").default;
deprecated("Fake deprecation message", { id: "fake-deprecation" })
JS
message = find("#global-notice-critical-deprecation")
expect(message).to have_text(
"One of your themes or plugins needs updating for compatibility with upcoming Discourse core changes",
)
expect(message).to have_text(SiteSetting.warn_critical_js_deprecations_message)
end
end