chai-dynamodb v1.0.1
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!
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.