Endpoint preparados
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
import { describe, it, beforeEach, mock, after } from "node:test";
|
||||
import assert from "node:assert";
|
||||
import { SimController } from "./Sim.controller.js";
|
||||
import { EventBus } from "sim-shared/domain/EventBus.port.js";
|
||||
import { SimUseCases } from "./Sim.usecases.js";
|
||||
import { ConsumeMessage } from "amqplib";
|
||||
import { postgrClient } from "#config/postgreConfig.js";
|
||||
import { httpInstance } from "#config/httpClient.config.js";
|
||||
import { OrderRepository } from "sim-shared/infrastructure/OrderRepository.js";
|
||||
import { PauseCancelTaskRepository } from "#adapters/PauseCancelTaskRepository.js";
|
||||
import { ObjeniousOperationsRepository } from "sim-shared/infrastructure/ObjeniousOperationRepository.js";
|
||||
|
||||
describe("SimController Integration Tests (Real UseCases)", () => {
|
||||
let eventBusMock: any;
|
||||
let controller: SimController;
|
||||
let useCases: SimUseCases;
|
||||
|
||||
beforeEach(() => {
|
||||
// Mock ONLY the event bus as requested
|
||||
eventBusMock = {
|
||||
publish: mock.fn(),
|
||||
addSubscribers: mock.fn(),
|
||||
consume: mock.fn(),
|
||||
ack: mock.fn(async () => { }),
|
||||
nack: mock.fn(async () => { }),
|
||||
};
|
||||
|
||||
const operationRepository = new ObjeniousOperationsRepository(
|
||||
httpInstance,
|
||||
postgrClient,
|
||||
);
|
||||
const orderRepository = new OrderRepository(postgrClient);
|
||||
const pauseRepository = new PauseCancelTaskRepository(postgrClient);
|
||||
|
||||
useCases = new SimUseCases({
|
||||
httpClient: httpInstance,
|
||||
operationRepository: operationRepository,
|
||||
orderRepository: orderRepository,
|
||||
pauseRepository: pauseRepository
|
||||
});
|
||||
|
||||
controller = new SimController(eventBusMock as unknown as EventBus, useCases);
|
||||
});
|
||||
|
||||
const createMockMsg = (payload: any): ConsumeMessage => {
|
||||
return {
|
||||
content: Buffer.from(JSON.stringify(payload)),
|
||||
fields: {},
|
||||
properties: {
|
||||
headers: {
|
||||
message_id: "test-correlation-id"
|
||||
}
|
||||
},
|
||||
} as unknown as ConsumeMessage;
|
||||
};
|
||||
|
||||
describe("suspend", () => {
|
||||
it("should call stage_suspend and interact with DB and EventBus", async () => {
|
||||
const iccid = "test-iccid-suspend-" + Date.now();
|
||||
const msg = createMockMsg({
|
||||
key: "sim.test.pause",
|
||||
payload: {
|
||||
iccid: iccid
|
||||
},
|
||||
headers: {
|
||||
message_id: "correlation-suspend-" + iccid
|
||||
}
|
||||
});
|
||||
|
||||
const handler = controller.suspend();
|
||||
await handler(msg);
|
||||
|
||||
// Verify that it reached the stage_suspend logic (which adds to pauseRepository)
|
||||
// We can query the DB or check if ACK was called
|
||||
assert.strictEqual(eventBusMock.ack.mock.callCount(), 1, "Message should be ACKed on success");
|
||||
assert.strictEqual(eventBusMock.nack.mock.callCount(), 0, "Message should not be NACKed");
|
||||
});
|
||||
});
|
||||
|
||||
describe("terminate", () => {
|
||||
it("should call stage_terminate and interact with DB and EventBus", async () => {
|
||||
const iccid = "test-iccid-terminate-" + Date.now();
|
||||
const msg = createMockMsg({
|
||||
key: "sim.test.pause",
|
||||
payload: {
|
||||
iccid: iccid
|
||||
},
|
||||
headers: {
|
||||
message_id: "correlation-terminate-" + iccid
|
||||
}
|
||||
});
|
||||
|
||||
const handler = controller.terminate();
|
||||
await handler(msg);
|
||||
|
||||
assert.strictEqual(eventBusMock.ack.mock.callCount(), 1, "Message should be ACKed on success");
|
||||
assert.strictEqual(eventBusMock.nack.mock.callCount(), 0, "Message should not be NACKed");
|
||||
});
|
||||
});
|
||||
|
||||
describe("Error Handling", () => {
|
||||
it("should nack if message is invalid", async () => {
|
||||
const msg = {
|
||||
content: Buffer.from("invalid json"),
|
||||
fields: {},
|
||||
properties: {},
|
||||
} as unknown as ConsumeMessage;
|
||||
const handler = controller.suspend();
|
||||
await assert.rejects(handler(msg), "Error de suspension consumiendo el mensaje no es valido");
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -3,6 +3,7 @@ import { ConsumeMessage } from "amqplib";
|
||||
import { SimUseCases } from "./Sim.usecases.js";
|
||||
import { SimEvents } from "sim-shared/domain/SimEvents.js";
|
||||
import { Result } from "sim-shared/domain/Result.js";
|
||||
import { ActionData } from "#domain/DTOs/objeniousapi.js";
|
||||
|
||||
/**
|
||||
* La clase usa generadores de funciones para mantener el contexto
|
||||
@@ -36,6 +37,7 @@ export class SimController {
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error al decodificar JSON:', error);
|
||||
console.error(Buffer.from(msg.content).toString(("utf8")))
|
||||
// Aquí podrías decidir devolver el string crudo o null
|
||||
return undefined;
|
||||
}
|
||||
@@ -173,14 +175,19 @@ export class SimController {
|
||||
}
|
||||
|
||||
const iccid = msgData.payload.iccid
|
||||
const res = await this.tryUseCase(msg, this.useCases.suspend({
|
||||
const suspendData: ActionData = {
|
||||
correlation_id: msgData.headers?.message_id,
|
||||
dueDate: this.genDueDate(2 * 60).toISOString(),
|
||||
identifier: {
|
||||
identifierType: "ICCID",
|
||||
identifiers: [iccid] // Por algún motivo solo he puesto un iccd por identifier
|
||||
}
|
||||
}))
|
||||
}
|
||||
|
||||
const useCaseRes = await this.tryUseCase(msg, this.useCases.stage_suspend(suspendData))
|
||||
/*
|
||||
const res = await this.tryUseCase(msg, this.useCases.suspend(actionData))
|
||||
*/
|
||||
|
||||
}
|
||||
}
|
||||
@@ -197,16 +204,20 @@ export class SimController {
|
||||
if (msgData == undefined) {
|
||||
return Promise.reject("Mensaje invalido")
|
||||
}
|
||||
|
||||
const iccid = msgData.payload.iccid
|
||||
console.log("Mensaje procesado", msgData)
|
||||
const res = await this.tryUseCase(msg, this.useCases.terminate({
|
||||
const terminateActionData: ActionData = {
|
||||
correlation_id: msgData.headers?.message_id,
|
||||
dueDate: this.genDueDate(2 * 60).toISOString(),
|
||||
identifier: {
|
||||
identifierType: "ICCID",
|
||||
identifiers: [iccid]
|
||||
}
|
||||
}))
|
||||
}
|
||||
|
||||
//const res = await this.tryUseCase(msg, this.useCases.terminate(terminateActionData))
|
||||
const res = await this.tryUseCase(msg, this.useCases.stage_terminate(terminateActionData))
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -95,7 +95,6 @@ export class SimUseCases {
|
||||
error: undefined,
|
||||
data: true
|
||||
}
|
||||
|
||||
} else {
|
||||
return {
|
||||
error: String(response.status),
|
||||
@@ -255,7 +254,7 @@ export class SimUseCases {
|
||||
iccid: suspendData.identifier.identifiers[0],
|
||||
activation_date: new Date(), // TODO: BUSCAR LA DE VERDAD
|
||||
next_check: undefined, // Que se haga instantaneamente al ser la primera
|
||||
operation_type: "terminate"
|
||||
operation_type: "suspend"
|
||||
}
|
||||
|
||||
const taskCreated = await this.pauseRepository.addTask(newTask)
|
||||
|
||||
Reference in New Issue
Block a user