Files
Jyotisha/tests/test_active_rectification_events_v4.py
2026-07-27 09:57:14 +08:00

98 lines
3.6 KiB
Python

from __future__ import annotations
from scripts import active_rectification_events_v4 as v4
def _row(candidate_time: str, event_id: str, points: float):
return {
"time": candidate_time,
"score": points,
"evidence": [{
"event_id": event_id,
"domain": "education",
"candidate_time": candidate_time,
"rule_ids": ["test"],
"points": points,
}],
"missing_layers": [],
}
def test_v4_scores_real_date_boundaries_and_never_confirms_a_minute(monkeypatch) -> None:
calls = []
def fake_compute(request):
calls.append(request)
event_id = request["events"][0]["id"]
boundary = request["events"][0]["date"]
return [
_row("05:13", event_id, 10 if boundary.endswith("-01") else 8),
_row("05:14", event_id, 9 if boundary.endswith("-01") else 9),
_row("05:15", event_id, 8 if boundary.endswith("-01") else 10),
]
monkeypatch.setattr(v4, "compute_event_candidate_rows", fake_compute)
result = v4.score_life_events_v4({
"birth_date": "1997-08-08",
"start_time": "04:30",
"end_time": "05:30",
"lat": 36.419,
"lon": 114.213,
"tz": 8.0,
"events": [{
"id": "00000000-0000-4000-8000-000000000001",
"domain": "education",
"event_kind": "education_milestone",
"date_start": "2016-09-01",
"date_end": "2016-09-30",
"precision": "month",
"summary": "大学入学",
}],
})
assert [call["events"][0]["date"] for call in calls] == ["2016-09-01", "2016-09-30"]
assert result["candidate_scores"][1]["score"] == 9
assert result["robustness"]["date_sensitivity_retention_rate"] == 1
assert result["can_confirm_exact_minute"] is False
assert result["calculation_spec_hash"] == "3e558d5aca9920357bda1d11c3f34fd9a4c2a7d92ccd9bc05cf85fbddd1bee20"
def test_v4_api_validates_event_kind_and_date_boundaries(monkeypatch) -> None:
from scripts.jyotish_api_server import BadRequest, JyotishAPIHandler
captured = {}
monkeypatch.setattr("scripts.jyotish_api_server._load_local_module", lambda name: v4)
monkeypatch.setattr(v4, "score_life_events_v4", lambda request: captured.setdefault("request", request) or {})
handler = JyotishAPIHandler.__new__(JyotishAPIHandler)
body = {
"birth_date": "1997-08-08",
"start_time": "05:00",
"end_time": "05:30",
"lat": 36.419,
"lon": 114.213,
"tz": 8,
"events": [{
"id": "00000000-0000-4000-8000-000000000001",
"domain": "relationship",
"event_kind": "relationship_end",
"date_start": "2020-10-01",
"date_end": "2020-10-31",
"precision": "month",
"summary": "关系结束",
}],
}
result = handler._compute_active_rectification_events_v4(body)
assert result["endpoint"] == "active_rectification_events_v4"
assert captured["request"]["events"][0]["date_end"] == "2020-10-31"
import pytest
with pytest.raises(BadRequest, match="event_kind does not match"):
handler._compute_active_rectification_events_v4({
**body,
"events": [{**body["events"][0], "event_kind": "relationship_start", "domain": "career"}],
})
with pytest.raises(BadRequest, match="date_start must not exceed"):
handler._compute_active_rectification_events_v4({
**body,
"events": [{**body["events"][0], "date_start": "2020-11-01"}],
})