crud test controller and class validator mocker generate classes

This commit is contained in:
IDONTSUDO 2023-12-19 21:10:58 +03:00
parent 6c85616c99
commit 9617d313a1
24 changed files with 242 additions and 108 deletions

View 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;
}
}

View file

@ -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 {

View file

@ -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);
};

View file

@ -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();
};