Jest preset to run DynamoDB Local
$ yarn add @shelf/jest-dynamodb --dev
Make sure aws-sdk
is installed as a peer dependency. And java
runtime available for running DynamoDBLocal.jar
module.exports = {
preset: '@shelf/jest-dynamodb'
};
- Type:
object[]
- Required:
true
Array of createTable params.
- Type:
number
- Required:
false
Port number. The default port number is 8000
.
- Type:
string[]
- Required:
false
Addtional arguments for dynamodb-local. The default value is ['-sharedDb']
.
- Type:
object
- Required:
false
Constructor params of DynamoDB client.
-
Type:
{installPath?: string, downloadUrl?: string}
-
Required:
false
-
installPath
defines the location where dynamodb-local is installed or will be installed. -
downloadUrl
defines the url of dynamodb-local package.
The default value is defined at https://github.com/rynop/dynamodb-local/blob/2e6c1cb2edde4de0dc51a71c193c510b939d4352/index.js#L16-L19
You can set up tables as an object:
module.exports = {
tables: [
{
TableName: `files`,
KeySchema: [{AttributeName: 'id', KeyType: 'HASH'}],
AttributeDefinitions: [{AttributeName: 'id', AttributeType: 'S'}],
ProvisionedThroughput: {ReadCapacityUnits: 1, WriteCapacityUnits: 1}
}
// etc
],
port: 8000
};
Or as an async function (particularly useful when resolving DynamoDB setup dynamically from serverless.yml
):
module.exports = async () => {
const serverless = new (require('serverless'))();
// If using monorepo where DynamoDB serverless.yml is in another directory
// const serverless = new (require('serverless'))({ servicePath: '../../../core/data' });
await serverless.init();
const service = await serverless.variables.populateService();
const resources = service.resources.filter(r => Object.keys(r).includes('Resources'))[0];
const tables = Object.keys(resources)
.map(name => resources[name])
.filter(r => r.Type === 'AWS::DynamoDB::Table')
.map(r => r.Properties);
return {
tables,
port: 8000
};
};
Or read table definitions from a CloudFormation template (example handles a !Sub on TableName, i.e. TableName: !Sub "${env}-users" ):
const yaml = require('js-yaml');
const fs = require('fs');
const {CLOUDFORMATION_SCHEMA} = require('cloudformation-js-yaml-schema');
module.exports = async () => {
const cf = yaml.safeLoad(fs.readFileSync('../cf-templates/example-stack.yaml', 'utf8'), {
schema: CLOUDFORMATION_SCHEMA
});
var tables = [];
Object.keys(cf.Resources).forEach(item => {
tables.push(cf.Resources[item]);
});
tables = tables
.filter(r => r.Type === 'AWS::DynamoDB::Table')
.map(r => {
let table = r.Properties;
if (typeof r.TableName === 'object') {
table.TableName = table.TableName.data.replace('${env}', 'test');
}
delete table.TimeToLiveSpecification; //errors on dynamo-local
return table;
});
return {
tables,
port: 8000
};
};
const {DocumentClient} = require('aws-sdk/clients/dynamodb');
const isTest = process.env.JEST_WORKER_ID;
const config = {
convertEmptyValues: true,
...(isTest && {endpoint: 'localhost:8000', sslEnabled: false, region: 'local-env'})
};
const ddb = new DocumentClient(config);
it('should insert item into table', async () => {
await ddb.put({TableName: 'files', Item: {id: '1', hello: 'world'}}).promise();
const {Item} = await ddb.get({TableName: 'files', Key: {id: '1'}}).promise();
expect(Item).toEqual({
id: '1',
hello: 'world'
});
});
UnknownError: Not Found
Perhaps something is using your port specified in jest-dynamodb-config.js
.
- jest-dynalite - a much lighter version which spins up an instance for each runner & doesn't depend on Java
$ git checkout master
$ yarn version
$ yarn publish
$ git push origin master --tags
MIT © Shelf