@tsed/platform-test-sdk
Version:
Package to test platform adapter integration with Ts.ED
120 lines (119 loc) • 3.95 kB
JavaScript
import { __decorate, __metadata, __param } from "tslib";
import { promisify } from "node:util";
import { Constant, Controller } from "@tsed/di";
import { NotFound } from "@tsed/exceptions";
import { Req } from "@tsed/platform-http";
import { PlatformTest } from "@tsed/platform-http/testing";
import { BodyParams, Session } from "@tsed/platform-params";
import { Allow, Email, Get, Ignore, MinLength, Post, Property, Required, Returns } from "@tsed/schema";
import SuperTest from "supertest";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
export class UserCreation {
}
__decorate([
Property(),
__metadata("design:type", String)
], UserCreation.prototype, "name", void 0);
__decorate([
Required(),
Email(),
Allow(null),
__metadata("design:type", String)
], UserCreation.prototype, "email", void 0);
__decorate([
Required(),
MinLength(6),
Allow(null),
__metadata("design:type", String)
], UserCreation.prototype, "password", void 0);
export class User extends UserCreation {
}
__decorate([
Ignore(),
__metadata("design:type", String)
], User.prototype, "password", void 0);
let SessionCtrl = class SessionCtrl {
connect(session, user) {
session.user = user;
return Promise.resolve(user);
}
userInfo(user) {
if (!user) {
return Promise.reject(new NotFound("User not found"));
}
return Promise.resolve(user);
}
logout(req) {
switch (this.platformName) {
case "koa":
return Promise.resolve((req.ctx.session = null));
case "express":
delete req.session.user;
return promisify(req.session.destroy.bind(req.session))();
}
return Promise.resolve();
}
};
__decorate([
Constant("PLATFORM_NAME"),
__metadata("design:type", String)
], SessionCtrl.prototype, "platformName", void 0);
__decorate([
Post("/connect"),
__param(0, Session()),
__param(1, BodyParams()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, UserCreation]),
__metadata("design:returntype", void 0)
], SessionCtrl.prototype, "connect", null);
__decorate([
Get("/userinfo"),
Returns(200, User),
__param(0, Session("user")),
__metadata("design:type", Function),
__metadata("design:paramtypes", [User]),
__metadata("design:returntype", Promise)
], SessionCtrl.prototype, "userInfo", null);
__decorate([
Get("/logout"),
Returns(204),
__param(0, Req()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], SessionCtrl.prototype, "logout", null);
SessionCtrl = __decorate([
Controller("/session")
], SessionCtrl);
export { SessionCtrl };
export function testSession(options) {
let request;
beforeAll(PlatformTest.bootstrap(options.server, {
...options,
mount: {
"/rest": [SessionCtrl]
}
}));
beforeAll(() => {
request = SuperTest.agent(PlatformTest.callback());
});
afterAll(PlatformTest.reset);
describe("Scenario1: POST /rest/session/connected", () => {
it("should keep connected user in session and destroy session", async () => {
await request.get("/rest/session/userinfo").expect(404);
await request.post("/rest/session/connect").send({
name: "name",
email: "test@test.fr",
password: "password1234"
});
// @ts-ignore
const response = await request.get("/rest/session/userinfo").expect(200);
expect(response.body).toEqual({
email: "test@test.fr",
name: "name"
});
await request.get("/rest/session/logout").expect(204);
await request.get("/rest/session/userinfo").expect(404);
});
});
}