@tsed/platform-test-sdk
Version:
Package to test platform adapter integration with Ts.ED
199 lines (198 loc) • 7.16 kB
JavaScript
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();
});
});
}