jsfsm/tests/sqlitePersistence.test.js
rts-pyers 0123a2e9b4 init
2025-08-11 16:28:38 -04:00

75 lines
1.6 KiB
JavaScript

import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
import { createMachine, loadMachine, setStorageDriver } from "../src/index";
import { sqliteDriver } from "../src/sqliteDriver.js";
describe("sqlite persistence", () => {
let driver;
beforeEach(() => {
driver = sqliteDriver({ filename: ":memory:" });
setStorageDriver(driver);
vi.useFakeTimers();
});
afterEach(() => {
vi.useRealTimers();
});
it("should save and load simple data+state", async () => {
const transitions = [{ from: "a", to: "b", when: () => true }];
const m = createMachine({
data: { x: 1 },
states: { a: 1, b: 0 },
transitions,
});
m.data.x = 42;
m.step();
await m.save("testSql");
const loaded = await loadMachine("testSql", {
transitions,
});
expect(loaded.data.x).toBe(42);
expect(loaded.has("b")).toBe(true);
});
it("should catch up missed ticks after reload", async () => {
const make = () =>
createMachine({
data: { count: 0 },
states: { run: 1 },
transitions: [],
});
const m1 = make();
m1.tick("run", (ctx) => ctx.set("count", ctx.get("count") + 1), {
interval: 1000,
});
vi.advanceTimersByTime(3000);
m1.step();
expect(m1.data.count).toBe(3);
await m1.save("tickTest");
vi.advanceTimersByTime(2000);
const m2 = await loadMachine("tickTest", {
transitions: [],
});
m2.tick("run", (ctx) => ctx.set("count", ctx.get("count") + 1), {
interval: 1000,
});
m2.step();
expect(m2.data.count).toBe(5);
});
});