UNPKG

@tsed/platform-test-sdk

Version:
120 lines (119 loc) 3.95 kB
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); }); }); }