src/db_reset.test.ts
Rama main · réplica de lectura del repositorio original.
import { beforeEach, describe, expect, it, vi } from "vitest";
import path from "node:path";
const mocks = vi.hoisted(() => {
const sqlite = {
pragma: vi.fn(),
close: vi.fn(),
};
return {
sqlite,
Database: vi.fn(() => sqlite),
drizzle: vi.fn(() => ({ $client: sqlite })),
migrate: vi.fn(),
fs: {
existsSync: vi.fn(),
statSync: vi.fn(() => ({ size: 1000 })),
unlinkSync: vi.fn(),
mkdirSync: vi.fn(),
},
getUserDataPath: vi.fn(() => "/mock/user-data"),
};
});
vi.mock("better-sqlite3", () => ({
default: mocks.Database,
}));
vi.mock("drizzle-orm/better-sqlite3", () => ({
drizzle: mocks.drizzle,
}));
vi.mock("drizzle-orm/better-sqlite3/migrator", () => ({
migrate: mocks.migrate,
}));
vi.mock("node:fs", () => ({
default: mocks.fs,
}));
vi.mock("@/paths/paths", () => ({
getUserDataPath: mocks.getUserDataPath,
}));
vi.mock("electron-log", () => ({
default: {
scope: () => ({
log: vi.fn(),
warn: vi.fn(),
error: vi.fn(),
}),
},
}));
async function loadDbModule() {
vi.resetModules();
return import("@/db");
}
describe("database reset helpers", () => {
beforeEach(() => {
vi.clearAllMocks();
mocks.fs.existsSync.mockReturnValue(true);
});
it("closes the database and clears the singleton so it can be reinitialized", async () => {
const { closeDatabase, getDb, initializeDatabase } = await loadDbModule();
initializeDatabase();
closeDatabase();
expect(mocks.sqlite.close).toHaveBeenCalledOnce();
expect(() => getDb()).toThrow("Database not initialized");
initializeDatabase();
expect(mocks.Database).toHaveBeenCalledTimes(2);
});
it("returns the sqlite database and sidecar file paths", async () => {
const { getDatabaseFilePaths } = await loadDbModule();
expect(getDatabaseFilePaths()).toEqual([
path.join("/mock/user-data", "sqlite.db"),
path.join("/mock/user-data", "sqlite.db-wal"),
path.join("/mock/user-data", "sqlite.db-shm"),
]);
});
});