Skip to content

Commit

Permalink
test: add iterator tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mahdavipanah committed Dec 10, 2024
1 parent 2e06d6a commit 2d3f04d
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 3 deletions.
1 change: 0 additions & 1 deletion docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
version: '3'
services:
redis:
image: redis
Expand Down
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ export class KeyvUpstash<T = any>

/**
* Get an async iterator for the keys and values in the store. If a namespace is provided, it will only iterate over keys with that namespace.
* If not namespace is provided, it will iterate over all keys in the Redis DB.
* If not namespace is provided, depending on the `noNamespaceAffectsAll` option, it will iterate over all keys or only keys without a namespace.
*
* @param {string} [namespace] - the namespace to iterate over
* @returns {AsyncGenerator<[string, U | undefined], void, unknown>} - async iterator with key value pairs
Expand Down
57 changes: 56 additions & 1 deletion test/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -453,13 +453,68 @@ describe("KeyvUpstash", () => {
expect(values).toContain("bar4")
expect(values).toContain("bar5")
expect(values).toContain("bar6")

expect(keys).not.toContain("foo96")
expect(keys).not.toContain("foo962")
expect(keys).not.toContain("foo963")
expect(values).not.toContain("bar")
expect(values).not.toContain("bar2")
expect(values).not.toContain("bar3")
})

test("should be able to iterate over all keys if no namespace is set and noNamespaceAffectsAll is true", async () => {
const keyvUpstash = createKeyvUpstash()
keyvUpstash.noNamespaceAffectsAll = true

keyvUpstash.namespace = "ns1"
await keyvUpstash.set("foo1", "bar1")
keyvUpstash.namespace = "ns2"
await keyvUpstash.set("foo2", "bar2")
keyvUpstash.namespace = undefined
await keyvUpstash.set("foo3", "bar3")

const keys = []
const values = []
for await (const [key, value] of keyvUpstash.iterator()) {
keys.push(key)
values.push(value)
}

expect(keys).toContain("ns1::foo1")
expect(keys).toContain("ns2::foo2")
expect(keys).toContain("foo3")
expect(values).toContain("bar1")
expect(values).toContain("bar2")
expect(values).toContain("bar3")
})

test("should only iterate over keys with no namespace if no namespace is set and noNamespaceAffectsAll is false", async () => {
const keyvUpstash = createKeyvUpstash()
keyvUpstash.noNamespaceAffectsAll = false

keyvUpstash.namespace = "ns1"
await keyvUpstash.set("foo1", "bar1")
keyvUpstash.namespace = "ns2"
await keyvUpstash.set("foo2", "bar2")
keyvUpstash.namespace = undefined
await keyvUpstash.set("foo3", "bar3")

const keys = []
const values = []
for await (const [key, value] of keyvUpstash.iterator()) {
keys.push(key)
values.push(value)
}

expect(keys).toContain("foo3")
expect(values).toContain("bar3")

expect(keys).not.toContain("foo1")
expect(keys).not.toContain("ns1::foo1")
expect(keys).not.toContain("ns2::foo2")
expect(keys).not.toContain("foo2")
expect(values).not.toContain("bar1")
expect(values).not.toContain("bar2")
})
})
})

0 comments on commit 2d3f04d

Please sign in to comment.