from __future__ import annotations import argparse from pathlib import Path import pytest from gyxx_flow.cli import ( CliConfigurationError, _load_runtime_environment_files, build_parser, ) def test_console_and_scheduler_accept_explicit_repeatable_env_files() -> None: parser = build_parser() console = parser.parse_args( ["console", "--env-file", "database.env", "--env-file", "notify.env"] ) scheduler = parser.parse_args( ["schedule", "run", "--env-file", "production.env"] ) assert console.env_file == [Path("database.env"), Path("notify.env")] assert scheduler.env_file == [Path("production.env")] def test_runtime_env_files_load_values_without_overriding_process_env( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, ) -> None: first = tmp_path / "database.env" second = tmp_path / "notifications.env" first.write_text( "GYXX_RUNTIME_ENV_TEST_DB=cloud\nGYXX_RUNTIME_ENV_TEST_KEEP=file\n", encoding="utf-8", ) second.write_text("GYXX_RUNTIME_ENV_TEST_NOTIFY=owner\n", encoding="utf-8") monkeypatch.delenv("GYXX_RUNTIME_ENV_TEST_DB", raising=False) monkeypatch.delenv("GYXX_RUNTIME_ENV_TEST_NOTIFY", raising=False) monkeypatch.setenv("GYXX_RUNTIME_ENV_TEST_KEEP", "process") _load_runtime_environment_files( argparse.Namespace(env_file=[first, second]) ) import os assert os.environ["GYXX_RUNTIME_ENV_TEST_DB"] == "cloud" assert os.environ["GYXX_RUNTIME_ENV_TEST_NOTIFY"] == "owner" assert os.environ["GYXX_RUNTIME_ENV_TEST_KEEP"] == "process" def test_runtime_env_file_must_exist(tmp_path: Path) -> None: missing = tmp_path / "missing.env" with pytest.raises(CliConfigurationError, match="runtime environment file not found"): _load_runtime_environment_files(argparse.Namespace(env_file=[missing]))