| 1 | import { assert, it } from "@effect/vitest" |
| 2 | import type { Layer } from "effect" |
| 3 | import { Effect } from "effect" |
| 4 | import * as Base64 from "effect/encoding/Base64" |
| 5 | import * as KeyValueStore from "effect/persistence/KeyValueStore" |
| 6 | |
| 7 | // Tests clear the shared store. |
| 8 | export const suite = (name: string, layer: Layer.Layer<KeyValueStore.KeyValueStore, unknown>) => |
| 9 | it.layer(layer, { timeout: { seconds: 30 }, concurrent: false })(`KeyValueStore (${name})`, (it) => { |
| 10 | it.effect("set + get + size", () => |
| 11 | Effect.gen(function*() { |
| 12 | const kv = yield* KeyValueStore.KeyValueStore |
| 13 | yield* kv.clear |
| 14 | |
| 15 | yield* kv.set("key", "value") |
| 16 | |
| 17 | assert.strictEqual(yield* kv.get("key"), "value") |
| 18 | assert.strictEqual(yield* kv.size, 1) |
| 19 | |
| 20 | yield* kv.set("key", "value-2") |
| 21 | |
| 22 | assert.strictEqual(yield* kv.get("key"), "value-2") |
| 23 | assert.strictEqual(yield* kv.size, 1) |
| 24 | })) |
| 25 | |
| 26 | it.effect("binary values", () => |
| 27 | Effect.gen(function*() { |
| 28 | const kv = yield* KeyValueStore.KeyValueStore |
| 29 | yield* kv.clear |
| 30 | const bytes = new Uint8Array([0, 42, 255, 128]) |
| 31 | |
| 32 | yield* kv.set("binary", bytes) |
| 33 | |
| 34 | assert.strictEqual(yield* kv.get("binary"), Base64.encode(bytes)) |
| 35 | assert.deepStrictEqual(yield* kv.getUint8Array("binary"), bytes) |
| 36 | })) |
| 37 | |
| 38 | it.effect("string values are not decoded as base64", () => |
| 39 | Effect.gen(function*() { |
| 40 | const kv = yield* KeyValueStore.KeyValueStore |
| 41 | yield* kv.clear |
| 42 | const value = "Zm9v" |
| 43 | |
| 44 | yield* kv.set("string", value) |
| 45 | |
| 46 | assert.strictEqual(yield* kv.get("string"), value) |
| 47 | assert.deepStrictEqual(yield* kv.getUint8Array("string"), new TextEncoder().encode(value)) |
| 48 | })) |
| 49 | |
| 50 | it.effect("utf8 string values", () => |
| 51 | Effect.gen(function*() { |
| 52 | const kv = yield* KeyValueStore.KeyValueStore |
| 53 | yield* kv.clear |
| 54 | const value = "héllo 👋" |
| 55 | |
| 56 | yield* kv.set("utf8", value) |
| 57 | |
| 58 | assert.strictEqual(yield* kv.get("utf8"), value) |
| 59 | assert.deepStrictEqual(yield* kv.getUint8Array("utf8"), new TextEncoder().encode(value)) |
| 60 | })) |
| 61 | |
| 62 | it.effect("remove", () => |
| 63 | Effect.gen(function*() { |
| 64 | const kv = yield* KeyValueStore.KeyValueStore |
| 65 | yield* kv.clear |
| 66 | |
| 67 | yield* kv.set("a", "1") |
| 68 | yield* kv.remove("a") |
| 69 | |
| 70 | assert.strictEqual(yield* kv.get("a"), undefined) |
| 71 | assert.strictEqual(yield* kv.size, 0) |
| 72 | })) |
| 73 | |
| 74 | it.effect("clear", () => |
| 75 | Effect.gen(function*() { |
| 76 | const kv = yield* KeyValueStore.KeyValueStore |
| 77 | yield* kv.clear |
| 78 | |
| 79 | yield* kv.set("a", "1") |
| 80 | yield* kv.set("b", "2") |
| 81 | yield* kv.clear |
| 82 | |
| 83 | assert.strictEqual(yield* kv.size, 0) |
| 84 | assert.strictEqual(yield* kv.get("a"), undefined) |
| 85 | assert.strictEqual(yield* kv.get("b"), undefined) |
| 86 | })) |
| 87 | }) |