await it('Should throw error when OCPPRequestService.requestHandler is not mocked', async () => {
const station = createChargingStation({ connectorsCount: 1 })
- await expect(
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
- (station as any).ocppRequestService.requestHandler()
- ).rejects.toThrow(
+ await expect(station.ocppRequestService.requestHandler()).rejects.toThrow(
'ocppRequestService.requestHandler not mocked. Define in createChargingStation options.'
)
})
const station = createChargingStation({ connectorsCount: 1 })
expect(() => {
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
- ;(station as any).ocppIncomingRequestService.stop()
+ station.ocppIncomingRequestService.stop()
}).toThrow(
'ocppIncomingRequestService.stop not mocked. Define in createChargingStation options.'
)
},
})
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
- const result = await (station as any).ocppRequestService.requestHandler()
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
+ const result = (await station.ocppRequestService.requestHandler()) as { success: boolean }
expect(result.success).toBe(true)
})
},
})
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
- ;(station as any).ocppIncomingRequestService.stop()
+ station.ocppIncomingRequestService.stop()
expect(stopCalled).toBe(true)
})
await it('Should throw error when OCPPRequestService.sendError is not mocked', async () => {
const station = createChargingStation({ connectorsCount: 1 })
- await expect(
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
- (station as any).ocppRequestService.sendError()
- ).rejects.toThrow(
+ await expect(station.ocppRequestService.sendError()).rejects.toThrow(
'ocppRequestService.sendError not mocked. Define in createChargingStation options.'
)
})
await it('Should throw error when OCPPRequestService.sendResponse is not mocked', async () => {
const station = createChargingStation({ connectorsCount: 1 })
- await expect(
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
- (station as any).ocppRequestService.sendResponse()
- ).rejects.toThrow(
+ await expect(station.ocppRequestService.sendResponse()).rejects.toThrow(
'ocppRequestService.sendResponse not mocked. Define in createChargingStation options.'
)
})
},
})
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
- const result = await (station as any).ocppRequestService.sendError()
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
+ const result = (await station.ocppRequestService.sendError()) as { error: string }
expect(result.error).toBe('test-error')
})
},
})
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
- const result = await (station as any).ocppRequestService.sendResponse()
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
+ const result = (await station.ocppRequestService.sendResponse()) as { response: string }
expect(result.response).toBe('test-response')
})
await it('Should throw error when OCPPIncomingRequestService.incomingRequestHandler is not mocked', async () => {
const station = createChargingStation({ connectorsCount: 1 })
- await expect(
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
- (station as any).ocppIncomingRequestService.incomingRequestHandler()
- ).rejects.toThrow(
+ await expect(station.ocppIncomingRequestService.incomingRequestHandler()).rejects.toThrow(
'ocppIncomingRequestService.incomingRequestHandler not mocked. Define in createChargingStation options.'
)
})
},
})
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
- const result = await (station as any).ocppIncomingRequestService.incomingRequestHandler()
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
+ const result = (await station.ocppIncomingRequestService.incomingRequestHandler()) as {
+ handled: boolean
+ }
expect(result.handled).toBe(true)
})
})
heartbeatInterval?: number
ocppConfiguration?: ChargingStationConfiguration
/** Custom OCPP incoming request service for test mocking */
- ocppIncomingRequestService?: unknown
+ ocppIncomingRequestService?: Partial<MockOCPPIncomingRequestService>
/** Custom OCPP request service for test mocking */
- ocppRequestService?: unknown
+ ocppRequestService?: Partial<MockOCPPRequestService>
started?: boolean
starting?: boolean
stationInfo?: Partial<ChargingStationInfo>
websocketPingInterval?: number
}
+/**
+ * Mock OCPP incoming request service interface for testing
+ * Provides typed access to mock handlers without eslint-disable comments
+ */
+export interface MockOCPPIncomingRequestService {
+ incomingRequestHandler: () => Promise<unknown>
+ stop: () => void
+}
+
+/**
+ * Mock OCPP request service interface for testing
+ * Provides typed access to mock handlers without eslint-disable comments
+ */
+export interface MockOCPPRequestService {
+ requestHandler: () => Promise<unknown>
+ sendError: () => Promise<unknown>
+ sendResponse: () => Promise<unknown>
+}
+
+/**
+ * Test-specific ChargingStation interface exposing mock services
+ * Allows typed access to mock OCPP services in tests
+ */
+export interface TestChargingStation extends ChargingStation {
+ ocppIncomingRequestService: MockOCPPIncomingRequestService
+ ocppRequestService: MockOCPPRequestService
+}
+
const CHARGING_STATION_BASE_NAME = 'CS-TEST'
/**
* Creates a ChargingStation instance for tests
* @param options - Configuration options for the charging station
- * @returns ChargingStation instance configured for testing
+ * @returns TestChargingStation instance configured for testing
*/
-export function createChargingStation (options: ChargingStationOptions = {}): ChargingStation {
+export function createChargingStation (options: ChargingStationOptions = {}): TestChargingStation {
const baseName = options.baseName ?? CHARGING_STATION_BASE_NAME
const templateIndex = 1
const connectionTimeout = options.connectionTimeout ?? Constants.DEFAULT_CONNECTION_TIMEOUT
],
...options.ocppConfiguration,
},
- ocppIncomingRequestService: options.ocppIncomingRequestService ?? {
+ ocppIncomingRequestService: {
incomingRequestHandler: async () => {
return await Promise.reject(
new Error(
'ocppIncomingRequestService.stop not mocked. Define in createChargingStation options.'
)
},
+ ...options.ocppIncomingRequestService,
},
- ocppRequestService: options.ocppRequestService ?? {
+ ocppRequestService: {
requestHandler: async () => {
return await Promise.reject(
new Error(
)
)
},
+ ...options.ocppRequestService,
},
restartHeartbeat: (): void => {
/* no-op for tests */
stopTxUpdatedInterval: (_connectorId: number): void => {
/* no-op for tests */
},
- } as unknown as ChargingStation
+ } as unknown as TestChargingStation
return chargingStation
}
import { expect } from '@std/expect'
import { describe, it } from 'node:test'
+import type { ChargingStationOcppConfiguration } from '../../src/types/index.js'
+
import {
addConfigurationKey,
deleteConfigurationKey,
await describe('getConfigurationKey()', async () => {
await it('should return undefined when configurationKey array is missing', () => {
const cs = createChargingStation()
- // remove array
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment
- cs.ocppConfiguration = {} as any
+ // Simulate missing configurationKey array
+ cs.ocppConfiguration = {} as Partial<ChargingStationOcppConfiguration>
expect(getConfigurationKey(cs, TEST_KEY_1)).toBeUndefined()
})
await describe('addConfigurationKey()', async () => {
await it('should no-op when configurationKey array missing', () => {
const cs = createChargingStation()
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment
- cs.ocppConfiguration = {} as any
+ // Simulate missing configurationKey array
+ cs.ocppConfiguration = {} as Partial<ChargingStationOcppConfiguration>
addConfigurationKey(cs, TEST_KEY_1, VALUE_A)
expect(getConfigurationKey(cs, TEST_KEY_1)).toBeUndefined()
})
await it('should return undefined without logging when configurationKey array missing', t => {
const cs = createChargingStation()
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment
- cs.ocppConfiguration = {} as any
+ // Simulate missing configurationKey array
+ cs.ocppConfiguration = {} as Partial<ChargingStationOcppConfiguration>
const errorMock = t.mock.method(logger, 'error')
const res = setConfigurationKeyValue(cs, TEST_KEY_1, VALUE_A)
expect(res).toBeUndefined()
await describe('deleteConfigurationKey()', async () => {
await it('should return undefined when configurationKey array missing', () => {
const cs = createChargingStation()
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment
- cs.ocppConfiguration = {} as any
+ // Simulate missing configurationKey array
+ cs.ocppConfiguration = {} as Partial<ChargingStationOcppConfiguration>
const res = deleteConfigurationKey(cs, TEST_KEY_1)
expect(res).toBeUndefined()
})