File size: 2,321 Bytes
a753e74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
"""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"