"""Tests for reloading a persisted paper module.""" import json from researchlink.schemas.paper import PaperExtraction, PaperMetadata from researchlink.schemas.provenance import SourceRecord from researchlink.services import module_io, paper_module from researchlink.services.metadata_resolver import build_provenance def _write_module(tmp_path): mod = tmp_path / "2017-attention" mod.mkdir() meta = PaperMetadata(title="Attention Is All You Need", year=2017, doi="10.1/x", arxiv_id="1706.03762", venue="NeurIPS", authors_provisional=["Vaswani", "Shazeer"], slug="2017-attention") ext = PaperExtraction(abstract="We propose the Transformer.", section_headings=["Introduction", "Method"], full_text="We propose the Transformer. It relies on attention.") (mod / "paper.md").write_text(paper_module.paper_markdown(meta, ext), encoding="utf-8") prov = build_provenance([SourceRecord(name="user", fields={ "title": meta.title, "year": 2017, "doi": "10.1/x", "arxiv_id": "1706.03762", "venue": "NeurIPS", "authors": meta.authors_provisional, "url": "https://arxiv.org/abs/1706.03762", })]) payload, sources = paper_module.build_metadata_json(prov, meta) (mod / "metadata.json").write_text(json.dumps(payload), encoding="utf-8") (mod / "sources.json").write_text(json.dumps(sources), encoding="utf-8") (mod / "references.md").write_text( "# References\n1. Bahdanau et al. Neural MT. 2015. ⚠️ `needs-verification`\n" "2. Sutskever et al. Seq2Seq. 2014.\n", encoding="utf-8") return mod def test_load_metadata_roundtrip(tmp_path): mod = _write_module(tmp_path) meta = module_io.load_metadata(mod) assert meta.title == "Attention Is All You Need" assert meta.year == 2017 assert meta.doi == "10.1/x" assert meta.arxiv_id == "1706.03762" assert meta.venue == "NeurIPS" assert meta.authors_provisional == ["Vaswani", "Shazeer"] assert meta.slug == "2017-attention" def test_load_extraction_roundtrip(tmp_path): mod = _write_module(tmp_path) ext = module_io.load_extraction(mod) assert ext.abstract == "We propose the Transformer." assert ext.section_headings == ["Introduction", "Method"] assert "relies on attention" in (ext.full_text or "") assert len(ext.references_raw) == 2 def test_load_references_strips_markers(tmp_path): mod = _write_module(tmp_path) refs = module_io.load_references(mod) assert refs[0] == "Bahdanau et al. Neural MT. 2015." # status marker stripped assert "Sutskever" in refs[1] def test_load_missing_files_tolerant(tmp_path): empty = tmp_path / "empty" empty.mkdir() assert module_io.load_metadata(empty).title == "Unknown Title" assert module_io.load_extraction(empty).references_raw == [] def test_write_module_file_maps_spec_name(tmp_path): mod = tmp_path / "m" mod.mkdir() dest = module_io.write_module_file(mod, "teaching-path.md", "# Study\n") assert dest.name == "study_notes.md" # internal key mapped to spec name assert dest.read_text() == "# Study\n"