matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
86 lines • 4.35 kB
JavaScript
import { describe, expect, it } from 'vitest';
import { MessageContext } from '../../../../roborockCommunication/models/index.js';
import { asType, mkUser } from '../../../helpers/testUtils.js';
describe('MessageContext', () => {
it('constructs and exposes endpoint, nonce and serializeNonce hex', () => {
const ctx = new MessageContext(mkUser());
expect(ctx.getEndpoint()).toBeDefined();
expect(typeof ctx.nonce).toBe('number');
const hex = ctx.getSerializeNonceAsHex();
expect(hex).toMatch(/^[0-9A-F]+$/);
});
it('registerDevice, updateNonce and getters', () => {
const ctx = new MessageContext(mkUser());
ctx.registerDevice('d1', 'lk', '1.0', 5);
expect(ctx.getLocalKey('d1')).toBe('lk');
expect(ctx.getLocalProtocolVersion('d1')).toBe('1.0');
expect(ctx.getDeviceNonce('d1')).toBe(5);
ctx.updateNonce('d1', 42);
expect(ctx.getDeviceNonce('d1')).toBe(42);
expect(ctx.getLocalKey('no')).toBeUndefined();
});
it('updateNonce should not throw for non-existent device', () => {
const ctx = new MessageContext(mkUser());
expect(() => {
ctx.updateNonce('nonexistent', 100);
}).not.toThrow();
expect(ctx.getDeviceNonce('nonexistent')).toBeUndefined();
});
it('constructor throws when userdata is missing required fields', () => {
expect(() => new MessageContext(asType({}))).toThrow();
expect(() => new MessageContext(asType(undefined))).toThrow();
});
it('updateProtocolVersion handles non-existent and existing devices', () => {
const ctx = new MessageContext(mkUser());
// should not throw for non-existent device
expect(() => ctx.updateLocalProtocolVersion('no', '2.0')).not.toThrow();
expect(ctx.getLocalProtocolVersion('no')).toBeUndefined();
// register and then update
ctx.registerDevice('d2', 'lk2', '1.0', 0);
expect(ctx.getLocalProtocolVersion('d2')).toBe('1.0');
ctx.updateLocalProtocolVersion('d2', '2.0');
expect(ctx.getLocalProtocolVersion('d2')).toBe('2.0');
});
it('re-registering a device replaces stored values', () => {
const ctx = new MessageContext(mkUser());
ctx.registerDevice('d3', 'lkA', '1.0', 1);
expect(ctx.getLocalKey('d3')).toBe('lkA');
ctx.registerDevice('d3', 'lkB', '2.0', 2);
expect(ctx.getLocalKey('d3')).toBe('lkB');
expect(ctx.getLocalProtocolVersion('d3')).toBe('2.0');
expect(ctx.getDeviceNonce('d3')).toBe(2);
});
it('should return undefined for all getters on non-existent device', () => {
const ctx = new MessageContext(mkUser());
expect(ctx.getLocalKey('missing')).toBeUndefined();
expect(ctx.getLocalProtocolVersion('missing')).toBeUndefined();
expect(ctx.getDeviceNonce('missing')).toBeUndefined();
});
it('updateMQTTProtocolVersion should update version for existing device', () => {
const ctx = new MessageContext(mkUser());
ctx.registerDevice('d1', 'lk', '1.0', 5);
expect(ctx.getMQTTProtocolVersion('d1')).toBe('1.0');
ctx.updateMQTTProtocolVersion('d1', '3.0');
expect(ctx.getMQTTProtocolVersion('d1')).toBe('3.0');
});
it('updateMQTTProtocolVersion should not throw for non-existent device', () => {
const ctx = new MessageContext(mkUser());
expect(() => ctx.updateMQTTProtocolVersion('nonexistent', '2.0')).not.toThrow();
expect(ctx.getMQTTProtocolVersion('nonexistent')).toBeUndefined();
});
it('getMQTTProtocolVersion should return undefined for non-existent device', () => {
const ctx = new MessageContext(mkUser());
expect(ctx.getMQTTProtocolVersion('missing')).toBeUndefined();
});
it('unregisterAllDevices should clear all registered devices', () => {
const ctx = new MessageContext(mkUser());
ctx.registerDevice('d1', 'lk1', '1.0', 1);
ctx.registerDevice('d2', 'lk2', '1.0', 2);
expect(ctx.getLocalKey('d1')).toBe('lk1');
expect(ctx.getLocalKey('d2')).toBe('lk2');
ctx.unregisterAllDevices();
expect(ctx.getLocalKey('d1')).toBeUndefined();
expect(ctx.getLocalKey('d2')).toBeUndefined();
});
});
//# sourceMappingURL=messageContext.test.js.map