diff --git a/tests/integration/database/base_model.spec.ts b/tests/integration/database/base_model.spec.ts index 90714d6..2263f72 100644 --- a/tests/integration/database/base_model.spec.ts +++ b/tests/integration/database/base_model.spec.ts @@ -82,10 +82,11 @@ describe('BaseModel (integration)', () => { }) it('countDocuments returns correct count', async () => { - const col = db.collection('test_base') + const col = db.collection('test_count') await col.insertMany([{ x: 1 }, { x: 2 }, { x: 3 }]) const count = await col.countDocuments({}) expect(count).toBe(3) + await col.drop() }) it('pagination works with skip and limit', async () => { diff --git a/tests/unit/services/cwmp/configuration_evaluation_state.spec.ts b/tests/unit/services/cwmp/configuration_evaluation_state.spec.ts index 47adf00..2849719 100644 --- a/tests/unit/services/cwmp/configuration_evaluation_state.spec.ts +++ b/tests/unit/services/cwmp/configuration_evaluation_state.spec.ts @@ -28,7 +28,12 @@ vi.mock('../../../../app/services/configuration_engine.js', () => ({ }, })) -import { ConfigurationEvaluationState } from '../../../../app/services/cwmp/configuration_evaluation_state.js' +// Mock provisioning code +vi.mock('../../../../app/utils/provisioning_code.js', () => ({ + buildProvisioningCode: () => 'test-prov-code-123', +})) + +import { ConfigurationEvaluationState, ComplianceUpdateState } from '../../../../app/services/cwmp/configuration_evaluation_state.js' import { Device } from '../../../../app/domain/device/device.js' import { DeviceId } from '../../../../app/domain/device/device_id.js' import { CWMPTaskQueue } from '../../../../app/services/cwmp/task_queue.js' @@ -118,3 +123,73 @@ describe('ConfigurationEvaluationState - full happy path', () => { expect(r4.nextState!.name).toBe('compliance-update') }) }) + +describe('ComplianceUpdateState', () => { + it('has name "compliance-update"', () => { + const engineResult = { + configuration: { identifier: 'cfg-1', policy: 'maintain' }, + inventoryPaths: [], + parameterDiffs: [], + firmwareMigrationPath: [], + skipFirmware: false, + isAlreadyCompliant: true, + } + const state = new ComplianceUpdateState(engineResult as any) + expect(state.name).toBe('compliance-update') + }) + + it('first call writes provisioning code and returns SPV', async () => { + const engineResult = { + configuration: { identifier: 'cfg-1', policy: 'maintain' }, + inventoryPaths: [], + parameterDiffs: [], + firmwareMigrationPath: [], + skipFirmware: false, + isAlreadyCompliant: true, + } + const state = new ComplianceUpdateState(engineResult as any) + const context = makeContext('supported') + const result = await state.handle(context) + // Should write provisioning code via SPV + expect(result.response).toContain('SetParameterValues') + expect(result.response).toContain('ProvisioningCode') + }) + + it('second call transitions to executing-commands', async () => { + const engineResult = { + configuration: { identifier: 'cfg-1', policy: 'maintain' }, + inventoryPaths: [], + parameterDiffs: [], + firmwareMigrationPath: [], + skipFirmware: false, + isAlreadyCompliant: true, + } + const state = new ComplianceUpdateState(engineResult as any) + const context = makeContext('supported') + + // First call: writes provisioning code + await state.handle(context) + + // Second call: transitions to executing-commands + context.message = { success: true, data: { Status: 0 } } + const result2 = await state.handle(context) + expect(result2.nextState).toBeDefined() + expect(result2.nextState!.name).toBe('executing-commands') + }) + + it('without configuration transitions directly to executing-commands', async () => { + const engineResult = { + configuration: null, + inventoryPaths: [], + parameterDiffs: [], + firmwareMigrationPath: [], + skipFirmware: false, + isAlreadyCompliant: true, + } + const state = new ComplianceUpdateState(engineResult as any) + const context = makeContext('supported') + const result = await state.handle(context) + expect(result.nextState).toBeDefined() + expect(result.nextState!.name).toBe('executing-commands') + }) +})