Files
dotlinker/tests/unit/test_cli.py
Kevin Veen-Birkenbach 8fd45cb87b
Some checks failed
CI + Mark Stable / Test & Lint (push) Has been cancelled
CI + Mark Stable / Mark stable tag (push) Has been cancelled
Initial Release:
https://chatgpt.com/share/6941a2a4-7974-800f-8911-9ab0bf1e3873
2025-12-16 19:19:05 +01:00

65 lines
2.2 KiB
Python

from __future__ import annotations
import io
import tempfile
import unittest
from contextlib import redirect_stdout
from pathlib import Path
from unittest.mock import patch
from dotlinker.cli import main
class TestCli(unittest.TestCase):
def _run(self, argv: list[str]) -> tuple[int, str]:
buf = io.StringIO()
with patch("sys.argv", ["doli"] + argv), redirect_stdout(buf):
try:
main()
return 0, buf.getvalue()
except SystemExit as e:
return int(e.code or 0), buf.getvalue()
def test_no_subcommand_prints_help(self) -> None:
rc, out = self._run([])
self.assertEqual(rc, 0)
self.assertIn("usage:", out)
self.assertIn("{pull,add}", out)
def test_add_writes_config(self) -> None:
with tempfile.TemporaryDirectory() as td:
cfg = Path(td) / "config.yaml"
rc, _ = self._run(
["-c", str(cfg), "add", "-N", "zshrc", "-b", "chezmoi", "-s", "~/.zshrc"]
)
self.assertEqual(rc, 0)
self.assertTrue(cfg.exists())
text = cfg.read_text(encoding="utf-8")
self.assertIn("zshrc", text)
self.assertIn("chezmoi", text)
def test_pull_calls_backends(self) -> None:
with tempfile.TemporaryDirectory() as td:
cfg = Path(td) / "config.yaml"
# Create config with two mappings
cfg.write_text(
"mappings:\n"
" - name: zshrc\n"
" backend: chezmoi\n"
" src: ~/.zshrc\n"
" - name: nvim\n"
" backend: cloud\n"
" src: ~/.config/nvim\n"
" dest: ~/Nextcloud/dotfiles/.config/nvim\n",
encoding="utf-8",
)
with patch("dotlinker.cli.ChezmoiBackend.pull") as chez_pull, patch(
"dotlinker.cli.CloudBackend.pull"
) as cloud_pull:
rc, _ = self._run(["-c", str(cfg), "pull"])
self.assertEqual(rc, 0)
self.assertEqual(chez_pull.call_count, 1)
self.assertEqual(cloud_pull.call_count, 1)