ddb-table
Version:
Strongly typed library for querying and modeling DynamoDB documents.
178 lines (174 loc) • 18.4 kB
JavaScript
"use strict";
require("mocha");
var _chai = require("chai");
var _TableIndex = _interopRequireDefault(require("./TableIndex"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
describe('TableIndex', () => {
it('TableKey type', () => {
_chai.assert.ok({
Id: 'foo'
});
_chai.assert.ok({
Id: 'foo',
Ver: 1
});
});
it('TableKeyArgs type', () => {
_chai.assert.ok(['foo']);
_chai.assert.ok(['foo', 1]);
});
// describe('.createNamesMap()', () => {
// it('Basic use case', () => {
// const table = new TableIndex<DemoItem, 'Id'>({
// tableName: 'MyTable',
// primaryKey: 'Id',
// });
//
// const names = table.createNamesMap();
//
// assert.equal(names.add('foo'), '#foo');
// assert.deepEqual(names.serialize(), {
// '#foo': 'foo',
// });
// });
// });
// describe('.createValuesMap()', () => {
// it('Basic use case', () => {
// const table = new TableIndex<DemoItem, 'Id'>({
// tableName: 'MyTable',
// primaryKey: 'Id',
// });
//
// const values = table.createValuesMap();
//
// assert.equal(values.add('foo', 3), ':foo');
// assert.deepEqual(values.serialize(), {
// ':foo': 3,
// });
// });
// });
describe('.scan()', () => {
it('Basic use case', () => {
const table = new _TableIndex.default({
tableName: 'MyTable',
primaryKey: 'Id',
documentClient: {
scan: () => null
}
});
_chai.assert.deepEqual(table.scan().serialize(), {
TableName: 'MyTable'
});
});
it('Full use case', () => {
const table = new _TableIndex.default({
tableName: 'MyTable',
primaryKey: 'Id',
sortKey: 'Ver',
indexName: 'Test',
documentClient: {
scan: () => null
}
});
_chai.assert.deepEqual(table.scan().filter(cn => cn.nq('hidden', true)).select('ALL_ATTRIBUTES').limit(20).startKey({
Id: '111',
Ver: 5
}).project({
inner: 1
}).segment(1, 10).serialize(), {
TableName: 'MyTable',
FilterExpression: '#hidden <> :hidden',
IndexName: 'Test',
ExpressionAttributeNames: {
'#hidden': 'hidden',
'#inner': 'inner'
},
ExpressionAttributeValues: {
':hidden': true
},
ProjectionExpression: '#inner',
Select: 'ALL_ATTRIBUTES',
Limit: 20,
ExclusiveStartKey: {
Id: '111',
Ver: 5
},
Segment: 1,
TotalSegments: 10
});
});
it('Empty startKey', () => {
const table = new _TableIndex.default({
tableName: 'MyTable',
primaryKey: 'Id',
sortKey: 'Ver',
indexName: 'Test',
documentClient: {
scan: () => null
}
});
_chai.assert.deepEqual(table.scan().startKey({
Id: '111',
Ver: 5
}).startKey(null).serialize(), {
TableName: 'MyTable',
IndexName: 'Test'
});
});
});
describe('.query()', () => {
it('Basic use case', () => {
const table = new _TableIndex.default({
tableName: 'MyTable',
primaryKey: 'Id',
documentClient: {
query: () => null
}
});
_chai.assert.deepEqual(table.query().keyCondition(cn => cn.eq('Id', '123')).serialize(), {
TableName: 'MyTable',
KeyConditionExpression: '#Id = :Id',
ExpressionAttributeNames: {
'#Id': 'Id'
},
ExpressionAttributeValues: {
':Id': '123'
}
});
});
it('Full use case', () => {
const table = new _TableIndex.default({
tableName: 'MyTable',
primaryKey: 'Id',
sortKey: 'Ver',
indexName: 'Test',
documentClient: {
query: () => null
}
});
_chai.assert.deepEqual(table.query().keyCondition(cn => cn.eq('Id', '123').and(cn => cn.gt('Ver', 5))).project({
inner: 1
}).reverseIndex().calcCapacity('TOTAL').extend({
ConsistentRead: true
}).serialize(), {
TableName: 'MyTable',
KeyConditionExpression: '#Id = :Id AND #Ver > :Ver',
IndexName: 'Test',
ExpressionAttributeNames: {
'#Id': 'Id',
'#Ver': 'Ver',
'#inner': 'inner'
},
ExpressionAttributeValues: {
':Id': '123',
':Ver': 5
},
ProjectionExpression: '#inner',
ScanIndexForward: false,
ReturnConsumedCapacity: 'TOTAL',
ConsistentRead: true
});
});
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1aXJlIiwiX2NoYWkiLCJfVGFibGVJbmRleCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImRlc2NyaWJlIiwiaXQiLCJhc3NlcnQiLCJvayIsIklkIiwiVmVyIiwidGFibGUiLCJUYWJsZUluZGV4IiwidGFibGVOYW1lIiwicHJpbWFyeUtleSIsImRvY3VtZW50Q2xpZW50Iiwic2NhbiIsImRlZXBFcXVhbCIsInNlcmlhbGl6ZSIsIlRhYmxlTmFtZSIsInNvcnRLZXkiLCJpbmRleE5hbWUiLCJmaWx0ZXIiLCJjbiIsIm5xIiwic2VsZWN0IiwibGltaXQiLCJzdGFydEtleSIsInByb2plY3QiLCJpbm5lciIsInNlZ21lbnQiLCJGaWx0ZXJFeHByZXNzaW9uIiwiSW5kZXhOYW1lIiwiRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzIiwiRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcyIsIlByb2plY3Rpb25FeHByZXNzaW9uIiwiU2VsZWN0IiwiTGltaXQiLCJFeGNsdXNpdmVTdGFydEtleSIsIlNlZ21lbnQiLCJUb3RhbFNlZ21lbnRzIiwicXVlcnkiLCJrZXlDb25kaXRpb24iLCJlcSIsIktleUNvbmRpdGlvbkV4cHJlc3Npb24iLCJhbmQiLCJndCIsInJldmVyc2VJbmRleCIsImNhbGNDYXBhY2l0eSIsImV4dGVuZCIsIkNvbnNpc3RlbnRSZWFkIiwiU2NhbkluZGV4Rm9yd2FyZCIsIlJldHVybkNvbnN1bWVkQ2FwYWNpdHkiXSwic291cmNlcyI6WyIuLi9zcmMvVGFibGVJbmRleC50ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnbW9jaGEnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQgVGFibGVJbmRleCwgeyBUYWJsZUtleSwgVGFibGVLZXlBcmdzIH0gZnJvbSAnLi9UYWJsZUluZGV4JztcblxuaW50ZXJmYWNlIERlbW9JdGVtIHtcbiAgSWQ6IHN0cmluZztcbiAgVmVyOiBudW1iZXI7XG4gIGZvbzogbnVtYmVyO1xuICBpbm5lcjoge1xuICAgIG9iajogc3RyaW5nO1xuICB9O1xuICBtYXliZT86IGJvb2xlYW47XG4gIGhpZGRlbjogYm9vbGVhbjtcbn1cblxuZGVzY3JpYmUoJ1RhYmxlSW5kZXgnLCAoKSA9PiB7XG4gIGl0KCdUYWJsZUtleSB0eXBlJywgKCkgPT4ge1xuICAgIGFzc2VydC5vazxUYWJsZUtleTxEZW1vSXRlbSwgJ0lkJz4+KHtcbiAgICAgIElkOiAnZm9vJyxcbiAgICB9KTtcblxuICAgIGFzc2VydC5vazxUYWJsZUtleTxEZW1vSXRlbSwgJ0lkJywgJ1Zlcic+Pih7XG4gICAgICBJZDogJ2ZvbycsXG4gICAgICBWZXI6IDEsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdUYWJsZUtleUFyZ3MgdHlwZScsICgpID0+IHtcbiAgICBhc3NlcnQub2s8VGFibGVLZXlBcmdzPERlbW9JdGVtLCAnSWQnPj4oWydmb28nXSk7XG4gICAgYXNzZXJ0Lm9rPFRhYmxlS2V5QXJnczxEZW1vSXRlbSwgJ0lkJywgJ1Zlcic+PihbJ2ZvbycsIDFdKTtcbiAgfSk7XG5cbiAgLy8gZGVzY3JpYmUoJy5jcmVhdGVOYW1lc01hcCgpJywgKCkgPT4ge1xuICAvLyAgIGl0KCdCYXNpYyB1c2UgY2FzZScsICgpID0+IHtcbiAgLy8gICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlSW5kZXg8RGVtb0l0ZW0sICdJZCc+KHtcbiAgLy8gICAgICAgdGFibGVOYW1lOiAnTXlUYWJsZScsXG4gIC8vICAgICAgIHByaW1hcnlLZXk6ICdJZCcsXG4gIC8vICAgICB9KTtcbiAgLy9cbiAgLy8gICAgIGNvbnN0IG5hbWVzID0gdGFibGUuY3JlYXRlTmFtZXNNYXAoKTtcbiAgLy9cbiAgLy8gICAgIGFzc2VydC5lcXVhbChuYW1lcy5hZGQoJ2ZvbycpLCAnI2ZvbycpO1xuICAvLyAgICAgYXNzZXJ0LmRlZXBFcXVhbChuYW1lcy5zZXJpYWxpemUoKSwge1xuICAvLyAgICAgICAnI2Zvbyc6ICdmb28nLFxuICAvLyAgICAgfSk7XG4gIC8vICAgfSk7XG4gIC8vIH0pO1xuXG4gIC8vIGRlc2NyaWJlKCcuY3JlYXRlVmFsdWVzTWFwKCknLCAoKSA9PiB7XG4gIC8vICAgaXQoJ0Jhc2ljIHVzZSBjYXNlJywgKCkgPT4ge1xuICAvLyAgICAgY29uc3QgdGFibGUgPSBuZXcgVGFibGVJbmRleDxEZW1vSXRlbSwgJ0lkJz4oe1xuICAvLyAgICAgICB0YWJsZU5hbWU6ICdNeVRhYmxlJyxcbiAgLy8gICAgICAgcHJpbWFyeUtleTogJ0lkJyxcbiAgLy8gICAgIH0pO1xuICAvL1xuICAvLyAgICAgY29uc3QgdmFsdWVzID0gdGFibGUuY3JlYXRlVmFsdWVzTWFwKCk7XG4gIC8vXG4gIC8vICAgICBhc3NlcnQuZXF1YWwodmFsdWVzLmFkZCgnZm9vJywgMyksICc6Zm9vJyk7XG4gIC8vICAgICBhc3NlcnQuZGVlcEVxdWFsKHZhbHVlcy5zZXJpYWxpemUoKSwge1xuICAvLyAgICAgICAnOmZvbyc6IDMsXG4gIC8vICAgICB9KTtcbiAgLy8gICB9KTtcbiAgLy8gfSk7XG5cbiAgZGVzY3JpYmUoJy5zY2FuKCknLCAoKSA9PiB7XG4gICAgaXQoJ0Jhc2ljIHVzZSBjYXNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdGFibGUgPSBuZXcgVGFibGVJbmRleDxEZW1vSXRlbSwgJ0lkJz4oe1xuICAgICAgICB0YWJsZU5hbWU6ICdNeVRhYmxlJyxcbiAgICAgICAgcHJpbWFyeUtleTogJ0lkJyxcbiAgICAgICAgZG9jdW1lbnRDbGllbnQ6IHsgc2NhbjogKCkgPT4gbnVsbCB9IGFzIG5ldmVyLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodGFibGUuc2NhbigpLnNlcmlhbGl6ZSgpLCB7XG4gICAgICAgIFRhYmxlTmFtZTogJ015VGFibGUnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnRnVsbCB1c2UgY2FzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlSW5kZXg8RGVtb0l0ZW0sICdJZCcsICdWZXInPih7XG4gICAgICAgIHRhYmxlTmFtZTogJ015VGFibGUnLFxuICAgICAgICBwcmltYXJ5S2V5OiAnSWQnLFxuICAgICAgICBzb3J0S2V5OiAnVmVyJyxcbiAgICAgICAgaW5kZXhOYW1lOiAnVGVzdCcsXG4gICAgICAgIGRvY3VtZW50Q2xpZW50OiB7IHNjYW46ICgpID0+IG51bGwgfSBhcyBuZXZlcixcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICB0YWJsZVxuICAgICAgICAgIC5zY2FuKClcbiAgICAgICAgICAuZmlsdGVyKChjbikgPT4gY24ubnEoJ2hpZGRlbicsIHRydWUpKVxuICAgICAgICAgIC5zZWxlY3QoJ0FMTF9BVFRSSUJVVEVTJylcbiAgICAgICAgICAubGltaXQoMjApXG4gICAgICAgICAgLnN0YXJ0S2V5KHsgSWQ6ICcxMTEnLCBWZXI6IDUgfSlcbiAgICAgICAgICAucHJvamVjdCh7IGlubmVyOiAxIH0pXG4gICAgICAgICAgLnNlZ21lbnQoMSwgMTApXG4gICAgICAgICAgLnNlcmlhbGl6ZSgpLFxuICAgICAgICB7XG4gICAgICAgICAgVGFibGVOYW1lOiAnTXlUYWJsZScsXG4gICAgICAgICAgRmlsdGVyRXhwcmVzc2lvbjogJyNoaWRkZW4gPD4gOmhpZGRlbicsXG4gICAgICAgICAgSW5kZXhOYW1lOiAnVGVzdCcsXG4gICAgICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzOiB7XG4gICAgICAgICAgICAnI2hpZGRlbic6ICdoaWRkZW4nLFxuICAgICAgICAgICAgJyNpbm5lcic6ICdpbm5lcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgICAnOmhpZGRlbic6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBQcm9qZWN0aW9uRXhwcmVzc2lvbjogJyNpbm5lcicsXG4gICAgICAgICAgU2VsZWN0OiAnQUxMX0FUVFJJQlVURVMnLFxuICAgICAgICAgIExpbWl0OiAyMCxcbiAgICAgICAgICBFeGNsdXNpdmVTdGFydEtleToge1xuICAgICAgICAgICAgSWQ6ICcxMTEnLFxuICAgICAgICAgICAgVmVyOiA1LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgU2VnbWVudDogMSxcbiAgICAgICAgICBUb3RhbFNlZ21lbnRzOiAxMCxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnRW1wdHkgc3RhcnRLZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZUluZGV4PERlbW9JdGVtLCAnSWQnLCAnVmVyJz4oe1xuICAgICAgICB0YWJsZU5hbWU6ICdNeVRhYmxlJyxcbiAgICAgICAgcHJpbWFyeUtleTogJ0lkJyxcbiAgICAgICAgc29ydEtleTogJ1ZlcicsXG4gICAgICAgIGluZGV4TmFtZTogJ1Rlc3QnLFxuICAgICAgICBkb2N1bWVudENsaWVudDogeyBzY2FuOiAoKSA9PiBudWxsIH0gYXMgbmV2ZXIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgdGFibGUuc2NhbigpLnN0YXJ0S2V5KHsgSWQ6ICcxMTEnLCBWZXI6IDUgfSkuc3RhcnRLZXkobnVsbCkuc2VyaWFsaXplKCksXG4gICAgICAgIHtcbiAgICAgICAgICBUYWJsZU5hbWU6ICdNeVRhYmxlJyxcbiAgICAgICAgICBJbmRleE5hbWU6ICdUZXN0JyxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcucXVlcnkoKScsICgpID0+IHtcbiAgICBpdCgnQmFzaWMgdXNlIGNhc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZUluZGV4PERlbW9JdGVtLCAnSWQnPih7XG4gICAgICAgIHRhYmxlTmFtZTogJ015VGFibGUnLFxuICAgICAgICBwcmltYXJ5S2V5OiAnSWQnLFxuICAgICAgICBkb2N1bWVudENsaWVudDogeyBxdWVyeTogKCkgPT4gbnVsbCB9IGFzIG5ldmVyLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoXG4gICAgICAgIHRhYmxlXG4gICAgICAgICAgLnF1ZXJ5KClcbiAgICAgICAgICAua2V5Q29uZGl0aW9uKChjbikgPT4gY24uZXEoJ0lkJywgJzEyMycpKVxuICAgICAgICAgIC5zZXJpYWxpemUoKSxcbiAgICAgICAge1xuICAgICAgICAgIFRhYmxlTmFtZTogJ015VGFibGUnLFxuICAgICAgICAgIEtleUNvbmRpdGlvbkV4cHJlc3Npb246ICcjSWQgPSA6SWQnLFxuICAgICAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lczoge1xuICAgICAgICAgICAgJyNJZCc6ICdJZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgICAnOklkJzogJzEyMycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnRnVsbCB1c2UgY2FzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlSW5kZXg8RGVtb0l0ZW0sICdJZCcsICdWZXInPih7XG4gICAgICAgIHRhYmxlTmFtZTogJ015VGFibGUnLFxuICAgICAgICBwcmltYXJ5S2V5OiAnSWQnLFxuICAgICAgICBzb3J0S2V5OiAnVmVyJyxcbiAgICAgICAgaW5kZXhOYW1lOiAnVGVzdCcsXG4gICAgICAgIGRvY3VtZW50Q2xpZW50OiB7IHF1ZXJ5OiAoKSA9PiBudWxsIH0gYXMgbmV2ZXIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgdGFibGVcbiAgICAgICAgICAucXVlcnkoKVxuICAgICAgICAgIC5rZXlDb25kaXRpb24oKGNuKSA9PiBjbi5lcSgnSWQnLCAnMTIzJykuYW5kKChjbikgPT4gY24uZ3QoJ1ZlcicsIDUpKSlcbiAgICAgICAgICAucHJvamVjdCh7IGlubmVyOiAxIH0pXG4gICAgICAgICAgLnJldmVyc2VJbmRleCgpXG4gICAgICAgICAgLmNhbGNDYXBhY2l0eSgnVE9UQUwnKVxuICAgICAgICAgIC5leHRlbmQoe1xuICAgICAgICAgICAgQ29uc2lzdGVudFJlYWQ6IHRydWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc2VyaWFsaXplKCksXG4gICAgICAgIHtcbiAgICAgICAgICBUYWJsZU5hbWU6ICdNeVRhYmxlJyxcbiAgICAgICAgICBLZXlDb25kaXRpb25FeHByZXNzaW9uOiAnI0lkID0gOklkIEFORCAjVmVyID4gOlZlcicsXG4gICAgICAgICAgSW5kZXhOYW1lOiAnVGVzdCcsXG4gICAgICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzOiB7XG4gICAgICAgICAgICAnI0lkJzogJ0lkJyxcbiAgICAgICAgICAgICcjVmVyJzogJ1ZlcicsXG4gICAgICAgICAgICAnI2lubmVyJzogJ2lubmVyJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IHtcbiAgICAgICAgICAgICc6SWQnOiAnMTIzJyxcbiAgICAgICAgICAgICc6VmVyJzogNSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFByb2plY3Rpb25FeHByZXNzaW9uOiAnI2lubmVyJyxcbiAgICAgICAgICBTY2FuSW5kZXhGb3J3YXJkOiBmYWxzZSxcbiAgICAgICAgICBSZXR1cm5Db25zdW1lZENhcGFjaXR5OiAnVE9UQUwnLFxuICAgICAgICAgIENvbnNpc3RlbnRSZWFkOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQUEsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUFrRSxTQUFBRyx1QkFBQUMsR0FB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