Introduce detailed progress reporting for PDF layout parsing, exposing phase and page-level updates to clients. Replace legacy parseStatus with a structured parseState field in the database schema, updating all relevant backend and API logic. Add SSE endpoint for real-time parse progress updates. Update client hooks and UI to reflect granular progress and improve user feedback during document parsing. Includes migration scripts and new parse-state utility module.
76 lines
2.2 KiB
TypeScript
76 lines
2.2 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import Database from 'better-sqlite3';
|
|
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
|
import { eq } from 'drizzle-orm';
|
|
import { documents } from '../../src/db/schema_sqlite';
|
|
import { transferUserDocuments } from '../../src/lib/server/user/claim-data';
|
|
|
|
test.describe('transferUserDocuments', () => {
|
|
test('moves document rows to new user without PK conflicts', async () => {
|
|
process.env.BASE_URL = 'http://localhost:3003';
|
|
process.env.AUTH_SECRET = 'test-secret';
|
|
|
|
const sqlite = new Database(':memory:');
|
|
sqlite.exec(`
|
|
CREATE TABLE documents (
|
|
id TEXT NOT NULL,
|
|
user_id TEXT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
type TEXT NOT NULL,
|
|
size INTEGER NOT NULL,
|
|
last_modified INTEGER NOT NULL,
|
|
file_path TEXT NOT NULL,
|
|
parse_state TEXT,
|
|
parsed_json_key TEXT,
|
|
created_at INTEGER,
|
|
PRIMARY KEY (id, user_id)
|
|
);
|
|
`);
|
|
|
|
const db = drizzle(sqlite);
|
|
|
|
const fromUserId = 'anon';
|
|
const toUserId = 'user';
|
|
|
|
await db.insert(documents).values([
|
|
{
|
|
id: 'doc-a',
|
|
userId: fromUserId,
|
|
name: 'a.pdf',
|
|
type: 'pdf',
|
|
size: 1,
|
|
lastModified: 1,
|
|
filePath: 'doc-a__a.pdf',
|
|
},
|
|
{
|
|
id: 'doc-b',
|
|
userId: fromUserId,
|
|
name: 'b.txt',
|
|
type: 'html',
|
|
size: 2,
|
|
lastModified: 2,
|
|
filePath: 'doc-b__b.txt',
|
|
},
|
|
// Existing row for the destination user (conflict on insert)
|
|
{
|
|
id: 'doc-a',
|
|
userId: toUserId,
|
|
name: 'a.pdf',
|
|
type: 'pdf',
|
|
size: 1,
|
|
lastModified: 1,
|
|
filePath: 'doc-a__a.pdf',
|
|
},
|
|
]);
|
|
|
|
const transferred = await transferUserDocuments(fromUserId, toUserId, { db });
|
|
expect(transferred).toBe(2);
|
|
|
|
const remainingFrom = await db.select().from(documents).where(eq(documents.userId, fromUserId));
|
|
expect(remainingFrom.length).toBe(0);
|
|
|
|
const remainingTo = await db.select().from(documents).where(eq(documents.userId, toUserId));
|
|
const ids = remainingTo.map((r) => r.id).sort();
|
|
expect(ids).toEqual(['doc-a', 'doc-b']);
|
|
});
|
|
});
|