75 lines
1.6 KiB
JavaScript
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);
|
|
});
|
|
});
|