UNPKG

ddb-table

Version:

Strongly typed library for querying and modeling DynamoDB documents.

178 lines (174 loc) 18.4 kB
"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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