feat: use calendar-day workspace traffic
This commit is contained in:
+60
-1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user