Jérôme Benoit [Tue, 3 Mar 2026 19:49:46 +0000 (20:49 +0100)]
test(ocpp): add OCPPServiceUtils connector status management tests
Add tests for sendAndSetConnectorStatus and restoreConnectorStatus
functions covering StatusNotification sending, connector status updates,
event emission, and reservation-based status restoration.
Jérôme Benoit [Tue, 3 Mar 2026 18:38:07 +0000 (19:38 +0100)]
test(ocpp): add OCPPServiceUtils pure function tests
Test getMessageTypeString, ajvErrorsToErrorType,
convertDateToISOString, isConnectorIdValid — 19 tests
covering the shared base layer with zero mocking.
Jérôme Benoit [Tue, 3 Mar 2026 18:09:09 +0000 (19:09 +0100)]
fix: quote test glob so /bin/sh delegates to Node
The shell /bin/sh does not support recursive ** globs.
Only 18/65 test files were running. Quoting the
pattern lets Node resolve it, running all 65 files.
* feat(ocpp2): implement TriggerMessage/UnlockConnector handlers and Reset hardening
- Implement TriggerMessage handler (F06): supports BootNotification,
Heartbeat, and StatusNotification triggers with EVSE targeting
- Implement UnlockConnector handler (F05): full spec compliance with
Unlocked, UnlockFailed, OngoingAuthorizedTransaction, UnknownConnector
response statuses
- Add AllowReset variable check and firmware update blocking to Reset handler
- Add 4 missing schema validations for certificate commands
- Add TriggerMessage/UnlockConnector schema validator configs
- Document RFC 6960 DER encoding deviation in computeCertificateHash
* refactor(ocpp2): eliminate unsafe type casts in handlers and VariableManager
- Add private toHandler() helper in OCPP20IncomingRequestService that concentrates
the single 'as unknown as IncomingRequestHandler' cast with documentation comment
- Replace 13 per-binding casts in constructor with this.toHandler() calls
- Remove 15 'as unknown as StandardParametersKey' casts from OCPP20VariableManager —
string is already a member of ConfigurationKeyType, no cast needed
- Remove now-unused import of StandardParametersKey from OCPP20VariableManager
* feat(ocpp2): expose TriggerMessage and UnlockConnector handlers in testable interface
* fix(ocpp2): add AJV strict:false and schema validation unit tests (T21)
- Set strict:false in all three AJV constructors (IncomingRequest, Request,
Response) to allow OCPP 2.0 schemas that use additionalItems without
array items (a draft-07 pattern AJV 8 strict mode rejects at compile time)
- Replace integration-style schema tests (blocked by tsx path resolution)
with direct AJV schema unit tests: load schemas from src/assets directly,
compile with AJV, verify invalid payloads are rejected — 15 tests pass
* fix(ocpp2): correct registry key separator in isComponentValid (T5-bugfix)
The `#validComponentNames` set was built using split('/') but registry keys
use '::' as separator (e.g. 'AlignedDataCtrlr::Available'). This caused the
set to contain full keys like 'AlignedDataCtrlr::Available' instead of just
component names like 'AlignedDataCtrlr', making isComponentValid return false
for all components and causing UnknownComponent responses for all Set/GetVariables.
Also update the EVSE test to assert UnknownVariable (not UnknownComponent) since
EVSE is a valid component in the registry but AuthorizeRemoteStart is not one of
its variables.
* fix(ocpp2): resolve tsc type errors in UUIDv4 cast, override modifier, and mock cast (F1)
* fix(ocpp2): add try/catch to TriggerMessage and UnlockConnector handlers, add integration test
- Add try/catch blocks to handleRequestTriggerMessage and
handleRequestUnlockConnector following the handleRequestReset
golden pattern with structured error responses
- Add 4th integration test: SetVariables on unknown component
returns rejected, GetVariables confirms unknown component
* fix(ocpp2): address PR review findings — remove dead code, consolidate types, fix test mock
- TriggerMessage: reject BootNotification trigger when last boot was
already Accepted per F06.FR.17 (returns Rejected + NotEnabled)
- UnlockConnector: check transaction on the specific target connector
instead of all EVSE connectors per F05.FR.02
- Add 3 new tests covering both spec requirements
- Fix withTimeout timer leak: clear setTimeout when promise resolves first
- readMessageLimits: replace empty catch with logger.debug diagnostic
- handleResponseTransactionEvent: add TODO noting log-only is intentional,
future work should act on idTokenInfo.status and chargingPriority
* style: fix jsdoc warnings in OCPP 2.0 handlers and tests
Add missing @returns tags and @param descriptions to satisfy
jsdoc/require-returns and jsdoc/require-param-description ESLint rules.
Replace empty JSDoc blocks with minimal valid documentation to satisfy
jsdoc/require-jsdoc rule. Achieves 0 lint warnings matching main branch
baseline.
* fix(types): reduce tsc errors to zero and fix all lint warnings
Eliminate all TypeScript compiler errors across src/ and test files by
fixing type mismatches, adding missing type annotations, and correcting
union type handling. Fix remaining ESLint issues including no-base-to-string
in ChargingProfile id extraction and jsdoc/tag-lines formatting.
* fix(ocpp2): fix AllowReset dead code, evseId===0 routing, and EVSE-scoped connector lookup
- AllowReset check now resolves via OCPP20VariableManager (runtime value) instead of static registry defaultValue
- Reset handler evseId===0 now routes to full station reset instead of EVSE-specific path
- TriggerMessage StatusNotification uses EVSE-scoped connector lookup instead of global getConnectorStatus
* ci: add typecheck step (tsc --noEmit --skipLibCheck) to CI pipeline
esbuild does not surface type errors at build time, so this catches
regressions before build+test. Runs on ubuntu/node-22 alongside lint.
* fix(ocpp2): remove DiagnosticsStatusNotification from MessageTriggerEnumType
This value is OCPP 1.6 only and not part of the OCPP 2.0.1 spec
(absent from TriggerMessageRequest.json schema).
* docs(readme): align OCPP 2.0.x section with spec and actual code
- Fix section letters to match OCPP 2.0.1 spec (A→B, B→C, C→G, etc.)
- Reorder sections to match spec block order (B,C,D,E,F,G,L,M,P)
- Add missing implemented commands: TriggerMessage, UnlockConnector,
Get15118EVCertificate, GetCertificateStatus
- Move GetVariables/SetVariables from Monitoring to B. Provisioning
- Replace stale 'variables not implemented' note with actual support listing
CALLRESULT payloads were not validated against JSON schemas for
CertificateSigned, DeleteCertificate, GetInstalledCertificateIds,
GetVariables, InstallCertificate, Reset, and SetVariables.
All schema files already existed; only the validator map registration
was missing. Aligns OCPP 2.0 with OCPP 1.6 which validates all
incoming request responses (17/17).
Remove ~135 paraphrase/over-comments from OCPP 2.0 source files that
described what the next line obviously does. Keeps spec references
(C11.FR.04, F06.FR.17, OCPP 2.0.1 §2.10), TODO annotations, RFC 6960
deviation notes, eslint-disable directives, and terse comments matching
the existing OCPP 1.6 style. Test @file/@description headers preserved
per test style guide.
* [autofix.ci] apply automated fixes
* fix(ocpp2): correct spec references and harmonize format
- Fix wrong FR code: F03.FR.09 (triggerReason) → F03.FR.04 (meter
values in TransactionEvent Ended)
- Harmonize FR comment format to 'X00.FR.00: description' style
- Harmonize section references to § symbol (was mixed Section/§)
- Harmonize RFC references to 'RFC 6960 §4.1.1' (was missing §)
* fix(ocpp): remove redundant strict:false from AJV instances
keywords: ['javaType'] already declares the custom keyword, making
strict:false unnecessary. Removing it enables AJV strict mode (default
since v7), which will flag any future non-standard schema keywords
instead of silently ignoring them.
* fix(types): make MeterValuesRequest/Response version-agnostic union types
Remove versioned OCPP16MeterValue import and casts from ChargingStation.ts,
following the established pattern of using union types outside the OCPP stack.
* fix(types): remove versioned type imports from Helpers.ts
Add ChargingSchedule union type, replace satisfies with version-agnostic
BootNotificationRequest, and rename getOCPP16ChargingSchedule to
getSingleChargingSchedule with union return type.
Jérôme Benoit [Mon, 2 Mar 2026 14:36:12 +0000 (15:36 +0100)]
refactor(test): audit-driven test quality improvements
- Add edge case tests for BaseError, OCPPError, ElectricUtils, AsyncLock, StatisticUtils
- Replace real timers with withMockTimers in UIServerSecurity rate limiter tests
- Add 'Date' to MockableTimerAPI type for Date.now() mocking support
- Factor duplicated OCPP 2.0 beforeEach into createOCPP20RequestTestContext factory
- Remove verbose 29-line JSDoc block in Utils.test.ts
Jérôme Benoit [Sun, 1 Mar 2026 23:04:02 +0000 (00:04 +0100)]
fix(tests): use inline type exports to fix Windows ESM compatibility
Consolidate separate 'export type' and 'export' re-exports into single
export block with inline 'type' keyword. This ensures proper ESM module
resolution on Windows where Node.js strictly validates named exports.
Reverts the workaround of splitting imports in OCPP20TestUtils.ts since
the root cause (improper re-export pattern) is now fixed at source.
Jérôme Benoit [Sun, 1 Mar 2026 22:56:10 +0000 (23:56 +0100)]
fix(tests): separate type import for Windows ESM compatibility
Split mixed import to use 'import type' for MockChargingStation type.
Windows Node.js ESM module resolution strictly enforces that type-only
exports cannot be imported as values in mixed import statements.
Jérôme Benoit [Sun, 1 Mar 2026 22:40:35 +0000 (23:40 +0100)]
refactor(test): consolidate certificate constants and factory functions
- Create OCPP20CertificateTestData.ts with shared certificate constants
- Add createMockCertificateHashData, createMockCertificateHashDataChain,
createMockOCSPRequestData factory functions to OCPP20TestUtils.ts
- Migrate 5 test files to use consolidated imports
- Remove duplicate local certificate definitions and factory functions
Jérôme Benoit [Sun, 1 Mar 2026 22:24:35 +0000 (23:24 +0100)]
refactor(test): remove duplicate MockChargingStation interface from MockFactories
- Delete unused MockChargingStation interface (duplicate of StationHelpers.ts)
- Delete unused createMockAuthChargingStation factory function
- Keep createMockAuthServiceTestStation which is actively used (34 calls)
Jérôme Benoit [Sun, 1 Mar 2026 21:38:38 +0000 (22:38 +0100)]
refactor(test): harmonize test file headers and fix async patterns
- Remove copyright headers from test files (align with JSDoc-only)
- Replace copyright with JSDoc headers in helper/constant files
- Fix AsyncLock.test.ts Promise anti-pattern (proper async/await)
- Add magic number constants to ChargingStationTestConstants.ts
- Fix semantic duplication with TEST_ONE_HOUR_SECONDS
Jérôme Benoit [Sun, 1 Mar 2026 12:23:57 +0000 (13:23 +0100)]
fix(test): investigate Windows CI hang (#1694)
* fix(test): add --test-force-exit to prevent Windows CI hang
Windows CI was hanging after test completion due to Node.js's handling of
stdout/stderr on Windows. On Windows, stdio uses Named Pipes (Sockets) that
remain 'ref'd' and keep the event loop alive, unlike Unix where file
descriptors are auto-unref'd.
The --test-force-exit flag is the official Node.js solution for this
Windows-specific behavior (see Node.js issue #49925).
Also fixes:
- createMockAuthorizationResult signature to accept only overrides parameter
- Remove setImmediate from mock.timers in Reset test (not needed)
* fix(test): wrap multiple describe blocks in parent for --test-force-exit compatibility
Node.js test runner with --test-force-exit has issues with multiple top-level
await describe() blocks. Wrapping both 'Error Recovery and Resilience' and
'Message Buffering' describe blocks in a parent 'ChargingStation Resilience'
describe block fixes the 'Promise resolution is still pending' errors.
* fix(test): wrap OCPP20 test describe blocks for --test-force-exit compatibility
Same fix as ChargingStation-Resilience.test.ts - wrapping multiple top-level
await describe() blocks in a parent describe block to fix Windows CI hang.
* fix(tests): add missing deleteIdTags method to MockIdTagsCache
The MockIdTagsCache mock was missing the deleteIdTags() method that exists
on the real IdTagsCache class. This caused ClearCache tests to fail when
the method was called during test execution.
* fix(tests): improve test isolation for OCPP 2.0 tests
- Add ocppConfiguration with configurationKey to GetBaseReport test setup
so ConfigurationInventory reports have data to return
- Add ocppConfiguration with HeartbeatInterval and WebSocketPingInterval
to VariableManager test setup for proper isolation
- Fix MessageTimeout test expectations to use seconds (OCPP 2.0 unit)
instead of milliseconds (station.getConnectionTimeout())
These changes ensure tests pass when run individually or in any order,
which is required for --test-force-exit on Windows.
* refactor(tests): use constants instead of hardcoded values in GetBaseReport test
Replace hardcoded '60' and '30' values with proper constant references:
- HeartbeatInterval: millisecondsToSeconds(Constants.DEFAULT_HEARTBEAT_INTERVAL)
- MeterValueSampleInterval: millisecondsToSeconds(Constants.DEFAULT_METER_VALUES_INTERVAL)
This follows the single source of truth principle from TEST_STYLE_GUIDE.md
and maintains consistency with OCPP20VariableManager.test.ts.
* docs(tests): document Windows CI constraints and --test-force-exit
Add section 5 'Platform-Specific Considerations' to TEST_STYLE_GUIDE.md:
- Explain why --test-force-exit is needed (Windows Named Pipes behavior)
- Document single top-level describe block requirement
- Update section numbers and summary accordingly
This documents the root cause and solution for the Windows CI hang issue.
Jérôme Benoit [Sun, 1 Mar 2026 01:08:26 +0000 (02:08 +0100)]
fix(test): remove redundant standardCleanup() from nested afterEach
UIHttpServer and OCPP20AuthAdapter tests had nested describes with
afterEach blocks calling standardCleanup(), duplicating the outer
afterEach cleanup. This could cause mock.restoreAll() to be called
twice per test, potentially causing issues on Windows.
Jérôme Benoit [Sun, 1 Mar 2026 01:05:37 +0000 (02:05 +0100)]
fix(test): remove redundant nested afterEach in Reset test causing Windows hang
The Reset test had nested describes (B11, B12) with their own afterEach
calling standardCleanup(), plus an outer afterEach calling mock.timers.reset()
then standardCleanup(). This caused mock.restoreAll() to be called twice
per test with timer reset in between - leaving MockTracker in inconsistent
state on Windows.
Also harmonize StationHelpers cleanup to use '= undefined' consistently
instead of mixing with 'delete'.
Jérôme Benoit [Sat, 28 Feb 2026 23:59:52 +0000 (00:59 +0100)]
fix(tests): restore ping() method and cleanup wsPingSetInterval
Fixes Windows CI hang caused by:
- Missing wsPingSetInterval cleanup in cleanupChargingStation()
- Removed ping()/pong() methods that ChargingStation.ts still calls
The WebSocket ping interval was never cleared during test cleanup,
keeping the Node.js event loop alive indefinitely on Windows.
Jérôme Benoit [Sat, 28 Feb 2026 23:54:34 +0000 (00:54 +0100)]
fix(tests): remove unused mock imports after cleanup refactor
Removed ', mock' from imports in 31 test files where mock.restoreAll()
was previously removed but the import remained, causing ESLint
'no-unused-vars' errors.
Jérôme Benoit [Sat, 28 Feb 2026 21:43:04 +0000 (22:43 +0100)]
docs(tests): update TEST_STYLE_GUIDE to reflect current utilities
- Remove duplicate createMockChargingStation entries
- Replace waitForCondition with waitForChargingStationState
- Update import examples to match current exports
Jérôme Benoit [Sat, 28 Feb 2026 21:16:52 +0000 (22:16 +0100)]
refactor(tests): consolidate MockUIService classes and remove redundant subclass
- Replace MockUIServiceBroadcast, MockUIServiceError, MockUIServiceNonBroadcast
with single createMockUIService(MockUIServiceMode) factory
- Remove redundant MockWebSocket subclass from UIServerTestUtils.ts
- Re-export createUIProtocolMock as createMockUIWebSocket for UI testing
- Update UIWebSocketServer.test.ts to use new factories
- Migrate createMockOCPP16Identifier to createMockIdentifier
- Migrate createMockOCPP20Identifier to createMockIdentifier
- Delete deprecated functions from MockFactories.ts
- Fix import order in LocalAuthStrategy.test.ts
- Extract createMockCertificateManager to OCPP20TestUtils.ts (was duplicated 4x)
- Consolidate 5 createMock*AuthorizationResult into single parameterized factory
- Add createMockIdentifier with OCPP version parameter (deprecate version-specific ones)
- Remove unused wrapper functions from certificate test files
Reduces code duplication and improves maintainability.
Jérôme Benoit [Sat, 28 Feb 2026 20:04:10 +0000 (21:04 +0100)]
docs(tests): update TEST_STYLE_GUIDE to reference new factory
- Updated TEST_STYLE_GUIDE.md to use createMockChargingStation
- Fixed comment in ChargingStationTestUtils.ts
- Removed references to deleted ChargingStationFactory.ts
Jérôme Benoit [Sat, 28 Feb 2026 20:02:51 +0000 (21:02 +0100)]
refactor(tests): fix TypeScript errors in auth and variable manager tests
- Fixed OCPPAuthIntegration.test.ts to use createMockChargingStation with destructuring
- Corrected import path in AuthComponentFactory.test.ts (../../../../ → ../../../)
- Fixed OCPP20VariableManager.test.ts type errors by properly extracting .station property
- All 291 tests passing
- Zero migration-related TypeScript compilation errors
Jérôme Benoit [Sat, 28 Feb 2026 19:54:21 +0000 (20:54 +0100)]
refactor(tests): delete deprecated ChargingStationFactory and fix remaining imports
- Deleted ChargingStationFactory.ts and ChargingStationFactory.test.ts
- Fixed broken imports in 3 utility test files (ConfigurationKeyUtils, Helpers, ErrorUtils)
- Migrated remaining createChargingStation() calls to createMockChargingStation()
- Added createMockChargingStationTemplate() support in StationHelpers
- All 291 tests passing
Jérôme Benoit [Sat, 28 Feb 2026 19:34:22 +0000 (20:34 +0100)]
refactor(tests): migrate all test files to createMockChargingStation
- Migrated 20 OCPP 2.0 test files to use createMockChargingStation
- Migrated 4 utility test files to use consolidated imports
- Added createChargingStation and createChargingStationTemplate re-exports to ChargingStationTestUtils
- All 291 tests passing
Jérôme Benoit [Sat, 28 Feb 2026 17:43:48 +0000 (18:43 +0100)]
refactor(tests): standardize cleanup and strict equality
- Migrate 15 test files to use standardCleanup() from TestLifecycleHelpers
- Replace all 27 .toEqual() with .toStrictEqual() across 10 files
- Fix import path in OCPP20CertificateManager.test.ts
This completes P0 (cleanup standardization) and P1 (strict equality)
from the test audit. All 291 tests pass.
Jérôme Benoit [Sat, 28 Feb 2026 17:13:24 +0000 (18:13 +0100)]
fix(test-isolation): make OCPP20VariableManager tests self-contained
- FileTransferProtocols: init config key via getVariables first
- OrganizationName: set value explicitly instead of relying on previous test
Each test initializes its own state via fresh mockChargingStation from beforeEach.
Fixes Windows CI failure caused by test execution order assumptions.
Jérôme Benoit [Sat, 28 Feb 2026 17:05:27 +0000 (18:05 +0100)]
refactor(tests): move mock creation from it() to beforeEach()
- Refactor OCPPAuthServiceImpl.test.ts: declare mocks at describe level, initialize in beforeEach()
- Refactor OCPPAuthServiceFactory.test.ts: same pattern for consistency
- Refactor InMemoryAuthCache.test.ts: move common mockResult to beforeEach()
Aligns with TEST_STYLE_GUIDE.md recommendation for test isolation pattern.
Jérôme Benoit [Sat, 28 Feb 2026 16:41:55 +0000 (17:41 +0100)]
refactor(tests): harmonize test suite structure and eliminate duplication
- Consolidate 5 TransactionEvent variant files into single parameterized test
- Reduce OCPPAuthIntegration.test.ts scope (422→196 lines, focus on integration)
- Remove duplicate resetConnectorTransactionStates function, use shared utility
- Merge OCPP20AuthAdapter-Offline.test.ts into main adapter test file
- Add beforeEach hooks for mock initialization in ChargingStation tests
- Standardize OCPP requirement codes in describe blocks (I02-I04, G03)
- Consolidate eslint-disable comments with explanatory reasons
- Fix JSDoc header positions in OCPP 2.0 test files
- Use standardCleanup() for consistent timer mock reset
Net reduction: ~400 lines of test code while maintaining full coverage
Jérôme Benoit [Sat, 28 Feb 2026 16:08:14 +0000 (17:08 +0100)]
fix(test-type-safety): remove unsafe type casts and add factory helper
Phase 1 (Type Safety):
- Remove 16 'undefined as unknown as' casts from 8 auth test files
- Add createStationWithCertificateManager() helper to OCPP20TestUtils
- Migrate 3 certificate test files to use the new type-safe helper
Phase 2 (Enhancements):
- Add explanatory comments to 9 ESLint override directives
- Update TEST_STYLE_GUIDE.md with new factory documentation
Jérôme Benoit [Sat, 28 Feb 2026 15:36:56 +0000 (16:36 +0100)]
fix(test-isolation): move mock creation to beforeEach in CableFirst test
- Move mockChargingStation initialization from module level to beforeEach()
- Declare mockChargingStation as let at describe scope per TEST_STYLE_GUIDE.md
- Ensures each test receives fresh mock instances
- Fixes CRITICAL test isolation violation per test audit
- All 12 tests in E02 - Cable-First Transaction Flow pass
Jérôme Benoit [Sat, 28 Feb 2026 14:06:42 +0000 (15:06 +0100)]
refactor(tests): remove eslint-disable and fix type safety issues
- Remove file-level eslint-disable comments from OCPP 2.0 transaction tests
- Replace `as any` casts with proper TypeScript types (ChargingStation, SentRequest)
- Fix test isolation by moving state reset to beforeEach hooks
- Use `stationInfo = undefined` pattern instead of delete with any cast
- Remove unnecessary async keywords and optional chains per lint rules
Jérôme Benoit [Sat, 28 Feb 2026 13:09:50 +0000 (14:09 +0100)]
refactor(tests): remove file-level eslint-disable and fix as any casts
- Remove blanket eslint-disable comments from OCPP 2.0 test files
- Fix improper 'as any' casts in afterEach cleanup (use union types)
- Add targeted inline eslint-disable-next-line for legitimate test cases
(testing null/undefined inputs for edge case validation)
Jérôme Benoit [Fri, 27 Feb 2026 22:54:59 +0000 (23:54 +0100)]
refactor(tests): improve test isolation and remove dead code
- Fix module-level state sharing in 6 OCPP 2.0 RequestService tests
- Remove unused createMockTemplate function from StationHelpers
- Remove unused TestStationHelper, TestTimerHelper, TestEnvironmentHelper classes (206 LOC)
- Add createMockAuthCache and createMockOCPPAdapter factories
- Update TEST_STYLE_GUIDE.md with test isolation best practices
- Clean up orphaned imports after dead code removal
Jérôme Benoit [Fri, 27 Feb 2026 22:31:29 +0000 (23:31 +0100)]
refactor(tests): add testable interface to eliminate eslint-disable comments
- Add TestableOCPP20RequestService interface and factory function
- Remove file-level eslint-disable from 3 OCPP20RequestService test files
- Use type assertions instead of generic type parameters for type safety
- Follows TEST_STYLE_GUIDE.md recommendation for testable interfaces
Jérôme Benoit [Fri, 27 Feb 2026 22:14:12 +0000 (23:14 +0100)]
test: add afterEach cleanup to all test files
Add afterEach with mock.restoreAll() to 27 test files.
Ensures 100% coverage for mock cleanup (63/63 files).
Prevents test pollution between test runs.
Follows TEST_STYLE_GUIDE.md standards.
Jérôme Benoit [Fri, 27 Feb 2026 22:03:44 +0000 (23:03 +0100)]
test: harmonize test names and add mock factories
- Replace 164 'should verify' patterns with descriptive test names
- Add createLoggerMocks() and createConsoleMocks() to TestLifecycleHelpers
- Add afterEach cleanup to ErrorUtils, WorkerUtils, ConfigurationUtils tests
- Align all test names with TEST_STYLE_GUIDE.md conventions
Jérôme Benoit [Fri, 27 Feb 2026 20:05:21 +0000 (21:05 +0100)]
fix(tests): bind method reference in ClearCache test
- Use .bind() for deleteIdTags method reference (line 89)
- Ensures proper 'this' context when method is restored and called
- Reduces lint errors from 41 to 40 (1 error fixed)
- All 291 tests still passing
Jérôme Benoit [Fri, 27 Feb 2026 20:03:12 +0000 (21:03 +0100)]
fix(tests): remove non-null assertions in InstallCertificate test
- Replace stationInfo! with stationInfo (safe - always initialized)
- Lines 188 and 203 in OCPP20IncomingRequestService-InstallCertificate.test.ts
- Reduces lint errors from 43 to 41 (2 errors fixed)
- All 291 tests still passing
Jérôme Benoit [Fri, 27 Feb 2026 20:00:20 +0000 (21:00 +0100)]
chore(tests): remove unused imports and variables
- Remove AvailabilityType from ChargingStation-Connectors.test.ts
- Remove ChargingStationConfiguration from StationHelpers.ts
- Remove minimalChargingStation variable from GetBaseReport.test.ts
- Remove OCPP20GetVariableDataType from SetVariables.test.ts
- Remove 3 unused imports from NotifyReport.test.ts
- Reduces lint errors from 50 to 43 (7 errors fixed)
- All 291 tests still passing
Jérôme Benoit [Fri, 27 Feb 2026 19:49:18 +0000 (20:49 +0100)]
chore(tests): auto-fix lint errors (sorting and unused imports)
- Fix export ordering in ChargingStationTestUtils.ts
- Fix object property sorting in OCPPAuthIntegration.test.ts
- Reduces lint errors from 61 to 50 (11 auto-fixed)
- All 291 tests still passing
Jérôme Benoit [Fri, 27 Feb 2026 19:17:11 +0000 (20:17 +0100)]
fix(tests): add afterEach cleanup to RemoteStartAuth test
- Added afterEach hook to clear mock references
- Prevents test pollution between test cases
- Only 1 file was missing cleanup (not 33 as initially audited)
- All 280 tests passing
Jérôme Benoit [Fri, 27 Feb 2026 19:07:37 +0000 (20:07 +0100)]
fix(tests): make auth integration tests deterministic
- Removed probabilistic assertion expect(successRate).toBeGreaterThan(50)
- Replaced live integration calls with deterministic mocks
- Used mock patterns from MockFactories.ts throughout
- All 27 auth tests now have explicit 100% pass/fail criteria
- Tests produce consistent results on repeated runs
- Preserved all test scenarios and coverage
Impact:
- Eliminated ~200 'as any' casts across 15 files
- Removed ~50 eslint-disable directives
- Full type safety with IntelliSense support
- All 280 tests passing
Note: 48 lint errors remain (import ordering, unsafe assignments).
Will address in follow-up commit.
Jérôme Benoit [Fri, 27 Feb 2026 18:18:14 +0000 (19:18 +0100)]
refactor(tests): consolidate duplicate test constants
- Delete duplicate OCPP20TestConstants.ts file
- Update all 21 OCPP 2.0 test files to import from canonical ChargingStationTestConstants.js
- All 7 constants verified as available in canonical source:
* TEST_CHARGING_STATION_BASE_NAME
* TEST_CHARGE_POINT_MODEL
* TEST_CHARGE_POINT_SERIAL_NUMBER
* TEST_CHARGE_POINT_VENDOR
* TEST_FIRMWARE_VERSION
* TEST_CONNECTOR_VALID_INSTANCE
* TEST_CONNECTOR_INVALID_INSTANCE
- Test suite passes with 280/280 tests passing
Jérôme Benoit [Fri, 27 Feb 2026 17:44:35 +0000 (18:44 +0100)]
fix(tests): move ocppVersion inside stationInfo in auth mock factory
The mock factory was placing ocppVersion at the root level of the mock
ChargingStation, but AuthComponentFactory.createAdapters() looks for
chargingStation.stationInfo?.ocppVersion, causing all auth service tests
to fail with 'OCPP version not found in charging station' error.
Jérôme Benoit [Fri, 27 Feb 2026 17:03:01 +0000 (18:03 +0100)]
fix(tests): ensure proper test isolation and cleanup
Add afterEach hooks to reset singleton state and clear factory caches
between tests, preventing state leakage across test files.
Changes:
- OCPP20VariableManager.test.ts: Reset runtime overrides after each test
- OCPPAuthServiceFactory.test.ts: Clear all cached instances after each test
- OCPP20IncomingRequestService-SetVariables.test.ts: Reset variable manager
- OCPP20IncomingRequestService-GetVariables.test.ts: Reset variable manager
- OCPP20IncomingRequestService-GetBaseReport.test.ts: Reset variable manager
Verified: All 280 tests pass on consecutive runs (test && test)
Jérôme Benoit [Fri, 27 Feb 2026 16:51:41 +0000 (17:51 +0100)]
refactor(tests): reduce eslint-disable comments with proper typing
- Add MockOCPPRequestService and MockOCPPIncomingRequestService interfaces
- Export TestChargingStation type for typed mock service access
- Remove 14 eslint-disable comments from ChargingStationFactory.test.ts
- Remove 4 eslint-disable comments from ConfigurationKeyUtils.test.ts
- Use Partial<ChargingStationOcppConfiguration> for missing config tests
Remaining 43 inline eslint-disable comments are all legitimate:
- no-empty-function: Testing empty callbacks
- require-await: Mock async implementations
- no-explicit-any: Testing validators with invalid inputs
Jérôme Benoit [Fri, 27 Feb 2026 16:46:22 +0000 (17:46 +0100)]
refactor(tests): consolidate mock station creation utilities
Replaced 17 inline mock station objects in OCPPAuthServiceFactory.test.ts
with calls to createMockAuthServiceTestStation() from MockFactories.ts.
This reduces test file from 327 to 228 lines (~30% reduction) while
maintaining identical test behavior.
Remaining auth adapter tests retain inline mocks due to test-specific
method requirements (inAcceptedState, getLocalAuthListEnabled, etc.)
that are appropriately kept close to their test context.
Jérôme Benoit [Fri, 27 Feb 2026 16:39:10 +0000 (17:39 +0100)]
docs(tests): add file-level JSDoc to test files
Add @file and @description JSDoc comments to all 58 test files
that were missing file-level documentation. Each JSDoc identifies
the module under test and provides a brief description of the
test coverage scope.