simplify repo

This commit is contained in:
Jev
2026-02-17 21:59:50 +01:00
parent 46e0ef9de7
commit 1f3c026b5b
23 changed files with 46 additions and 558 deletions

View File

@@ -1,22 +0,0 @@
from __future__ import annotations
import pytest
from {{ cookiecutter.package_name }}.config import clear_config_cache
from {{ cookiecutter.package_name }}.config.paths import ENV_CONFIG_VAR
@pytest.fixture(autouse=True)
def _isolate_xdg_paths(monkeypatch, tmp_path_factory) -> None:
temp_root = tmp_path_factory.mktemp("xdg")
monkeypatch.setenv("XDG_CONFIG_HOME", str(temp_root / "config"))
monkeypatch.setenv("XDG_DATA_HOME", str(temp_root / "data"))
monkeypatch.delenv(ENV_CONFIG_VAR, raising=False)
yield
@pytest.fixture(autouse=True)
def _clear_config_cache() -> None:
clear_config_cache()
yield
clear_config_cache()

View File

@@ -1,75 +1,24 @@
from __future__ import annotations
import json
from typer.testing import CliRunner
from {{ cookiecutter.package_name }}.cli.app import app
from {{ cookiecutter.package_name }}.config.paths import ENV_CONFIG_VAR
from {{ cookiecutter.package_name }}.cli import app
runner = CliRunner()
def test_config_show_success_defaults() -> None:
result = runner.invoke(app, ["config", "show"])
def test_help() -> None:
result = runner.invoke(app, ["--help"])
assert result.exit_code == 0
payload = json.loads(result.output)
assert payload["source"] == "<defaults>"
assert payload["config"]["app"]["greeting"] == "Hello"
def test_config_init_create_and_overwrite(tmp_path) -> None:
path = tmp_path / "config.toml"
create_result = runner.invoke(app, ["config", "init", "--path", str(path)])
assert create_result.exit_code == 0
assert path.exists()
conflict_result = runner.invoke(app, ["config", "init", "--path", str(path)])
assert conflict_result.exit_code == 1
assert "Config already exists" in conflict_result.output
overwrite_result = runner.invoke(
app,
["config", "init", "--path", str(path), "--overwrite"],
)
assert overwrite_result.exit_code == 0
def test_version() -> None:
result = runner.invoke(app, ["--version"])
assert result.exit_code == 0
assert result.output.strip()
def test_config_show_missing_env_file_exits_with_code_1(tmp_path, monkeypatch) -> None:
missing = tmp_path / "missing.toml"
monkeypatch.setenv(ENV_CONFIG_VAR, str(missing))
result = runner.invoke(app, ["config", "show"])
assert result.exit_code == 1
assert "Config file not found" in result.output
def test_config_show_invalid_config_exits_with_code_1(tmp_path, monkeypatch) -> None:
config_path = tmp_path / "config.toml"
config_path.write_text('unknown = "value"\n')
monkeypatch.setenv(ENV_CONFIG_VAR, str(config_path))
result = runner.invoke(app, ["config", "show"])
assert result.exit_code == 1
assert "Extra inputs are not permitted" in result.output
def test_hello_cli_override_precedence(tmp_path, monkeypatch) -> None:
config_path = tmp_path / "config.toml"
config_path.write_text('[app]\ngreeting = "Hi"\n\n[database]\npath = "/tmp/example.db"\n')
monkeypatch.setenv(ENV_CONFIG_VAR, str(config_path))
from_config = runner.invoke(app, ["hello", "say", "--name", "Ada"])
assert from_config.exit_code == 0
assert "Hi, Ada!" in from_config.output
from_cli = runner.invoke(
app,
["hello", "say", "--name", "Ada", "--greeting", "Yo"],
)
assert from_cli.exit_code == 0
assert "Yo, Ada!" in from_cli.output
def test_hello() -> None:
result = runner.invoke(app, ["hello", "--name", "Ada"])
assert result.exit_code == 0
assert "Hello, Ada!" in result.output

View File

@@ -1,62 +0,0 @@
from __future__ import annotations
import pytest
from pydantic import ValidationError
from {{ cookiecutter.package_name }}.commands import format_greeting
from {{ cookiecutter.package_name }}.config import get_config, get_config_source
from {{ cookiecutter.package_name }}.config.paths import ENV_CONFIG_VAR, config_file_path
def test_env_config_override(tmp_path, monkeypatch) -> None:
config_path = tmp_path / "config.toml"
config_path.write_text('[app]\ngreeting = "Hi"\n\n[database]\npath = "/tmp/app.db"\n')
monkeypatch.setenv(ENV_CONFIG_VAR, str(config_path))
settings = get_config()
assert settings.app.greeting == "Hi"
assert settings.database.path == "/tmp/app.db"
assert get_config_source() == config_path
def test_missing_env_config_raises(tmp_path, monkeypatch) -> None:
missing = tmp_path / "missing.toml"
monkeypatch.setenv(ENV_CONFIG_VAR, str(missing))
with pytest.raises(FileNotFoundError, match="Config file not found"):
get_config()
def test_xdg_default_config_is_loaded(monkeypatch) -> None:
path = config_file_path()
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text('[app]\ngreeting = "Hola"\n\n[database]\npath = "/tmp/default.db"\n')
monkeypatch.delenv(ENV_CONFIG_VAR, raising=False)
settings = get_config()
assert settings.app.greeting == "Hola"
assert settings.database.path == "/tmp/default.db"
assert get_config_source() == path
def test_unknown_key_raises_validation_error(tmp_path, monkeypatch) -> None:
config_path = tmp_path / "config.toml"
config_path.write_text('unknown = "value"\n')
monkeypatch.setenv(ENV_CONFIG_VAR, str(config_path))
with pytest.raises(ValidationError):
get_config()
def test_settings_are_frozen() -> None:
settings = get_config()
with pytest.raises(ValidationError, match="frozen"):
settings.app.greeting = "Mutated"
def test_format_greeting() -> None:
assert format_greeting("Ada") == "Hello, Ada!"
assert format_greeting("Ada", greeting="Hi") == "Hi, Ada!"

View File

@@ -1,19 +0,0 @@
from __future__ import annotations
from {{ cookiecutter.package_name }} import __all__, __version__, get_config
from {{ cookiecutter.package_name }}.config.settings import Settings
def test_public_version_is_string() -> None:
assert isinstance(__version__, str)
def test_public_exports_include_stable_symbols() -> None:
assert set(__all__) >= {"__version__", "get_config", "Settings"}
def test_get_config_defaults_shape() -> None:
settings = get_config()
assert isinstance(settings, Settings)
assert settings.app.greeting == "Hello"
assert settings.database.path.endswith("/data.db")