UNPKG

@tsed/platform-test-sdk

Version:
199 lines (198 loc) 7.16 kB
import { __decorate, __metadata, __param } from "tslib"; import { dirname, join } from "node:path"; import { Controller } from "@tsed/di"; import { MulterOptions, MultipartFile } from "@tsed/platform-http"; import { PlatformTest } from "@tsed/platform-http/testing"; import { BodyParams } from "@tsed/platform-params"; import { CollectionOf, Post, Property, Required, Status } from "@tsed/schema"; import multer from "multer"; import readPkgUp from "read-pkg-up"; import SuperTest from "supertest"; import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; const rootDir = import.meta.dirname; // automatically replaced by import.meta.dirname on build export class Task { } __decorate([ Property(), __metadata("design:type", String) ], Task.prototype, "id", void 0); __decorate([ Property(), __metadata("design:type", String) ], Task.prototype, "title", void 0); export class Event { } __decorate([ Property(), Required(), __metadata("design:type", String) ], Event.prototype, "id", void 0); __decorate([ CollectionOf(Task), __metadata("design:type", Array) ], Event.prototype, "tasks", void 0); const fileFilterStub = vi.fn(); const fileFilter = (req, file, callback) => { fileFilterStub(); callback(null, true); }; function getFileConfig() { return { storage: multer.diskStorage({ destination: (req, _fileItem, cb) => { const path = `${rootDir}/../.tmp`; cb(null, path); } }), fileFilter }; } let TestMulterController = class TestMulterController { uploadWithName(media) { return media.originalname; } uploadWithPayload(media, formId) { return { file: media.originalname, formId }; } uploadWithOptions(media) { return { file: media.originalname }; } uploadTwoFiles(media, media2) { return { file1: media.originalname, file2: media2.originalname }; } }; __decorate([ Post("/scenario-1"), Status(201), MulterOptions({ dest: `${rootDir}/../.tmp` }), __param(0, Required()), __param(0, MultipartFile("media")), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], TestMulterController.prototype, "uploadWithName", null); __decorate([ Post("/scenario-2"), Status(201), MulterOptions({ dest: `${rootDir}/../.tmp` }), __param(0, MultipartFile("media")), __param(1, BodyParams("form_id")), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, String]), __metadata("design:returntype", void 0) ], TestMulterController.prototype, "uploadWithPayload", null); __decorate([ Post("/scenario-3"), Status(201), MulterOptions(getFileConfig()), __param(0, MultipartFile("media")), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], TestMulterController.prototype, "uploadWithOptions", null); __decorate([ Post("/scenario-4"), Status(201), __param(0, MultipartFile("media1")), __param(1, MultipartFile("media2")), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, Object]), __metadata("design:returntype", void 0) ], TestMulterController.prototype, "uploadTwoFiles", null); TestMulterController = __decorate([ Controller("/multer") ], TestMulterController); export { TestMulterController }; export function testMulter(options) { const pkg = readPkgUp.sync({ cwd: import.meta.dirname }); const rootDir = join(dirname(pkg?.path || ""), "src"); beforeAll(PlatformTest.bootstrap(options.server, { ...options, mount: { "/rest": [TestMulterController] } })); beforeAll(() => { }); afterAll(PlatformTest.reset); beforeAll(() => { vi.resetAllMocks(); }); describe("Scenario 1: POST /rest/multer/scenario-1", () => { it("should upload file with multer", async () => { const request = SuperTest(PlatformTest.callback()); const result = await request.post("/rest/multer/scenario-1").attach("media", `${rootDir}/data/file.txt`).expect(201); expect(result.text).toEqual("file.txt"); }); it("should throw an exception when there is no file", async () => { const request = SuperTest(PlatformTest.callback()); const result = await request.post("/rest/multer/scenario-1").expect(400); expect(result.body).toEqual({ name: "REQUIRED_VALIDATION_ERROR", message: "Bad request on parameter \"request.files.media.0\".\nIt should have required parameter 'media.0'", status: 400, errors: [ { dataPath: ".media.0", requestPath: "files", keyword: "required", message: "It should have required parameter 'media.0'", modelName: "files", params: { missingProperty: "media.0" }, schemaPath: "#/required" } ] }); }); }); describe("Scenario 2: POST /rest/multer/scenario-2", () => { it("should upload file with multer", async () => { const request = SuperTest(PlatformTest.callback()); const result = await request .post("/rest/multer/scenario-2") .attach("media", `${rootDir}/data/file.txt`) .field({ form_id: "form_id" }) .expect(201); expect(result.body).toEqual({ file: "file.txt", formId: "form_id" }); }); }); describe("Scenario 3: POST /rest/multer/scenario-3", () => { it("should upload file with multer", async () => { const request = SuperTest(PlatformTest.callback()); const result = await request.post("/rest/multer/scenario-3").attach("media", `${rootDir}/data/file.txt`).field({}).expect(201); expect(result.body).toEqual({ file: "file.txt" }); // filterFilter is called expect(fileFilterStub).toBeCalled(); }); }); describe("Scenario 4: POST /rest/multer/scenario-4", () => { it("should upload two files using multer", async () => { const request = SuperTest(PlatformTest.callback()); const result = await request .post("/rest/multer/scenario-4") .attach("media1", `${rootDir}/data/file.txt`) .attach("media2", `${rootDir}/data/file.txt`) .field({}) .expect(201); expect(result.body).toEqual({ file1: "file.txt", file2: "file.txt" }); // filterFilter is called expect(fileFilterStub).toBeCalled(); }); }); }