import "https://esm.sh/fake-indexeddb@4.0.2/auto";
import { assertEquals } from "../../test_deps.ts";
import { DataStore } from "../../plugos/lib/datastore.ts";
import { IndexedDBKvPrimitives } from "../../plugos/lib/indexeddb_kv_primitives.ts";
import { DataStoreSpacePrimitives } from "./datastore_space_primitives.ts";

Deno.test("DataStoreSpacePrimitives", {
  sanitizeResources: false,
  sanitizeOps: false,
}, async () => {
  const db = new IndexedDBKvPrimitives("test");
  await db.init();

  const space = new DataStoreSpacePrimitives(new DataStore(db));
  const files = await space.fetchFileList();
  assertEquals(files, []);
  // Write text file
  const fileMeta = await space.writeFile(
    "test.txt",
    stringToBytes("Hello World"),
  );
  assertEquals(
    (await space.readFile("test.txt")).data,
    stringToBytes("Hello World"),
  );
  const fbContent = (await space.readFile("test.txt"))
    .data;
  assertEquals(new TextDecoder().decode(fbContent), "Hello World");
  assertEquals(await space.fetchFileList(), [fileMeta]);
  const buf = new Uint8Array([1, 2, 3, 4, 5]);
  // Write binary file
  await space.writeFile("test.bin", buf);
  const fMeta = await space.getFileMeta("test.bin");
  assertEquals(fMeta.size, 5);
  assertEquals((await space.fetchFileList()).length, 2);

  await space.deleteFile("test.bin");
  assertEquals(await space.fetchFileList(), [fileMeta]);

  db.close();
});

function stringToBytes(str: string): Uint8Array {
  return new TextEncoder().encode(str);
}