from review_summary import ( build_review_summary, review_summary_lines, review_summary_markdown, review_summary_readiness_label, ) def test_review_summary_counts_expected_status_groups_and_export_scope(): rows = [ {"include": True, "review_status": "auto_detected", "source": "detected"}, {"include": False, "review_status": "needs_review", "source": "candidate"}, {"include": True, "review_status": "manual", "source": "manual"}, {"include": True, "review_status": "remembered", "source": "remembered"}, ] summary = build_review_summary(rows) assert summary["total_rows"] == 4 assert summary["automatically_detected_rows"] == 1 assert summary["rows_needing_review"] == 1 assert summary["manually_added_rows"] == 1 assert summary["remembered_replacement_rows"] == 1 assert summary["checked_rows_included_in_export"] == 3 assert summary["unchecked_rows_excluded_from_export"] == 1 assert summary["open_candidate_warning"] is True assert summary["open_candidate_rows"] == 1 def test_review_summary_infers_status_from_dutch_labels_and_source_fallbacks(): rows = [ {"include": "ja", "review_status_label": "Automatisch vervangen"}, {"include": "nee", "review_status_label": "Controle nodig"}, {"include": "true", "source": "manual"}, {"include": 1, "entity_type": "REMEMBERED"}, {"include": 0, "source": "unknown"}, ] summary = build_review_summary(rows) assert summary["automatically_detected_rows"] == 1 assert summary["rows_needing_review"] == 2 assert summary["manually_added_rows"] == 1 assert summary["remembered_replacement_rows"] == 1 assert summary["checked_rows_included_in_export"] == 3 assert summary["unchecked_rows_excluded_from_export"] == 2 def test_review_summary_ready_label_warns_when_candidates_are_open(): summary = build_review_summary([ {"include": True, "review_status": "auto_detected"}, {"include": False, "review_status": "needs_review"}, ]) assert review_summary_readiness_label(summary) == "Controle nodig voor export" assert summary["readiness_label"] == "Controle nodig voor export" def test_review_summary_ready_label_handles_empty_and_unselected_states(): empty_summary = build_review_summary([]) unselected_summary = build_review_summary([ {"include": False, "review_status": "auto_detected"}, ]) assert review_summary_readiness_label(empty_summary) == "Geen vervangregels gevonden" assert review_summary_readiness_label(unselected_summary) == "Niet klaar voor export" def test_review_summary_lines_and_markdown_are_user_facing_dutch(): summary = build_review_summary([ {"include": True, "review_status": "auto_detected"}, {"include": False, "review_status": "needs_review"}, ]) lines = review_summary_lines(summary) markdown = review_summary_markdown(summary) assert "Totaal aantal regels: 2" in lines assert "Meegenomen in export: 1" in lines assert "Niet meegenomen in export: 1" in lines assert any("Let op:" in line for line in lines) assert "- Controle nodig: 1" in markdown