inversify-express-utils
Version:
Some utilities for the development of express applications with Inversify
962 lines • 45.5 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/* eslint-disable @typescript-eslint/no-unused-vars */
const globals_1 = require("@jest/globals");
const cookie_parser_1 = __importDefault(require("cookie-parser"));
const express_1 = require("express");
const inversify_1 = require("inversify");
const supertest_1 = __importDefault(require("supertest"));
const decorators_1 = require("../decorators");
const server_1 = require("../server");
const utils_1 = require("../utils");
(0, globals_1.describe)('Integration Tests:', () => {
let server;
let container;
(0, globals_1.beforeEach)(() => {
(0, utils_1.cleanUpMetadata)();
container = new inversify_1.Container();
});
(0, globals_1.describe)('Routing & Request Handling:', () => {
(0, globals_1.it)('should work for async controller methods', async () => {
let TestController = class TestController {
async getTest(req, res) {
return new Promise((resolve) => {
setTimeout(() => {
resolve('GET');
}, 10);
});
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", Promise)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build()).get('/').expect(200, 'GET');
});
(0, globals_1.it)('should work for async controller methods that fails', async () => {
let TestController = class TestController {
async getTest(req, res) {
return new Promise((_resolve, reject) => {
setTimeout(() => {
// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
reject('GET');
}, 10);
});
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", Promise)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build()).get('/').expect(500);
});
(0, globals_1.it)('should work for methods which call nextFunc()', async () => {
let TestController = class TestController {
getTest(req, res, nextFunc) {
nextFunc();
}
getTest2(req, res) {
return 'GET';
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object, Function]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest2", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build()).get('/').expect(200, 'GET');
});
(0, globals_1.it)('should work for async methods which call nextFunc()', async () => {
let TestController = class TestController {
async getTest(_req, _res, nextFunc) {
return new Promise((resolve) => {
setTimeout(() => {
nextFunc();
resolve(null);
}, 10);
});
}
getTest2(req, res) {
return 'GET';
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object, Function]),
__metadata("design:returntype", Promise)
], TestController.prototype, "getTest", null);
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest2", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build()).get('/').expect(200, 'GET');
});
(0, globals_1.it)('should work for async methods called by nextFunc()', async () => {
let TestController = class TestController {
getTest(req, res, nextFunc) {
return nextFunc;
}
async getTest2(req, res) {
return new Promise((resolve) => {
setTimeout(() => {
resolve('GET');
}, 10);
});
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object, Function]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", Promise)
], TestController.prototype, "getTest2", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build()).get('/').expect(200, 'GET');
});
(0, globals_1.it)('should work for each shortcut decorator', async () => {
let TestController = class TestController {
getTest(_req, res) {
res.send('GET');
}
postTest(_req, res) {
res.send('POST');
}
putTest(_req, res) {
res.send('PUT');
}
patchTest(_req, res) {
res.send('PATCH');
}
headTest(_req, res) {
res.send('HEAD');
}
deleteTest(_req, res) {
res.send('DELETE');
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
__decorate([
(0, decorators_1.httpPost)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "postTest", null);
__decorate([
(0, decorators_1.httpPut)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "putTest", null);
__decorate([
(0, decorators_1.httpPatch)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "patchTest", null);
__decorate([
(0, decorators_1.httpHead)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "headTest", null);
__decorate([
(0, decorators_1.httpDelete)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "deleteTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
const agent = (0, supertest_1.default)(server.build());
await agent.get('/').expect(200, 'GET');
await agent.post('/').expect(200, 'POST');
await agent.put('/').expect(200, 'PUT');
await agent.patch('/').expect(200, 'PATCH');
await agent.head('/').expect(200, undefined); // HEAD requests have no body
await agent.delete('/').expect(200, 'DELETE');
});
(0, globals_1.it)('should work for more obscure HTTP methods using the httpMethod decorator', async () => {
let TestController = class TestController {
getTest(req, res) {
res.send('PROPFIND');
}
};
__decorate([
(0, decorators_1.httpMethod)('propfind', '/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build()).propfind('/').expect(200, 'PROPFIND');
});
(0, globals_1.it)('should use returned values as response', async () => {
const result = { hello: 'world' };
let TestController = class TestController {
getTest(req, res) {
return result;
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build())
.get('/')
.expect(200, JSON.stringify(result));
});
(0, globals_1.it)('should use custom router passed from configuration', async () => {
let TestController = class TestController {
get() {
return 'Such Text';
}
};
__decorate([
(0, decorators_1.httpGet)('/Endpoint'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], TestController.prototype, "get", null);
TestController = __decorate([
(0, decorators_1.controller)('/CaseSensitive')
], TestController);
const customRouter = (0, express_1.Router)({
caseSensitive: true,
});
server = new server_1.InversifyExpressServer(container, customRouter);
const app = server.build();
const expectedSuccess = (0, supertest_1.default)(app)
.get('/CaseSensitive/Endpoint')
.expect(200, 'Such Text');
const expectedNotFound1 = (0, supertest_1.default)(app)
.get('/casesensitive/endpoint')
.expect(404);
const expectedNotFound2 = (0, supertest_1.default)(app)
.get('/CaseSensitive/endpoint')
.expect(404);
return Promise.all([
expectedSuccess,
expectedNotFound1,
expectedNotFound2,
]);
});
(0, globals_1.it)('should use custom routing configuration', () => {
let TestController = class TestController {
get() {
return 'pong';
}
};
__decorate([
(0, decorators_1.httpGet)('/endpoint'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], TestController.prototype, "get", null);
TestController = __decorate([
(0, decorators_1.controller)('/ping')
], TestController);
server = new server_1.InversifyExpressServer(container, null, {
rootPath: '/api/v1',
});
return (0, supertest_1.default)(server.build())
.get('/api/v1/ping/endpoint')
.expect(200, 'pong');
});
(0, globals_1.it)("should work for controller methods who's return value is falsey", async () => {
let TestController = class TestController {
async delete() {
return undefined;
}
};
__decorate([
(0, decorators_1.httpDelete)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", Promise)
], TestController.prototype, "delete", null);
TestController = __decorate([
(0, decorators_1.controller)('/user')
], TestController);
server = new server_1.InversifyExpressServer(container);
try {
await (0, supertest_1.default)(server.build())
.delete('/user')
.timeout({ deadline: 200, response: 100 });
throw new Error('Expected request to hang, but a response was received');
}
catch (error) {
if (!('timeout' in error)) {
throw error;
}
}
});
});
(0, globals_1.describe)('Middleware:', () => {
let result;
const middleware = {
a(req, res, nextFunc) {
result += 'a';
nextFunc();
},
b(req, res, nextFunc) {
result += 'b';
nextFunc();
},
c(req, res, nextFunc) {
result += 'c';
nextFunc();
},
};
const spyA = globals_1.jest
.fn()
.mockImplementation(middleware.a.bind(middleware));
const spyB = globals_1.jest
.fn()
.mockImplementation(middleware.b.bind(middleware));
const spyC = globals_1.jest
.fn()
.mockImplementation(middleware.c.bind(middleware));
(0, globals_1.beforeEach)(() => {
spyA.mockClear();
spyB.mockClear();
spyC.mockClear();
result = '';
});
(0, globals_1.it)('should call method-level middleware correctly (GET)', async () => {
let TestController = class TestController {
getTest(req, res) {
res.send('GET');
}
};
__decorate([
(0, decorators_1.httpGet)('/', spyA, spyB, spyC),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
const agent = (0, supertest_1.default)(server.build());
await agent.get('/').expect(200, 'GET');
(0, globals_1.expect)(spyA).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyB).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyC).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(result).toBe('abc');
});
(0, globals_1.it)('should call method-level middleware correctly (POST)', async () => {
let TestController = class TestController {
postTest(req, res) {
res.send('POST');
}
};
__decorate([
(0, decorators_1.httpPost)('/', spyA, spyB, spyC),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "postTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
const agent = (0, supertest_1.default)(server.build());
await agent.post('/').expect(200, 'POST');
(0, globals_1.expect)(spyA).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyB).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyC).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(result).toBe('abc');
});
(0, globals_1.it)('should call method-level middleware correctly (PUT)', async () => {
let TestController = class TestController {
postTest(req, res) {
res.send('PUT');
}
};
__decorate([
(0, decorators_1.httpPut)('/', spyA, spyB, spyC),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "postTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
const agent = (0, supertest_1.default)(server.build());
await agent.put('/').expect(200, 'PUT');
(0, globals_1.expect)(spyA).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyB).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyC).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(result).toBe('abc');
});
(0, globals_1.it)('should call method-level middleware correctly (PATCH)', async () => {
let TestController = class TestController {
postTest(req, res) {
res.send('PATCH');
}
};
__decorate([
(0, decorators_1.httpPatch)('/', spyA, spyB, spyC),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "postTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
const agent = (0, supertest_1.default)(server.build());
await agent.patch('/').expect(200, 'PATCH');
(0, globals_1.expect)(spyA).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyB).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyC).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(result).toBe('abc');
});
(0, globals_1.it)('should call method-level middleware correctly (HEAD)', async () => {
let TestController = class TestController {
postTest(req, res) {
res.send('HEAD');
}
};
__decorate([
(0, decorators_1.httpHead)('/', spyA, spyB, spyC),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "postTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
const agent = (0, supertest_1.default)(server.build());
await agent.head('/').expect(200, undefined); // HEAD requests have no body
(0, globals_1.expect)(spyA).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyB).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyC).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(result).toBe('abc');
});
(0, globals_1.it)('should call method-level middleware correctly (DELETE)', async () => {
let TestController = class TestController {
postTest(req, res) {
res.send('DELETE');
}
};
__decorate([
(0, decorators_1.httpDelete)('/', spyA, spyB, spyC),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "postTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
const agent = (0, supertest_1.default)(server.build());
await agent.delete('/').expect(200, 'DELETE');
(0, globals_1.expect)(spyA).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyB).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyC).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(result).toBe('abc');
});
(0, globals_1.it)('should call method-level middleware correctly (ALL)', async () => {
let TestController = class TestController {
postTest(req, res) {
res.send('ALL');
}
};
__decorate([
(0, decorators_1.all)('/', spyA, spyB, spyC),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "postTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
const agent = (0, supertest_1.default)(server.build());
await agent.get('/').expect(200, 'ALL');
(0, globals_1.expect)(spyA).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyB).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyC).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(result).toBe('abc');
});
(0, globals_1.it)('should call controller-level middleware correctly', async () => {
let TestController = class TestController {
getTest(req, res) {
res.send('GET');
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/', spyA, spyB, spyC)
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build()).get('/').expect(200, 'GET');
(0, globals_1.expect)(spyA).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyB).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyC).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(result).toBe('abc');
});
(0, globals_1.it)('should call server-level middleware correctly', async () => {
let TestController = class TestController {
getTest(req, res) {
res.send('GET');
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
server.setConfig((app) => {
app.use(spyA);
app.use(spyB);
app.use(spyC);
});
await (0, supertest_1.default)(server.build()).get('/').expect(200, 'GET');
(0, globals_1.expect)(spyA).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyB).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyC).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(result).toBe('abc');
});
(0, globals_1.it)('should call all middleware in correct order', async () => {
let TestController = class TestController {
getTest(req, res) {
res.send('GET');
}
};
__decorate([
(0, decorators_1.httpGet)('/', spyC),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/', spyB)
], TestController);
server = new server_1.InversifyExpressServer(container);
server.setConfig((app) => {
app.use(spyA);
});
await (0, supertest_1.default)(server.build()).get('/').expect(200, 'GET');
(0, globals_1.expect)(spyA).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyB).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyC).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(result).toBe('abc');
});
(0, globals_1.it)('should resolve controller-level middleware', async () => {
const symbolId = Symbol.for('spyA');
const strId = 'spyB';
let TestController = class TestController {
getTest(req, res) {
res.send('GET');
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/', symbolId, strId)
], TestController);
container.bind(symbolId).toConstantValue(spyA);
container.bind(strId).toConstantValue(spyB);
server = new server_1.InversifyExpressServer(container);
const agent = (0, supertest_1.default)(server.build());
await agent.get('/').expect(200, 'GET');
(0, globals_1.expect)(spyA).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyB).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(result).toBe('ab');
});
(0, globals_1.it)('should resolve method-level middleware', async () => {
const symbolId = Symbol.for('spyA');
const strId = 'spyB';
let TestController = class TestController {
getTest(req, res) {
res.send('GET');
}
};
__decorate([
(0, decorators_1.httpGet)('/', symbolId, strId),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
container.bind(symbolId).toConstantValue(spyA);
container.bind(strId).toConstantValue(spyB);
server = new server_1.InversifyExpressServer(container);
const agent = (0, supertest_1.default)(server.build());
await agent.get('/').expect(200, 'GET');
(0, globals_1.expect)(spyA).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyB).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(result).toBe('ab');
});
(0, globals_1.it)('should compose controller- and method-level middleware', async () => {
const symbolId = Symbol.for('spyA');
const strId = 'spyB';
let TestController = class TestController {
getTest(req, res) {
res.send('GET');
}
};
__decorate([
(0, decorators_1.httpGet)('/', strId),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/', symbolId)
], TestController);
container.bind(symbolId).toConstantValue(spyA);
container.bind(strId).toConstantValue(spyB);
server = new server_1.InversifyExpressServer(container);
const agent = (0, supertest_1.default)(server.build());
await agent.get('/').expect(200, 'GET');
(0, globals_1.expect)(spyA).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(spyB).toHaveBeenCalledTimes(1);
(0, globals_1.expect)(result).toBe('ab');
});
});
(0, globals_1.describe)('Parameters:', () => {
(0, globals_1.it)('should bind a method parameter to the url parameter of the web request', async () => {
let TestController = class TestController {
getTest(id, req, res) {
return id;
}
};
__decorate([
(0, decorators_1.httpGet)(':id'),
__param(0, (0, decorators_1.requestParam)('id')),
__metadata("design:type", Function),
__metadata("design:paramtypes", [String, Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build()).get('/foo').expect(200, 'foo');
});
(0, globals_1.it)('should bind a method parameter to the request object', async () => {
let TestController = class TestController {
getTest(req) {
return req.params['id'];
}
};
__decorate([
(0, decorators_1.httpGet)(':id'),
__param(0, (0, decorators_1.request)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build()).get('/GET').expect(200, 'GET');
});
(0, globals_1.it)('should bind a method parameter to the response object', async () => {
let TestController = class TestController {
getTest(res) {
return res.send('foo');
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__param(0, (0, decorators_1.response)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build()).get('/').expect(200, 'foo');
});
(0, globals_1.it)('should bind a method parameter to a query parameter', async () => {
let TestController = class TestController {
getTest(id) {
return id;
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__param(0, (0, decorators_1.queryParam)('id')),
__metadata("design:type", Function),
__metadata("design:paramtypes", [String]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build())
.get('/')
.query('id=foo')
.expect(200, 'foo');
});
(0, globals_1.it)('should bind a method parameter to the request body', async () => {
let TestController = class TestController {
getTest(reqBody) {
return reqBody;
}
};
__decorate([
(0, decorators_1.httpPost)('/'),
__param(0, (0, decorators_1.requestBody)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [String]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
const body = { foo: 'bar' };
server.setConfig((app) => {
app.use((0, express_1.json)());
});
await (0, supertest_1.default)(server.build()).post('/').send(body).expect(200, body);
});
(0, globals_1.it)('should bind a method parameter to the request headers', async () => {
let TestController = class TestController {
getTest(headers) {
return headers;
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__param(0, (0, decorators_1.requestHeaders)('testhead')),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build())
.get('/')
.set('TestHead', 'foo')
.expect(200, 'foo');
});
(0, globals_1.it)('should be case insensitive to request headers', async () => {
let TestController = class TestController {
getTest(headers) {
return headers;
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__param(0, (0, decorators_1.requestHeaders)('TestHead')),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build())
.get('/')
.set('TestHead', 'foo')
.expect(200, 'foo');
});
(0, globals_1.it)('should bind a method parameter to a cookie', async () => {
let TestController = class TestController {
getCookie(cookie, req, res) {
return cookie;
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__param(0, (0, decorators_1.cookies)('Cookie')),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object, Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getCookie", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
server.setConfig((app) => {
app.use((0, cookie_parser_1.default)());
});
await (0, supertest_1.default)(server.build())
.get('/')
.set('Cookie', 'Cookie=hey')
.expect(200, 'hey');
});
(0, globals_1.it)('should bind a method parameter to the next function', async () => {
let TestController = class TestController {
getTest(nextFunc) {
return nextFunc();
}
getResult() {
return 'foo';
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__param(0, (0, decorators_1.next)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Function]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getTest", null);
__decorate([
(0, decorators_1.httpGet)('/'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], TestController.prototype, "getResult", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build()).get('/').expect(200, 'foo');
});
(0, globals_1.it)('should bind a method parameter to a principal with null (empty) details when no AuthProvider is set.', async () => {
let TestController = class TestController {
getPrincipalTest(userPrincipal) {
return userPrincipal.details;
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__param(0, (0, decorators_1.principal)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getPrincipalTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
server = new server_1.InversifyExpressServer(container);
await (0, supertest_1.default)(server.build()).get('/').expect(200, '');
});
(0, globals_1.it)('should bind a method parameter to a principal with valid details when an AuthProvider is set.', async () => {
let TestController = class TestController {
getPrincipalTest(userPrincipal) {
return userPrincipal.details;
}
};
__decorate([
(0, decorators_1.httpGet)('/'),
__param(0, (0, decorators_1.principal)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], TestController.prototype, "getPrincipalTest", null);
TestController = __decorate([
(0, decorators_1.controller)('/')
], TestController);
let CustomAuthProvider = class CustomAuthProvider {
async getUser(req, res, nextFunc) {
return Promise.resolve({
details: 'something',
isAuthenticated: async () => Promise.resolve(true),
isInRole: async () => Promise.resolve(true),
isResourceOwner: async () => Promise.resolve(true),
});
}
};
CustomAuthProvider = __decorate([
(0, inversify_1.injectable)()
], CustomAuthProvider);
server = new server_1.InversifyExpressServer(container, null, null, null, CustomAuthProvider);
await (0, supertest_1.default)(server.build()).get('/').expect(200, 'something');
});
});
});
//# sourceMappingURL=server.test.js.map