"""Tests for spec paper-module builders and filename mapping.""" from researchlink.schemas.paper import PaperExtraction, PaperMetadata from researchlink.schemas.provenance import FieldStatus, SourceRecord from researchlink.services import paper_module as pm from researchlink.services.metadata_resolver import build_provenance def test_spec_rename_maps_and_passes_through(): assert pm.spec_filename("digest.md") == "summary.md" assert pm.spec_filename("reproducibility.md") == "reproduction.md" assert pm.spec_filename("README.md") == "README.md" # unmapped → identity assert pm.spec_filename("labs/01.py") == "labs/01.py" def test_paper_markdown_grounded(): meta = PaperMetadata(title="T", year=2024, authors_provisional=["A"]) ext = PaperExtraction(abstract="An abstract.", section_headings=["Intro", "Method"], full_text="Body text here.", page_count=3) md = pm.paper_markdown(meta, ext) assert md.startswith("# T") assert "An abstract." in md assert "- Intro" in md and "- Method" in md assert "Body text here." in md assert "Machine-extracted" in md def test_paper_markdown_marks_missing(): md = pm.paper_markdown(PaperMetadata(title="X"), PaperExtraction()) assert "[needs-verification]" in md def test_build_metadata_json_splits_sources_and_conflicts(): records = [ SourceRecord(name="arxiv", fields={"title": "T", "year": 2017}), SourceRecord(name="crossref", fields={"title": "T", "year": 2018}), ] prov = build_provenance(records) meta = PaperMetadata(title="T", slug="2017-t") payload, sources = pm.build_metadata_json(prov, meta, model_slug="m") assert payload["schema_version"] == "0.1" assert payload["slug"] == "2017-t" assert payload["generated_by_model"] == "m" assert "year" in payload["conflicts"] # conflict surfaced assert payload["fields"]["title"]["status"] == FieldStatus.verified.value assert payload["fields"]["title"]["confidence_label"] in ("high", "medium", "low") assert "sources" not in payload["fields"] # sources split out assert sources["schema_version"] == "0.1" assert len(sources["sources"]) == 2 assert sources["sources"][0]["type"] == "arxiv" assert sources["sources"][0]["status"] == "ok"