chai-dynamodb

AWS DynamoDB reserved word assertions for Chai

Usage no npm install needed!

<script type="module">
  import chaiDynamodb from 'https://cdn.skypack.dev/chai-dynamodb';
</script>

README

chai-dynamodb

A Chai plugin that adds a matcher to check for the use of a DynamoDB reserved word in a string. Very useful for testing AWS Lambda code!

NPM Version NPM License NPM Downloads
NPM

Using

Also see the tests

browser-side

Include chai-dynamodb after Chai:

<script src="chai.js"></script>
<script src="chai-dynamodb.js"></script>

server-side

Have chai use chai-dynamodb:

var chai = require('chai');
chai.use(require('chai-dynamodb'));

Assertions

Check any string for a DynamoDB reserved word that is not prefixed by either # or : (idiomatically used to prefix expression attribute names and values respectively). The assertion is true if the string doesn't have any reserved words that would cause a call to DynamoDB to fail.

noReservedWords

const safe = 'id, phone, email';
const notSafe = 'id, name, phone, email';
const usingAttributeNamePrefix = 'id, #name, phone, email';
const usingAttributeValuePrefix = 'username = :name';

// using should-style assertions
safe.should.have.noReservedWords();
notSafe.should.have.noReservedWords(); // fails
usingAttributeNamePrefix.should.have.noReservedWords();
usingAttributeValuePrefix.should.have.noReservedWords();

// using expect-style assertions
expect(safe).to.have.noReservedWords();
expect(notSafe).to.have.noReservedWords(); // fails
expect(usingAttributeNamePrefix).to.have.noReservedWords();
expect(usingAttributeValuePrefix).to.have.noReservedWords();

// using tdd assertions
assert.noReservedWords(safe);
assert.noReservedWords(notSafe); // fails
assert.noReservedWords(usingAttributeNamePrefix);
assert.noReservedWords(usingAttributeValuePrefix);

noReservedWordsExcept

Useful when there is planned use of specific keywords. Takes a single string or array of strings as its argument. Not case-sensitive.

const usingAttributeNamePrefix = 'SET #name = :fullname';
const usingAttributeValuePrefix = 'SET username = :name';
const missingPrefix = 'SET username = name';

// using should-style assertions
usingAttributeNamePrefix.should.have.noReservedWordsExcept('set');
usingAttributeValuePrefix.should.have.noReservedWordsExcept('SET');
missingPrefix.should.have.noReservedWordsExcept(['SET', 'NAME']);
missingPrefix.should.have.noReservedWordsExcept('SET'); // fails

// using expect-style assertions
expect(usingAttributeNamePrefix).to.have.noReservedWordsExcept('set');
expect(usingAttributeValuePrefix).to.have.noReservedWordsExcept('SET');
expect(missingPrefix).to.have.noReservedWordsExcept(['SET', 'NAME']);
expect(missingPrefix).to.have.noReservedWordsExcept('SET'); // fails

// using tdd assertions
assert.noReservedWordsExcept(usingAttributeNamePrefix, 'set');
assert.noReservedWordsExcept(usingAttributeValuePrefix, 'SET');
assert.noReservedWordsExcept(missingPrefix, ['SET', 'NAME']);
assert.noReservedWordsExcept(missingPrefix, 'SET'); // fails

Limitations

DynamoDB is an actively developed product at AWS, so it's possible they'll add more to the current reserved list of 573 words. This library can be a helpful early protection against the small mistakes that plague us all, but if it's mission-critical you should probably check https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html yourself.