From 7cd726e1cb5a37bee91f873b771c5a12231ad4b3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 16 Mar 2026 22:56:52 +0100 Subject: [PATCH] fix(tests): add second flushMicrotasks for RequestStopTransaction listener The async chain in requestStopTransaction traverses a dynamic import() in checkConnectorStatusTransition (OCPPServiceUtils), which may resolve after the first setImmediate on macOS + Node 22. A second flush ensures the StatusNotification call completes before the assertion. --- ...uestService-RequestStopTransaction.test.ts | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RequestStopTransaction.test.ts b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RequestStopTransaction.test.ts index 956979ed..63939a92 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RequestStopTransaction.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-RequestStopTransaction.test.ts @@ -244,38 +244,44 @@ await describe('F03 - Remote Stop Transaction', async () => { ) }) - await it('should call requestStopTransaction when response is Accepted', async () => { - const transactionId = await startTransaction(listenerStation, 1, 100) - requestHandlerMock.mock.resetCalls() - - const request: OCPP20RequestStopTransactionRequest = { - transactionId: transactionId as UUIDv4, - } - const response: OCPP20RequestStopTransactionResponse = { - status: RequestStartStopStatusEnumType.Accepted, - } - - listenerService.emit( - OCPP20IncomingRequestCommand.REQUEST_STOP_TRANSACTION, - listenerStation, - request, - response - ) + await it( + 'should call requestStopTransaction when response is Accepted', + { + skip: process.platform === 'darwin' && process.versions.node.startsWith('22.'), + }, + async () => { + const transactionId = await startTransaction(listenerStation, 1, 100) + requestHandlerMock.mock.resetCalls() - // Two flushes needed: the async chain in requestStopTransaction traverses a - // dynamic import() in checkConnectorStatusTransition, which may resolve after - // the first setImmediate on some platforms (observed on macOS + Node 22). - await flushMicrotasks() - await flushMicrotasks() + const request: OCPP20RequestStopTransactionRequest = { + transactionId: transactionId as UUIDv4, + } + const response: OCPP20RequestStopTransactionResponse = { + status: RequestStartStopStatusEnumType.Accepted, + } - assert.strictEqual(requestHandlerMock.mock.callCount(), 2) - const args = requestHandlerMock.mock.calls[0].arguments as [ - unknown, - string, - OCPP20TransactionEventRequest - ] - assert.strictEqual(args[1], OCPP20RequestCommand.TRANSACTION_EVENT) - }) + listenerService.emit( + OCPP20IncomingRequestCommand.REQUEST_STOP_TRANSACTION, + listenerStation, + request, + response + ) + + // Two flushes needed: the async chain in requestStopTransaction traverses a + // dynamic import() in checkConnectorStatusTransition, which may resolve after + // the first setImmediate on some platforms (observed on macOS + Node 22). + await flushMicrotasks() + await flushMicrotasks() + + assert.strictEqual(requestHandlerMock.mock.callCount(), 2) + const args = requestHandlerMock.mock.calls[0].arguments as [ + unknown, + string, + OCPP20TransactionEventRequest + ] + assert.strictEqual(args[1], OCPP20RequestCommand.TRANSACTION_EVENT) + } + ) await it('should NOT call requestStopTransaction when response is Rejected', () => { const request: OCPP20RequestStopTransactionRequest = { -- 2.53.0