"""Tests for scripts.evaluation artifact assembly.""" from sage.core.models import EvalCase, EvalCaseProvenance, MetricsReport import scripts.evaluation as evaluation_script def _case( *, query: str, query_id: str, source_type: str, category: str, intent: str, subset_tags: tuple[str, ...], query_slice_tags: tuple[str, ...], origin_family: str, curation_mode: str, ) -> EvalCase: return EvalCase( query=query, relevant_items={"ASIN1": 3.0}, query_id=query_id, source_type=source_type, category=category, intent=intent, subset_tags=subset_tags, query_slice_tags=query_slice_tags, provenance=EvalCaseProvenance( schema_version="query_provenance_v1", origin_family=origin_family, curation_mode=curation_mode, source_dataset="amazon_esci", source_split="test", selection_policy="corpus_overlap_min_relevant_items_v1", subset_assignment_policy="normalized_query_sha256_v1", ), ) def test_build_primary_evaluation_artifact_adds_metadata_breakdowns(monkeypatch): cases = [ _case( query="wireless keyboard", query_id="qb_001", source_type="amazon_esci", category="keyboards", intent="use_case", subset_tags=("retrieval_eval",), query_slice_tags=(), origin_family="amazon_esci_overlap", curation_mode="pure_import", ), _case( query="latest earbuds to avoid", query_id="qb_002", source_type="manual_seed", category="audio", intent="problem_solving", subset_tags=("retrieval_eval", "special_probe"), query_slice_tags=( "recency_sensitive_query", "negative_problem_query", ), origin_family="manual_seed", curation_mode="candidate_bootstrap", ), ] case_results = [] for case, recommended_ids, metrics in [ ( cases[0], ["ASIN1", "ASIN3"], { "ndcg": 1.0, "hit": 1.0, "mrr": 1.0, "precision": 0.5, "recall": 1.0, "diversity": 0.2, "novelty": 2.0, }, ), ( cases[1], ["ASIN4", "ASIN1"], { "ndcg": 0.6309, "hit": 1.0, "mrr": 0.5, "precision": 0.5, "recall": 1.0, "diversity": 0.6, "novelty": 3.0, }, ), ]: row = case.to_dict() row["recommended_product_ids"] = recommended_ids row["relevant_item_count"] = 1 row["relevant_hits"] = [ { "product_id": "ASIN1", "rank": recommended_ids.index("ASIN1") + 1, "relevance": 3.0, } ] row["first_relevant_rank"] = recommended_ids.index("ASIN1") + 1 row["metrics"] = metrics case_results.append(row) monkeypatch.setattr( evaluation_script, "evaluate_recommendations_with_details", lambda **_kwargs: ( MetricsReport( n_cases=2, ndcg_at_k=0.8154, hit_at_k=1.0, mrr=0.75, precision_at_k=0.5, recall_at_k=1.0, diversity=0.4, coverage=0.6, novelty=2.5, k=10, ), case_results, ), ) artifact = evaluation_script.build_primary_evaluation_artifact( cases, item_embeddings={}, item_popularity={}, total_items=5, ) assert artifact["metrics"]["ndcg_at_10"] == 0.8154 assert artifact["case_metadata_summary"]["total_cases"] == 2 assert artifact["case_metadata_summary"]["by_origin_family"] == { "amazon_esci_overlap": 1, "manual_seed": 1, } assert artifact["case_metadata_summary"]["by_query_slice_tag"] == { "recency_sensitive_query": 1, "negative_problem_query": 1, } assert ( artifact["metric_breakdowns"]["by_curation_mode"]["candidate_bootstrap"][ "n_cases" ] == 1 ) assert ( artifact["metric_breakdowns"]["by_query_slice_tag"]["recency_sensitive_query"][ "n_cases" ] == 1 ) assert ( artifact["metric_breakdowns"]["by_query_slice_tag"]["recency_sensitive_query"][ "coverage" ] == 0.4 ) assert ( artifact["metric_breakdowns"]["by_subset_tag"]["retrieval_eval"]["n_cases"] == 2 ) assert "subset_tags" in artifact["breakdown_methodology"]["multi_membership_fields"]