import { test, expect, vi } from "vitest";
import { withCache } from "./cache.js";
import { newLixFile, openLixInMemory } from "@lix-js/sdk";
import { sql } from "kysely";
test("it should be network-first", async () => {
    const mockLoader = vi
        .fn()
        .mockResolvedValueOnce("module content 1")
        .mockResolvedValueOnce("module content 2");
    const mockModulePath = "https://mock.com/module.js";
    const lix = await openLixInMemory({ blob: await newLixFile() });
    const result1 = await withCache(mockLoader, lix)(mockModulePath);
    expect(mockLoader).toHaveBeenCalledTimes(1);
    expect(result1).toBe("module content 1");
    const cachedPlugins = await lix.db
        .selectFrom("file")
        .selectAll()
        // @ts-expect-error - kysely doesn't know about GLOB
        .where(sql `path GLOB '/cache/plugins/*'`)
        .execute();
    expect(cachedPlugins.length).toBe(1);
    const parsed = new TextDecoder().decode(cachedPlugins[0].data);
    expect(parsed).toBe("module content 1");
    const result2 = await withCache(mockLoader, lix)(mockModulePath);
    expect(mockLoader).toHaveBeenCalledTimes(2);
    expect(result2).toBe("module content 2");
    const cachedPlugins2 = await lix.db
        .selectFrom("file")
        .selectAll()
        // @ts-expect-error - kysely doesn't know about GLOB
        .where(sql `path GLOB '/cache/plugins/*'`)
        .execute();
    expect(cachedPlugins2.length).toBe(1);
    const parsed2 = new TextDecoder().decode(cachedPlugins2[0].data);
    expect(parsed2).toBe("module content 2");
});
test("it should throw the error from the loader if the cache does not exist", async () => {
    const mockLoader = vi.fn().mockRejectedValueOnce(new Error("Network error"));
    const mockModulePath = "https://mock.com/module.js";
    const lix = await openLixInMemory({ blob: await newLixFile() });
    await expect(async () => await withCache(mockLoader, lix)(mockModulePath)).rejects.toThrowError("Network error");
});
test("it should fallback to the cache if the loader fails", async () => {
    const mockLoader = vi.fn().mockRejectedValueOnce(new Error("Network error"));
    const mockModulePath = "https://mock.com/module.js";
    const mockModuleCachePath = "/cache/plugins/31i1etp0l413h";
    const lix = await openLixInMemory({ blob: await newLixFile() });
    await lix.db
        .insertInto("file")
        .values({
        path: mockModuleCachePath,
        data: new TextEncoder().encode("cached module content"),
    })
        .execute();
    const result = await withCache(mockLoader, lix)(mockModulePath);
    expect(result).toBe("cached module content");
});
//# sourceMappingURL=cache.test.js.map