-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_client.py
More file actions
123 lines (94 loc) · 4.56 KB
/
test_client.py
File metadata and controls
123 lines (94 loc) · 4.56 KB
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
112
113
114
115
116
117
118
119
120
121
122
123
from __future__ import annotations
import os
from types import SimpleNamespace
from unittest.mock import patch
import pytest
from hotdata_runtime.env import normalize_host, pick_workspace, resolve_workspace_selection
from hotdata_runtime.client import HotdataClient
@pytest.mark.parametrize(
("raw", "expected"),
[
("https://api.hotdata.dev", "https://api.hotdata.dev"),
("https://api.hotdata.dev/", "https://api.hotdata.dev"),
("https://api.hotdata.dev/v1", "https://api.hotdata.dev"),
("https://api.hotdata.dev/v1/", "https://api.hotdata.dev"),
("http://localhost:8000/v1", "http://localhost:8000"),
("http://localhost:8000", "http://localhost:8000"),
],
)
def test_normalize_host(raw: str, expected: str):
assert normalize_host(raw) == expected
def test_pick_workspace_prefers_env(monkeypatch: pytest.MonkeyPatch):
monkeypatch.setenv("HOTDATA_WORKSPACE", "ws_explicit")
assert pick_workspace("k", "https://api.hotdata.dev", None) == "ws_explicit"
def test_resolve_workspace_selection_prefers_env_without_listing(
monkeypatch: pytest.MonkeyPatch,
):
monkeypatch.setenv("HOTDATA_WORKSPACE", "ws_explicit")
with patch("hotdata_runtime.env.list_workspaces") as listing:
resolved = resolve_workspace_selection(
"k", "https://api.hotdata.dev", None
)
listing.assert_not_called()
assert resolved.workspace_id == "ws_explicit"
assert resolved.source == "explicit_env"
assert resolved.workspaces == []
def test_pick_workspace_prefers_workspace_id_env(monkeypatch: pytest.MonkeyPatch):
monkeypatch.delenv("HOTDATA_WORKSPACE", raising=False)
monkeypatch.setenv("HOTDATA_WORKSPACE_ID", "ws_from_id")
assert pick_workspace("k", "https://api.hotdata.dev", None) == "ws_from_id"
def test_pick_workspace_chooses_first_active(monkeypatch: pytest.MonkeyPatch):
monkeypatch.delenv("HOTDATA_WORKSPACE", raising=False)
monkeypatch.delenv("HOTDATA_WORKSPACE_ID", raising=False)
items = [
SimpleNamespace(public_id="ws_1", active=False),
SimpleNamespace(public_id="ws_2", active=True),
SimpleNamespace(public_id="ws_3", active=True),
]
listing = SimpleNamespace(workspaces=items)
with patch("hotdata_runtime.env.WorkspacesApi") as Api:
Api.return_value.list_workspaces.return_value = listing
assert pick_workspace("k", "https://api.hotdata.dev", None) == "ws_2"
def test_pick_workspace_falls_back_to_first(monkeypatch: pytest.MonkeyPatch):
monkeypatch.delenv("HOTDATA_WORKSPACE", raising=False)
monkeypatch.delenv("HOTDATA_WORKSPACE_ID", raising=False)
items = [
SimpleNamespace(public_id="ws_1", active=False),
SimpleNamespace(public_id="ws_2", active=False),
]
listing = SimpleNamespace(workspaces=items)
with patch("hotdata_runtime.env.WorkspacesApi") as Api:
Api.return_value.list_workspaces.return_value = listing
assert pick_workspace("k", "https://api.hotdata.dev", None) == "ws_1"
def test_resolve_workspace_selection_returns_workspaces_and_source(
monkeypatch: pytest.MonkeyPatch,
):
monkeypatch.delenv("HOTDATA_WORKSPACE", raising=False)
monkeypatch.delenv("HOTDATA_WORKSPACE_ID", raising=False)
items = [
SimpleNamespace(public_id="ws_1", active=False),
SimpleNamespace(public_id="ws_2", active=True),
]
listing = SimpleNamespace(workspaces=items)
with patch("hotdata_runtime.env.WorkspacesApi") as Api:
Api.return_value.list_workspaces.return_value = listing
resolved = resolve_workspace_selection(
"k", "https://api.hotdata.dev", None
)
assert resolved.workspace_id == "ws_2"
assert resolved.source == "active"
assert resolved.workspaces == items
def test_list_qualified_table_names_passes_connection_id():
client = HotdataClient("k", "ws", host="https://api.hotdata.dev")
with patch.object(client, "iter_tables", return_value=iter([])) as it:
client.list_qualified_table_names(limit=5, connection_id="conn_a")
it.assert_called_once()
assert it.call_args.kwargs["connection_id"] == "conn_a"
def test_wait_result_ready_raises_on_cancelled():
client = HotdataClient("k", "ws", host="https://api.hotdata.dev")
class FakeResultsApi:
def get_result(self, result_id: str):
return SimpleNamespace(status="cancelled", error_message=None)
with patch.object(client, "_results_api", return_value=FakeResultsApi()):
with pytest.raises(RuntimeError, match="cancelled"):
client._wait_result_ready("res_1", timeout_s=0.1, interval_s=0)