100 lines
3.3 KiB
Python
100 lines
3.3 KiB
Python
"""Zotero review rows export into the append-only ledger."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typer.testing import CliRunner
|
|
|
|
from cli import app
|
|
from lead.ledger.export import export_project
|
|
from lead.ledger.store import open_ledger
|
|
from zot.db import TYPE_MAP, Db
|
|
from zot.schema import create_db
|
|
|
|
runner = CliRunner()
|
|
|
|
|
|
def test_export_is_idempotent_until_the_extraction_version_changes(tmp_path):
|
|
zpath = str(tmp_path / "z.sqlite")
|
|
con = create_db(zpath)
|
|
con.close()
|
|
with Db(zpath) as zdb:
|
|
item_id = zdb.create_item(TYPE_MAP["journalArticle"], key="ABCD2345")
|
|
zdb.set_fields(item_id, {"title": "All-cause readmission"})
|
|
for tag in (
|
|
"project:lead-precursors",
|
|
"found-in:pubmed",
|
|
"stage:4-included",
|
|
"screen:include",
|
|
):
|
|
zdb.tag_item(item_id, tag)
|
|
zdb.add_note(item_id, "target_id: Q.ACR\n\nIncluded.")
|
|
anchor = zdb.create_item(TYPE_MAP["journalArticle"], key="EFGH5678")
|
|
zdb.tag_item(anchor, "project:lead-precursors")
|
|
zdb.tag_item(anchor, "module:prisma")
|
|
zdb.tag_item(anchor, "stage:4-included")
|
|
zdb.add_note(anchor, "target_id: Q.ACR")
|
|
zdb.commit()
|
|
|
|
ledger = open_ledger(str(tmp_path / "ledger.duckdb"))
|
|
try:
|
|
first = export_project(
|
|
zdb,
|
|
ledger,
|
|
"lead-precursors",
|
|
extraction_version="v1",
|
|
actor="tester",
|
|
)
|
|
assert first == {"source": 1, "decision": 1, "extraction": 1}
|
|
second = export_project(
|
|
zdb,
|
|
ledger,
|
|
"lead-precursors",
|
|
extraction_version="v1",
|
|
actor="tester",
|
|
)
|
|
assert second == {"source": 0, "decision": 0, "extraction": 0}
|
|
|
|
source_hash = ledger.execute(
|
|
"select content_hash from lead_evidence.source"
|
|
).fetchone()[0]
|
|
stored_key = ledger.execute(
|
|
"select zotero_key from lead_evidence.source"
|
|
).fetchone()[0]
|
|
assert stored_key == "ABCD2345"
|
|
third = export_project(
|
|
zdb,
|
|
ledger,
|
|
"lead-precursors",
|
|
extraction_version="v2",
|
|
actor="tester",
|
|
)
|
|
assert third["extraction"] == 1
|
|
hashes = {
|
|
row[0]
|
|
for row in ledger.execute(
|
|
"select content_hash from lead_evidence.source"
|
|
).fetchall()
|
|
}
|
|
assert hashes != {source_hash}
|
|
versions = {
|
|
row[0]
|
|
for row in ledger.execute(
|
|
"select extraction_version from lead_evidence.extraction"
|
|
).fetchall()
|
|
}
|
|
assert versions == {"v1", "v2"}
|
|
targets = {
|
|
row[0]
|
|
for row in ledger.execute(
|
|
"select target_id from lead_evidence.extraction"
|
|
).fetchall()
|
|
}
|
|
assert targets == {"Q.ACR"}
|
|
finally:
|
|
ledger.close()
|
|
|
|
|
|
def test_ledger_export_command_is_registered():
|
|
result = runner.invoke(app, ["lead", "ledger", "export", "--help"])
|
|
assert result.exit_code == 0
|