From bfa969df43bd10de06ae3bc29f7d7707df853d77 Mon Sep 17 00:00:00 2001 From: Olivier Bagot Date: Tue, 13 Jan 2026 16:31:36 +0100 Subject: [PATCH] fix: Change connector boot status to be available at boot (#1641) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * fix: connector boot status available by default * fix: connector boot status available by default * chore: add unit tests to getBootConnectorStatus * fix: refine connector boot status logic based on reviewer feedback - Restore charging station and connector availability checks - Only restore previous status when transaction is in progress (transactionStarted === true) - Add isChargingStationAvailable() method to test factory - Add comprehensive tests for all scenarios including: - Charging station/connector unavailable - Transaction in progress (restore previous status) - Boot status from template - Default to Available Addresses review feedback from PR #1641 about properly handling: - Station/connector availability - Conditional previous status restoration - Transaction state considerations * refactor: remove redundant comments from getBootConnectorStatus --------- Co-authored-by: Jérôme Benoit Co-authored-by: Jérôme Benoit --- src/charging-station/Helpers.ts | 25 ++++----- tests/ChargingStationFactory.ts | 3 ++ tests/charging-station/Helpers.test.ts | 73 ++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 15 deletions(-) diff --git a/src/charging-station/Helpers.ts b/src/charging-station/Helpers.ts index bd354879..9e766e6a 100644 --- a/src/charging-station/Helpers.ts +++ b/src/charging-station/Helpers.ts @@ -294,24 +294,19 @@ export const getBootConnectorStatus = ( connectorId: number, connectorStatus: ConnectorStatus ): ConnectorStatusEnum => { - let connectorBootStatus: ConnectorStatusEnum if ( - connectorStatus.status == null && - (!chargingStation.isChargingStationAvailable() || - !chargingStation.isConnectorAvailable(connectorId)) + !chargingStation.isChargingStationAvailable() || + !chargingStation.isConnectorAvailable(connectorId) ) { - connectorBootStatus = ConnectorStatusEnum.Unavailable - } else if (connectorStatus.status == null && connectorStatus.bootStatus != null) { - // Set boot status in template at startup - connectorBootStatus = connectorStatus.bootStatus - } else if (connectorStatus.status != null) { - // Set previous status at startup - connectorBootStatus = connectorStatus.status - } else { - // Set default status - connectorBootStatus = ConnectorStatusEnum.Available + return ConnectorStatusEnum.Unavailable + } + if (connectorStatus.transactionStarted === true && connectorStatus.status != null) { + return connectorStatus.status + } + if (connectorStatus.bootStatus != null) { + return connectorStatus.bootStatus } - return connectorBootStatus + return ConnectorStatusEnum.Available } export const checkTemplate = ( diff --git a/tests/ChargingStationFactory.ts b/tests/ChargingStationFactory.ts index accdc49f..8df2dacd 100644 --- a/tests/ChargingStationFactory.ts +++ b/tests/ChargingStationFactory.ts @@ -156,6 +156,9 @@ export function createChargingStation (options: ChargingStationOptions = {}): Ch chargingStation.bootNotificationResponse?.status === RegistrationStatusEnumType.ACCEPTED ) }, + isChargingStationAvailable: (): boolean => { + return chargingStation.getConnectorStatus(0)?.availability === AvailabilityType.Operative + }, isConnectorAvailable: (connectorId: number) => { return ( connectorId > 0 && diff --git a/tests/charging-station/Helpers.test.ts b/tests/charging-station/Helpers.test.ts index 451fa65a..2689d1d0 100644 --- a/tests/charging-station/Helpers.test.ts +++ b/tests/charging-station/Helpers.test.ts @@ -8,6 +8,7 @@ import { checkConfiguration, checkStationInfoConnectorStatus, checkTemplate, + getBootConnectorStatus, getChargingStationId, getHashId, getMaxNumberOfEvses, @@ -16,6 +17,7 @@ import { } from '../../src/charging-station/Helpers.js' import { BaseError } from '../../src/exception/index.js' import { + AvailabilityType, type ChargingStationConfiguration, type ChargingStationInfo, type ChargingStationTemplate, @@ -397,4 +399,75 @@ await describe('Helpers test suite', async () => { expect(warnMock.mock.calls.length).toBe(1) expect(connectorStatus.status).toBeUndefined() }) + + await it('Verify getBootConnectorStatus() - default to Available when no bootStatus', () => { + const chargingStation = createChargingStation({ baseName, connectorsCount: 2 }) + const connectorStatus = {} as ConnectorStatus + expect(getBootConnectorStatus(chargingStation, 1, connectorStatus)).toBe( + ConnectorStatusEnum.Available + ) + }) + + await it('Verify getBootConnectorStatus() - use bootStatus from template', () => { + const chargingStation = createChargingStation({ baseName, connectorsCount: 2 }) + const connectorStatus = { + bootStatus: ConnectorStatusEnum.Unavailable, + } as ConnectorStatus + expect(getBootConnectorStatus(chargingStation, 1, connectorStatus)).toBe( + ConnectorStatusEnum.Unavailable + ) + }) + + await it('Verify getBootConnectorStatus() - charging station unavailable overrides bootStatus', () => { + const chargingStation = createChargingStation({ + baseName, + connectorDefaults: { availability: AvailabilityType.Inoperative }, + connectorsCount: 2, + }) + const connectorStatus = { + bootStatus: ConnectorStatusEnum.Available, + } as ConnectorStatus + expect(getBootConnectorStatus(chargingStation, 1, connectorStatus)).toBe( + ConnectorStatusEnum.Unavailable + ) + }) + + await it('Verify getBootConnectorStatus() - connector unavailable overrides bootStatus', () => { + const chargingStation = createChargingStation({ + baseName, + connectorDefaults: { availability: AvailabilityType.Inoperative }, + connectorsCount: 2, + }) + const connectorStatus = { + availability: AvailabilityType.Inoperative, + bootStatus: ConnectorStatusEnum.Available, + } as ConnectorStatus + expect(getBootConnectorStatus(chargingStation, 1, connectorStatus)).toBe( + ConnectorStatusEnum.Unavailable + ) + }) + + await it('Verify getBootConnectorStatus() - transaction in progress restores previous status', () => { + const chargingStation = createChargingStation({ baseName, connectorsCount: 2 }) + const connectorStatus = { + bootStatus: ConnectorStatusEnum.Available, + status: ConnectorStatusEnum.Charging, + transactionStarted: true, + } as ConnectorStatus + expect(getBootConnectorStatus(chargingStation, 1, connectorStatus)).toBe( + ConnectorStatusEnum.Charging + ) + }) + + await it('Verify getBootConnectorStatus() - no transaction uses bootStatus over previous status', () => { + const chargingStation = createChargingStation({ baseName, connectorsCount: 2 }) + const connectorStatus = { + bootStatus: ConnectorStatusEnum.Available, + status: ConnectorStatusEnum.Charging, + transactionStarted: false, + } as ConnectorStatus + expect(getBootConnectorStatus(chargingStation, 1, connectorStatus)).toBe( + ConnectorStatusEnum.Available + ) + }) }) -- 2.43.0