@naturalcycles/db-lib
Version:
Lowest Common Denominator API to supported Databases
140 lines (115 loc) • 4.4 kB
text/typescript
import { _sortBy } from '@naturalcycles/js-lib/array/sort.js'
import { CommonKeyValueDao } from '../kv/commonKeyValueDao.js'
import type { CommonKeyValueDB, KeyValueDBTuple } from '../kv/commonKeyValueDB.js'
import { createTestItemsBM, TEST_TABLE } from './test.model.js'
const testItems = createTestItemsBM(4)
const testIds = testItems.map(e => e.id)
const testEntries: KeyValueDBTuple[] = testItems.map(e => [e.id, Buffer.from(`${e.id}value`)])
export async function runCommonKeyValueDaoTest(db: CommonKeyValueDB): Promise<void> {
const { afterAll, beforeAll, expect, test } = await import('vitest')
const dao = new CommonKeyValueDao({
db,
table: TEST_TABLE,
// todo: make this test support "deflatedJson" transformer
})
const { support } = db
beforeAll(async () => {
// Tests in this suite are not isolated,
// and failing tests can leave the DB in an unexpected state for other tests,
// including the following test run.
// Here we clear the table before running the tests.
const ids = await dao.streamIds().toArray()
await dao.deleteByIds(ids)
})
afterAll(async () => {
const ids = await dao.streamIds().toArray()
await dao.deleteByIds(ids)
})
test('ping', async () => {
await dao.ping()
})
test('createTable', async () => {
await dao.createTable({ dropIfExists: true })
})
test('deleteByIds non existing', async () => {
await dao.deleteByIds(testIds)
})
test('getByIds should return empty', async () => {
const results = await dao.getByIds(testIds)
expect(results).toEqual([])
})
test('saveBatch, then getByIds', async () => {
await dao.saveBatch(testEntries)
const entries = await dao.getByIds(testIds)
// console.log(typeof entries[0]![1], entries[0]![1])
_sortBy(entries, e => e[0], { mutate: true })
expect(entries).toEqual(testEntries) // Jest doesn't allow to compare Buffers directly
// expect(entries.map(e => e[0])).toEqual(testEntries.map(e => e[0]))
// expect(entries.map(e => e[1].toString())).toEqual(testEntries.map(e => e[1].toString()))
})
test('streamIds', async () => {
const ids = await dao.streamIds().toArray()
ids.sort()
expect(ids).toEqual(testIds)
})
test('streamIds limited', async () => {
const idsLimited = await dao.streamIds(2).toArray()
// Order is non-deterministic, so, cannot compare values
// idsLimited.sort()
// expect(idsLimited).toEqual(testIds.slice(0, 2))
expect(idsLimited.length).toBe(2)
})
test('streamValues', async () => {
const values = await dao.streamValues().toArray()
values.sort()
expect(values).toEqual(testEntries.map(e => e[1]))
})
test('streamValues limited', async () => {
const valuesLimited = await dao.streamValues(2).toArray()
// valuesLimited.sort()
// expect(valuesLimited).toEqual(testEntries.map(e => e[1]).slice(0, 2))
expect(valuesLimited.length).toBe(2)
})
test('streamEntries', async () => {
const entries = await dao.streamEntries().toArray()
entries.sort()
expect(entries).toEqual(testEntries)
})
test('streamEntries limited', async () => {
const entriesLimited = await dao.streamEntries(2).toArray()
// entriesLimited.sort()
// expect(entriesLimited).toEqual(testEntries.slice(0, 2))
expect(entriesLimited.length).toBe(2)
})
test('deleteByIds should clear', async () => {
await dao.deleteByIds(testIds)
const results = await dao.getByIds(testIds)
expect(results).toEqual([])
})
if (support.increment) {
const id = 'nonExistingField'
const id2 = 'nonExistingField2'
test('increment on a non-existing field should set the value to 1', async () => {
const result = await dao.increment(id)
expect(result).toBe(1)
})
test('increment on a existing field should increase the value by one', async () => {
const result = await dao.increment(id)
expect(result).toBe(2)
})
test('increment should increase the value by the specified amount', async () => {
const result = await dao.increment(id, 2)
expect(result).toBe(4)
})
test('increment 2 ids at the same time', async () => {
const result = await dao.incrementBatch([
[id, 1],
[id2, 2],
])
expect(Object.fromEntries(result)).toEqual({
[id]: 5,
[id2]: 2,
})
})
}
}