topen/test/test_configuration.py
Marty Oehme 13c34b08e2
Some checks are pending
website / deploy (push) Blocked by required conditions
website / build (push) Waiting to run
test: Restructure test files
Extract the individual parsing tests (cli, env, rc) and add additional
configuration test file (TConf and config builder).

To extract the fixtures they have to go into an additional 'conftest.py'
file for pytest to recognize and automatically import them, see:
https://docs.pytest.org/en/stable/reference/fixtures.html#conftest-py-sharing-fixtures-across-multiple-files

and:
https://docs.pytest.org/en/stable/how-to/fixtures.html#using-fixtures-from-other-projects
2025-11-29 12:29:35 +01:00

100 lines
3.5 KiB
Python

# pyright: reportUnusedImport=false, reportUnusedParameter=false
# ruff: noqa: F401, F811
# ^ Turn off for implicit pytest fixture import
from pathlib import Path
import pytest
from topen import TConf, build_config
class TestTConf:
def test_paths_are_expanded(self):
cfg = TConf.from_dict(
{
"task_data": "~/somewhere/tasks",
"task_id": 0,
"task_rc": "$HOME/taskrc",
"notes_dir": "$HOME/notes",
}
)
assert cfg.task_data == Path("~/somewhere/tasks").expanduser()
assert cfg.task_rc == Path("~/taskrc").expanduser()
assert cfg.notes_dir == Path("~/notes").expanduser()
def test_default_notes_sub_dir(self):
cfg = TConf.from_dict({"task_data": "~/my/tasks", "task_id": 0})
assert cfg.notes_dir == Path("~/my/tasks/notes").expanduser()
@pytest.mark.parametrize(
"env,expected",
[
({"EDITOR": "vim"}, "vim"),
({"VISUAL": "emacs", "EDITOR": ""}, "emacs"),
({"VISUAL": "nvim", "EDITOR": "notepad"}, "notepad"),
],
)
def test_editor_env_resolution(self, isolate_env, monkeypatch, env, expected):
for k, v in env.items():
monkeypatch.setenv(k, v)
assert TConf(0).notes_editor == expected
class TestBuildConfigPrecedence:
"""
All tests exercise the same key (notes_ext) to keep the assertions short.
Each source sets a different value so we can be sure the right one wins.
"""
def test_defaults_only(self, fake_rc, monkeypatch, isolate_env, fake_id):
cfg = build_config()
assert cfg.notes_ext == "md"
def test_taskrc_overrides_defaults(
self, fake_rc, monkeypatch, isolate_env, fake_id
):
fake_rc.write_text("notes.ext=from-rc\n")
cfg = build_config()
assert cfg.notes_ext == "from-rc"
def test_env_overrides_taskrc(self, fake_rc, monkeypatch, isolate_env, fake_id):
fake_rc.write_text("notes.ext=from-rc\n")
monkeypatch.setenv("TOPEN_NOTES_EXT", "from-env")
cfg = build_config()
assert cfg.notes_ext == "from-env"
def test_cli_overrides_env(self, fake_rc, monkeypatch, isolate_env):
fake_rc.write_text("notes.ext=from-rc\n")
monkeypatch.setenv("TOPEN_NOTES_EXT", "from-env")
monkeypatch.setattr("sys.argv", ["topen", "0", "--extension", "from-cli"])
cfg = build_config()
assert cfg.notes_ext == "from-cli"
def test_cli_overrides_everything(self, fake_rc, monkeypatch, isolate_env):
fake_rc.write_text("notes.ext=from-rc\nnotes.dir=/rc-dir\nnotes.editor=joe")
monkeypatch.setenv("TOPEN_NOTES_EXT", "from-env")
monkeypatch.setenv("TOPEN_NOTES_DIR", "/env-dir")
monkeypatch.setenv("EDITOR", "emacs")
# CLI wins
monkeypatch.setattr(
"sys.argv",
[
"topen",
"0",
"--extension",
"cli-ext",
"--notes-dir",
"cli-dir",
"--editor",
"helix",
],
)
cfg = build_config()
assert cfg.notes_ext == "cli-ext"
assert cfg.notes_dir == Path("cli-dir")
assert cfg.notes_editor == "helix"
# sanity check that the task-id coming from CLI is preserved
def test_cli_supplies_task_id(self, fake_rc, monkeypatch, isolate_env):
monkeypatch.setattr("sys.argv", ["topen", "42"])
cfg = build_config()
assert cfg.task_id == "42"