crud test controller and class validator mocker generate classes
This commit is contained in:
parent
6c85616c99
commit
9617d313a1
24 changed files with 242 additions and 108 deletions
49
server/test/controllers/crud_controller_test.ts
Normal file
49
server/test/controllers/crud_controller_test.ts
Normal file
|
@ -0,0 +1,49 @@
|
|||
import { CrudController } from "../../src/core/controllers/crud_controller";
|
||||
import { ClassValidatorMocker } from "../../src/core/helpers/class_validator_mocker";
|
||||
import { HttpRepository } from "../../src/core/repository/http_repository";
|
||||
|
||||
function instanceOfObjectAndHaveId(s: any): string {
|
||||
if (s instanceof Object && "id" in s) {
|
||||
return s.id;
|
||||
}
|
||||
if (s instanceof Object && "_id" in s) {
|
||||
return s._id;
|
||||
}
|
||||
throw Error(`${s} is not instance object or not have property _id`);
|
||||
}
|
||||
|
||||
export class CrudControllerTest {
|
||||
controllerTest: CrudController<any, any>;
|
||||
httpRepository: HttpRepository;
|
||||
|
||||
constructor(port: number, controller: CrudController<any, any>) {
|
||||
this.controllerTest = controller;
|
||||
this.httpRepository = new HttpRepository(`http://localhost:${port}`);
|
||||
}
|
||||
|
||||
async call() {
|
||||
let result = false;
|
||||
const mockModel = ClassValidatorMocker.create<any>(this.controllerTest.validationModel);
|
||||
const postRequestBody = await this.httpRepository.jsonRequest(this.controllerTest.mainURL, "POST", mockModel);
|
||||
|
||||
await postRequestBody.map(async (s) => {
|
||||
const id = instanceOfObjectAndHaveId(s);
|
||||
const getRequestBody = await this.httpRepository.jsonRequest(this.controllerTest.mainURL, "GET");
|
||||
await getRequestBody.map(async (el) => {
|
||||
if (el instanceof Array) {
|
||||
const firstElement = el.firstElement();
|
||||
const mockModelUpdate = ClassValidatorMocker.create<any>(this.controllerTest.validationModel);
|
||||
Object.assign(firstElement, mockModelUpdate);
|
||||
delete firstElement.__v;
|
||||
const putReqBody = await this.httpRepository.jsonRequest(this.controllerTest.mainURL, "PUT", firstElement);
|
||||
await putReqBody.map(async () => {
|
||||
(await this.httpRepository.jsonRequest(this.controllerTest.mainURL + "?id=" + id, "DELETE")).map(() => {
|
||||
result = true;
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -2,9 +2,12 @@ import mongoose from "mongoose";
|
|||
import { delay } from "../../src/core/helpers/delay";
|
||||
import { Result } from "../../src/core/helpers/result";
|
||||
import { TypedEvent } from "../../src/core/helpers/typed_event";
|
||||
import { DropDataBaseUseCase } from "../../src/core/usecases/drop_database_usecase";
|
||||
import { ExitAppUseCase } from "../../src/core/usecases/exit_app_usecase";
|
||||
|
||||
export const before = async () => {
|
||||
await mongoose.connection.dropDatabase();
|
||||
new DropDataBaseUseCase().call();
|
||||
new ExitAppUseCase().call();
|
||||
};
|
||||
|
||||
export class TestCore {
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
import { Type } from "class-transformer";
|
||||
import { ClassValidatorMocker } from "../../src/core/helpers/class_validator_mocket";
|
||||
import { IsString, IsNumber, IsBoolean, IsUUID, IsMongoId, ValidateNested } from "class-validator";
|
||||
|
||||
class Foo {}
|
||||
class MyClass {
|
||||
@ValidateNested()
|
||||
@Type(() => Foo)
|
||||
model: Foo;
|
||||
|
||||
@IsNumber()
|
||||
numberProperty: number;
|
||||
|
||||
@IsBoolean()
|
||||
booleanProperty: boolean;
|
||||
|
||||
@IsUUID()
|
||||
uuidProperty: string;
|
||||
}
|
||||
|
||||
const myClassDataMock = ClassValidatorMocker.create<MyClass>(MyClass);
|
||||
|
||||
export const mainTest = () => {
|
||||
console.log(myClassDataMock);
|
||||
};
|
|
@ -13,10 +13,12 @@ import { ReadDataBaseModelUseCaseTest } from "./usecases/read_database_model_use
|
|||
import { UpdateDataBaseModelUseCaseTest } from "./usecases/update_database_model_usecase";
|
||||
import { PaginationDataBaseModelUseCaseTest } from "./usecases/pagination_database_model_usecase_test";
|
||||
import { extensions } from "../src/core/extensions/extensions";
|
||||
import { CrudControllerTest } from "./controllers/crud_controller_test";
|
||||
import { TriggerPresentation } from "../src/features/triggers/triggers_presentation";
|
||||
import { App, Environment, ServerStatus } from "../src/core/controllers/app";
|
||||
import { httpRoutes } from "../src/core/controllers/routes";
|
||||
import { DataBaseConnectUseCase } from "../src/core/usecases/database_connect_usecase";
|
||||
|
||||
extensions();
|
||||
|
||||
const testCore = TestCore.instance;
|
||||
export const dirname__: string = dirname(__filename);
|
||||
export const assert = testCore.assert;
|
||||
|
@ -33,13 +35,13 @@ const init = async () => {
|
|||
await new DataBaseConnectUseCase().call();
|
||||
};
|
||||
|
||||
const test = async () => {
|
||||
const unitTest = async () => {
|
||||
await init();
|
||||
await new ExecutorProgramServiceTest(dirname__).test();
|
||||
await new FilesChangerTest(dirname__).test();
|
||||
await new StackServiceTest(dirname__ + "/context/").test();
|
||||
await new TriggerServiceTest().test();
|
||||
await new CreateDataBaseModelUseCaseTest().test();
|
||||
|
||||
await new CreateDataBaseModelUseCaseTest().test();
|
||||
await new DeleteDataBaseModelUseCaseTest().test();
|
||||
await new ReadDataBaseModelUseCaseTest().test();
|
||||
|
@ -48,11 +50,35 @@ const test = async () => {
|
|||
for await (const usecase of tests) {
|
||||
testCore.assert(await new usecase().test(), usecase.name);
|
||||
}
|
||||
|
||||
};
|
||||
const presentationCrudControllers = [new TriggerPresentation()];
|
||||
const e2eTest = async () => {
|
||||
const app = new App(httpRoutes, [], Environment.E2E_TEST);
|
||||
app.listen();
|
||||
await new Promise((resolve, reject) => {
|
||||
app.on(async (e) => {
|
||||
if (e === ServerStatus.finished) {
|
||||
for await (const el of presentationCrudControllers) {
|
||||
testCore.assert(await new CrudControllerTest(app.port, el).call(), el.constructor.name);
|
||||
}
|
||||
resolve(e);
|
||||
}
|
||||
if (e === ServerStatus.error) {
|
||||
console.log(e);
|
||||
reject(e);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
const main = async () => {
|
||||
await init();
|
||||
await test();
|
||||
extensions();
|
||||
if (process.env.NODE_ENV === "unit") {
|
||||
await unitTest();
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV === "e2e") {
|
||||
await e2eTest();
|
||||
}
|
||||
await testCore.testResult();
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue