import assert from 'node:assert/strict'; import { buildHardwareSmokeCases, loadHardwareSmokeConfig, runHardwareSmoke } from '../dist/devices/hardware-smoke-runner.js'; const config = loadHardwareSmokeConfig({ QIPAI_HARDWARE_SMOKE_ENABLE: 'false', QIPAI_HARDWARE_SMOKE_ALLOW_ACTIONS: 'false', QIPAI_HARDWARE_CONTROL_BOX_DEVICE_ID: 'BOX_001', QIPAI_HARDWARE_SMART_SOCKET_DEVICE_ID: 'SOCKET_001' }); const dryCases = buildHardwareSmokeCases(config); assert.deepEqual(dryCases.map((item) => item.id), [ 'control-box-basic-info', 'smart-socket-work-info' ]); assert.equal(dryCases.every((item) => item.destructive === false), true); const actionCases = buildHardwareSmokeCases({ ...config, allowActions: true, subLockSubId: 'SUB001' }); assert.equal(actionCases.some((item) => item.id === 'control-box-power-slot1-off'), true); assert.equal(actionCases.some((item) => item.id === 'sub-lock-open'), true); assert.equal(actionCases.some((item) => item.id === 'smart-socket-switch-off'), true); assert.equal(actionCases.some((item) => item.destructive), true); const dryRun = await runHardwareSmoke(config, dryCases); assert.equal(dryRun.length, 2); assert.equal(dryRun.every((item) => item.status === 'DRY_RUN'), true); assert.equal(dryRun.every((item) => !String(item.reason).includes('password')), true); const skipped = await runHardwareSmoke(loadHardwareSmokeConfig({}), []); assert.deepEqual(skipped, [{ caseId: 'hardware-smoke-config', status: 'SKIP', reason: 'No DeviceID configured.' }]); console.log('PASS: M06-G hardware smoke runner builds safe dry-run and action matrices.');