import { describe, test, expect, beforeAll, afterAll } from "bun:test"; import { and, eq } from "drizzle-orm"; import { db } from "./db/client"; import { blockModels } from "./db/schema"; import { storeBlockModels } from "./models"; import { createTestServer, deleteTestServer } from "./test-helpers"; describe("storeBlockModels", () => { let server: { id: string }; beforeAll(async () => { server = await createTestServer("block-models"); }); afterAll(async () => { await deleteTestServer(server.id); }); test("upserts blockstate and model entries, keyed by (serverId, kind, name)", async () => { await storeBlockModels(server.id, [ { kind: "blockstate", name: "thaumcraft:blockcustomplant", json: '{"variants":{}}' }, { kind: "model", name: "thaumcraft:block/customplant", json: '{"elements":[]}' }, ]); const rows = await db.select().from(blockModels).where(eq(blockModels.serverId, server.id)); expect(rows.length).toBe(2); expect(rows.find((r) => r.kind === "blockstate")?.name).toBe("thaumcraft:blockcustomplant"); expect(rows.find((r) => r.kind === "model")?.json).toBe('{"elements":[]}'); }); test("a blockstate and a model can share the same name without colliding (kind is part of the key)", async () => { await storeBlockModels(server.id, [ { kind: "blockstate", name: "thaumcraft:foo", json: '{"a":1}' }, { kind: "model", name: "thaumcraft:foo", json: '{"b":2}' }, ]); const rows = await db .select() .from(blockModels) .where(and(eq(blockModels.serverId, server.id), eq(blockModels.name, "thaumcraft:foo"))); expect(rows.length).toBe(2); }); test("re-sending the same (kind, name) with new JSON overwrites, not duplicates", async () => { await storeBlockModels(server.id, [{ kind: "model", name: "thaumcraft:block/customplant", json: '{"v":1}' }]); await storeBlockModels(server.id, [{ kind: "model", name: "thaumcraft:block/customplant", json: '{"v":2}' }]); const rows = await db .select() .from(blockModels) .where( and( eq(blockModels.serverId, server.id), eq(blockModels.kind, "model"), eq(blockModels.name, "thaumcraft:block/customplant"), ), ); expect(rows.length).toBe(1); expect(rows[0]!.json).toBe('{"v":2}'); }); test("an empty list is a no-op, not an error", async () => { await expect(storeBlockModels(server.id, [])).resolves.toBeUndefined(); }); });