1import { assert, it } from "@effect/vitest"
2import type { Layer } from "effect"
3import { Effect } from "effect"
4import * as Base64 from "effect/encoding/Base64"
5import * as KeyValueStore from "effect/persistence/KeyValueStore"
6
7// Tests clear the shared store.
8export 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 })