npm package: @lifeomic/test-tool-dynamodb
Description: [![npm](https://img.shields.io/npm/v/@lifeomic/test-tool-dynamodb.svg)](https://www.npmjs.com/package/@lifeomic/test-tool-dynamodb) [![Build Status](https://github.com/lifeomic/test-tools/actions/workflows/release.yaml/badge.svg)](https://github.com/lifeo
Author: LifeOmic
Latest version: 5.2.1

# @lifeomic/test-tool-dynamodb

[![npm](https://img.shields.io/npm/v/@lifeomic/test-tool-dynamodb.svg)](https://www.npmjs.com/package/@lifeomic/test-tool-dynamodb)
[![Build Status](https://github.com/lifeomic/test-tools/actions/workflows/release.yaml/badge.svg)](https://github.com/lifeomic/test-tools/actions/workflows/release.yaml)


## DynamoDB

Many services use [DynamoDB][dynamodb] as their primary storage solution.
Testing service code against a DynamoDB storage layer requires either mocking
the DynamoDB interface (using something like [aws-sdk-mock-client][aws-sdk-mock-client]) or
pointing the test code at a provisioned DynamoDB instance. AWS has published
[DynamoDB Local][dynamodb-local] so that testing can be done without having to
use real AWS resources. DynamoDB Local has also been published as a
[community docker image][dynamodb-image] making testing even easier to do using
tools like [docker-compose][docker-compose] and [dockerode][dockerode].

`@lifeomic/test-tool-dynamodb` supports both methods of integrating with DynamoDB. For simple
unit tests, the `dynamoDBTestHooks` helper can be used to provision and link DynamoDB
docker containers. The helper will define all
relevant environment variables and will inject a preconfigured
[DyanomDB client][dynamodb-client] into the test context. The setup and tear
down will also create and destroy tables, as defined in the schema, between
test cases. The helper will also automatically handle port binding differences
between regular and nested Docker environments.

`@lifeomic/test-tool-dynamodb` managed containers are able to join an existing docker-compose
network allowing them to reuse an existing DynamoDB container by configuring
the test hooks.


### `dynamoDBTestHooks`

#### config
| Attribute            | Description/type                                                                                 |
|----------------------|--------------------------------------------------------------------------------------------------| 
| schemas              | `@aws-sdk/client-dynamodb`.`CreateTableInput`[] for creating tables                              |
| useUniqueTables      | Add a unique identifier to the table name, useful for parallel tests using the same table schema |
| useLocalDynamoDb     | Start a Docker instance of the DynamoDB table                                                    |
| dockerDynamoDBConfig | Configure the Docker container                                                                   |
| dynamoDBClientConfig | Optional client configuration                                                                    |

##### dockerDynamoDBConfig

| Attribute            | Description                                 |
|----------------------|---------------------------------------------|
| inMemory             | Should we create an in memory only database |
| dynamoDBClientConfig | Optional client configuration               |

Provides hooks for standard test stages, beforeAll, beforeEach, afterEach, afterAll. The test context will
include the following:

| Attribute        | Description/Type                                                                 |
|------------------|----------------------------------------------------------------------------------|
| dynamoDBClient   | `@aws-sdk/client-dynamodb`.`DynamoDBClient`                                      |
| config           | `@aws-sdk/client-dynamodb`.`DynamoDBClientConfig`                                |
| tableNamesMap    | Map of base table name to actual table name. E.g. `users` to `users-abcdef12345` |
| uniqueIdentifier | The unique identifier appended to each table name. E.g. `abcdef12345`            |

If `useUniqueTables` is true, dynamically generated table names will be used, in
the form of `<tableNameProvidedInSchema>-<uuid>`. The unique table name can be
fetched from the `tableNames` map. Otherwise, the table name will be the default
provided in the schema. This allows tests to be run in parallel.