From 6c1713e1905538e29a105b5e19e8b606b88ce9a0 Mon Sep 17 00:00:00 2001 From: Saberlve Date: Wed, 15 Apr 2026 18:58:46 +0800 Subject: [PATCH] test: add missing fixture files and __init__.py to worktree Co-Authored-By: Claude Opus 4.6 --- tests/__init__.py | 2 + tests/fixtures/__init__.py | 1 + tests/fixtures/build_zotero_fixture.py | 112 +++++++++++++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 tests/__init__.py create mode 100644 tests/fixtures/__init__.py create mode 100644 tests/fixtures/build_zotero_fixture.py diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..7b32724 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,2 @@ +"""Test package.""" + diff --git a/tests/fixtures/__init__.py b/tests/fixtures/__init__.py new file mode 100644 index 0000000..d1b3395 --- /dev/null +++ b/tests/fixtures/__init__.py @@ -0,0 +1 @@ +"""Test fixtures package.""" diff --git a/tests/fixtures/build_zotero_fixture.py b/tests/fixtures/build_zotero_fixture.py new file mode 100644 index 0000000..1f79f2c --- /dev/null +++ b/tests/fixtures/build_zotero_fixture.py @@ -0,0 +1,112 @@ +from __future__ import annotations + +import sqlite3 +from pathlib import Path + + +def build_fixture_zotero_dir(zotero_dir: Path) -> None: + storage_dir = zotero_dir / "storage" / "ATTACH01" + storage_dir.mkdir(parents=True, exist_ok=True) + (storage_dir / "paper.txt").write_text( + "This paper studies card pipelines for research writing.", + encoding="utf-8", + ) + + conn = sqlite3.connect(zotero_dir / "zotero.sqlite") + cur = conn.cursor() + + cur.executescript( + """ + create table itemTypes (itemTypeID integer primary key, typeName text, templateItemTypeID int, display int); + create table items (itemID integer primary key, itemTypeID int, dateAdded text, dateModified text, clientDateModified text, libraryID int, key text, version int, synced int); + create table fields (fieldID integer primary key, fieldName text, fieldFormatID int); + create table itemDataValues (valueID integer primary key, value text); + create table itemData (itemID int, fieldID int, valueID int); + create table creators (creatorID integer primary key, firstName text, lastName text, fieldMode int); + create table creatorTypes (creatorTypeID integer primary key, creatorType text); + create table itemCreators (itemID int, creatorID int, creatorTypeID int, orderIndex int); + create table tags (tagID integer primary key, name text); + create table itemTags (itemID int, tagID int, type int); + create table collections (collectionID integer primary key, collectionName text, parentCollectionID int, clientDateModified text, libraryID int, key text, version int, synced int); + create table collectionItems (collectionID int, itemID int, orderIndex int); + create table itemNotes (itemID integer primary key, parentItemID int, note text, title text); + create table itemAttachments (itemID integer primary key, parentItemID int, linkMode int, contentType text, charsetID int, path text, syncState int, storageModTime int, storageHash text, lastProcessedModificationTime int); + """ + ) + + cur.executemany( + "insert into itemTypes(itemTypeID, typeName, templateItemTypeID, display) values (?, ?, ?, ?)", + [ + (1, "journalArticle", None, 1), + (2, "note", None, 1), + (3, "attachment", None, 1), + ], + ) + cur.executemany( + "insert into fields(fieldID, fieldName, fieldFormatID) values (?, ?, ?)", + [ + (1, "title", 1), + (2, "abstractNote", 1), + (3, "date", 1), + ], + ) + cur.executemany( + "insert into itemDataValues(valueID, value) values (?, ?)", + [ + (1, "Card Pipelines for Research Writing"), + (2, "Merged metadata and notes improve drafting support."), + (3, "2024"), + ], + ) + cur.execute( + "insert into items(itemID, itemTypeID, dateAdded, dateModified, clientDateModified, libraryID, key, version, synced) values (?, ?, '', '', '', 1, ?, 1, 1)", + (1, 1, "PAPER0001"), + ) + cur.executemany( + "insert into itemData(itemID, fieldID, valueID) values (?, ?, ?)", + [ + (1, 1, 1), + (1, 2, 2), + (1, 3, 3), + ], + ) + cur.execute( + "insert into creators(creatorID, firstName, lastName, fieldMode) values (1, 'Alice', 'Smith', 0)" + ) + cur.execute( + "insert into creatorTypes(creatorTypeID, creatorType) values (1, 'author')" + ) + cur.execute( + "insert into itemCreators(itemID, creatorID, creatorTypeID, orderIndex) values (1, 1, 1, 0)" + ) + cur.executemany( + "insert into tags(tagID, name) values (?, ?)", + [ + (1, "llm"), + (2, "writing"), + ], + ) + cur.executemany( + "insert into itemTags(itemID, tagID, type) values (?, ?, 0)", + [ + (1, 1), + (1, 2), + ], + ) + cur.executemany( + "insert into collections(collectionID, collectionName, parentCollectionID, clientDateModified, libraryID, key, version, synced) values (?, ?, ?, '', 1, ?, 1, 1)", + [ + (1, "Theory", None, "COLL0001"), + (2, "Drafting", 1, "COLL0002"), + ], + ) + cur.execute("insert into collectionItems(collectionID, itemID, orderIndex) values (2, 1, 0)") + cur.execute( + "insert into itemNotes(itemID, parentItemID, note, title) values (2, 1, '

Merged notes matter.

', 'note')" + ) + cur.execute( + "insert into itemAttachments(itemID, parentItemID, linkMode, contentType, charsetID, path, syncState, storageModTime, storageHash, lastProcessedModificationTime) values (3, 1, 1, 'text/plain', null, 'storage:ATTACH01/paper.txt', 0, 0, '', 0)" + ) + + conn.commit() + conn.close()