Files
last30days-skill/tests/test_schema_v3.py
Jeffrey Sperling 96a4a78faa chore: migrate to gemini-3.1-flash-lite GA model
The Gemini 3.1 Flash Lite preview model is being discontinued on
May 25, 2026. Per Google's GA announcement, the underlying model
architecture is identical and only the model identifier needs to
be updated from `gemini-3.1-flash-lite-preview` to
`gemini-3.1-flash-lite`.

Also relaxes the `_require_gemini_31_preview` guard to accept any
`gemini-3.1-*` identifier (renamed to `_require_gemini_31`), so the
GA name and the still-preview `gemini-3.1-pro-preview` both pass.
2026-05-16 21:40:22 -07:00

90 lines
3.8 KiB
Python

import sys
import unittest
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "skills" / "last30days" / "scripts"))
from lib import schema
class SchemaV3Tests(unittest.TestCase):
def test_report_roundtrip(self):
report = schema.Report(
topic="test topic",
range_from="2026-02-14",
range_to="2026-03-16",
generated_at="2026-03-16T00:00:00+00:00",
provider_runtime=schema.ProviderRuntime(
reasoning_provider="gemini",
planner_model="gemini-3.1-flash-lite",
rerank_model="gemini-3.1-flash-lite",
),
query_plan=schema.QueryPlan(
intent="breaking_news",
freshness_mode="strict_recent",
cluster_mode="story",
raw_topic="test topic",
subqueries=[schema.SubQuery(label="primary", search_query="test topic", ranking_query="What happened with test topic?", sources=["grounding"])],
source_weights={"grounding": 1.0},
),
clusters=[schema.Cluster(cluster_id="cluster-1", title="Title", candidate_ids=["c1"], representative_ids=["c1"], sources=["grounding"], score=90)],
ranked_candidates=[schema.Candidate(
candidate_id="c1",
item_id="i1",
source="grounding",
sources=["grounding", "reddit"],
title="Title",
url="https://example.com",
snippet="Snippet",
subquery_labels=["primary"],
native_ranks={"primary:grounding": 1},
local_relevance=0.8,
freshness=90,
engagement=None,
source_quality=1.0,
rrf_score=0.02,
rerank_score=91,
final_score=90,
source_items=[
schema.SourceItem(item_id="i1", source="grounding", title="Title", body="Body", url="https://example.com", published_at="2026-03-16")
],
)],
items_by_source={"grounding": [schema.SourceItem(item_id="i1", source="grounding", title="Title", body="Body", url="https://example.com")]},
errors_by_source={},
warnings=["warning"],
artifacts={"grounding": []},
)
restored = schema.report_from_dict(schema.to_dict(report))
self.assertEqual(report.topic, restored.topic)
self.assertEqual(report.provider_runtime.planner_model, restored.provider_runtime.planner_model)
self.assertEqual(report.ranked_candidates[0].candidate_id, restored.ranked_candidates[0].candidate_id)
self.assertEqual(report.ranked_candidates[0].sources, restored.ranked_candidates[0].sources)
self.assertEqual(report.items_by_source["grounding"][0].title, restored.items_by_source["grounding"][0].title)
def test_source_item_from_dict_preserves_zero_valued_signals(self):
item = schema.source_item_from_dict(
{
"item_id": "x1",
"source": "x",
"title": "Title",
"body": "Body",
"url": "https://example.com",
"relevance_hint": 0.0,
"local_relevance": 0.0,
"freshness": 0,
"engagement_score": 0,
"source_quality": 0.0,
"local_rank_score": 0.0,
}
)
self.assertEqual(0.0, item.relevance_hint)
self.assertEqual(0.0, item.local_relevance)
self.assertEqual(0, item.freshness)
self.assertEqual(0, item.engagement_score)
self.assertEqual(0.0, item.source_quality)
self.assertEqual(0.0, item.local_rank_score)
if __name__ == "__main__":
unittest.main()