ulthar-framework/packages/fabric/sqlite-store/state/state-store.test.ts

168 lines
3.8 KiB
TypeScript

import { Effect, Run } from "@fabric/core";
import { Field, isLike, Model } from "@fabric/domain";
import { UUIDGeneratorMock } from "@fabric/domain/mocks";
import { afterEach, beforeEach, describe, expect, test } from "@fabric/testing";
import { SQLiteStateStore } from "./state-store.ts";
describe("State Store", () => {
const models = [
Model.entityFrom("demo", {
value: Field.float(),
owner: Field.reference({ targetModel: "users" }),
optional: Field.string({ isOptional: true }),
}),
Model.entityFrom("users", {
name: Field.string(),
}),
];
let store: SQLiteStateStore<(typeof models)[number]>;
beforeEach(async () => {
store = new SQLiteStateStore(":memory:", models);
await store.migrate().runOrThrow();
});
afterEach(async () => {
await store.close().runOrThrow();
});
test("should insert a record", async () => {
const newUUID = UUIDGeneratorMock.generate();
await store.insertInto("users", {
id: newUUID,
name: "test",
}).runOrThrow();
});
test("should select all records", async () => {
const newUUID = UUIDGeneratorMock.generate();
await store.insertInto("users", {
name: "test",
id: newUUID,
}).runOrThrow();
const result = await store.from("users").select().runOrThrow();
// expectTypeOf(result).toEqualTypeOf<
// {
// id: UUID;
// name: string;
// }[]
// >();
expect(result).toEqual([
{
id: newUUID,
name: "test",
},
]);
});
test("should select records with a filter", async () => {
const newUUID = UUIDGeneratorMock.generate();
await Effect.seq(
() =>
store.insertInto("users", {
name: "test",
id: newUUID,
}),
() =>
store.insertInto("users", {
name: "anotherName",
id: UUIDGeneratorMock.generate(),
}),
() =>
store.insertInto("users", {
name: "anotherName2",
id: UUIDGeneratorMock.generate(),
}),
).runOrThrow();
const result = await store
.from("users")
.where({
name: isLike("te%"),
})
.select().runOrThrow();
// expectTypeOf(result).toEqualTypeOf<
// {
// id: UUID;
// name: string;
// }[]
// >();
expect(result).toEqual([
{
id: newUUID,
name: "test",
},
]);
});
test("should update a record", async () => {
const newUUID = UUIDGeneratorMock.generate();
await Effect.seq(
() =>
store.insertInto("users", {
name: "test",
id: newUUID,
}),
() =>
store.update("users", newUUID, {
name: "updated",
}),
).runOrThrow();
const result = await store.from("users").where({ id: newUUID }).selectOne()
.runOrThrow();
expect(result).toEqual({
id: newUUID,
name: "updated",
});
});
test("should delete a record", async () => {
const newUUID = UUIDGeneratorMock.generate();
await Effect.seq(
() =>
store.insertInto("users", {
name: "test",
id: newUUID,
}),
() => store.delete("users", newUUID),
).runOrThrow();
const result = await store.from("users").where({ id: newUUID }).selectOne()
.runOrThrow();
expect(result).toBeUndefined();
});
test("should insert a record with a reference", async () => {
const newUUID = UUIDGeneratorMock.generate();
const ownerUUID = UUIDGeneratorMock.generate();
await Run.seqOrThrow(
() =>
store.insertInto("users", {
id: ownerUUID,
name: "test",
}),
() =>
store.insertInto("demo", {
id: newUUID,
value: 1.0,
owner: ownerUUID,
}),
);
});
});