feat: use calendar-day workspace traffic

This commit is contained in:
2026-08-04 01:36:40 +08:00
parent 311236d28f
commit d9a9fbaaad
5 changed files with 168 additions and 19 deletions
+60 -1
View File
@@ -2,6 +2,7 @@ from __future__ import annotations
import contextlib
import copy
import datetime as dt
import io
import os
from pathlib import Path
@@ -25,6 +26,9 @@ def load_module():
def workspace_payload_fixture() -> dict[str, object]:
zone = dt.timezone(dt.timedelta(hours=8), name="Asia/Shanghai")
local_start = dt.datetime.combine(dt.datetime.now(zone).date(), dt.time.min, tzinfo=zone)
local_end = local_start + dt.timedelta(days=1)
return {
"service": "sub2api-pricing-monitor",
"view": "workspace",
@@ -77,7 +81,11 @@ def workspace_payload_fixture() -> dict[str, object]:
}
},
"traffic": {
"window_hours": 24,
"period_kind": "calendar_day",
"date": local_start.date().isoformat(),
"timezone": "Asia/Shanghai",
"started_at": local_start.isoformat(),
"ends_at": local_end.isoformat(),
"sample_limit": 1000,
"sample_limited": False,
"partial": False,
@@ -775,6 +783,11 @@ class WorkspaceTests(unittest.TestCase):
self.assertEqual(mod.as_int("9007199254740999"), 9007199254740999)
self.assertEqual(mod.normalize_key_rows(keys)[0]["name"], "wmy")
self.assertEqual(mod.normalize_key_rows(keys)[0]["cost"], 0.25)
self.assertEqual(keys["period_kind"], "calendar_day")
self.assertEqual(keys["date"], payload["traffic"]["date"])
self.assertEqual(keys["timezone"], "Asia/Shanghai")
self.assertIn(f"today {keys['date']} (Asia/Shanghai)", mod.usage_period_label(keys))
self.assertEqual(errors["time_range"], f"today {keys['date']} (Asia/Shanghai)")
self.assertEqual(errors["items"][0]["error_count"], 4)
self.assertEqual(errors["items"][0]["phase"], "upstream_http")
self.assertEqual(errors["sources"]["server6"]["total"], 4)
@@ -811,6 +824,28 @@ class WorkspaceTests(unittest.TestCase):
with self.assertRaisesRegex(RuntimeError, "invalid workspace requests"):
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_payload", return_value=invalid_period):
with self.assertRaisesRegex(RuntimeError, "invalid workspace traffic period"):
mod.fetch_workspace_payload("https://workspace.example.test/data", 3)
utc_period = workspace_payload_fixture()
utc_start = dt.datetime.now(dt.timezone.utc).replace(
hour=0, minute=0, second=0, microsecond=0
)
utc_period["traffic"].update(
{
"date": utc_start.date().isoformat(),
"timezone": "UTC",
"started_at": utc_start.isoformat(),
"ends_at": (utc_start + dt.timedelta(days=1)).isoformat(),
}
)
with mock.patch.object(mod, "fetch_payload", return_value=utc_period):
with self.assertRaisesRegex(RuntimeError, "invalid workspace traffic period"):
mod.fetch_workspace_payload("https://workspace.example.test/data", 3)
def test_workspace_cache_coalesces_reads_and_returns_copies(self) -> None:
mod = load_module()
calls: list[str] = []
@@ -840,6 +875,30 @@ class WorkspaceTests(unittest.TestCase):
cache.get(force=True)
self.assertEqual(len(calls), 2)
def test_workspace_cache_rejects_previous_calendar_day(self) -> None:
mod = load_module()
self.assertEqual(
mod.usage_day_date(dt.datetime(2026, 8, 3, 16, tzinfo=dt.timezone.utc)),
"2026-08-04",
)
payload = workspace_payload_fixture()
yesterday = dt.datetime.now(dt.timezone.utc) - dt.timedelta(days=1)
local_start = yesterday.astimezone(dt.timezone(dt.timedelta(hours=8))).replace(
hour=0, minute=0, second=0, microsecond=0
)
local_end = local_start + dt.timedelta(days=1)
payload["traffic"].update(
{
"date": local_start.date().isoformat(),
"started_at": local_start.isoformat(),
"ends_at": local_end.isoformat(),
}
)
cache = mod.WorkspaceCache("https://workspace.example.test/data", 3, 300)
with mock.patch.object(mod, "fetch_workspace_payload", return_value=payload):
with self.assertRaisesRegex(RuntimeError, "current-day traffic unavailable"):
cache.get()
def test_workspace_cache_backs_off_failures_with_and_without_last_good(self) -> None:
mod = load_module()
cache = mod.WorkspaceCache("https://workspace.example.test/data", 3, 300)