matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
123 lines • 8.09 kB
JavaScript
import { RvcOperationalState } from 'matterbridge/matter/clusters';
import { describe, expect, it } from 'vitest';
import { DockStationStatus, DockStationStatusCode } from '../../model/DockStationStatus.js';
import { DockErrorCode } from '../../roborockCommunication/enums/vacuumAndDockErrorCode.js';
const OK = DockStationStatusCode.OK;
const ERR = DockStationStatusCode.Error;
function createDockStatus(overrides = {}) {
return new DockStationStatus(overrides.cleanFluidStatus ?? OK, overrides.waterBoxFilterStatus ?? OK, overrides.dustBagStatus ?? OK, overrides.dirtyWaterBoxStatus ?? OK, overrides.clearWaterBoxStatus ?? OK, overrides.isUpdownWaterReady ?? OK);
}
describe('DockStationStatus', () => {
it('should parse docking station status correctly', () => {
const dss = 2729;
const status = DockStationStatus.parseDockStationStatus(dss);
expect(status.cleanFluidStatus).toBe(2);
expect(status.waterBoxFilterStatus).toBe(2);
expect(status.dustBagStatus).toBe(2);
expect(status.dirtyWaterBoxStatus).toBe(2);
expect(status.clearWaterBoxStatus).toBe(2);
expect(status.isUpdownWaterReady).toBe(1);
});
it('should detect no error when all status fields are OK', () => {
const dss = 168;
const status = DockStationStatus.parseDockStationStatus(dss);
expect(status.hasError()).toBe(false);
});
it('should detect error in any status field', () => {
const status = createDockStatus({ dustBagStatus: ERR });
expect(status.hasError()).toBe(true);
});
it('should return true when isUpdownWaterReady is Error', () => {
const status = createDockStatus({ isUpdownWaterReady: ERR });
expect(status.hasError()).toBe(true);
});
it('should return true when clearWater and isUpdownWaterReady are both Error', () => {
const status = createDockStatus({ clearWaterBoxStatus: ERR, isUpdownWaterReady: ERR });
expect(status.hasError()).toBe(true);
});
it('should return true for dss=2729 when isUpdownWaterReady is Error', () => {
const status = DockStationStatus.parseDockStationStatus(2729);
expect(status.hasError()).toBe(true);
});
it('should handle missing clean water tank status gracefully', () => {
const dss = 164; // Missing clean water tank status
const status = DockStationStatus.parseDockStationStatus(dss);
expect(status.cleanFluidStatus).toBe(DockStationStatusCode.Unknown);
expect(status.waterBoxFilterStatus).toBe(DockStationStatusCode.Unknown);
expect(status.dustBagStatus).toBe(DockStationStatusCode.OK);
expect(status.dirtyWaterBoxStatus).toBe(DockStationStatusCode.OK);
expect(status.clearWaterBoxStatus).toBe(DockStationStatusCode.Error);
expect(status.hasError()).toBe(true);
});
it('should handle missing dirty water box status gracefully', () => {
const dss = 152; // Missing dirty water box status
const status = DockStationStatus.parseDockStationStatus(dss);
expect(status.cleanFluidStatus).toBe(DockStationStatusCode.Unknown);
expect(status.waterBoxFilterStatus).toBe(DockStationStatusCode.Unknown);
expect(status.dustBagStatus).toBe(DockStationStatusCode.OK);
expect(status.dirtyWaterBoxStatus).toBe(DockStationStatusCode.Error);
expect(status.clearWaterBoxStatus).toBe(DockStationStatusCode.OK);
expect(status.hasError()).toBe(true);
});
describe('getMatterOperationalError', () => {
it.each([
['clearWaterBoxStatus', { clearWaterBoxStatus: ERR }, RvcOperationalState.ErrorState.WaterTankEmpty],
['dirtyWaterBoxStatus', { dirtyWaterBoxStatus: ERR }, RvcOperationalState.ErrorState.DirtyWaterTankFull],
['dustBagStatus', { dustBagStatus: ERR }, RvcOperationalState.ErrorState.DustBinMissing],
['cleanFluidStatus', { cleanFluidStatus: ERR }, RvcOperationalState.ErrorState.WaterTankMissing],
['waterBoxFilterStatus', { waterBoxFilterStatus: ERR }, RvcOperationalState.ErrorState.WaterTankMissing],
['isUpdownWaterReady', { isUpdownWaterReady: ERR }, RvcOperationalState.ErrorState.UnableToCompleteOperation],
])('should return expected ErrorState when %s is Error', (_field, overrides, expected) => {
const status = createDockStatus(overrides);
expect(status.getMatterOperationalError()).toBe(expected);
});
it('should return NoError when no errors', () => {
expect(createDockStatus().getMatterOperationalError()).toBe(RvcOperationalState.ErrorState.NoError);
});
it('should return WaterTankEmpty when clearWater and dustBag are both Error', () => {
const status = createDockStatus({ clearWaterBoxStatus: ERR, dustBagStatus: ERR });
expect(status.getMatterOperationalError()).toBe(RvcOperationalState.ErrorState.WaterTankEmpty);
});
it('should return DirtyWaterTankFull when dirtyWater and cleanFluid are both Error', () => {
const status = createDockStatus({ dirtyWaterBoxStatus: ERR, cleanFluidStatus: ERR });
expect(status.getMatterOperationalError()).toBe(RvcOperationalState.ErrorState.DirtyWaterTankFull);
});
it('should return DustBinMissing when dustBag and cleanFluid are both Error', () => {
const status = createDockStatus({ dustBagStatus: ERR, cleanFluidStatus: ERR });
expect(status.getMatterOperationalError()).toBe(RvcOperationalState.ErrorState.DustBinMissing);
});
it('should return WaterTankMissing when filter and cleanFluid are both Error', () => {
const status = createDockStatus({ waterBoxFilterStatus: ERR, cleanFluidStatus: ERR });
expect(status.getMatterOperationalError()).toBe(RvcOperationalState.ErrorState.WaterTankMissing);
});
it('should return UnableToCompleteOperation when only isUpdownWaterReady is Error', () => {
const status = createDockStatus({ isUpdownWaterReady: ERR });
expect(status.getMatterOperationalError()).toBe(RvcOperationalState.ErrorState.UnableToCompleteOperation);
});
it('should return WaterTankEmpty for python-roborock dss=149 fixture', () => {
const status = DockStationStatus.parseDockStationStatus(149);
expect(status.clearWaterBoxStatus).toBe(DockStationStatusCode.Error);
expect(status.dirtyWaterBoxStatus).toBe(DockStationStatusCode.Error);
expect(status.getMatterOperationalError()).toBe(RvcOperationalState.ErrorState.WaterTankEmpty);
});
});
describe('parseDockErrorCode', () => {
it.each([
[DockErrorCode.None, RvcOperationalState.ErrorState.NoError],
[DockErrorCode.NoDustbinOrFilter, RvcOperationalState.ErrorState.DustBinMissing],
[DockErrorCode.AutoEmptyDockFanError, RvcOperationalState.ErrorState.DustBinFull],
[DockErrorCode.AutoEmptyDockVoltageError, RvcOperationalState.ErrorState.UnableToCompleteOperation],
[DockErrorCode.DuctBlockage, RvcOperationalState.ErrorState.DustBinFull],
[DockErrorCode.WaterEmpty, RvcOperationalState.ErrorState.WaterTankEmpty],
[DockErrorCode.WasteWaterTankFull, RvcOperationalState.ErrorState.DirtyWaterTankFull],
[DockErrorCode.CleaningTankFullOrBlocked, RvcOperationalState.ErrorState.DirtyWaterTankFull],
[DockErrorCode.MaintenanceBrushJammed, RvcOperationalState.ErrorState.BrushJammed],
[DockErrorCode.DirtyTankLatchOpen, RvcOperationalState.ErrorState.DirtyWaterTankMissing],
[DockErrorCode.NoDustbin, RvcOperationalState.ErrorState.DustBinMissing],
[999, RvcOperationalState.ErrorState.UnableToCompleteOperation],
])('should map dock error code %i to %s', (code, expected) => {
expect(DockStationStatus.parseDockErrorCode(code)).toBe(expected);
});
});
});
//# sourceMappingURL=DockingStationStatus.test.js.map