feat(streaming): add StreamTokenRequest/Response schemas
This commit is contained in:
parent
0996ea8c7a
commit
2547f80893
2 changed files with 44 additions and 0 deletions
|
|
@ -152,3 +152,24 @@ class BuildRequest(BaseModel):
|
||||||
|
|
||||||
template_id: str
|
template_id: str
|
||||||
role_overrides: dict[str, str] = Field(default_factory=dict)
|
role_overrides: dict[str, str] = Field(default_factory=dict)
|
||||||
|
|
||||||
|
|
||||||
|
class StreamTokenRequest(BaseModel):
|
||||||
|
"""Request body for POST /recipes/stream-token.
|
||||||
|
|
||||||
|
Pantry items and dietary constraints are fetched from the DB at request
|
||||||
|
time — the client does not supply them here.
|
||||||
|
"""
|
||||||
|
level: int = Field(4, ge=3, le=4, description="Recipe level: 3=styled, 4=wildcard")
|
||||||
|
wildcard_confirmed: bool = Field(False, description="Required true for level 4")
|
||||||
|
|
||||||
|
|
||||||
|
class StreamTokenResponse(BaseModel):
|
||||||
|
"""Response from POST /recipes/stream-token.
|
||||||
|
|
||||||
|
The frontend opens EventSource at stream_url?token=<token> to receive
|
||||||
|
SSE chunks directly from the coordinator.
|
||||||
|
"""
|
||||||
|
stream_url: str
|
||||||
|
token: str
|
||||||
|
expires_in_s: int
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
import pytest
|
import pytest
|
||||||
from unittest.mock import AsyncMock, patch
|
from unittest.mock import AsyncMock, patch
|
||||||
|
|
||||||
|
from app.models.schemas.recipe import StreamTokenRequest, StreamTokenResponse
|
||||||
|
|
||||||
|
|
||||||
def test_coordinator_authorize_missing_url(monkeypatch):
|
def test_coordinator_authorize_missing_url(monkeypatch):
|
||||||
"""coordinator_authorize raises RuntimeError when COORDINATOR_URL is unset."""
|
"""coordinator_authorize raises RuntimeError when COORDINATOR_URL is unset."""
|
||||||
|
|
@ -9,3 +11,24 @@ def test_coordinator_authorize_missing_url(monkeypatch):
|
||||||
monkeypatch.delenv("COORDINATOR_KIWI_KEY", raising=False)
|
monkeypatch.delenv("COORDINATOR_KIWI_KEY", raising=False)
|
||||||
# Will test this properly via endpoint — see Task 3 tests.
|
# Will test this properly via endpoint — see Task 3 tests.
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def test_stream_token_request_defaults():
|
||||||
|
req = StreamTokenRequest()
|
||||||
|
assert req.level == 4
|
||||||
|
assert req.wildcard_confirmed is False
|
||||||
|
|
||||||
|
|
||||||
|
def test_stream_token_request_level_3():
|
||||||
|
req = StreamTokenRequest(level=3)
|
||||||
|
assert req.level == 3
|
||||||
|
|
||||||
|
|
||||||
|
def test_stream_token_response():
|
||||||
|
resp = StreamTokenResponse(
|
||||||
|
stream_url="http://10.1.10.71:7700/proxy/stream",
|
||||||
|
token="abc-123",
|
||||||
|
expires_in_s=60,
|
||||||
|
)
|
||||||
|
assert resp.stream_url.startswith("http")
|
||||||
|
assert resp.expires_in_s == 60
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue