From 02a88b0864510bd20847beb2e48d2940cfe5a8da Mon Sep 17 00:00:00 2001 From: Arnold Wender Date: Fri, 24 Apr 2026 11:13:51 +0200 Subject: [PATCH] test(config): make palace_path tests portable across POSIX and Windows The new abspath+expanduser normalization means /env/palace no longer round-trips literally on Windows (abspath prepends the current drive, producing D:\env\palace). Rewrite the env-var tests to compare against os.path.abspath(os.path.expanduser(raw)) instead of hardcoded Unix strings, and build raw paths with os.path.join so backslash-vs-slash differences don't leak into assertions. Covers test_env_override, the three new tests, and the legacy-alias test in test_config_extra. --- tests/test_config.py | 33 ++++++++++++++++++++++----------- tests/test_config_extra.py | 8 ++++++-- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/tests/test_config.py b/tests/test_config.py index f41b3df..9200214 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -21,31 +21,41 @@ def test_config_from_file(): def test_env_override(): - os.environ["MEMPALACE_PALACE_PATH"] = "/env/palace" - cfg = MempalaceConfig(config_dir=tempfile.mkdtemp()) - assert cfg.palace_path == "/env/palace" - del os.environ["MEMPALACE_PALACE_PATH"] + raw = "/env/palace" + os.environ["MEMPALACE_PALACE_PATH"] = raw + try: + cfg = MempalaceConfig(config_dir=tempfile.mkdtemp()) + # palace_path normalizes with abspath + expanduser to match the + # --palace CLI code path. On Unix that's a no-op for "/env/palace"; + # on Windows abspath prepends the current drive letter. + assert cfg.palace_path == os.path.abspath(os.path.expanduser(raw)) + finally: + del os.environ["MEMPALACE_PALACE_PATH"] def test_env_path_expanduser(): - os.environ["MEMPALACE_PALACE_PATH"] = "~/mempalace-test" + raw = os.path.join("~", "mempalace-test") + os.environ["MEMPALACE_PALACE_PATH"] = raw try: cfg = MempalaceConfig(config_dir=tempfile.mkdtemp()) # Tilde must be expanded to match the --palace CLI code path. - assert "~" not in cfg.palace_path + assert cfg.palace_path == os.path.abspath(os.path.expanduser(raw)) assert cfg.palace_path.endswith("mempalace-test") - assert cfg.palace_path == os.path.expanduser("~/mempalace-test") finally: del os.environ["MEMPALACE_PALACE_PATH"] def test_env_path_abspath_collapses_traversal(): - os.environ["MEMPALACE_PALACE_PATH"] = "/tmp/palace/../mempalace-test" + # Build a raw path with a .. segment using the platform separator so + # the assertion is portable (Windows uses \, POSIX uses /). + raw = os.path.join(tempfile.gettempdir(), "palace", "..", "mempalace-test") + expected = os.path.abspath(os.path.expanduser(raw)) + os.environ["MEMPALACE_PALACE_PATH"] = raw try: cfg = MempalaceConfig(config_dir=tempfile.mkdtemp()) # .. segments must be collapsed, not preserved literally. assert ".." not in cfg.palace_path - assert cfg.palace_path == "/tmp/mempalace-test" + assert cfg.palace_path == expected finally: del os.environ["MEMPALACE_PALACE_PATH"] @@ -53,12 +63,13 @@ def test_env_path_abspath_collapses_traversal(): def test_env_path_legacy_alias_normalized(): # Legacy MEMPAL_PALACE_PATH gets the same normalization treatment. os.environ.pop("MEMPALACE_PALACE_PATH", None) - os.environ["MEMPAL_PALACE_PATH"] = "~/legacy-alias/../mempalace-test" + raw = os.path.join("~", "legacy-alias", "..", "mempalace-test") + os.environ["MEMPAL_PALACE_PATH"] = raw try: cfg = MempalaceConfig(config_dir=tempfile.mkdtemp()) assert "~" not in cfg.palace_path assert ".." not in cfg.palace_path - assert cfg.palace_path == os.path.expanduser("~/mempalace-test") + assert cfg.palace_path == os.path.abspath(os.path.expanduser(raw)) finally: del os.environ["MEMPAL_PALACE_PATH"] diff --git a/tests/test_config_extra.py b/tests/test_config_extra.py index d0d9b5d..f7418c6 100644 --- a/tests/test_config_extra.py +++ b/tests/test_config_extra.py @@ -63,10 +63,14 @@ def test_save_people_map(tmp_path): def test_env_mempal_palace_path(tmp_path): """MEMPAL_PALACE_PATH (legacy) should also work.""" os.environ.pop("MEMPALACE_PALACE_PATH", None) - os.environ["MEMPAL_PALACE_PATH"] = "/legacy/path" + raw = "/legacy/path" + os.environ["MEMPAL_PALACE_PATH"] = raw try: cfg = MempalaceConfig(config_dir=str(tmp_path)) - assert cfg.palace_path == "/legacy/path" + # palace_path is normalized via abspath + expanduser — compare + # against the normalized form so the test is portable between + # POSIX (no-op) and Windows (prepends current drive letter). + assert cfg.palace_path == os.path.abspath(os.path.expanduser(raw)) finally: del os.environ["MEMPAL_PALACE_PATH"]