fix(thread): make wait-state side effects atomic
This commit is contained in:
1 parent
f8a90f4402
commit
a1dd361f51
4 files changed
+356
-83
No files matched your search
@@ -0,0 +1,62 @@
|
||||
import { join } from "node:path";
|
||||
import { tmpdir } from "node:os";
|
||||
import { mkdtemp, rm } from "node:fs/promises";
|
||||
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
beforeAll(() => {
|
||||
process.env.AGENTCOMPANY_ALLOW_INSECURE_VAULT = "true";
|
||||
});
|
||||
|
||||
vi.mock("electron", () => ({
|
||||
safeStorage: {
|
||||
isEncryptionAvailable: () => false,
|
||||
getSelectedStorageBackend: () => "basic_text",
|
||||
encryptString: (value: string) => Buffer.from(value, "utf8"),
|
||||
decryptString: (value: Buffer) => value.toString("utf8"),
|
||||
},
|
||||
}));
|
||||
|
||||
import { AppDatabase } from "../../src/main/database";
|
||||
|
||||
describe("AppDatabase transactions", () => {
|
||||
let tempDir: string;
|
||||
let db: AppDatabase;
|
||||
|
||||
beforeEach(async () => {
|
||||
tempDir = await mkdtemp(join(tmpdir(), "agentcompany-db-tx-"));
|
||||
db = new AppDatabase(tempDir);
|
||||
db.init();
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
db.close();
|
||||
await rm(tempDir, { recursive: true, force: true });
|
||||
});
|
||||
|
||||
it("rolls back nested transactions to their savepoint", () => {
|
||||
const outerCompanyId = db.withTransaction(() => {
|
||||
const companyId = db.core.company.saveCompany({
|
||||
name: "Nested Transaction Co",
|
||||
description: "Outer transaction should survive inner rollback.",
|
||||
status: "active",
|
||||
});
|
||||
|
||||
expect(() => {
|
||||
db.withTransaction(() => {
|
||||
db.core.company.saveCompany({
|
||||
name: "Nested Transaction Rolled Back",
|
||||
description: "Inner transaction should roll back.",
|
||||
status: "active",
|
||||
});
|
||||
throw new Error("inner write failed");
|
||||
});
|
||||
}).toThrow("inner write failed");
|
||||
|
||||
return companyId;
|
||||
});
|
||||
|
||||
const companies = db.queryAll<{ id: string; name: string }>("select id, name from companies order by created_at asc");
|
||||
expect(companies.map((company) => company.id)).toContain(outerCompanyId);
|
||||
expect(companies.some((company) => company.name === "Nested Transaction Rolled Back")).toBe(false);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user