Allow easy mocking of stub logger callTransports function to receive the actual message

This commit is contained in:
Tomer committed 2024-09-11 14:06:19 +03:00
1 parent 5b6f176e11
commit de5b9d6235
2 files changed
+22 -38

No files matched your search

+7 -26
View File
@@ -326,47 +326,28 @@ describe('Controller', () => {
});
it('Handle mqtt message', async () => {
class DummyTransport extends Transport {
log(info, callback) {}
}
const transport = new DummyTransport();
logger.setTransportsEnabled(true);
let spyTransport = jest.spyOn(transport, 'log').mockImplementation();
logger.addTransport(transport);
const eventbus = controller.eventBus;
let spyEventbusEmitMQTTMessage = jest.spyOn(eventbus, 'emitMQTTMessage').mockImplementation();
await controller.start();
logger.debug.mockClear();
await MQTT.events.message('dummytopic', 'dummymessage');
expect(spyTransport).toHaveBeenCalledWith(
{level: 'debug', message: "Received MQTT message on 'dummytopic' with data 'dummymessage'", namespace: LOG_MQTT_NS},
expect.any(Function),
);
logger.removeTransport(transport);
logger.setTransportsEnabled(false);
expect(spyEventbusEmitMQTTMessage).toHaveBeenCalledWith({topic: 'dummytopic', message: "dummymessage"});
expect(logger.callTransports).toHaveBeenCalledWith("debug", "Received MQTT message on 'dummytopic' with data 'dummymessage'", LOG_MQTT_NS);
});
it('Skip MQTT messages on topic we published to', async () => {
class DummyTransport extends Transport {
log(info, callback) {}
}
const transport = new DummyTransport();
logger.setTransportsEnabled(true);
let spyTransport = jest.spyOn(transport, 'log').mockImplementation();
logger.addTransport(transport);
const eventbus = controller.eventBus;
let spyEventbusEmitMQTTMessage = jest.spyOn(eventbus, 'emitMQTTMessage').mockImplementation();
await controller.start();
logger.debug.mockClear();
await MQTT.events.message('zigbee2mqtt/skip-this-topic', 'skipped');
expect(spyTransport).toHaveBeenCalledWith(
{level: 'debug', message: "Received MQTT message on 'zigbee2mqtt/skip-this-topic' with data 'skipped'", namespace: LOG_MQTT_NS},
expect.any(Function),
);
expect(spyEventbusEmitMQTTMessage).toHaveBeenCalledWith({topic: 'zigbee2mqtt/skip-this-topic', message: "skipped"});
logger.debug.mockClear();
await controller.mqtt.publish('skip-this-topic', '', {});
await MQTT.events.message('zigbee2mqtt/skip-this-topic', 'skipped');
expect(logger.debug).toHaveBeenCalledTimes(0);
logger.removeTransport(transport);
logger.setTransportsEnabled(false);
});
it('On zigbee event message', async () => {
+15 -12
View File
@@ -5,21 +5,24 @@ let namespacedLevels = {};
let transports = [];
let transportsEnabled = false;
const callTransports = (level, messageOrLambda, namespace) => {
if (transportsEnabled) {
const message = messageOrLambda instanceof Function ? messageOrLambda() : messageOrLambda;
for (const transport of transports) {
transport.log({level, message, namespace}, () => {});
}
}
};
const mock = {
callTransports:jest.fn().mockImplementation((level, message, namespace) => {
if (transportsEnabled) {
for (const transport of transports) {
transport.log({level, message, namespace}, () => {});
}
}
}),
log: (level, messageOrLambda, namespace = 'z2m') => {
const message = messageOrLambda instanceof Function ? messageOrLambda() : messageOrLambda;
mock.callTransports(level, message, namespace)
},
init: jest.fn(),
info: jest.fn().mockImplementation((messageOrLambda, namespace = 'z2m') => callTransports('info', messageOrLambda, namespace)),
warning: jest.fn().mockImplementation((messageOrLambda, namespace = 'z2m') => callTransports('warning', messageOrLambda, namespace)),
error: jest.fn().mockImplementation((messageOrLambda, namespace = 'z2m') => callTransports('error', messageOrLambda, namespace)),
debug: jest.fn().mockImplementation((messageOrLambda, namespace = 'z2m') => callTransports('debug', messageOrLambda, namespace)),
info: jest.fn().mockImplementation((messageOrLambda, namespace = 'z2m') => mock.log('info', messageOrLambda, namespace)),
warning: jest.fn().mockImplementation((messageOrLambda, namespace = 'z2m') => mock.log('warning', messageOrLambda, namespace)),
error: jest.fn().mockImplementation((messageOrLambda, namespace = 'z2m') => mock.log('error', messageOrLambda, namespace)),
debug: jest.fn().mockImplementation((messageOrLambda, namespace = 'z2m') => mock.log('debug', messageOrLambda, namespace)),
cleanup: jest.fn(),
logOutput: jest.fn(),
add: (transport) => transports.push(transport),