UNPKG

@northscaler/service-support

Version:

Artifacts that assist in writing service layers effectively

147 lines (133 loc) 15.6 kB
/* global describe, it */ 'use strict'; var _dec, _dec2, _dec3, _class; function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; } const chai = require('chai'); chai.use(require('dirty-chai')); const expect = chai.expect; const { serviceMethod } = require('../../main').decorators; const { DateFormat, ResponseStatus } = require('../../main').enums; const { CodedError } = require('@northscaler/error-support'); const OopsyError = CodedError({ name: 'Oopsy' }); let AdditionService = (_dec = serviceMethod(), _dec2 = serviceMethod({ includeErrorStacks: false }), _dec3 = serviceMethod({ dateFormat: DateFormat.UNIX_MILLISECONDS }), (_class = class AdditionService { async add({ a, b, at }) { return this._add({ a, b, at }); } async addNoStacktrace({ a, b, at }) { return this._add({ a, b, at }); } async addWithUnixMillisecondsFormat({ a, b, at }) { return this._add({ a, b, at }); } async _add({ a, b, at }) { if (typeof a !== 'number' || typeof b !== 'number') throw new OopsyError({ msg: 'arguments not both numbers' }); return { sum: a + b, at }; } }, (_applyDecoratedDescriptor(_class.prototype, "add", [_dec], Object.getOwnPropertyDescriptor(_class.prototype, "add"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "addNoStacktrace", [_dec2], Object.getOwnPropertyDescriptor(_class.prototype, "addNoStacktrace"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, "addWithUnixMillisecondsFormat", [_dec3], Object.getOwnPropertyDescriptor(_class.prototype, "addWithUnixMillisecondsFormat"), _class.prototype)), _class)); const adder = new AdditionService(); describe('integration tests of @serviceMethod', () => { it('should return successful response', async function () { var _actual, _actual$meta, _actual2, _actual2$meta; const dto = { a: 1, b: 2, at: new Date() }; const expected = { data: { sum: dto.a + dto.b, at: dto.at.toISOString() }, meta: { status: ResponseStatus.SUCCESS.name } }; let actual = await adder.add(dto); console.log(JSON.stringify(actual, null, 2)); expect((_actual = actual) === null || _actual === void 0 ? void 0 : (_actual$meta = _actual.meta) === null || _actual$meta === void 0 ? void 0 : _actual$meta.elapsedMillis).to.be.at.least(0); delete actual.meta.elapsedMillis; expect(actual).to.deep.equal(expected); expected.data.at = dto.at.getTime(); actual = await adder.addWithUnixMillisecondsFormat(dto); console.log(JSON.stringify(actual, null, 2)); expect((_actual2 = actual) === null || _actual2 === void 0 ? void 0 : (_actual2$meta = _actual2.meta) === null || _actual2$meta === void 0 ? void 0 : _actual2$meta.elapsedMillis).to.be.at.least(0); delete actual.meta.elapsedMillis; expect(actual).to.deep.equal(expected); }); it('should return error response', async function () { var _actual3, _actual3$meta, _actual4, _actual4$error, _actual5, _actual5$meta, _actual6, _actual6$error; const dto = { a: 1, b: 'foo' }; const expected = { error: { name: 'Oopsy', message: 'E_OOPSY: arguments not both numbers', code: 'E_OOPSY' }, meta: { status: ResponseStatus.FAILURE.name } }; let actual = await adder.add(dto); expect((_actual3 = actual) === null || _actual3 === void 0 ? void 0 : (_actual3$meta = _actual3.meta) === null || _actual3$meta === void 0 ? void 0 : _actual3$meta.elapsedMillis).to.be.at.least(0); delete actual.meta.elapsedMillis; expect(typeof ((_actual4 = actual) === null || _actual4 === void 0 ? void 0 : (_actual4$error = _actual4.error) === null || _actual4$error === void 0 ? void 0 : _actual4$error.stack)).to.equal('string'); delete actual.error.stack; expect(actual).to.deep.equal(expected); actual = await adder.addNoStacktrace(dto); console.log(JSON.stringify(actual, null, 2)); expect((_actual5 = actual) === null || _actual5 === void 0 ? void 0 : (_actual5$meta = _actual5.meta) === null || _actual5$meta === void 0 ? void 0 : _actual5$meta.elapsedMillis).to.be.at.least(0); delete actual.meta.elapsedMillis; expect((_actual6 = actual) === null || _actual6 === void 0 ? void 0 : (_actual6$error = _actual6.error) === null || _actual6$error === void 0 ? void 0 : _actual6$error.stack).not.to.be.ok(); expect(actual).to.deep.equal(expected); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0L2ludGVncmF0aW9uL3NlcnZpY2VNZXRob2Quc3BlYy5qcyJdLCJuYW1lcyI6WyJjaGFpIiwicmVxdWlyZSIsInVzZSIsImV4cGVjdCIsInNlcnZpY2VNZXRob2QiLCJkZWNvcmF0b3JzIiwiRGF0ZUZvcm1hdCIsIlJlc3BvbnNlU3RhdHVzIiwiZW51bXMiLCJDb2RlZEVycm9yIiwiT29wc3lFcnJvciIsIm5hbWUiLCJBZGRpdGlvblNlcnZpY2UiLCJpbmNsdWRlRXJyb3JTdGFja3MiLCJkYXRlRm9ybWF0IiwiVU5JWF9NSUxMSVNFQ09ORFMiLCJhZGQiLCJhIiwiYiIsImF0IiwiX2FkZCIsImFkZE5vU3RhY2t0cmFjZSIsImFkZFdpdGhVbml4TWlsbGlzZWNvbmRzRm9ybWF0IiwibXNnIiwic3VtIiwiYWRkZXIiLCJkZXNjcmliZSIsIml0IiwiZHRvIiwiRGF0ZSIsImV4cGVjdGVkIiwiZGF0YSIsInRvSVNPU3RyaW5nIiwibWV0YSIsInN0YXR1cyIsIlNVQ0NFU1MiLCJhY3R1YWwiLCJjb25zb2xlIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsImVsYXBzZWRNaWxsaXMiLCJ0byIsImJlIiwibGVhc3QiLCJkZWVwIiwiZXF1YWwiLCJnZXRUaW1lIiwiZXJyb3IiLCJtZXNzYWdlIiwiY29kZSIsIkZBSUxVUkUiLCJzdGFjayIsIm5vdCIsIm9rIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUVBOzs7Ozs7QUFFQSxNQUFNQSxJQUFJLEdBQUdDLE9BQU8sQ0FBQyxNQUFELENBQXBCOztBQUNBRCxJQUFJLENBQUNFLEdBQUwsQ0FBU0QsT0FBTyxDQUFDLFlBQUQsQ0FBaEI7QUFDQSxNQUFNRSxNQUFNLEdBQUdILElBQUksQ0FBQ0csTUFBcEI7O0FBRUEsTUFBTTtBQUFFQyxFQUFBQTtBQUFGLElBQW9CSCxPQUFPLENBQUMsWUFBRCxDQUFQLENBQXNCSSxVQUFoRDs7QUFDQSxNQUFNO0FBQUVDLEVBQUFBLFVBQUY7QUFBY0MsRUFBQUE7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UUgsSUFBVCxrREFBQyxjQUFjUSxhQUFmLENBQU4sQ0FBb0NDLEVBQXBDLENBQXVDQyxFQUF2QyxDQUEwQ3hCLEVBQTFDLENBQTZDeUIsS0FBN0MsQ0FBbUQsQ0FBbkQ7QUFDQSxXQUFPUixNQUFNLENBQUNILElBQVAsQ0FBWVEsYUFBbkI7QUFFQXRDLElBQUFBLE1BQU0sYUFBQ2lDLE1BQUQsK0RBQUMsU0FBUVksS0FBVCxtREFBQyxlQUFlSSxLQUFoQixDQUFOLENBQTZCQyxHQUE3QixDQUFpQ1gsRUFBakMsQ0FBb0NDLEVBQXBDLENBQXVDVyxFQUF2QztBQUVBbkQsSUFBQUEsTUFBTSxDQUFDaUMsTUFBRCxDQUFOLENBQWVNLEVBQWYsQ0FBa0JHLElBQWxCLENBQXVCQyxLQUF2QixDQUE2QmhCLFFBQTdCO0FBQ0QsR0FqQ0MsQ0FBRjtBQWtDRCxDQWhFTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIGRlc2NyaWJlLCBpdCAqL1xuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgY2hhaSA9IHJlcXVpcmUoJ2NoYWknKVxuY2hhaS51c2UocmVxdWlyZSgnZGlydHktY2hhaScpKVxuY29uc3QgZXhwZWN0ID0gY2hhaS5leHBlY3RcblxuY29uc3QgeyBzZXJ2aWNlTWV0aG9kIH0gPSByZXF1aXJlKCcuLi8uLi9tYWluJykuZGVjb3JhdG9yc1xuY29uc3QgeyBEYXRlRm9ybWF0LCBSZXNwb25zZVN0YXR1cyB9ID0gcmVxdWlyZSgnLi4vLi4vbWFpbicpLmVudW1zXG5jb25zdCB7IENvZGVkRXJyb3IgfSA9IHJlcXVpcmUoJ0Bub3J0aHNjYWxlci9lcnJvci1zdXBwb3J0JylcblxuY29uc3QgT29wc3lFcnJvciA9IENvZGVkRXJyb3IoeyBuYW1lOiAnT29wc3knIH0pXG5cbmNsYXNzIEFkZGl0aW9uU2VydmljZSB7XG4gIEBzZXJ2aWNlTWV0aG9kKClcbiAgYXN5bmMgYWRkICh7IGEsIGIsIGF0IH0pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKHsgYSwgYiwgYXQgfSlcbiAgfVxuXG4gIEBzZXJ2aWNlTWV0aG9kKHsgaW5jbHVkZUVycm9yU3RhY2tzOiBmYWxzZSB9KVxuICBhc3luYyBhZGROb1N0YWNrdHJhY2UgKHsgYSwgYiwgYXQgfSkge1xuICAgIHJldHVybiB0aGlzLl9hZGQoeyBhLCBiLCBhdCB9KVxuICB9XG5cbiAgQHNlcnZpY2VNZXRob2QoeyBkYXRlRm9ybWF0OiBEYXRlRm9ybWF0LlVOSVhfTUlMTElTRUNPTkRTIH0pXG4gIGFzeW5jIGFkZFdpdGhVbml4TWlsbGlzZWNvbmRzRm9ybWF0ICh7IGEsIGIsIGF0IH0pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKHsgYSwgYiwgYXQgfSlcbiAgfVxuXG4gIGFzeW5jIF9hZGQgKHsgYSwgYiwgYXQgfSkge1xuICAgIGlmICh0eXBlb2YgYSAhPT0gJ251bWJlcicgfHwgdHlwZW9mIGIgIT09ICdudW1iZXInKSB0aHJvdyBuZXcgT29wc3lFcnJvcih7IG1zZzogJ2FyZ3VtZW50cyBub3QgYm90aCBudW1iZXJzJyB9KVxuXG4gICAgcmV0dXJuIHsgc3VtOiBhICsgYiwgYXQgfVxuICB9XG59XG5cbmNvbnN0IGFkZGVyID0gbmV3IEFkZGl0aW9uU2VydmljZSgpXG5cbmRlc2NyaWJlKCdpbnRlZ3JhdGlvbiB0ZXN0cyBvZiBAc2VydmljZU1ldGhvZCcsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCByZXR1cm4gc3VjY2Vzc2Z1bCByZXNwb25zZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBkdG8gPSB7IGE6IDEsIGI6IDIsIGF0OiBuZXcgRGF0ZSgpIH1cblxuICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgZGF0YTogeyBzdW06IGR0by5hICsgZHRvLmIsIGF0OiBkdG8uYXQudG9JU09TdHJpbmcoKSB9LFxuICAgICAgbWV0YToge1xuICAgICAgICBzdGF0dXM6IFJlc3BvbnNlU3RhdHVzLlNVQ0NFU1MubmFtZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBhY3R1YWwgPSBhd2FpdCBhZGRlci5hZGQoZHRvKVxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGFjdHVhbCwgbnVsbCwgMikpXG5cbiAgICBleHBlY3QoYWN0dWFsPy5tZXRhPy5lbGFwc2VkTWlsbGlzKS50by5iZS5hdC5sZWFzdCgwKVxuICAgIGRlbGV0ZSBhY3R1YWwubWV0YS5lbGFwc2VkTWlsbGlzXG5cbiAgICBleHBlY3QoYWN0dWFsKS50by5kZWVwLmVxdWFsKGV4cGVjdGVkKVxuXG4gICAgZXhwZWN0ZWQuZGF0YS5hdCA9IGR0by5hdC5nZXRUaW1lKClcblxuICAgIGFjdHVhbCA9IGF3YWl0IGFkZGVyLmFkZFdpdGhVbml4TWlsbGlzZWNvbmRzRm9ybWF0KGR0bylcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhY3R1YWwsIG51bGwsIDIpKVxuXG4gICAgZXhwZWN0KGFjdHVhbD8ubWV0YT8uZWxhcHNlZE1pbGxpcykudG8uYmUuYXQubGVhc3QoMClcbiAgICBkZWxldGUgYWN0dWFsLm1ldGEuZWxhcHNlZE1pbGxpc1xuXG4gICAgZXhwZWN0KGFjdHVhbCkudG8uZGVlcC5lcXVhbChleHBlY3RlZClcbiAgfSlcblxuICBpdCgnc2hvdWxkIHJldHVybiBlcnJvciByZXNwb25zZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBkdG8gPSB7IGE6IDEsIGI6ICdmb28nIH1cblxuICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgZXJyb3I6IHtcbiAgICAgICAgbmFtZTogJ09vcHN5JyxcbiAgICAgICAgbWVzc2FnZTogJ0VfT09QU1k6IGFyZ3VtZW50cyBub3QgYm90aCBudW1iZXJzJyxcbiAgICAgICAgY29kZTogJ0VfT09QU1knXG4gICAgICB9LFxuICAgICAgbWV0YToge1xuICAgICAgICBzdGF0dXM6IFJlc3BvbnNlU3RhdHVzLkZBSUxVUkUubmFtZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBhY3R1YWwgPSBhd2FpdCBhZGRlci5hZGQoZHRvKVxuXG4gICAgZXhwZWN0KGFjdHVhbD8ubWV0YT8uZWxhcHNlZE1pbGxpcykudG8uYmUuYXQubGVhc3QoMClcbiAgICBkZWxldGUgYWN0dWFsLm1ldGEuZWxhcHNlZE1pbGxpc1xuXG4gICAgZXhwZWN0KHR5cGVvZiBhY3R1YWw/LmVycm9yPy5zdGFjaykudG8uZXF1YWwoJ3N0cmluZycpXG4gICAgZGVsZXRlIGFjdHVhbC5lcnJvci5zdGFja1xuXG4gICAgZXhwZWN0KGFjdHVhbCkudG8uZGVlcC5lcXVhbChleHBlY3RlZClcblxuICAgIGFjdHVhbCA9IGF3YWl0IGFkZGVyLmFkZE5vU3RhY2t0cmFjZShkdG8pXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYWN0dWFsLCBudWxsLCAyKSlcblxuICAgIGV4cGVjdChhY3R1YWw/Lm1ldGE/LmVsYXBzZWRNaWxsaXMpLnRvLmJlLmF0LmxlYXN0KDApXG4gICAgZGVsZXRlIGFjdHVhbC5tZXRhLmVsYXBzZWRNaWxsaXNcblxuICAgIGV4cGVjdChhY3R1YWw/LmVycm9yPy5zdGFjaykubm90LnRvLmJlLm9rKClcblxuICAgIGV4cGVjdChhY3R1YWwpLnRvLmRlZXAuZXF1YWwoZXhwZWN0ZWQpXG4gIH0pXG59KVxuIl19