from __future__ import annotations import json import sys from pathlib import Path from types import SimpleNamespace import requests sys.path.append(str(Path(__file__).resolve().parents[1])) from scripts.check_live_app import LiveCheckResult, check_live_app, main class DummyResponse(SimpleNamespace): def __init__(self, status_code: int): super().__init__(status_code=status_code) def test_check_live_app_success(monkeypatch): def fake_get(url, timeout): assert url == "https://example.com" assert timeout == 5 return DummyResponse(status_code=200) monkeypatch.setattr("scripts.check_live_app.requests.get", fake_get) result = check_live_app("https://example.com", timeout=5) assert isinstance(result, LiveCheckResult) assert result.is_success assert result.status_code == 200 assert result.error is None def test_check_live_app_failure(monkeypatch): class DummyException(requests.RequestException): def __init__(self, message: str): super().__init__(message) self.response = DummyResponse(status_code=503) def fake_get(url, timeout): # pragma: no cover - executed via exception raise DummyException("service unavailable") monkeypatch.setattr("scripts.check_live_app.requests.get", fake_get) result = check_live_app("https://example.com") assert not result.is_success assert result.status_code == 503 assert "service unavailable" in result.error def test_main_success(monkeypatch, capsys): def fake_check(url, timeout): return LiveCheckResult(url=url, status_code=200, elapsed_seconds=0.12, error=None) monkeypatch.setattr("scripts.check_live_app.check_live_app", fake_check) exit_code = main(["--url", "https://example.com"]) captured = capsys.readouterr() assert exit_code == 0 assert "✅" in captured.out def test_main_failure(monkeypatch, capsys): def fake_check(url, timeout): return LiveCheckResult(url=url, status_code=500, elapsed_seconds=0.12, error="boom") monkeypatch.setattr("scripts.check_live_app.check_live_app", fake_check) exit_code = main(["--url", "https://example.com"]) captured = capsys.readouterr() assert exit_code == 1 assert "❌" in captured.err def test_main_uses_config_when_url_missing(tmp_path, monkeypatch, capsys): config_path = tmp_path / "settings.json" config_path.write_text(json.dumps({"live_app": {"streamlit_url": "https://config-app.streamlit.app"}})) def fake_check(url, timeout): assert url == "https://config-app.streamlit.app" return LiveCheckResult(url=url, status_code=200, elapsed_seconds=0.05, error=None) monkeypatch.setattr("scripts.check_live_app.check_live_app", fake_check) exit_code = main(["--config", str(config_path)]) captured = capsys.readouterr() assert exit_code == 0 assert "✅" in captured.out def test_main_warns_when_config_missing_url(tmp_path, capsys): config_path = tmp_path / "settings.json" config_path.write_text(json.dumps({"live_app": {"streamlit_url": "https://.streamlit.app"}})) exit_code = main(["--config", str(config_path)]) captured = capsys.readouterr() assert exit_code == 1 assert "⚠️" in captured.err