# Copyright (c) 2026 Krzysztof Rudnicki. MIT licence. """Finding the private album, and the two different ways it can be absent. Split out of test_config.py, which reached the 250-line cap. """ from __future__ import annotations from typing import TYPE_CHECKING import pytest from signal_bot.config import ConfigError from signal_bot.config_env import load_config from tests import pack_fixture from tests.test_config import BASE_ENV if TYPE_CHECKING: from pathlib import Path def test_an_installation_with_no_album_has_no_pack(tmp_path: Path) -> None: """Which is every machine but one, and every test in this suite.""" assert load_config(dict(BASE_ENV)).photo_pack_dirs == () def test_a_named_album_is_loaded_and_kept(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: root = pack_fixture.build(tmp_path / "pack") monkeypatch.setenv("PHOTO_PACK_DIR", str(root)) assert load_config(dict(BASE_ENV)).photo_pack_dirs == (root,) def test_a_named_album_that_is_not_there_fails_startup( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: """A typo in a path is an answer, not an outage worth retrying.""" monkeypatch.setenv("PHOTO_PACK_DIR", str(tmp_path / "nowhere")) with pytest.raises(ConfigError, match="is not a directory"): load_config(dict(BASE_ENV)) def test_a_broken_album_fails_startup_rather_than_every_command( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: """Parsed here, where load_config raising exits, not inside a retry loop.""" root = pack_fixture.build(tmp_path / "pack") (root / "people.json").write_text("{}", encoding="utf-8") monkeypatch.setenv("PHOTO_PACK_DIR", str(root)) with pytest.raises(ConfigError, match="defines no commands"): load_config(dict(BASE_ENV)) def test_the_album_may_also_be_found_where_systemd_puts_it( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: pack_fixture.build(tmp_path / "state" / "pack") monkeypatch.setenv("STATE_DIRECTORY", str(tmp_path / "state")) assert load_config(dict(BASE_ENV)).photo_pack_dirs == (tmp_path / "state" / "pack",) def test_an_empty_album_directory_is_not_a_crash_loop( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: """The tagger creates the directory before the manifest exists. With Restart=always, failing on a directory somebody merely created would put the unit into a restart loop -- so the implicit path is a hint, and only a pack named outright is allowed to fail startup. """ (tmp_path / "share" / "signal-bot" / "pack" / "media").mkdir(parents=True) monkeypatch.setenv("XDG_DATA_HOME", str(tmp_path / "share")) assert load_config(dict(BASE_ENV)).photo_pack_dirs == () def test_a_named_album_with_no_manifest_fails_startup( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: (tmp_path / "pack").mkdir() monkeypatch.setenv("PHOTO_PACK_DIR", str(tmp_path / "pack")) with pytest.raises(ConfigError, match=r"has no people\.json"): load_config(dict(BASE_ENV))