personal memory agent
1# SPDX-License-Identifier: AGPL-3.0-only
2# Copyright (c) 2026 sol pbc
3
4from __future__ import annotations
5
6import json
7import re
8from pathlib import Path
9
10from solstone.convey import copy
11
12
13def test_console_copy_matches_browser_mirror() -> None:
14 text = Path("solstone/convey/static/convey_copy.js").read_text(encoding="utf-8")
15
16 for python_name in copy.__all__:
17 if not python_name.startswith("CONVEY_CONSOLE_"):
18 continue
19 js_name = python_name.removeprefix("CONVEY_")
20 assert _js_constant(text, js_name) == getattr(copy, python_name)
21
22
23def test_non_console_copy_matches_browser_mirror() -> None:
24 text = Path("solstone/convey/static/convey_copy.js").read_text(encoding="utf-8")
25
26 assert _js_constant(text, "UNKNOWN_ERROR") == copy.CONVEY_UNKNOWN_ERROR
27 assert _js_constant(text, "LOG_READ_FAILED") == copy.CONVEY_LOG_READ_FAILED
28
29
30def test_manifest_touched_action_and_report_copy_matches_browser_mirror() -> None:
31 text = Path("solstone/convey/static/convey_copy.js").read_text(encoding="utf-8")
32
33 names = (
34 "CONVEY_ACTION_RECONNECT",
35 "CONVEY_ACTION_RESTART",
36 "CONVEY_REPORT_ANONYMOUS_LABEL",
37 "CONVEY_REPORT_DIAGNOSTIC_REASON_CODE_LABEL",
38 "CONVEY_REPORT_DIAGNOSTIC_TIME_LABEL",
39 "CONVEY_REPORT_ACTION_SEND",
40 "CONVEY_REPORT_ACTION_SENDING",
41 "CONVEY_REPORT_ACTION_CANCEL",
42 "CONVEY_REPORT_ACTION_CLOSE",
43 "CONVEY_REPORT_ACTION_OPEN_EMAIL",
44 "CONVEY_REPORT_ACTION_VIEW_TICKET",
45 "CONVEY_REPORT_SUCCESS_BODY",
46 "CONVEY_REPORT_FALLBACK_BODY",
47 "CONVEY_REPORT_BUTTON_LABEL",
48 )
49
50 for python_name in names:
51 js_name = python_name.removeprefix("CONVEY_")
52 assert _js_constant(text, js_name) == getattr(copy, python_name)
53
54
55def _js_constant(text: str, name: str) -> str:
56 match = re.search(rf'{name}: "((?:[^"\\]|\\.)*)"', text)
57 assert match is not None, name
58 return json.loads(f'"{match.group(1)}"')