Skip to content

Commit

Permalink
Jest tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Luligu committed Feb 6, 2025
1 parent 432de3f commit 26a679c
Show file tree
Hide file tree
Showing 11 changed files with 58 additions and 32 deletions.
4 changes: 0 additions & 4 deletions src/deviceManager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
import { DeviceManager } from './deviceManager.js';
import { PluginManager } from './pluginManager.js';
import { contactSensor, occupancySensor } from './matterbridgeDeviceTypes.js';
import { MdnsService } from '@matter/main/protocol';

// Default colors
const plg = '\u001B[38;5;33m';
Expand Down Expand Up @@ -38,9 +37,7 @@ describe('DeviceManager with mocked devices', () => {

afterAll(async () => {
// Close the Matterbridge instance
const server = matterbridge.serverNode;
await matterbridge.destroyInstance();
await server?.env.get(MdnsService)[Symbol.asyncDispose]();
// Restore the mocked AnsiLogger.log method
loggerLogSpy.mockRestore();
// Restore the mocked console.log
Expand Down Expand Up @@ -195,7 +192,6 @@ describe('DeviceManager with real devices', () => {
// Close the Matterbridge instance
const server = matterbridge.serverNode;
await matterbridge.destroyInstance();
await server?.env.get(MdnsService)[Symbol.asyncDispose]();
// Restore the mocked AnsiLogger.log method
loggerLogSpy.mockRestore();
// Restore the mocked console.log
Expand Down
2 changes: 0 additions & 2 deletions src/frontend.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1166,9 +1166,7 @@ describe('Matterbridge frontend', () => {
expect((matterbridge as any).plugins.size).toBe(0);

// Close the Matterbridge instance
const server = matterbridge.serverNode;
await matterbridge.destroyInstance();
await server?.env.get(MdnsService)[Symbol.asyncDispose]();

expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.DEBUG, `WebSocket server closed successfully`);
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.NOTICE, `Cleanup completed. Shutting down...`);
Expand Down
4 changes: 0 additions & 4 deletions src/matterbridge.bridge.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import { jest } from '@jest/globals';
import { AnsiLogger, db, LogLevel, nf, rs, UNDERLINE, UNDERLINEOFF } from 'node-ansi-logger';
import { Matterbridge } from './matterbridge.js';
import { wait, waiter } from './utils/utils.js';
import { MdnsService } from '@matter/main/protocol';
import { Environment, StorageService } from '@matter/main';
import path from 'path';
import os from 'os';
Expand Down Expand Up @@ -83,7 +82,6 @@ describe('Matterbridge loadInstance() and cleanup() -bridge mode', () => {
afterAll(async () => {
// Restore all mocks
jest.restoreAllMocks();
// console.log('Matterbridge test -bridge mode');
}, 30000);

test('Matterbridge.loadInstance(true) -bridge mode', async () => {
Expand Down Expand Up @@ -160,9 +158,7 @@ describe('Matterbridge loadInstance() and cleanup() -bridge mode', () => {

test('Matterbridge.destroyInstance() -bridge mode', async () => {
// Close the Matterbridge instance
const server = matterbridge.serverNode;
await matterbridge.destroyInstance();
await server?.env.get(MdnsService)[Symbol.asyncDispose]();

expect((matterbridge as any).log.log).toHaveBeenCalledWith(LogLevel.NOTICE, `Cleanup completed. Shutting down...`);
}, 60000);
Expand Down
2 changes: 0 additions & 2 deletions src/matterbridge.childbridge.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import { jest } from '@jest/globals';
import { AnsiLogger, db, LogLevel, nf, rs, UNDERLINE, UNDERLINEOFF } from 'node-ansi-logger';
import { Matterbridge } from './matterbridge.js';
import { wait, waiter } from './utils/utils.js';
import { MdnsService } from '@matter/main/protocol';
import { Environment, StorageService } from '@matter/main';
import path from 'path';
import os from 'os';
Expand Down Expand Up @@ -82,7 +81,6 @@ describe('Matterbridge loadInstance() and cleanup() -childbridge mode', () => {
afterAll(async () => {
// Restore all mocks
jest.restoreAllMocks();
// console.log('Matterbridge test -childbridge mode');
});

test('Matterbridge.loadInstance(true) -childbridge mode', async () => {
Expand Down
62 changes: 52 additions & 10 deletions src/matterbridge.test.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
/* eslint-disable @typescript-eslint/no-explicit-any */

process.argv = ['node', 'matterbridge.test.js', '-frontend', '0', '-profile', 'Jest'];
process.argv = ['node', 'matterbridge.test.js', '-frontend', '0', '-profile', 'Jest', '-logger', 'debug', '-matterlogger', 'debug'];

import { jest } from '@jest/globals';

// jest.mock('@project-chip/matter-node.js/util');

import { AnsiLogger, db, LogLevel, nf } from 'node-ansi-logger';
import { AnsiLogger, db, LogLevel, nf, TimestampFormat } from 'node-ansi-logger';
import { hasParameter } from './utils/utils.js';
import { Matterbridge } from './matterbridge.js';
import { RegisteredPlugin, SessionInformation } from './matterbridgeTypes.js';
Expand Down Expand Up @@ -81,15 +81,17 @@ describe('Matterbridge', () => {
let matterbridge: Matterbridge;

test('Matterbridge.loadInstance(false)', async () => {
expect((Matterbridge as any).instance).toBeUndefined();
matterbridge = await Matterbridge.loadInstance(false);
matterbridge.log = new AnsiLogger({ logName: 'Matterbridge', logTimestampFormat: TimestampFormat.TIME_MILLIS, logLevel: LogLevel.DEBUG });
expect(matterbridge).toBeDefined();
expect(matterbridge.profile).toBe('Jest');
expect(matterbridge.nodeStorageName).toBe('storage.Jest');
expect(matterbridge.matterStorageName).toBe('matterstorage.Jest');
expect(matterbridge.matterbrideLoggerFile).toBe('matterbridge.Jest.log');
expect(matterbridge.matterLoggerFile).toBe('matter.Jest.log');
expect((matterbridge as any).initialized).toBeFalsy();
expect((matterbridge as any).log).toBeUndefined();
expect((matterbridge as any).log).toBeDefined();
expect((matterbridge as any).homeDirectory).toBe('');
expect((matterbridge as any).matterbridgeDirectory).toBe('');
expect((matterbridge as any).globalModulesDirectory).toBe('');
Expand All @@ -111,6 +113,7 @@ describe('Matterbridge', () => {
});

test('Matterbridge.loadInstance(true)', async () => {
expect((Matterbridge as any).instance).toBeDefined();
matterbridge = await Matterbridge.loadInstance(true);
expect((matterbridge as any).initialized).toBeFalsy();
if (!(matterbridge as any).initialized) await matterbridge.initialize();
Expand Down Expand Up @@ -148,6 +151,7 @@ describe('Matterbridge', () => {
test('Matterbridge.loadInstance(true) with frontend', async () => {
process.argv = ['node', 'matterbridge.test.js', '-frontend', '8081', '-profile', 'Jest'];

expect((Matterbridge as any).instance).toBeUndefined();
matterbridge = await Matterbridge.loadInstance(true);
expect((matterbridge as any).initialized).toBeTruthy();
if (!(matterbridge as any).initialized) await matterbridge.initialize();
Expand Down Expand Up @@ -179,6 +183,7 @@ describe('Matterbridge', () => {
let matterbridge: Matterbridge;

beforeAll(async () => {
process.argv = ['node', 'matterbridge.test.js', '-frontend', '0', '-profile', 'Jest', '-logger', 'debug', '-matterlogger', 'debug'];
matterbridge = await Matterbridge.loadInstance(true);
if (!(matterbridge as any).initialized) await matterbridge.initialize();
});
Expand All @@ -191,6 +196,8 @@ describe('Matterbridge', () => {
test('Matterbridge profile', async () => {
expect(matterbridge).toBeDefined();
expect(matterbridge.profile).toBe('Jest');
expect((matterbridge as any).initialized).toBe(true);
expect((matterbridge as any).hasCleanupStarted).toBe(false);
});

test('should do a partial mock of AnsiLogger', () => {
Expand Down Expand Up @@ -273,17 +280,23 @@ describe('Matterbridge', () => {
});

test('matterbridge -help', async () => {
expect((matterbridge as any).initialized).toBe(true);
expect((matterbridge as any).hasCleanupStarted).toBe(false);

const shutdownPromise = new Promise((resolve) => {
matterbridge.on('shutdown', resolve);
});
process.argv = ['node', 'matterbridge.test.js', '-frontend', '0', '-help'];
await (matterbridge as any).parseCommandLine();
expect(loggerLogSpy).toHaveBeenCalled();
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, expect.stringContaining('Usage: matterbridge [options]'));
await shutdownPromise;
matterbridge.removeAllListeners('shutdown');
}, 60000);

test('matterbridge -list', async () => {
expect((matterbridge as any).initialized).toBe(true);
expect((matterbridge as any).hasCleanupStarted).toBe(false);

const shutdownPromise = new Promise((resolve) => {
matterbridge.on('shutdown', resolve);
});
Expand All @@ -296,6 +309,9 @@ describe('Matterbridge', () => {
}, 60000);

test('matterbridge -logstorage', async () => {
expect((matterbridge as any).initialized).toBe(true);
expect((matterbridge as any).hasCleanupStarted).toBe(false);

const shutdownPromise = new Promise((resolve) => {
matterbridge.on('shutdown', resolve);
});
Expand All @@ -307,6 +323,9 @@ describe('Matterbridge', () => {
}, 60000);

test('matterbridge -loginterfaces', async () => {
expect((matterbridge as any).initialized).toBe(true);
expect((matterbridge as any).hasCleanupStarted).toBe(false);

const shutdownPromise = new Promise((resolve) => {
matterbridge.on('shutdown', resolve);
});
Expand All @@ -318,6 +337,9 @@ describe('Matterbridge', () => {
}, 60000);

test('matterbridge -reset', async () => {
expect((matterbridge as any).initialized).toBe(true);
expect((matterbridge as any).hasCleanupStarted).toBe(false);

const shutdownPromise = new Promise((resolve) => {
matterbridge.on('shutdown', resolve);
});
Expand All @@ -329,6 +351,9 @@ describe('Matterbridge', () => {
}, 60000);

test('matterbridge -reset xxx', async () => {
expect((matterbridge as any).initialized).toBe(false);
expect((matterbridge as any).hasCleanupStarted).toBe(false);

const shutdownPromise = new Promise((resolve) => {
matterbridge.on('shutdown', resolve);
});
Expand All @@ -342,6 +367,9 @@ describe('Matterbridge', () => {
}, 60000);

test('matterbridge -add mockPlugin1', async () => {
expect((matterbridge as any).initialized).toBe(false);
expect((matterbridge as any).hasCleanupStarted).toBe(false);

const shutdownPromise = new Promise((resolve) => {
matterbridge.on('shutdown', resolve);
});
Expand All @@ -366,6 +394,9 @@ describe('Matterbridge', () => {
}, 60000);

test('matterbridge -disable mockPlugin1', async () => {
expect((matterbridge as any).initialized).toBe(false);
expect((matterbridge as any).hasCleanupStarted).toBe(false);

const shutdownPromise = new Promise((resolve) => {
matterbridge.on('shutdown', resolve);
});
Expand All @@ -386,6 +417,9 @@ describe('Matterbridge', () => {
}, 60000);

test('matterbridge -enable mockPlugin1', async () => {
expect((matterbridge as any).initialized).toBe(false);
expect((matterbridge as any).hasCleanupStarted).toBe(false);

const shutdownPromise = new Promise((resolve) => {
matterbridge.on('shutdown', resolve);
});
Expand All @@ -406,6 +440,9 @@ describe('Matterbridge', () => {
}, 60000);

test('matterbridge -remove mockPlugin1', async () => {
expect((matterbridge as any).initialized).toBe(false);
expect((matterbridge as any).hasCleanupStarted).toBe(false);

const shutdownPromise = new Promise((resolve) => {
matterbridge.on('shutdown', resolve);
});
Expand All @@ -421,6 +458,9 @@ describe('Matterbridge', () => {
}, 60000);

test('matterbridge -add mockPlugin1/2/3', async () => {
expect((matterbridge as any).initialized).toBe(false);
expect((matterbridge as any).hasCleanupStarted).toBe(false);

const shutdownPromise = new Promise((resolve) => {
matterbridge.on('shutdown', resolve);
});
Expand Down Expand Up @@ -468,6 +508,9 @@ describe('Matterbridge', () => {
}, 60000);

test('matterbridge start mockPlugin1/2/3', async () => {
expect((matterbridge as any).initialized).toBe(false);
expect((matterbridge as any).hasCleanupStarted).toBe(false);

process.argv = ['node', 'matterbridge.test.js', '-frontend', '0'];
const plugins = (await (matterbridge as any).plugins.array()) as RegisteredPlugin[];
expect(plugins).toHaveLength(3);
Expand All @@ -492,15 +535,14 @@ describe('Matterbridge', () => {
}, 10000);

test('matterbridge -factoryreset', async () => {
const shutdownPromise = new Promise((resolve) => {
matterbridge.on('shutdown', resolve);
});
expect((matterbridge as any).initialized).toBe(false);
expect((matterbridge as any).hasCleanupStarted).toBe(false);

process.argv = ['node', 'matterbridge.test.js', '-frontend', '0', '-factoryreset'];
await (matterbridge as any).parseCommandLine();
expect((matterbridge as any).log.log).toHaveBeenCalledWith(LogLevel.INFO, 'Factory reset done! Remove all paired fabrics from the controllers.');
expect(loggerLogSpy).toHaveBeenCalledWith(LogLevel.INFO, 'Factory reset done! Remove all paired fabrics from the controllers.');
expect((matterbridge as any).plugins).toHaveLength(0);
// await shutdownPromise;
matterbridge.removeAllListeners('shutdown');
}, 60000);
}, 10000);
});
});
2 changes: 2 additions & 0 deletions src/matterbridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1402,6 +1402,8 @@ export class Matterbridge extends EventEmitter {
}
this.hasCleanupStarted = false;
this.initialized = false;
} else {
this.log.debug('Cleanup already started...');
}
}

Expand Down
3 changes: 0 additions & 3 deletions src/matterbridgeAccessoryPlatform.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import { jest } from '@jest/globals';
import { AnsiLogger } from 'node-ansi-logger';
import { Matterbridge } from './matterbridge.js';
import { MatterbridgeAccessoryPlatform } from './matterbridgeAccessoryPlatform.js';
import { MdnsService } from '@matter/main/protocol';

describe('Matterbridge accessory platform', () => {
beforeAll(async () => {
Expand Down Expand Up @@ -41,9 +40,7 @@ describe('Matterbridge accessory platform', () => {
expect(platform.type).toBe('AccessoryPlatform');

// Close the Matterbridge instance
const server = matterbridge.serverNode;
await matterbridge.destroyInstance();
await server?.env.get(MdnsService)[Symbol.asyncDispose]();
expect((Matterbridge as any).instance).toBeUndefined();
}, 60000);
});
3 changes: 0 additions & 3 deletions src/matterbridgeDynamicPlatform.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import { jest } from '@jest/globals';
import { AnsiLogger, LogLevel } from 'node-ansi-logger';
import { Matterbridge } from './matterbridge.js';
import { MatterbridgeDynamicPlatform } from './matterbridgeDynamicPlatform.js';
import { MdnsService } from '@matter/main/protocol';

describe('Matterbridge dynamic platform', () => {
beforeAll(async () => {
Expand Down Expand Up @@ -41,9 +40,7 @@ describe('Matterbridge dynamic platform', () => {
expect(platform.type).toBe('DynamicPlatform');

// Close the Matterbridge instance
const server = matterbridge.serverNode;
await matterbridge.destroyInstance();
await server?.env.get(MdnsService)[Symbol.asyncDispose]();
expect((Matterbridge as any).instance).toBeUndefined();
}, 60000);
});
5 changes: 3 additions & 2 deletions src/matterbridgeEndpoint-default.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ import {
TotalVolatileOrganicCompoundsConcentrationMeasurementServer,
} from '@matter/node/behaviors';
import { updateAttribute } from './matterbridgeEndpointHelpers.js';
import { MdnsService } from '@matter/main/protocol';

describe('MatterbridgeEndpoint class', () => {
let matterbridge: Matterbridge;
Expand Down Expand Up @@ -918,9 +917,11 @@ describe('MatterbridgeEndpoint class', () => {
expect(device.getAttribute(AirQuality.Cluster.id, 'airQuality')).toBe(AirQuality.AirQualityEnum.Unknown);
});

// eslint-disable-next-line jest/expect-expect
// eslint-disable-next-line jest/no-commented-out-tests
/*
test('pause before cleanup', async () => {
await new Promise((resolve) => setTimeout(resolve, 5000)); // Pause for 5 seconds
}, 60000);
*/
});
});
2 changes: 1 addition & 1 deletion src/matterbridgeEndpoint-matterjs.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@ describe('MatterbridgeEndpoint class', () => {
test('close server node', async () => {
expect(server).toBeDefined();
await server.close();
await server.env.get(MdnsService)[Symbol.asyncDispose]();
await server.env.get(MdnsService)[Symbol.asyncDispose](); // loadInstance(false) does not start the mDNS service
});
});
});
1 change: 0 additions & 1 deletion src/matterbridgeEndpoint.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ import {
TimeSynchronizationServer,
} from '@matter/node/behaviors';
import { checkNotLatinCharacters, generateUniqueId, getAttributeId, getClusterId } from './matterbridgeEndpointHelpers.js';
import { MdnsService } from '@matter/main/protocol';

describe('MatterbridgeEndpoint class', () => {
let matterbridge: Matterbridge;
Expand Down

0 comments on commit 26a679c

Please sign in to comment.