UNPKG

matterbridge-switchbot

Version:
113 lines (96 loc) 4.66 kB
import { vi, describe, beforeEach, afterAll } from 'vitest'; import { AnsiLogger, LogLevel } from 'matterbridge/logger'; import { Matterbridge, MatterbridgeEndpoint, PlatformConfig } from 'matterbridge'; import { TemplatePlatform } from '../src/module.ts'; const mockLog = { fatal: vi.fn((message: string, ...parameters: any[]) => {}), error: vi.fn((message: string, ...parameters: any[]) => {}), warn: vi.fn((message: string, ...parameters: any[]) => {}), notice: vi.fn((message: string, ...parameters: any[]) => {}), info: vi.fn((message: string, ...parameters: any[]) => {}), debug: vi.fn((message: string, ...parameters: any[]) => {}), } as unknown as AnsiLogger; const mockMatterbridge = { matterbridgeDirectory: './jest/matterbridge', matterbridgePluginDirectory: './jest/plugins', systemInformation: { ipv4Address: undefined, ipv6Address: undefined, osRelease: 'xx.xx.xx.xx.xx.xx', nodeVersion: '22.1.10' }, matterbridgeVersion: '3.0.0', log: mockLog, getDevices: vi.fn(() => { return []; }), getPlugins: vi.fn(() => { return []; }), addBridgedEndpoint: vi.fn(async (pluginName: string, device: MatterbridgeEndpoint) => {}), removeBridgedEndpoint: vi.fn(async (pluginName: string, device: MatterbridgeEndpoint) => {}), removeAllBridgedEndpoints: vi.fn(async (pluginName: string) => {}), } as unknown as Matterbridge; const mockConfig = { name: 'matterbridge-plugin-template', type: 'DynamicPlatform', version: '1.0.0', debug: false, unregisterOnShutdown: false, } as PlatformConfig; const loggerLogSpy = vi.spyOn(AnsiLogger.prototype, 'log').mockImplementation((level: string, message: string, ...parameters: any[]) => {}); describe('Matterbridge Plugin Template', () => { let instance: TemplatePlatform; beforeEach(() => { vi.clearAllMocks(); }); afterAll(() => { vi.restoreAllMocks(); }); it('should throw an error if matterbridge is not the required version', async () => { mockMatterbridge.matterbridgeVersion = '2.0.0'; // Simulate an older version expect(() => new TemplatePlatform(mockMatterbridge, mockLog, mockConfig)).toThrow( 'This plugin requires Matterbridge version >= "3.0.7". Please update Matterbridge from 2.0.0 to the latest version in the frontend.', ); mockMatterbridge.matterbridgeVersion = '3.0.7'; }); it('should create an instance of the platform', async () => { instance = (await import('../src/module.ts')).default(mockMatterbridge, mockLog, mockConfig) as TemplatePlatform; expect(instance).toBeInstanceOf(TemplatePlatform); expect(instance.matterbridge).toBe(mockMatterbridge); expect(instance.log).toBe(mockLog); expect(instance.config).toBe(mockConfig); expect(instance.matterbridge.matterbridgeVersion).toBe('3.0.7'); expect(mockLog.info).toHaveBeenCalledWith('Initializing Platform...'); }); it('should start', async () => { await instance.onStart('Jest'); expect(mockLog.info).toHaveBeenCalledWith('onStart called with reason: Jest'); await instance.onStart(); expect(mockLog.info).toHaveBeenCalledWith('onStart called with reason: none'); }); it('should call the command handlers', async () => { for (const device of instance.getDevices()) { if (device.hasClusterServer('onOff')) { await device.executeCommandHandler('on'); await device.executeCommandHandler('off'); } } expect(mockLog.info).toHaveBeenCalledWith('Command on called on cluster undefined'); // Is undefined here cause the endpoint in not active expect(mockLog.info).toHaveBeenCalledWith('Command off called on cluster undefined'); // Is undefined here cause the endpoint in not active }); it('should configure', async () => { await instance.onConfigure(); expect(mockLog.info).toHaveBeenCalledWith('onConfigure called'); expect(mockLog.info).toHaveBeenCalledWith(expect.stringContaining('Configuring device:')); }); it('should change logger level', async () => { await instance.onChangeLoggerLevel(LogLevel.DEBUG); expect(mockLog.info).toHaveBeenCalledWith('onChangeLoggerLevel called with: debug'); }); it('should shutdown', async () => { await instance.onShutdown('Jest'); expect(mockLog.info).toHaveBeenCalledWith('onShutdown called with reason: Jest'); // Mock the unregisterOnShutdown behavior mockConfig.unregisterOnShutdown = true; await instance.onShutdown(); expect(mockLog.info).toHaveBeenCalledWith('onShutdown called with reason: none'); expect(mockMatterbridge.removeAllBridgedEndpoints).toHaveBeenCalled(); mockConfig.unregisterOnShutdown = false; }); });