The
MockDb
class wires up a local JSON data store to replicate some key
behaviors of DynamoDB for testing purposes.
MockDb is not a database in any meaningful sense, nor does it express anything like the full range of DynamoDB's features! It's just a limited test fixture, to which I add features as I need them.
The current feature set includes:
query
&
querySync
- Depending on the options passed, these methods behave like
either a DynamoDB query
or
scan
operation, including limited return sets with
page keys.
All methods exist in synchronous & asynchronous versions. Async methods run with a normally-distributed delay.
That's it!
MockDB depends on
entity-tools
to define entity properties, indexable properties, and records. This
package also provides the
sort
function used internally by
MockDb.query
.
You'll almost certainly run MockDb as a dev dependency. To install:
npm i -D @karmaniverous/mock-db
Then you can run:
import type { Entity } from '@karmaniverous/entity-tools';
import { MockDb, type QueryOptions } from '.';
// Specify the data type.
interface User extends Entity {
partition: string;
id: number;
name: string;
}
// Create some data.
const users: User[] = [
{ partition: 'a', id: 4, name: 'Alice' },
{ partition: 'b', id: 3, name: 'Bob' },
{ partition: 'a', id: 2, name: 'Charlie' },
{ partition: 'a', id: 1, name: 'Dave' },
];
// Create a new instance of MockDb.
const mockDb = new MockDb(users);
// Perform a "scan" synchronously across partitions with a filter.
const scanResult = mockDb.querySync({
filter: ({ id }) => id > 2,
sortOrder: [{ property: 'id' }],
});
console.log(scanResult);
// {
// count: 2,
// items: [
// { partition: 'b', id: 2, name: 'Bob' },
// { partition: 'a', id: 3, name: 'Alice' }
// ],
// pageKey: undefined
// }
// Perform an asynchronous, paged, sorted "query" within a partition.
const queryOptions: QueryOptions<User> = {
hashKey: 'partition',
hashValue: 'a',
indexComponents: ['partition', 'id'],
limit: 2,
sortOrder: [{ property: 'id' }],
};
let queryResult = await mockDb.query(queryOptions, 100);
console.log(queryResult);
// {
// count: 2,
// items: [
// { partition: 'a', id: 1, name: 'Dave' },
// { partition: 'a', id: 2, name: 'Charlie' }
// ],
// pageKey: { partition: 'a', id: 2 }
// }
// Use the returned pageKey to get the next page.
queryResult = await mockDb.query(
{
...queryOptions,
pageKey: queryResult.pageKey,
},
100,
);
console.log(queryResult);
// {
// count: 1,
// items: [ { partition: 'a', id: 4, name: 'Alice' } ],
// pageKey: undefined
// }
See the API Documentation for more details.
Got questions or suggestions? Start a discussion!
Built for you with ❤️ on Bali! Find more great tools & templates on my GitHub Profile.