diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test_i18n.py | 1 | ||||
| -rw-r--r-- | tests/test_i18n_rendering.py | 54 | ||||
| -rw-r--r-- | tests/test_settings.py | 14 |
3 files changed, 49 insertions, 20 deletions
diff --git a/tests/test_i18n.py b/tests/test_i18n.py index 48f8b9f..a2d0ffd 100644 --- a/tests/test_i18n.py +++ b/tests/test_i18n.py @@ -106,5 +106,6 @@ def test_get_prompt_returns_expected_strings(): """Basic sanity checks for the get_prompt() helper.""" assert prompts.get_prompt("tool_system") == prompts.get_prompts("ja")["tool_system"] assert prompts.get_prompt("tool_system", lang="en") == prompts.get_prompts("en")["tool_system"] + assert prompts.get_prompt("current_time", lang="ja") == prompts.get_prompts("ja")["current_time"] assert prompts.get_prompt("missing.prompt", fallback="fallback") == "fallback" assert prompts.get_prompt("missing.prompt") == "missing.prompt" diff --git a/tests/test_i18n_rendering.py b/tests/test_i18n_rendering.py index 0c37aad..ba1f602 100644 --- a/tests/test_i18n_rendering.py +++ b/tests/test_i18n_rendering.py @@ -3,6 +3,7 @@ from __future__ import annotations import json +from pathlib import Path import pytest from bs4 import BeautifulSoup @@ -11,20 +12,39 @@ from starlette.testclient import TestClient from ollama_web.app import create_app from ollama_web.config import settings from ollama_web.i18n import get_messages, t +from ollama_web.settings_store import save_app_settings @pytest.fixture -def reset_language(): - """Reset language to the initial value after each test.""" - original = settings.language - yield - settings.language = original +def reset_language(tmp_path): + """Reset language and data_dir to their initial values after each test.""" + original_language = settings.language + original_data_dir = settings.data_dir + settings.data_dir = str(tmp_path) + yield tmp_path + settings.language = original_language + settings.data_dir = original_data_dir if hasattr(get_messages, "cache_clear"): get_messages.cache_clear() -def _render_index() -> str: +def _write_settings(data_dir: Path, language: str) -> None: + """Persist a minimal settings file with the requested UI language.""" + save_app_settings( + data_dir, + { + "ui": {"language": language}, + "ollama": { + "system_prompt": "", + "options": {"temperature": 0.8, "num_ctx": 8192}, + }, + }, + ) + + +def _render_index(data_dir: Path, language: str) -> str: """Render index.html and return the HTML body.""" + _write_settings(data_dir, language) app = create_app() with TestClient(app) as client: response = client.post("/api/auth/login", json={"pin": settings.pin}) @@ -33,8 +53,9 @@ def _render_index() -> str: return response.text -def _render_pages(): +def _render_pages(data_dir: Path, language: str): """Render login and authenticated index pages with their response headers.""" + _write_settings(data_dir, language) app = create_app() with TestClient(app) as client: login_page = client.get("/login") @@ -45,9 +66,9 @@ def _render_pages(): def test_english_language_consistency(reset_language): - """When settings.language='en', all UI text including MCP must be English.""" - settings.language = "en" - html = _render_index() + """When persisted language='en', all UI text including MCP must be English.""" + data_dir = reset_language + html = _render_index(data_dir, "en") # HTML-side labels assert 'lang="en"' in html assert "MCP Settings" in html @@ -62,9 +83,9 @@ def test_english_language_consistency(reset_language): def test_japanese_language_consistency(reset_language): - """When settings.language='ja', all UI text including MCP must be Japanese.""" - settings.language = "ja" - html = _render_index() + """When persisted language='ja', all UI text including MCP must be Japanese.""" + data_dir = reset_language + html = _render_index(data_dir, "ja") # HTML-side labels assert 'lang="ja"' in html assert "MCP設定" in html @@ -101,8 +122,8 @@ def test_browser_messages_are_embedded_as_json_data( login_title: str, ): """Both pages expose parseable localized data without executable inline scripts.""" - settings.language = lang - login_page, index_page = _render_pages() + data_dir = reset_language + login_page, index_page = _render_pages(data_dir, lang) for response in (login_page, index_page): soup = BeautifulSoup(response.text, "html.parser") @@ -121,7 +142,8 @@ def test_browser_messages_are_embedded_as_json_data( def test_i18n_pages_keep_strict_script_csp(reset_language): """The localization transport must not require weakening script-src.""" - login_page, index_page = _render_pages() + data_dir = reset_language + login_page, index_page = _render_pages(data_dir, settings.language) for response in (login_page, index_page): csp = response.headers["content-security-policy"] diff --git a/tests/test_settings.py b/tests/test_settings.py index 737c8fd..29ec2c1 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -135,10 +135,16 @@ def test_settings_api_and_page_elements(tmp_path: Path) -> None: def test_system_prompt_is_localized_and_appended() -> None: custom = "Always answer briefly." - assert _compose_system_prompt("en", "") == get_prompt("tool_system", lang="en") - assert _compose_system_prompt("en", custom) == ( - f"{get_prompt('tool_system', lang='en')}\n\n{custom}" - ) + # An empty custom prompt yields only the tool prompt plus the current time line. + empty = _compose_system_prompt("en", "") + assert empty.startswith(get_prompt("tool_system", lang="en")) + assert get_prompt("current_time", lang="en").split("{time}")[0].rstrip() in empty + + # A custom prompt is appended after the tool prompt and current time line. + composed = _compose_system_prompt("en", custom) + assert composed.startswith(get_prompt("tool_system", lang="en")) + assert composed.endswith(custom) + assert get_prompt("current_time", lang="en").split("{time}")[0].rstrip() in composed def test_options_are_forwarded_to_tool_and_final_rounds(monkeypatch: pytest.MonkeyPatch) -> None: |
