"""Tests for the daemon-startup filesystem bootstrap (lib.bootstrap).""" import pytest from lib import bootstrap, dnsmasq, firewall, network, nginx, wireguard @pytest.fixture() def sandbox(tmp_path, monkeypatch): """Point every bootstrap-referenced path into a throwaway tree.""" cfg = tmp_path / "config" data = tmp_path / "data" monkeypatch.setattr(dnsmasq, "CONFIG_DIR", cfg / "dnsmasq") monkeypatch.setattr(dnsmasq, "DATA_DIR", data / "dnsmasq") monkeypatch.setattr(dnsmasq, "FRAGMENTS_DIR", data / "dnsmasq" / "fragments") monkeypatch.setattr(firewall, "CONFIG_DIR", cfg / "firewall") monkeypatch.setattr(firewall, "DATA_DIR", data / "firewall") monkeypatch.setattr(network, "CONFIG_DIR", cfg / "network") monkeypatch.setattr(network, "DATA_DIR", data / "networkd") monkeypatch.setattr(nginx, "CONFIG_DIR", cfg / "nginx") monkeypatch.setattr(nginx, "DATA_DIR", data / "nginx") monkeypatch.setattr(nginx, "SITES_DIR", data / "nginx" / "sites-enabled") monkeypatch.setattr(nginx, "CONFIG_FILE", cfg / "nginx" / "config.json") monkeypatch.setattr(wireguard, "CONFIG_PATH", cfg / "wireguard" / "config.json") return tmp_path def test_creates_runtime_dirs(sandbox): bootstrap.bootstrap() assert dnsmasq.FRAGMENTS_DIR.is_dir() assert firewall.DATA_DIR.is_dir() assert network.DATA_DIR.is_dir() assert nginx.SITES_DIR.is_dir() assert wireguard.CONFIG_PATH.parent.is_dir() def test_does_not_create_config_files(sandbox): # Config files are left for system-import (first start) or the first # save_config — bootstrap must not pre-empt either. bootstrap.bootstrap() assert not nginx.CONFIG_FILE.exists() assert not (dnsmasq.CONFIG_DIR / "config.json").exists() assert not (network.CONFIG_DIR / "config.json").exists() assert not (firewall.CONFIG_DIR / "config.json").exists() assert not wireguard.CONFIG_PATH.exists() def test_persists_nginx_migration(sandbox): nginx.save_config({"domains": {"app.example.com": {"backend": "myapp"}}}) bootstrap.bootstrap() on_disk = nginx.get_config() assert on_disk["backends"]["webui"]["_migrated"] is True raw = nginx.CONFIG_FILE.read_text() assert '"_migrated": true' in raw or '"_migrated":True' in raw def test_idempotent(sandbox): nginx.save_config({"domains": {}}) bootstrap.bootstrap() mtime = nginx.CONFIG_FILE.stat().st_mtime_ns bootstrap.bootstrap() assert nginx.CONFIG_FILE.stat().st_mtime_ns == mtime