UNPKG

@e280/quay

Version:

File-browser and outliner UI for the web

79 lines 3.08 kB
import { Txt } from "@e280/stz"; import { expect, Science, test } from "@e280/science"; import { Cask } from "./cask.js"; import { Cellar } from "./cellar.js"; import { MemoryForklift } from "./memory-forklift.js"; export default Science.suite({ "save + load roundtrip": test(async () => { const cellar = new Cellar(); const text = "hello world"; const bytes = Txt.toBytes(text); await cellar.save(bytes); const hash = await Cask.hash(bytes); expect(await cellar.has(hash)).is(true); const loaded = await cellar.load(hash); expect(loaded.hash).is(hash); expect(Txt.fromBytes(loaded.bytes)).is(text); }), "save is idempotent": test(async () => { const cellar = new Cellar(); const bytes = new TextEncoder().encode("foo bar"); await cellar.save(bytes); await cellar.save(bytes); // again const hash = await Cask.hash(bytes); expect(await cellar.has(hash)).is(true); }), "throws on corruption": test(async () => { const forklift = new MemoryForklift(); const cellar = new Cellar(forklift); const good = new TextEncoder().encode("valid data"); const bad = new TextEncoder().encode("corrupt data"); const hash = await Cask.hash(good); await forklift.save(hash, bad); await expect(async () => cellar.load(hash)).throwsAsync(); }), "delete removes file": test(async () => { const cellar = new Cellar(); const bytes = new TextEncoder().encode("temporary data"); await cellar.save(bytes); const hash = await Cask.hash(bytes); expect(await cellar.has(hash)).is(true); await cellar.delete(hash); expect(await cellar.has(hash)).is(false); }), "load missing throws": test(async () => { const cellar = new Cellar(); const fakeHash = "deadbeef1234567890"; await expect(async () => cellar.load(fakeHash)).throwsAsync(); }), "list returns saved hashes": test(async () => { const cellar = new Cellar(); const texts = ["a", "b", "c"]; for (const t of texts) await cellar.save(Txt.toBytes(t)); const hashes = []; for await (const hash of cellar.list()) hashes.push(hash); expect(hashes.length).is(3); for (const t of texts) { const h = await Cask.hash(Txt.toBytes(t)); expect(hashes.includes(h)).is(true); } }), "clear removes all entries": test(async () => { const cellar = new Cellar(); await cellar.save(Txt.toBytes("one")); await cellar.save(Txt.toBytes("two")); await cellar.save(Txt.toBytes("three")); let count = 0; for await (const _ of cellar.list()) count++; expect(count).is(3); await cellar.clear(); let postClearCount = 0; for await (const _ of cellar.list()) postClearCount++; expect(postClearCount).is(0); }) }); //# sourceMappingURL=cellar.test.js.map