style: normalize merged state tests
This commit is contained in:
parent
83e1f78818
commit
83409d5354
2 changed files with 27 additions and 26 deletions
|
|
@ -15,6 +15,7 @@ Missing *third-party* optional dependencies (customtkinter, PIL, ...) are
|
||||||
skipped, not failed: those are legitimately absent in headless environments.
|
skipped, not failed: those are legitimately absent in headless environments.
|
||||||
Broken *internal* references always fail.
|
Broken *internal* references always fail.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import ast
|
import ast
|
||||||
|
|
@ -124,10 +125,9 @@ def test_antigravity_provider_loads_from_repo() -> None:
|
||||||
"""Verify that antigravity_provider is loaded from the repository src, not from %LOCALAPPDATA%."""
|
"""Verify that antigravity_provider is loaded from the repository src, not from %LOCALAPPDATA%."""
|
||||||
import antigravity_provider
|
import antigravity_provider
|
||||||
import antigravity_provider.runtime
|
import antigravity_provider.runtime
|
||||||
|
|
||||||
pkg_file = Path(antigravity_provider.__file__).resolve()
|
pkg_file = Path(antigravity_provider.__file__).resolve()
|
||||||
runtime_file = Path(antigravity_provider.runtime.__file__).resolve()
|
runtime_file = Path(antigravity_provider.runtime.__file__).resolve()
|
||||||
|
|
||||||
assert str(PACKAGE_ROOT.resolve()) in str(pkg_file) or str(PACKAGE_ROOT.resolve()) in str(pkg_file.parent)
|
assert str(PACKAGE_ROOT.resolve()) in str(pkg_file) or str(PACKAGE_ROOT.resolve()) in str(pkg_file.parent)
|
||||||
assert str(PACKAGE_ROOT.resolve()) in str(runtime_file)
|
assert str(PACKAGE_ROOT.resolve()) in str(runtime_file)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
"""Comprehensive tests for Task A: State Layer, Event-Driven Quota, Seq-Guards, and OAuth Lifecycle."""
|
"""Comprehensive tests for Task A: State Layer, Event-Driven Quota, Seq-Guards, and OAuth Lifecycle."""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
|
@ -26,14 +27,14 @@ def test_targeted_account_quota_delta_event():
|
||||||
"""Verify that updating an account's quota produces EVENT_QUOTA_UPDATED with exact account identifiers."""
|
"""Verify that updating an account's quota produces EVENT_QUOTA_UPDATED with exact account identifiers."""
|
||||||
bus = EventBus.get()
|
bus = EventBus.get()
|
||||||
store = HubStateStore.get()
|
store = HubStateStore.get()
|
||||||
|
|
||||||
received_events = []
|
received_events = []
|
||||||
|
|
||||||
def _listener(name, payload):
|
def _listener(name, payload):
|
||||||
received_events.append((name, payload))
|
received_events.append((name, payload))
|
||||||
|
|
||||||
bus.subscribe(EVENT_QUOTA_UPDATED, _listener)
|
bus.subscribe(EVENT_QUOTA_UPDATED, _listener)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
bucket = QuotaBucket(
|
bucket = QuotaBucket(
|
||||||
id="antigravity.claude.5h",
|
id="antigravity.claude.5h",
|
||||||
|
|
@ -49,9 +50,9 @@ def test_targeted_account_quota_delta_event():
|
||||||
buckets=[bucket],
|
buckets=[bucket],
|
||||||
source="runtime_event",
|
source="runtime_event",
|
||||||
)
|
)
|
||||||
|
|
||||||
store.apply_delta_quota_updated("antigravity", "ag-orch-primary", snap)
|
store.apply_delta_quota_updated("antigravity", "ag-orch-primary", snap)
|
||||||
|
|
||||||
assert len(received_events) >= 1
|
assert len(received_events) >= 1
|
||||||
name, payload = received_events[-1]
|
name, payload = received_events[-1]
|
||||||
assert name == EVENT_QUOTA_UPDATED
|
assert name == EVENT_QUOTA_UPDATED
|
||||||
|
|
@ -67,15 +68,15 @@ def test_targeted_account_quota_delta_event():
|
||||||
def test_seq_token_prevents_stale_refresh_clobber():
|
def test_seq_token_prevents_stale_refresh_clobber():
|
||||||
"""Verify that an out-of-order stale background response cannot overwrite fresher state."""
|
"""Verify that an out-of-order stale background response cannot overwrite fresher state."""
|
||||||
store = HubStateStore.get()
|
store = HubStateStore.get()
|
||||||
|
|
||||||
seq_fresh = store.next_seq()
|
seq_fresh = store.next_seq()
|
||||||
snap_fresh = store.refresh(force_scan=False, seq=seq_fresh)
|
snap_fresh = store.refresh(force_scan=False, seq=seq_fresh)
|
||||||
gen_fresh = snap_fresh.generation
|
gen_fresh = snap_fresh.generation
|
||||||
|
|
||||||
# Simulate a delayed/stale response from an earlier seq counter
|
# Simulate a delayed/stale response from an earlier seq counter
|
||||||
seq_stale = seq_fresh - 1
|
seq_stale = seq_fresh - 1
|
||||||
snap_after_stale = store.refresh(force_scan=False, seq=seq_stale)
|
snap_after_stale = store.refresh(force_scan=False, seq=seq_stale)
|
||||||
|
|
||||||
# Stale response must be rejected, retaining the fresh generation
|
# Stale response must be rejected, retaining the fresh generation
|
||||||
assert snap_after_stale.generation == gen_fresh
|
assert snap_after_stale.generation == gen_fresh
|
||||||
assert store.refresh_skipped_total >= 1
|
assert store.refresh_skipped_total >= 1
|
||||||
|
|
@ -86,25 +87,25 @@ def test_account_added_and_removed_delta_events():
|
||||||
"""Verify that account added and removed delta methods fire targeted events without global scan."""
|
"""Verify that account added and removed delta methods fire targeted events without global scan."""
|
||||||
bus = EventBus.get()
|
bus = EventBus.get()
|
||||||
store = HubStateStore.get()
|
store = HubStateStore.get()
|
||||||
|
|
||||||
added_events = []
|
added_events = []
|
||||||
removed_events = []
|
removed_events = []
|
||||||
|
|
||||||
def _on_added(name, payload):
|
def _on_added(name, payload):
|
||||||
added_events.append(payload)
|
added_events.append(payload)
|
||||||
|
|
||||||
def _on_removed(name, payload):
|
def _on_removed(name, payload):
|
||||||
removed_events.append(payload)
|
removed_events.append(payload)
|
||||||
|
|
||||||
bus.subscribe(EVENT_ACCOUNT_ADDED, _on_added)
|
bus.subscribe(EVENT_ACCOUNT_ADDED, _on_added)
|
||||||
bus.subscribe(EVENT_ACCOUNT_REMOVED, _on_removed)
|
bus.subscribe(EVENT_ACCOUNT_REMOVED, _on_removed)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
store.apply_delta_account_added("openai-codex", "codex-slot-2")
|
store.apply_delta_account_added("openai-codex", "codex-slot-2")
|
||||||
assert len(added_events) >= 1
|
assert len(added_events) >= 1
|
||||||
assert added_events[-1]["provider"] == "openai-codex"
|
assert added_events[-1]["provider"] == "openai-codex"
|
||||||
assert added_events[-1]["profile_id"] == "codex-slot-2"
|
assert added_events[-1]["profile_id"] == "codex-slot-2"
|
||||||
|
|
||||||
store.apply_delta_account_removed("openai-codex", "codex-slot-2")
|
store.apply_delta_account_removed("openai-codex", "codex-slot-2")
|
||||||
assert len(removed_events) >= 1
|
assert len(removed_events) >= 1
|
||||||
assert removed_events[-1]["provider"] == "openai-codex"
|
assert removed_events[-1]["provider"] == "openai-codex"
|
||||||
|
|
@ -119,17 +120,17 @@ def test_provider_refresh_scheduler_execution():
|
||||||
"""Verify HermesRefreshScheduler.trigger_refresh_provider refreshes specific provider."""
|
"""Verify HermesRefreshScheduler.trigger_refresh_provider refreshes specific provider."""
|
||||||
scheduler = HermesRefreshScheduler.get()
|
scheduler = HermesRefreshScheduler.get()
|
||||||
completed = []
|
completed = []
|
||||||
|
|
||||||
def _on_done():
|
def _on_done():
|
||||||
completed.append(True)
|
completed.append(True)
|
||||||
|
|
||||||
scheduler.trigger_refresh_provider("antigravity", on_complete=_on_done)
|
scheduler.trigger_refresh_provider("antigravity", on_complete=_on_done)
|
||||||
|
|
||||||
# Wait briefly for worker thread
|
# Wait briefly for worker thread
|
||||||
t0 = time.time()
|
t0 = time.time()
|
||||||
while not completed and (time.time() - t0 < 3.0):
|
while not completed and (time.time() - t0 < 3.0):
|
||||||
time.sleep(0.05)
|
time.sleep(0.05)
|
||||||
|
|
||||||
assert len(completed) == 1
|
assert len(completed) == 1
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -139,19 +140,19 @@ def test_antigravity_claude_vs_gemini_quota_bucket_isolation():
|
||||||
snap = AccountQuotaService.get()._generate_baseline_snapshot("antigravity", "ag-orch-primary")
|
snap = AccountQuotaService.get()._generate_baseline_snapshot("antigravity", "ag-orch-primary")
|
||||||
assert snap is not None
|
assert snap is not None
|
||||||
assert len(snap.buckets) >= 2
|
assert len(snap.buckets) >= 2
|
||||||
|
|
||||||
claude_bucket = snap.get_bucket_for_model("claude-3-7-sonnet")
|
claude_bucket = snap.get_bucket_for_model("claude-3-7-sonnet")
|
||||||
gemini_bucket = snap.get_bucket_for_model("gemini-2.5-pro")
|
gemini_bucket = snap.get_bucket_for_model("gemini-2.5-pro")
|
||||||
|
|
||||||
assert claude_bucket is not None
|
assert claude_bucket is not None
|
||||||
assert gemini_bucket is not None
|
assert gemini_bucket is not None
|
||||||
assert claude_bucket.model_family == "claude"
|
assert claude_bucket.model_family == "claude"
|
||||||
assert gemini_bucket.model_family == "gemini"
|
assert gemini_bucket.model_family == "gemini"
|
||||||
assert claude_bucket.id != gemini_bucket.id
|
assert claude_bucket.id != gemini_bucket.id
|
||||||
|
|
||||||
# Mark claude exhausted
|
# Mark claude exhausted
|
||||||
claude_bucket.status = "exhausted"
|
claude_bucket.status = "exhausted"
|
||||||
claude_bucket.remaining_percent = 0.0
|
claude_bucket.remaining_percent = 0.0
|
||||||
|
|
||||||
assert snap.is_model_available("claude-3-7-sonnet") is False
|
assert snap.is_model_available("claude-3-7-sonnet") is False
|
||||||
assert snap.is_model_available("gemini-2.5-pro") is True
|
assert snap.is_model_available("gemini-2.5-pro") is True
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue