feat(api): align routine context windows with recent skin history
This commit is contained in:
parent
1c457d62a3
commit
fecfa0b9e4
3 changed files with 273 additions and 71 deletions
|
|
@ -1,6 +1,10 @@
|
|||
import uuid
|
||||
from datetime import date
|
||||
from unittest.mock import patch
|
||||
|
||||
from innercontext.models import Routine, SkinConditionSnapshot
|
||||
from innercontext.models.enums import BarrierState, OverallSkinState
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Routines
|
||||
# ---------------------------------------------------------------------------
|
||||
|
|
@ -223,6 +227,18 @@ def test_suggest_routine(client, session):
|
|||
with patch(
|
||||
"innercontext.api.routines.call_gemini_with_function_tools"
|
||||
) as mock_gemini:
|
||||
session.add(
|
||||
SkinConditionSnapshot(
|
||||
id=uuid.uuid4(),
|
||||
snapshot_date=date(2026, 2, 22),
|
||||
overall_state=OverallSkinState.GOOD,
|
||||
hydration_level=4,
|
||||
barrier_state=BarrierState.INTACT,
|
||||
priorities=["hydration"],
|
||||
)
|
||||
)
|
||||
session.commit()
|
||||
|
||||
# Mock the Gemini response
|
||||
mock_response = type(
|
||||
"Response",
|
||||
|
|
@ -231,7 +247,7 @@ def test_suggest_routine(client, session):
|
|||
"text": '{"steps": [{"product_id": null, "action_type": "shaving_razor"}], "reasoning": "because"}'
|
||||
},
|
||||
)
|
||||
mock_gemini.return_value = mock_response
|
||||
mock_gemini.return_value = (mock_response, None)
|
||||
|
||||
r = client.post(
|
||||
"/routines/suggest",
|
||||
|
|
@ -250,12 +266,32 @@ def test_suggest_routine(client, session):
|
|||
kwargs = mock_gemini.call_args.kwargs
|
||||
assert "USER PROFILE:" in kwargs["contents"]
|
||||
assert "UPCOMING GROOMING (next 7 days):" in kwargs["contents"]
|
||||
assert "snapshot from 2026-02-22" in kwargs["contents"]
|
||||
assert "RECENT ROUTINES: none" in kwargs["contents"]
|
||||
assert "function_handlers" in kwargs
|
||||
assert "get_product_details" in kwargs["function_handlers"]
|
||||
|
||||
|
||||
def test_suggest_batch(client, session):
|
||||
with patch("innercontext.api.routines.call_gemini") as mock_gemini:
|
||||
session.add(
|
||||
Routine(
|
||||
id=uuid.uuid4(),
|
||||
routine_date=date(2026, 2, 27),
|
||||
part_of_day="pm",
|
||||
)
|
||||
)
|
||||
session.add(
|
||||
SkinConditionSnapshot(
|
||||
id=uuid.uuid4(),
|
||||
snapshot_date=date(2026, 2, 20),
|
||||
overall_state=OverallSkinState.GOOD,
|
||||
hydration_level=4,
|
||||
barrier_state=BarrierState.INTACT,
|
||||
)
|
||||
)
|
||||
session.commit()
|
||||
|
||||
# Mock the Gemini response
|
||||
mock_response = type(
|
||||
"Response",
|
||||
|
|
@ -264,7 +300,7 @@ def test_suggest_batch(client, session):
|
|||
"text": '{"days": [{"date": "2026-03-03", "am_steps": [], "pm_steps": [], "reasoning": "none"}], "overall_reasoning": "batch test"}'
|
||||
},
|
||||
)
|
||||
mock_gemini.return_value = mock_response
|
||||
mock_gemini.return_value = (mock_response, None)
|
||||
|
||||
r = client.post(
|
||||
"/routines/suggest-batch",
|
||||
|
|
@ -281,6 +317,8 @@ def test_suggest_batch(client, session):
|
|||
assert data["overall_reasoning"] == "batch test"
|
||||
kwargs = mock_gemini.call_args.kwargs
|
||||
assert "USER PROFILE:" in kwargs["contents"]
|
||||
assert "2026-02-27 PM:" in kwargs["contents"]
|
||||
assert "snapshot from 2026-02-20" in kwargs["contents"]
|
||||
|
||||
|
||||
def test_suggest_batch_invalid_date_range(client):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue