Files
readest/apps/readest-app/src/__tests__/database/turso-rust.tauri.test.ts
T

112 lines
3.3 KiB
TypeScript

import { describe, it, expect, beforeEach, afterEach } from 'vitest';
import { invoke } from '../tauri/tauri-invoke';
import { DatabaseService, DatabaseExecResult, DatabaseRow } from '@/types/database';
import { baseTests } from './suites/base-tests';
import { ftsTests } from './suites/fts-tests';
import { vectorTests } from './suites/vector-tests';
import { migrationTests } from './suites/migration-tests';
/**
* Thin DatabaseService adapter over raw Tauri IPC invoke() calls.
* Enables reuse of the shared test suites.
*/
class TauriDatabaseAdapter implements DatabaseService {
constructor(private dbPath: string) {}
async execute(sql: string, params: unknown[] = []): Promise<DatabaseExecResult> {
const result = (await invoke('plugin:turso|execute', {
db: this.dbPath,
query: sql,
values: params,
})) as { rowsAffected: number; lastInsertId: number };
return {
rowsAffected: result.rowsAffected,
lastInsertId: result.lastInsertId,
};
}
async select<T extends DatabaseRow = DatabaseRow>(
sql: string,
params: unknown[] = [],
): Promise<T[]> {
return (await invoke('plugin:turso|select', {
db: this.dbPath,
query: sql,
values: params,
})) as T[];
}
async batch(statements: string[]): Promise<void> {
await invoke('plugin:turso|batch', {
db: this.dbPath,
queries: statements,
});
}
async close(): Promise<void> {
await invoke('plugin:turso|close', { db: this.dbPath });
}
}
/**
* Integration tests for the turso-backed tauri-plugin-turso running inside
* the Tauri WebView. Calls plugin IPC commands via __TAURI_INTERNALS__.invoke().
*
* The database is opened with experimental index_method enabled so that
* FTS (Tantivy-based) CREATE INDEX ... USING fts works.
*/
describe('turso plugin (native Tauri)', () => {
const DB_PATH = 'sqlite::memory:';
let dbPath: string;
let db: DatabaseService;
beforeEach(async () => {
dbPath = (await invoke('plugin:turso|load', {
options: { path: DB_PATH, experimental: ['index_method'] },
})) as string;
db = new TauriDatabaseAdapter(dbPath);
});
afterEach(async () => {
await db.close();
});
// ---------------------------------------------------------------------------
// Connection lifecycle
// ---------------------------------------------------------------------------
it('loads an in-memory database and returns a path', () => {
expect(typeof dbPath).toBe('string');
expect(dbPath.length).toBeGreaterThan(0);
});
// ---------------------------------------------------------------------------
// Plugin config
// ---------------------------------------------------------------------------
it('get_config returns encryption status', async () => {
const config = (await invoke('plugin:turso|get_config')) as { encrypted: boolean };
expect(typeof config.encrypted).toBe('boolean');
});
// ---------------------------------------------------------------------------
// Shared test suites
// ---------------------------------------------------------------------------
describe('Base Operations', () => {
baseTests(() => db);
});
describe('Full-Text Search', () => {
ftsTests(() => db);
});
describe('Vector Search', () => {
vectorTests(() => db);
});
describe('Migrations', () => {
migrationTests(() => db);
});
});