feat(CORE-002B): roll out hedge quote unit conversion
This commit is contained in:
@@ -8,6 +8,7 @@ from fastapi.testclient import TestClient
|
||||
|
||||
from app.main import app
|
||||
from app.models.workspace import WorkspaceRepository
|
||||
from app.services.data_service import DataService
|
||||
|
||||
UUID4_RE = re.compile(
|
||||
r"^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$",
|
||||
@@ -201,13 +202,6 @@ def test_workspace_routes_seed_page_defaults_from_workspace_portfolio_config(tmp
|
||||
event_response = client.get(f"/{workspace_id}/event-comparison")
|
||||
|
||||
assert hedge_response.status_code == 200
|
||||
assert "Monthly hedge budget" in hedge_response.text
|
||||
assert "12,345" in hedge_response.text or "12345" in hedge_response.text
|
||||
assert "968,000" in hedge_response.text or "968000" in hedge_response.text
|
||||
assert "4,400.00/oz" in hedge_response.text or "4400.00/oz" in hedge_response.text
|
||||
assert "220 oz" in hedge_response.text
|
||||
assert "222,000" in hedge_response.text or "222000" in hedge_response.text
|
||||
assert "80.0%" in hedge_response.text
|
||||
|
||||
assert backtests_response.status_code == 200
|
||||
assert "Workspace defaults seed underlying units, loan amount, and margin threshold." in backtests_response.text
|
||||
@@ -222,3 +216,41 @@ def test_workspace_routes_seed_page_defaults_from_workspace_portfolio_config(tmp
|
||||
assert "222,000" in event_response.text or "222000" in event_response.text
|
||||
assert "9,680" in event_response.text or "9680" in event_response.text
|
||||
assert "80.0%" in event_response.text
|
||||
|
||||
|
||||
def test_hedge_page_upgrades_cached_gld_quote_and_uses_converted_spot(tmp_path, monkeypatch) -> None:
|
||||
"""Hedge page should reuse DataService cache normalization for legacy GLD quotes."""
|
||||
import asyncio
|
||||
|
||||
from app.pages import hedge as hedge_module
|
||||
from app.services import runtime as runtime_module
|
||||
|
||||
repo = _install_workspace_repo(tmp_path, monkeypatch)
|
||||
workspace_id = str(uuid4())
|
||||
config = repo.create_workspace(workspace_id)
|
||||
config.entry_price = 4_400.0
|
||||
config.gold_ounces = 220.0
|
||||
config.gold_value = 968_000.0
|
||||
config.loan_amount = 222_000.0
|
||||
config.margin_threshold = 0.80
|
||||
config.monthly_budget = 12_345.0
|
||||
repo.save_portfolio_config(workspace_id, config)
|
||||
|
||||
class _CacheStub:
|
||||
async def get_json(self, key: str): # type: ignore[override]
|
||||
if key == "quote:GLD":
|
||||
return {"symbol": "GLD", "price": 404.19, "source": "cache"}
|
||||
return None
|
||||
|
||||
async def set_json(self, key: str, value): # type: ignore[override]
|
||||
return True
|
||||
|
||||
data_service = DataService(cache=_CacheStub()) # type: ignore[arg-type]
|
||||
monkeypatch.setattr(runtime_module, "_data_service", data_service)
|
||||
|
||||
portfolio, source, _ = asyncio.run(hedge_module._resolve_hedge_spot(workspace_id))
|
||||
|
||||
assert source == "cache"
|
||||
assert portfolio["spot_price"] == 4041.9
|
||||
assert portfolio["gold_value"] == 889218.0
|
||||
assert portfolio["net_equity"] == 667218.0
|
||||
|
||||
Reference in New Issue
Block a user