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
100 lines
3.5 KiB
Python
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"
|