61 lines
2.8 KiB
Python
61 lines
2.8 KiB
Python
|
|
"""Tests for #1116 — composer placeholder reflects active profile name."""
|
||
|
|
import re
|
||
|
|
|
||
|
|
|
||
|
|
def _src(name: str) -> str:
|
||
|
|
with open(f"static/{name}") as f:
|
||
|
|
return f.read()
|
||
|
|
|
||
|
|
|
||
|
|
class TestComposerPlaceholderProfile:
|
||
|
|
"""applyBotName() should use the profile name when activeProfile is set."""
|
||
|
|
|
||
|
|
def test_applyBotName_uses_profile_name(self):
|
||
|
|
"""applyBotName must check S.activeProfile and prefer it over global bot_name."""
|
||
|
|
src = _src("boot.js")
|
||
|
|
assert "S.activeProfile" in src, \
|
||
|
|
"applyBotName must reference S.activeProfile"
|
||
|
|
# Should fall back to _botName when activeProfile is 'default'
|
||
|
|
assert "S.activeProfile!=='default'" in src, \
|
||
|
|
"applyBotName must skip 'default' profile (use bot_name instead)"
|
||
|
|
|
||
|
|
def test_applyBotName_capitalises_profile_name(self):
|
||
|
|
"""Profile name should be capitalised (first letter uppercase)."""
|
||
|
|
src = _src("boot.js")
|
||
|
|
m = re.search(r'function applyBotName\(\)\{.*?\n\}', src, re.DOTALL)
|
||
|
|
assert m, "applyBotName function must exist"
|
||
|
|
body = m.group(0)
|
||
|
|
assert "charAt(0).toUpperCase()" in body, \
|
||
|
|
"applyBotName must capitalise first letter of profile name"
|
||
|
|
|
||
|
|
def test_applyBotName_falls_back_to_bot_name(self):
|
||
|
|
"""When no active profile, must fall back to window._botName."""
|
||
|
|
src = _src("boot.js")
|
||
|
|
m = re.search(r'function applyBotName\(\)\{.*?\n\}', src, re.DOTALL)
|
||
|
|
assert m, "applyBotName function must exist"
|
||
|
|
body = m.group(0)
|
||
|
|
assert "window._botName||'Hermes'" in body, \
|
||
|
|
"applyBotName must fall back to window._botName or 'Hermes'"
|
||
|
|
|
||
|
|
def test_switchToProfile_calls_applyBotName(self):
|
||
|
|
"""switchToProfile() must call applyBotName() after switching."""
|
||
|
|
src = _src("panels.js")
|
||
|
|
assert "function switchToProfile" in src, \
|
||
|
|
"switchToProfile function must exist"
|
||
|
|
# Find the function block (starts with 'async function switchToProfile')
|
||
|
|
m = re.search(r'async function switchToProfile\s*\(', src)
|
||
|
|
assert m, "switchToProfile must be an async function"
|
||
|
|
# Get everything after the function declaration (enough context)
|
||
|
|
after = src[m.start():m.start()+5000]
|
||
|
|
assert "applyBotName" in after, \
|
||
|
|
"switchToProfile must call applyBotName after profile switch"
|
||
|
|
|
||
|
|
def test_placeholder_uses_name_variable(self):
|
||
|
|
"""The composer placeholder must use the resolved name variable."""
|
||
|
|
src = _src("boot.js")
|
||
|
|
m = re.search(r'function applyBotName\(\)\{.*?\n\}', src, re.DOTALL)
|
||
|
|
assert m, "applyBotName function must exist"
|
||
|
|
body = m.group(0)
|
||
|
|
assert re.search(r"msg\.placeholder\s*=\s*.*Message.*name", body), \
|
||
|
|
"applyBotName must set composer placeholder to 'Message <name>…'"
|