aboutsummaryrefslogtreecommitdiff
path: root/app/tests/test_backends_probe.py
blob: 742e2089f8f673a4d8d7158f42065e1947d585fb (plain)
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
105
106
107
108
109
110
111
"""Tests for backends.probe: identifying which backend answers at a URL."""

import json
import unittest
from unittest.mock import patch

from backends import probe


class _FakeResponse:
    def __init__(self, payload):
        self._payload = payload

    def __enter__(self):
        return self

    def __exit__(self, *exc):
        return False

    def read(self):
        return json.dumps(self._payload).encode("utf-8")


class IdentifyServerTests(unittest.TestCase):
    def _patch_http(self, routes):
        """routes: URL path -> JSON payload dict (missing = HTTP error)."""
        import urllib.parse

        def fake_urlopen(url, timeout=None):
            path = urllib.parse.urlsplit(url).path
            payload = routes.get(path)
            if payload is None:
                raise OSError("HTTP 404")
            return _FakeResponse(payload)

        return patch.object(probe.urllib.request, "urlopen",
                            side_effect=fake_urlopen)

    def test_audiocpp_identified(self):
        routes = {"/health": {"status": "ok"},
                  "/v1/models": {"data": [{"id": "qwen", "family": "qwen3_tts",
                                           "task": "tts"}]}}
        with patch.object(probe.common, "server_running", return_value=True), \
                self._patch_http(routes):
            self.assertEqual(probe.identify_server("http://127.0.0.1:8080"),
                             "audiocpp")

    def test_faster_identified(self):
        with patch.object(probe.common, "server_running", return_value=True), \
                self._patch_http({"/health": {"model_loaded": True}}):
            self.assertEqual(probe.identify_server("http://127.0.0.1:8000"),
                             "faster")

    def test_qwen_custom_and_clone_identified(self):
        with patch.object(probe.common, "server_running", return_value=True), \
                self._patch_http({"/info": {"named_endpoints":
                                            {"/run_instruct": {}}}}):
            self.assertEqual(probe.identify_server("http://x:7860"),
                             "qwen-custom")
        with patch.object(probe.common, "server_running", return_value=True), \
                self._patch_http({"/info": {"named_endpoints":
                                            {"/run_voice_clone": {}}}}):
            self.assertEqual(probe.identify_server("http://x:7861"),
                             "qwen-clone")

    def test_qwen_design_identified(self):
        with patch.object(probe.common, "server_running", return_value=True), \
                self._patch_http({"/info": {"named_endpoints":
                                            {"/run_voice_design": {}}}}):
            self.assertEqual(probe.identify_server("http://x:7860"),
                             "qwen-design")

    def test_unreachable_returns_none(self):
        with patch.object(probe.common, "server_running", return_value=False):
            self.assertIsNone(probe.identify_server("http://127.0.0.1:8080"))

    def test_health_ok_without_models_catalog_is_not_audiocpp(self):
        # A service that answers {"status": "ok"} but not /v1/models is not
        # recognized as audio.cpp.
        with patch.object(probe.common, "server_running", return_value=True), \
                self._patch_http({"/health": {"status": "ok"}}):
            self.assertIsNone(probe.identify_server("http://x"))

    def test_empty_url_returns_none(self):
        self.assertIsNone(probe.identify_server(""))
        self.assertIsNone(probe.identify_server(None))


class SameEndpointTests(unittest.TestCase):
    def test_same_host_port(self):
        self.assertTrue(probe.same_endpoint("http://127.0.0.1:8080",
                                            "http://127.0.0.1:8080/"))

    def test_scheme_ignored(self):
        self.assertTrue(probe.same_endpoint("http://h:8080", "https://h:8080"))

    def test_different_port(self):
        self.assertFalse(probe.same_endpoint("http://127.0.0.1:8080",
                                             "http://127.0.0.1:8000"))

    def test_different_host(self):
        self.assertFalse(probe.same_endpoint("http://127.0.0.1:8080",
                                             "http://10.0.0.5:8080"))

    def test_empty_url(self):
        self.assertFalse(probe.same_endpoint("", "http://h:8080"))
        self.assertFalse(probe.same_endpoint("http://h:8080", ""))


if __name__ == "__main__":
    unittest.main()