///
import { expect, test } from "@playwright/test";
import { CID } from "multiformats";
import { sha256 } from "multiformats/hashes/sha2";
const url = "http://localhost:8085";
test.beforeEach(async ({ page }) => {
await page.goto(url);
await page.waitForFunction(() => window.setup != null);
});
test.describe("PublicDirectory", () => {
test("lookupNode can fetch file added to directory", async ({ page }) => {
const result = await page.evaluate(async () => {
const {
wnfs: { PublicDirectory },
mock: { MemoryBlockStore, sampleCID },
} = await window.setup();
const time = new Date();
const store = new MemoryBlockStore();
const root = new PublicDirectory(time);
var { rootDir } = await root.write(["text.txt"], sampleCID, time, store);
return await rootDir.lookupNode("text.txt", store);
});
expect(result).toBeDefined();
});
test("lookupNode cannot fetch file not added to directory", async ({ page }) => {
const result = await page.evaluate(async () => {
const {
wnfs: { PublicDirectory },
mock: { MemoryBlockStore },
} = await window.setup();
const time = new Date();
const store = new MemoryBlockStore();
const root = new PublicDirectory(time);
return await root.lookupNode("Unknown", store);
});
expect(result).toBe(undefined);
});
test("getNode can fetch node from root dir", async ({ page }) => {
const [result0, result1] = await page.evaluate(async (): Promise => {
const {
wnfs: { PublicDirectory },
mock: { MemoryBlockStore, sampleCID },
} = await window.setup();
const time = new Date();
const store = new MemoryBlockStore();
const root = new PublicDirectory(time);
var { rootDir } = await root.mkdir(["pictures", "dogs"], time, store);
var { rootDir } = await rootDir.write(
["pictures", "cats", "tabby.png"],
sampleCID,
time,
store,
);
let result0 = await rootDir.getNode(["pictures", "cats", "tabby.png"], store);
let result1 = await rootDir.getNode(["pictures", "dogs", "bingo.png"], store);
return [result0, result1];
});
expect(result0).toBeDefined();
expect(result1).toBeUndefined();
});
test("mkdir can create new directory", async ({ page }) => {
const result = await page.evaluate(async () => {
const {
wnfs: { PublicDirectory },
mock: { MemoryBlockStore, sampleCID },
} = await window.setup();
const time = new Date();
const store = new MemoryBlockStore();
const root = new PublicDirectory(time);
var { rootDir } = await root.mkdir(["pictures", "cats"], time, store);
var { rootDir } = await rootDir.write(
["pictures", "cats", "tabby.png"],
sampleCID,
time,
store,
);
await rootDir.getNode(["pictures", "cats", "tabby.png"], store);
return rootDir;
});
expect(result).toBeDefined();
});
test("ls can list children under directory", async ({ page }) => {
const result = await page.evaluate(async () => {
const {
wnfs: { PublicDirectory },
mock: { MemoryBlockStore, sampleCID },
} = await window.setup();
const time = new Date();
const store = new MemoryBlockStore();
const root = new PublicDirectory(time);
var { rootDir } = await root.mkdir(["pictures", "dogs"], time, store);
var { rootDir } = await rootDir.write(
["pictures", "cats", "tabby.png"],
sampleCID,
time,
store,
);
const result = await rootDir.ls(["pictures"], store);
return result;
});
expect(result.length).toBe(2);
expect(result[0].name).toBe("cats");
expect(result[1].name).toBe("dogs");
});
test("rm can remove children from directory", async ({ page }) => {
const result = await page.evaluate(async () => {
const {
wnfs: { PublicDirectory },
mock: { MemoryBlockStore, sampleCID },
} = await window.setup();
const time = new Date();
const store = new MemoryBlockStore();
const root = new PublicDirectory(time);
var { rootDir } = await root.write(
["pictures", "dogs", "billie.jpeg"],
sampleCID,
time,
store,
);
var { rootDir } = await rootDir.write(
["pictures", "cats", "tabby.png"],
sampleCID,
time,
store,
);
var { rootDir } = await rootDir.rm(["pictures", "cats"], store);
const result = await rootDir.ls(["pictures"], store);
return result;
});
expect(result.length).toEqual(1);
expect(result[0].name).toEqual("dogs");
});
test("basicMv can move content between directories", async ({ page }) => {
const [imagesContent, picturesContent] = await page.evaluate(async () => {
const {
wnfs: { PublicDirectory },
mock: { MemoryBlockStore, sampleCID },
} = await window.setup();
const time = new Date();
const store = new MemoryBlockStore();
const root = new PublicDirectory(time);
var { rootDir } = await root.write(["pictures", "cats", "luna.jpeg"], sampleCID, time, store);
var { rootDir } = await rootDir.write(
["pictures", "cats", "tabby.png"],
sampleCID,
time,
store,
);
var { rootDir } = await rootDir.mkdir(["images"], time, store);
var { rootDir } = await rootDir.basicMv(
["pictures", "cats"],
["images", "cats"],
time,
store,
);
const imagesContent = await rootDir.ls(["images"], store);
const picturesContent = await rootDir.ls(["pictures"], store);
return [imagesContent, picturesContent];
});
expect(imagesContent.length).toEqual(1);
expect(picturesContent.length).toEqual(0);
expect(imagesContent[0].name).toEqual("cats");
});
test("cp can copy content between directories", async ({ page }) => {
const [imagesContent, picturesContent] = await page.evaluate(async () => {
const {
wnfs: { PublicDirectory },
mock: { MemoryBlockStore, sampleCID },
} = await window.setup();
const time = new Date();
const store = new MemoryBlockStore();
const root = new PublicDirectory(time);
var { rootDir } = await root.write(["pictures", "cats", "luna.jpeg"], sampleCID, time, store);
var { rootDir } = await rootDir.write(
["pictures", "cats", "tabby.png"],
sampleCID,
time,
store,
);
var { rootDir } = await rootDir.mkdir(["images"], time, store);
var { rootDir } = await rootDir.cp(["pictures", "cats"], ["images", "cats"], time, store);
const imagesContent = await rootDir.ls(["images"], store);
const picturesContent = await rootDir.ls(["pictures"], store);
return [imagesContent, picturesContent];
});
expect(imagesContent.length).toEqual(1);
expect(picturesContent.length).toEqual(1);
expect(imagesContent[0].name).toEqual("cats");
});
test("A PublicDirectory has the correct metadata", async ({ page }) => {
const result = await page.evaluate(async () => {
const {
wnfs: { PublicDirectory },
} = await window.setup();
const time = new Date();
return new PublicDirectory(time).metadata();
});
expect(result.created).not.toBeUndefined();
});
test("A PublicFile has the correct metadata", async ({ page }) => {
const result = await page.evaluate(async () => {
const {
wnfs: { PublicFile },
} = await window.setup();
const time = new Date();
return new PublicFile(time).metadata();
});
expect(result.created).not.toBeUndefined();
});
test("A PublicFile can be written and read", async ({ page }) => {
const result = await page.evaluate(async () => {
const {
wnfs: { PublicFile },
mock: { MemoryBlockStore },
} = await window.setup();
const store = new MemoryBlockStore();
const time = new Date();
const file = new PublicFile(time);
const content = new TextEncoder().encode("Hello, World!");
const file2 = await file.setContent(time, content, store);
const readBack = await file2.getContent(store);
const partialRead = await file2.readAt(7, 5, store);
return [new TextDecoder().decode(readBack), new TextDecoder().decode(partialRead)];
});
expect(result[0]).toEqual("Hello, World!");
expect(result[1]).toEqual("World");
});
test("A PublicFile supports chunking files", async ({ page }) => {
const longString = "x".repeat(5 * 1024 * 1024); // 5 MiB
const result = await page.evaluate(async () => {
const {
wnfs: { PublicFile },
mock: { MemoryBlockStore },
} = await window.setup();
const store = new MemoryBlockStore();
const time = new Date();
const file = new PublicFile(time);
const longString = "x".repeat(5 * 1024 * 1024);
const content = new TextEncoder().encode(longString);
const file2 = await file.setContent(time, content, store);
const readBack = await file2.readAt(0, undefined, store);
return new TextDecoder().decode(readBack);
});
expect(result).toEqual(longString);
});
test("A PublicFile has a content CID", async ({ page }) => {
const result = await page.evaluate(async () => {
const {
wnfs: { PublicFile },
mock: { CID, MemoryBlockStore },
} = await window.setup();
const store = new MemoryBlockStore();
const time = new Date();
const file = new PublicFile(time);
const content = new TextEncoder().encode("hello");
const file2 = await file.setContent(time, content, store);
const cid_bytes = await file2.getRawContentCid(store);
return cid_bytes ? CID.decode(cid_bytes).toV1().toString() : undefined;
});
expect(result).not.toBeUndefined();
expect(result).toEqual("bafkr4ihkr4ld3m4gqkjf4reryxsy2s5tkbxprqkow6fin2iiyvreuzzab4");
});
test("A PublicFile has a content size", async ({ page }) => {
const result = await page.evaluate(async () => {
const {
wnfs: { PublicFile },
mock: { MemoryBlockStore },
} = await window.setup();
const store = new MemoryBlockStore();
const time = new Date();
const file = new PublicFile(time);
const longString = "x".repeat(5 * 1024 * 1024);
const content = new TextEncoder().encode(longString);
const file2 = await file.setContent(time, content, store);
return await file2.getSize(store);
});
expect(result).toEqual(5 * 1024 * 1024);
});
});
test.describe("BlockStore", () => {
test("a BlockStore implementation can overwrite the putBlock method", async ({ page }) => {
const result = await page.evaluate(async () => {
const {
wnfs: { PublicFile },
mock: { CID, Sha256BlockStore },
} = await window.setup();
const store = new Sha256BlockStore();
const time = new Date();
const file = new PublicFile(time);
const longString = "x".repeat(5 * 1024 * 1024);
const content = new TextEncoder().encode(longString);
const file2 = await file.setContent(time, content, store);
const cid = await file2.store(store);
return CID.decode(cid).toString();
});
const cid = CID.parse(result);
expect(cid.multihash.code).toEqual(sha256.code);
})
})