72 lines
2.0 KiB
Python
72 lines
2.0 KiB
Python
"""NMI runtime-profile contract for the Redmine CLI/TUI."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
import redmine_ticket_nmi
|
|
|
|
|
|
def test_runtime_profile_honors_explicit_production_mode_and_env_file(tmp_path):
|
|
production_env = tmp_path / "production.env"
|
|
production_env.write_text("NMI_ENDPOINT_PRODUCTION=https://app.ldrprep.com/api.php\n")
|
|
|
|
profile = redmine_ticket_nmi.resolve_runtime_profile(
|
|
environ={
|
|
"NMI_MODE": "production",
|
|
"NMI_ENV_FILE": str(production_env),
|
|
}
|
|
)
|
|
|
|
assert profile.mode == "production"
|
|
assert profile.env_file == production_env
|
|
assert profile.ready is True
|
|
assert profile.problem is None
|
|
|
|
|
|
def test_runtime_profile_rejects_empty_env_file(tmp_path):
|
|
empty_env = tmp_path / "empty.env"
|
|
empty_env.touch()
|
|
|
|
profile = redmine_ticket_nmi.resolve_runtime_profile(
|
|
environ={
|
|
"NMI_MODE": "production",
|
|
"NMI_ENV_FILE": str(empty_env),
|
|
}
|
|
)
|
|
|
|
assert profile.mode == "production"
|
|
assert profile.ready is False
|
|
assert "empty" in profile.problem.lower()
|
|
|
|
|
|
def test_brief_refuses_unready_runtime_profile(monkeypatch, tmp_path):
|
|
empty_env = tmp_path / "empty.env"
|
|
empty_env.touch()
|
|
|
|
monkeypatch.setattr(
|
|
redmine_ticket_nmi,
|
|
"resolve_runtime_profile",
|
|
lambda **_kwargs: redmine_ticket_nmi.NmiRuntimeProfile(
|
|
mode="production",
|
|
env_file=empty_env,
|
|
nmi_bin=Path("/tmp/nmi"),
|
|
endpoint=None,
|
|
ready=False,
|
|
problem="NMI env file is empty",
|
|
),
|
|
)
|
|
|
|
payload = redmine_ticket_nmi.brief_for_issue(
|
|
{"id": 123, "subject": "item 200000001"},
|
|
[{"type": "item_no", "value": "200000001", "confidence": "high"}],
|
|
mode="production",
|
|
env_file=str(empty_env),
|
|
)
|
|
|
|
assert payload["ok"] is False
|
|
assert payload["error"] == "nmi_runtime_not_ready"
|
|
assert "empty" in payload["runtime"]["problem"].lower()
|