Files
Termix/plugins/workspaces/tests/backend/repository.test.ts
T

65 lines
2.4 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { createTestDb, type TestDb } from "@termix/plugin-sdk/testing";
import { workspaces } from "../../src/backend/tables.js";
import {
createWorkspaceRepository,
type WorkspaceRepository,
} from "../../src/backend/repository.js";
import { pluginDir } from "./helpers";
let db: TestDb;
let repo: WorkspaceRepository;
beforeEach(async () => {
db = await createTestDb(pluginDir, {
before: (sqlite) =>
sqlite.exec("INSERT INTO users (id) VALUES ('user-1'), ('user-2')"),
});
repo = createWorkspaceRepository(
db.database,
await db.database.define(workspaces),
);
});
afterEach(() => db.close());
describe("workspace repository", () => {
it("reads a new row back by its own sync id", async () => {
const a = await repo.create("user-1", { name: "A", payload: "{}" });
const b = await repo.create("user-1", { name: "B", payload: "{}" });
expect(a.name).toBe("A");
expect(b.name).toBe("B");
expect(a.syncId).not.toBe(b.syncId);
expect(a.createdAt).toBe(a.updatedAt);
});
it("returns the updated last session rather than a new one", async () => {
const first = await repo.upsertLastSession("user-1", '{"tabs":[]}', "t1");
const second = await repo.upsertLastSession("user-1", '{"tabs":[1]}', "t2");
expect(second.id).toBe(first.id);
expect(second.payload).toBe('{"tabs":[1]}');
expect(second.updatedAt).toBe("t2");
});
it("switches the default without touching another user's", async () => {
const theirs = await repo.create("user-2", { name: "T", payload: "{}" });
await repo.setDefault("user-2", theirs.id);
const a = await repo.create("user-1", { name: "A", payload: "{}" });
const b = await repo.create("user-1", { name: "B", payload: "{}" });
await repo.setDefault("user-1", a.id);
await repo.setDefault("user-1", b.id);
expect((await repo.findById("user-1", a.id))?.isDefault).toBe(false);
expect((await repo.findById("user-1", b.id))?.isDefault).toBe(true);
expect((await repo.findById("user-2", theirs.id))?.isDefault).toBe(true);
});
it("refuses to edit or delete the last session", async () => {
const last = await repo.upsertLastSession("user-1", "{}");
expect(await repo.update("user-1", last.id, { name: "x" })).toBeNull();
expect(await repo.setDefault("user-1", last.id)).toBeNull();
expect(await repo.delete("user-1", last.id)).toBe(false);
});
});