]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
fix: Change connector boot status to be available at boot (#1641)
authorOlivier Bagot <olivier.bagot@sap.com>
Tue, 13 Jan 2026 15:31:36 +0000 (16:31 +0100)
committerGitHub <noreply@github.com>
Tue, 13 Jan 2026 15:31:36 +0000 (15:31 +0000)
* 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 <jerome.benoit@sap.com>
Co-authored-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/charging-station/Helpers.ts
tests/ChargingStationFactory.ts
tests/charging-station/Helpers.test.ts

index bd3548792048be752f4a749bcf1d550db523a8ce..9e766e6ae9ad961fae66209c1ac10e7a2005d0d7 100644 (file)
@@ -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 = (
index accdc49fc6b045c19d286cd7af29ade6e08b52bc..8df2dacd4c42be06c0f88fbfd8caef0b6d17abba 100644 (file)
@@ -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 &&
index 451fa65ae53c192c2fc2361c414392c7502225be..2689d1d07387d822a4466f28097f870731eb2d2a 100644 (file)
@@ -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
+    )
+  })
 })