feat: show dual-node account test status

This commit is contained in:
2026-08-07 03:09:23 +08:00
parent 492e6c882f
commit 68d37a1584
5 changed files with 208 additions and 22 deletions
+71 -1
View File
@@ -67,6 +67,27 @@ def workspace_payload_fixture() -> dict[str, object]:
"provider": "openai",
"kind": "quota_limited",
"usable": True,
"active_state": "yes",
"schedulable_state": "partial",
"last_test_state": "partial",
"last_test_time": "2026-08-03T10:00:00Z",
"last_test_model": "gpt-5.6-luna",
"node_status": {
"server6": {
"active": True,
"schedulable": True,
"last_test": "yes",
"last_test_time": "2026-08-03T10:00:00Z",
"last_test_model": "gpt-5.6-luna",
},
"server4": {
"active": True,
"schedulable": False,
"last_test": "no",
"last_test_time": "2026-08-03T10:02:00Z",
"last_test_model": "gpt-5.6-mini",
},
},
"account_rate_multiplier": 0.06,
"account_rate_multiplier_cny": 0.003,
}
@@ -730,6 +751,8 @@ def sample_logs_payload() -> dict:
"api_key": {"id": 3, "name": "codex-main"},
"account_id": 7,
"account": {"id": 7, "name": "oai-sub-1"},
"account_rate_multiplier": 0.06,
"account_rate_multiplier_cny": 0.003,
"user": {"id": 1, "name": "shujakuin"},
"model": "gpt-5.5",
"upstream_model": "gpt-5.5-codex",
@@ -807,10 +830,45 @@ class WorkspaceTests(unittest.TestCase):
normalized_accounts = mod.normalize_account_rows(accounts, pricing_payload=pricing)
normalized_logs = mod.normalize_log_rows(logs)
self.assertEqual(normalized_accounts[0]["id"], 9007199254740993)
self.assertEqual(normalized_accounts[0]["account_multiplier"], 0.003)
self.assertEqual(normalized_accounts[0]["active"], "yes")
self.assertEqual(normalized_accounts[0]["schedulable_state"], "partial")
self.assertEqual(normalized_accounts[0]["last_test"], "partial")
self.assertEqual(normalized_accounts[0]["last_test_model"], "gpt-5.6-luna")
self.assertIn("server6 active yes", mod.workspace_account_node_detail(normalized_accounts[0]))
once_output = io.StringIO()
with contextlib.redirect_stdout(once_output):
mod.print_once(accounts, pricing_payload=pricing)
self.assertIn("last-test", once_output.getvalue())
self.assertIn("gpt-5.6-luna", once_output.getvalue())
self.assertEqual(normalized_logs[0]["id"], 9007199254740997)
self.assertEqual(normalized_logs[0]["account_multiplier"], 0.003)
self.assertEqual(normalized_logs[0]["cost"], 0.25)
self.assertEqual(mod.account_rate_value({"account_rate_multiplier": 0.06}), 0.06)
self.assertEqual(
mod.account_rate_value(
{
"account_rate_multiplier": 0.06,
"account_rate_multiplier_cny": 0.003,
}
),
0.003,
)
self.assertEqual(
mod.account_rate_value(
{
"account_rate_multiplier": 0.06,
"account_rate_multiplier_cny": "not-a-number",
}
),
0.06,
)
self.assertEqual(mod.account_rate_value({"account_rate_multiplier_cny": 0}), 0)
self.assertIsNone(
mod.account_rate_value({"account_rate_multiplier": float("nan")})
)
self.assertEqual(mod.format_multiplier(0.003), "0.003x")
self.assertEqual(mod.format_multiplier(0), "0x")
self.assertEqual(mod.format_multiplier(float("inf")), "-")
self.assertEqual(mod.as_int("9007199254740999"), 9007199254740999)
self.assertEqual(len(keys["items"]), 1)
self.assertEqual(mod.normalize_key_rows(keys)[0]["name"], "wmy")
@@ -863,6 +921,12 @@ class WorkspaceTests(unittest.TestCase):
with self.assertRaisesRegex(RuntimeError, "invalid workspace requests"):
mod.fetch_workspace_payload("https://workspace.example.test/data", 3)
invalid_contract = workspace_payload_fixture()
invalid_contract["accounts"]["accounts"][0]["node_status"].pop("server4")
with mock.patch.object(mod, "fetch_workspace_response", return_value=(invalid_contract, "")):
with self.assertRaisesRegex(RuntimeError, "account contract"):
mod.fetch_workspace_payload("https://workspace.example.test/data", 3)
invalid_period = workspace_payload_fixture()
invalid_period["traffic"].pop("ends_at")
with mock.patch.object(mod, "fetch_workspace_response", return_value=(invalid_period, "")):
@@ -1323,6 +1387,7 @@ class Sub2APILogsTests(unittest.TestCase):
self.assertEqual(oldest["input_tokens"], 1200)
self.assertEqual(oldest["output_tokens"], 340)
self.assertEqual(oldest["cache_tokens"], 50 + 4100)
self.assertEqual(oldest["account_multiplier"], 0.003)
self.assertEqual(oldest["first_token_ms"], 800)
self.assertGreater(oldest["tokens_per_second"], 0)
self.assertEqual(oldest["cost"], 0.0123)
@@ -1399,6 +1464,11 @@ class Sub2APILogsTests(unittest.TestCase):
self.assertIn("$0.012", text)
self.assertIn("5.3s", text)
self.assertIn("total 2.3K records", text)
lines = text.splitlines()
header = next(line for line in lines if line.startswith("node"))
multiplier_row = next(line for line in lines if "codex-main" in line)
self.assertEqual(header.index("key"), multiplier_row.index("codex-main"))
self.assertEqual(header.index("multiplier"), multiplier_row.index("0.003x"))
def test_default_logs_token_reads_config_file(self) -> None:
mod = load_module()