From dbda64e89d6b76cabfe57c21f281cb6d5132c257 Mon Sep 17 00:00:00 2001 From: Sergey Matyunin Date: Thu, 3 Sep 2026 13:52:37 +0300 Subject: [PATCH] test: catch stale danger locale gate Issue: #434 User-Visible: no --- scripts/mutation-gate.mjs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/scripts/mutation-gate.mjs b/scripts/mutation-gate.mjs index 1c89f652..171ca211 100644 --- a/scripts/mutation-gate.mjs +++ b/scripts/mutation-gate.mjs @@ -1069,6 +1069,32 @@ const MUTANT_DEFINITIONS = [ replace: " void this._dangerConfirmLocaleGate;", }], }, + { + id: 'danger-confirm-uses-last-rendered-language-gate', + guard: 'node demo/smoke_danger_confirm_branches.mjs', + because: 'ready -> warm and warm -> ready both have a window before render; consulting the ' + + 'last painted branch can admit an unrenderable request or reject a renderable one (#434 AC7)', + patches: [{ + file: 'src/houseplan-card.ts', + find: " /** Current language branch; never cached from a previous render. */\n" + + ' private get _dangerConfirmLocaleGate(): LanguageRenderGate {\n' + + " if (!this._config || !this.hass) return 'ready';\n" + + ' return languageRenderGate(\n' + + ' this, LANGUAGE_RUNTIME, langOf(this.hass, this._config.language),\n' + + ' );\n' + + ' }', + replace: " private _dangerConfirmLocaleGate: LanguageRenderGate = 'ready';", + }, { + file: 'src/houseplan-card.ts', + find: ' const localeGate = this._dangerConfirmLocaleGate;\n' + + " if (localeGate === 'cold') return languageLoadingTemplate();", + replace: ' const localeGate = languageRenderGate(\n' + + ' this, LANGUAGE_RUNTIME, langOf(this.hass, this._config.language),\n' + + ' );\n' + + ' this._dangerConfirmLocaleGate = localeGate;\n' + + " if (localeGate === 'cold') return languageLoadingTemplate();", + }], + }, { id: 'danger-confirm-warm-transition-cancel-removed', guard: 'node demo/smoke_danger_confirm_branches.mjs',