UNPKG

ddb-table

Version:

Strongly typed library for querying and modeling DynamoDB documents.

130 lines (129 loc) 20.3 kB
"use strict"; require("mocha"); var _chai = require("chai"); var _ExpressionAttributeNames = _interopRequireDefault(require("./ExpressionAttributeNames")); var _ExpressionAttributeValues = _interopRequireDefault(require("./ExpressionAttributeValues")); var _UpdateValueExpression = _interopRequireDefault(require("./UpdateValueExpression")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } describe('UpdateValueExpression', () => { describe('.name', () => { it('basic use case', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const exp = new _UpdateValueExpression.default(names, values, '#foo', 'foo'); _chai.assert.equal(exp.name('foo'), '#foo'); _chai.assert.deepEqual(names.serialize(), { '#foo': 'foo' }); _chai.assert.deepEqual(values.serialize(), undefined); }); it('inner path', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const exp = new _UpdateValueExpression.default(names, values, '#foo', 'foo'); _chai.assert.equal(exp.name('foo', 'bar'), '#foo.#bar'); _chai.assert.deepEqual(names.serialize(), { '#foo': 'foo', '#bar': 'bar' }); _chai.assert.deepEqual(values.serialize(), undefined); }); }); describe('.value', () => { it('basic use case', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const exp = new _UpdateValueExpression.default(names, values, '#foo', 'foo'); _chai.assert.equal(exp.value(1), ':foo'); _chai.assert.deepEqual(names.serialize(), undefined); _chai.assert.deepEqual(values.serialize(), { ':foo': 1 }); }); }); describe('.inc', () => { it('basic use case', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const exp = new _UpdateValueExpression.default(names, values, '#foo', 'foo'); _chai.assert.equal(exp.inc(3), '#foo + :foo'); _chai.assert.deepEqual(names.serialize(), undefined); _chai.assert.deepEqual(values.serialize(), { ':foo': 3 }); }); it('2 values', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const exp = new _UpdateValueExpression.default(names, values, '#foo', 'foo'); _chai.assert.equal(exp.inc(exp => exp.name('bar'), 2), '#bar + :foo'); _chai.assert.deepEqual(names.serialize(), { '#bar': 'bar' }); _chai.assert.deepEqual(values.serialize(), { ':foo': 2 }); }); }); describe('.dec', () => { it('basic use case', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const exp = new _UpdateValueExpression.default(names, values, '#foo', 'foo'); _chai.assert.equal(exp.dec(3), '#foo - :foo'); _chai.assert.deepEqual(names.serialize(), undefined); _chai.assert.deepEqual(values.serialize(), { ':foo': 3 }); }); it('2 values', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const exp = new _UpdateValueExpression.default(names, values, '#foo', 'foo'); _chai.assert.equal(exp.dec(exp => exp.name('bar'), 2), '#bar - :foo'); _chai.assert.deepEqual(names.serialize(), { '#bar': 'bar' }); _chai.assert.deepEqual(values.serialize(), { ':foo': 2 }); }); }); describe('.listAppend', () => { it('basic use case', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const exp = new _UpdateValueExpression.default(names, values, '#foo', 'foo'); _chai.assert.equal(exp.listAppend([3]), 'list_append(#foo, :foo)'); _chai.assert.deepEqual(names.serialize(), undefined); _chai.assert.deepEqual(values.serialize(), { ':foo': [3] }); }); it('2 lists', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const exp = new _UpdateValueExpression.default(names, values, '#foo', 'foo'); _chai.assert.equal(exp.listAppend(exp => exp.name('bar'), [3]), 'list_append(#bar, :foo)'); _chai.assert.deepEqual(names.serialize(), { '#bar': 'bar' }); _chai.assert.deepEqual(values.serialize(), { ':foo': [3] }); }); }); describe('.ifNotExists', () => { it('basic use case', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const exp = new _UpdateValueExpression.default(names, values, '#foo', 'foo'); _chai.assert.equal(exp.ifNotExists(3), 'if_not_exists(#foo, :foo)'); _chai.assert.deepEqual(names.serialize(), undefined); _chai.assert.deepEqual(values.serialize(), { ':foo': 3 }); }); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1aXJlIiwiX2NoYWkiLCJfRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9FeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzIiwiX1VwZGF0ZVZhbHVlRXhwcmVzc2lvbiIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiZGVzY3JpYmUiLCJpdCIsIm5hbWVzIiwiRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzIiwidmFsdWVzIiwiRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcyIsImV4cCIsIlVwZGF0ZVZhbHVlRXhwcmVzc2lvbiIsImFzc2VydCIsImVxdWFsIiwibmFtZSIsImRlZXBFcXVhbCIsInNlcmlhbGl6ZSIsInVuZGVmaW5lZCIsInZhbHVlIiwiaW5jIiwiZGVjIiwibGlzdEFwcGVuZCIsImlmTm90RXhpc3RzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4cHJlc3Npb25zL1VwZGF0ZVZhbHVlRXhwcmVzc2lvbi50ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnbW9jaGEnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzIGZyb20gJy4vRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzJztcbmltcG9ydCBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzIGZyb20gJy4vRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcyc7XG5pbXBvcnQgVXBkYXRlVmFsdWVFeHByZXNzaW9uIGZyb20gJy4vVXBkYXRlVmFsdWVFeHByZXNzaW9uJztcblxuZGVzY3JpYmUoJ1VwZGF0ZVZhbHVlRXhwcmVzc2lvbicsICgpID0+IHtcbiAgZGVzY3JpYmUoJy5uYW1lJywgKCkgPT4ge1xuICAgIGl0KCdiYXNpYyB1c2UgY2FzZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG5hbWVzID0gbmV3IEV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lcygpO1xuICAgICAgY29uc3QgdmFsdWVzID0gbmV3IEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXMoKTtcbiAgICAgIGNvbnN0IGV4cCA9IG5ldyBVcGRhdGVWYWx1ZUV4cHJlc3Npb248eyBmb286IG51bWJlciB9LCBudW1iZXI+KFxuICAgICAgICBuYW1lcyxcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICAnI2ZvbycsXG4gICAgICAgICdmb28nLFxuICAgICAgKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGV4cC5uYW1lKCdmb28nKSwgJyNmb28nKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobmFtZXMuc2VyaWFsaXplKCksIHsgJyNmb28nOiAnZm9vJyB9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodmFsdWVzLnNlcmlhbGl6ZSgpLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lubmVyIHBhdGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBuYW1lcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlTmFtZXMoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzKCk7XG4gICAgICBjb25zdCBleHAgPSBuZXcgVXBkYXRlVmFsdWVFeHByZXNzaW9uPHsgZm9vOiB7IGJhcjogbnVtYmVyIH0gfSwgbnVtYmVyPihcbiAgICAgICAgbmFtZXMsXG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgJyNmb28nLFxuICAgICAgICAnZm9vJyxcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChleHAubmFtZSgnZm9vJywgJ2JhcicpLCAnI2Zvby4jYmFyJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG5hbWVzLnNlcmlhbGl6ZSgpLCB7ICcjZm9vJzogJ2ZvbycsICcjYmFyJzogJ2JhcicgfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHZhbHVlcy5zZXJpYWxpemUoKSwgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy52YWx1ZScsICgpID0+IHtcbiAgICBpdCgnYmFzaWMgdXNlIGNhc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBuYW1lcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlTmFtZXMoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzKCk7XG4gICAgICBjb25zdCBleHAgPSBuZXcgVXBkYXRlVmFsdWVFeHByZXNzaW9uPHsgZm9vOiBudW1iZXIgfSwgbnVtYmVyPihcbiAgICAgICAgbmFtZXMsXG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgJyNmb28nLFxuICAgICAgICAnZm9vJyxcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChleHAudmFsdWUoMSksICc6Zm9vJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG5hbWVzLnNlcmlhbGl6ZSgpLCB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWx1ZXMuc2VyaWFsaXplKCksIHsgJzpmb28nOiAxIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnLmluYycsICgpID0+IHtcbiAgICBpdCgnYmFzaWMgdXNlIGNhc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBuYW1lcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlTmFtZXMoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzKCk7XG4gICAgICBjb25zdCBleHAgPSBuZXcgVXBkYXRlVmFsdWVFeHByZXNzaW9uPHsgZm9vOiBudW1iZXIgfSwgbnVtYmVyPihcbiAgICAgICAgbmFtZXMsXG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgJyNmb28nLFxuICAgICAgICAnZm9vJyxcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChleHAuaW5jKDMpLCAnI2ZvbyArIDpmb28nKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobmFtZXMuc2VyaWFsaXplKCksIHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHZhbHVlcy5zZXJpYWxpemUoKSwgeyAnOmZvbyc6IDMgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnMiB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBuYW1lcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlTmFtZXMoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzKCk7XG4gICAgICBjb25zdCBleHAgPSBuZXcgVXBkYXRlVmFsdWVFeHByZXNzaW9uPFxuICAgICAgICB7IGZvbzogbnVtYmVyOyBiYXI6IHN0cmluZyB9LFxuICAgICAgICBudW1iZXJcbiAgICAgID4obmFtZXMsIHZhbHVlcywgJyNmb28nLCAnZm9vJyk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgZXhwLmluYygoZXhwKSA9PiBleHAubmFtZSgnYmFyJyksIDIpLFxuICAgICAgICAnI2JhciArIDpmb28nLFxuICAgICAgKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobmFtZXMuc2VyaWFsaXplKCksIHsgJyNiYXInOiAnYmFyJyB9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodmFsdWVzLnNlcmlhbGl6ZSgpLCB7ICc6Zm9vJzogMiB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5kZWMnLCAoKSA9PiB7XG4gICAgaXQoJ2Jhc2ljIHVzZSBjYXNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbmFtZXMgPSBuZXcgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzKCk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBuZXcgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcygpO1xuICAgICAgY29uc3QgZXhwID0gbmV3IFVwZGF0ZVZhbHVlRXhwcmVzc2lvbjx7IGZvbzogbnVtYmVyIH0sIG51bWJlcj4oXG4gICAgICAgIG5hbWVzLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgICcjZm9vJyxcbiAgICAgICAgJ2ZvbycsXG4gICAgICApO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoZXhwLmRlYygzKSwgJyNmb28gLSA6Zm9vJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG5hbWVzLnNlcmlhbGl6ZSgpLCB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWx1ZXMuc2VyaWFsaXplKCksIHsgJzpmb28nOiAzIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJzIgdmFsdWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbmFtZXMgPSBuZXcgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzKCk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBuZXcgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcygpO1xuICAgICAgY29uc3QgZXhwID0gbmV3IFVwZGF0ZVZhbHVlRXhwcmVzc2lvbjxcbiAgICAgICAgeyBmb286IG51bWJlcjsgYmFyOiBzdHJpbmcgfSxcbiAgICAgICAgbnVtYmVyXG4gICAgICA+KG5hbWVzLCB2YWx1ZXMsICcjZm9vJywgJ2ZvbycpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIGV4cC5kZWMoKGV4cCkgPT4gZXhwLm5hbWUoJ2JhcicpLCAyKSxcbiAgICAgICAgJyNiYXIgLSA6Zm9vJyxcbiAgICAgICk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG5hbWVzLnNlcmlhbGl6ZSgpLCB7ICcjYmFyJzogJ2JhcicgfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHZhbHVlcy5zZXJpYWxpemUoKSwgeyAnOmZvbyc6IDIgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcubGlzdEFwcGVuZCcsICgpID0+IHtcbiAgICBpdCgnYmFzaWMgdXNlIGNhc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBuYW1lcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlTmFtZXMoKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzKCk7XG4gICAgICBjb25zdCBleHAgPSBuZXcgVXBkYXRlVmFsdWVFeHByZXNzaW9uPHsgZm9vOiBudW1iZXJbXSB9LCBudW1iZXJbXT4oXG4gICAgICAgIG5hbWVzLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgICcjZm9vJyxcbiAgICAgICAgJ2ZvbycsXG4gICAgICApO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoZXhwLmxpc3RBcHBlbmQoWzNdKSwgJ2xpc3RfYXBwZW5kKCNmb28sIDpmb28pJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG5hbWVzLnNlcmlhbGl6ZSgpLCB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWx1ZXMuc2VyaWFsaXplKCksIHsgJzpmb28nOiBbM10gfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnMiBsaXN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IG5hbWVzID0gbmV3IEV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lcygpO1xuICAgICAgY29uc3QgdmFsdWVzID0gbmV3IEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXMoKTtcbiAgICAgIGNvbnN0IGV4cCA9IG5ldyBVcGRhdGVWYWx1ZUV4cHJlc3Npb248XG4gICAgICAgIHsgZm9vOiBudW1iZXJbXTsgYmFyOiBudW1iZXJbXSB9LFxuICAgICAgICBudW1iZXJbXVxuICAgICAgPihuYW1lcywgdmFsdWVzLCAnI2ZvbycsICdmb28nKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBleHAubGlzdEFwcGVuZCgoZXhwKSA9PiBleHAubmFtZSgnYmFyJyksIFszXSksXG4gICAgICAgICdsaXN0X2FwcGVuZCgjYmFyLCA6Zm9vKScsXG4gICAgICApO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChuYW1lcy5zZXJpYWxpemUoKSwgeyAnI2Jhcic6ICdiYXInIH0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWx1ZXMuc2VyaWFsaXplKCksIHsgJzpmb28nOiBbM10gfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuaWZOb3RFeGlzdHMnLCAoKSA9PiB7XG4gICAgaXQoJ2Jhc2ljIHVzZSBjYXNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbmFtZXMgPSBuZXcgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzKCk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBuZXcgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcygpO1xuICAgICAgY29uc3QgZXhwID0gbmV3IFVwZGF0ZVZhbHVlRXhwcmVzc2lvbjx7IGZvbzogbnVtYmVyIH0sIG51bWJlcj4oXG4gICAgICAgIG5hbWVzLFxuICAgICAgICB2YWx1ZXMsXG4gICAgICAgICcjZm9vJyxcbiAgICAgICAgJ2ZvbycsXG4gICAgICApO1xuXG4gICAgICBhc3NlcnQuZXF1YWwoZXhwLmlmTm90RXhpc3RzKDMpLCAnaWZfbm90X2V4aXN0cygjZm9vLCA6Zm9vKScpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChuYW1lcy5zZXJpYWxpemUoKSwgdW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodmFsdWVzLnNlcmlhbGl6ZSgpLCB7ICc6Zm9vJzogMyB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQUEsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLHlCQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSwwQkFBQSxHQUFBRCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUssc0JBQUEsR0FBQUYsc0JBQUEsQ0FBQUgsT0FBQTtBQUE0RCxTQUFBRyx1QkFBQUcsR0FBQSxXQUFBQSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxHQUFBRCxHQUFBLEtBQUFFLE9BQUEsRUFBQUYsR0FBQTtBQUU1REcsUUFBUSxDQUFDLHVCQUF1QixFQUFFLE1BQU07RUFDdENBLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTTtJQUN0QkMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLE1BQU07TUFDekIsTUFBTUMsS0FB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