File size: 3,307 Bytes
eab2256
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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://<your-app>.streamlit.app"}}))

    exit_code = main(["--config", str(config_path)])
    captured = capsys.readouterr()

    assert exit_code == 1
    assert "⚠️" in captured.err