import path from "node:path"; import assert from "node:assert/strict"; import { describe, it } from "node:test"; import { eq } from "drizzle-orm"; import { migrate } from "drizzle-orm/better-sqlite3/migrator"; import { createDatabaseContext, type DatabaseContext, } from "../src/db/database-context.js"; import { DistributionBoardRepository } from "../src/db/repositories/distribution-board.repository.js"; import { circuitLists } from "../src/db/schema/circuit-lists.js"; import { circuitSections } from "../src/db/schema/circuit-sections.js"; import { distributionBoards } from "../src/db/schema/distribution-boards.js"; import { projects } from "../src/db/schema/projects.js"; function createTestDatabase(): DatabaseContext { const context = createDatabaseContext(":memory:"); migrate(context.db, { migrationsFolder: path.resolve("src", "db", "migrations"), }); context.db.insert(projects).values({ id: "project-1", name: "Test project" }).run(); return context; } describe("distribution board repository integration", () => { it("commits board, circuit list and default sections together", () => { const context = createTestDatabase(); try { const repository = new DistributionBoardRepository(context.db); const board = repository.createWithCircuitListAndDefaultSections( "project-1", "UV-01" ); const persistedBoards = context.db .select() .from(distributionBoards) .where(eq(distributionBoards.id, board.id)) .all(); const persistedLists = context.db .select() .from(circuitLists) .where(eq(circuitLists.distributionBoardId, board.id)) .all(); const persistedSections = context.db .select() .from(circuitSections) .where(eq(circuitSections.circuitListId, board.id)) .all(); assert.deepEqual(persistedBoards, [board]); assert.equal(persistedLists.length, 1); assert.equal(persistedLists[0].name, "UV-01 Stromkreisliste"); assert.deepEqual( persistedSections .sort((left, right) => left.sortOrder - right.sortOrder) .map((section) => [section.key, section.prefix]), [ ["lighting", "-1F"], ["single_phase", "-2F"], ["three_phase", "-3F"], ["unassigned", "-UF"], ] ); } finally { context.close(); } }); it("rolls back board and circuit list when default section creation fails", () => { const context = createTestDatabase(); try { context.sqlite.exec(` CREATE TRIGGER fail_default_section_insert BEFORE INSERT ON circuit_sections BEGIN SELECT RAISE(ABORT, 'forced section failure'); END; `); const repository = new DistributionBoardRepository(context.db); assert.throws( () => repository.createWithCircuitListAndDefaultSections( "project-1", "UV rollback" ), /forced section failure/ ); assert.equal(context.db.select().from(distributionBoards).all().length, 0); assert.equal(context.db.select().from(circuitLists).all().length, 0); assert.equal(context.db.select().from(circuitSections).all().length, 0); } finally { context.close(); } }); });