/** * AuthEventManager 单元测试 */ import { describe, it, expect, beforeEach, vi } from 'vitest'; import { AuthEventManager, authEventManager } from '@/auth/event-manager'; import type { AuthEventListener } from '@/auth/event-manager'; describe('AuthEventManager', () => { let eventManager: AuthEventManager; let mockListener1: AuthEventListener; let mockListener2: AuthEventListener; beforeEach(() => { eventManager = new AuthEventManager(); mockListener1 = vi.fn(); mockListener2 = vi.fn(); vi.clearAllMocks(); }); describe('on', () => { it('应该添加事件监听器', () => { eventManager.on('login_success', mockListener1); // 触发事件 eventManager.emit('login_success', { user: 'test' }); expect(mockListener1).toHaveBeenCalledWith({ user: 'test' }); expect(mockListener1).toHaveBeenCalledTimes(1); }); it('应该支持为同一事件添加多个监听器', () => { eventManager.on('login_success', mockListener1); eventManager.on('login_success', mockListener2); // 触发事件 eventManager.emit('login_success', { user: 'test' }); expect(mockListener1).toHaveBeenCalledWith({ user: 'test' }); expect(mockListener2).toHaveBeenCalledWith({ user: 'test' }); }); it('应该支持为不同事件添加监听器', () => { eventManager.on('login_success', mockListener1); eventManager.on('logout', mockListener2); // 只触发登录成功事件 eventManager.emit('login_success', { user: 'test' }); expect(mockListener1).toHaveBeenCalledWith({ user: 'test' }); expect(mockListener1).toHaveBeenCalledTimes(1); expect(mockListener2).not.toHaveBeenCalled(); }); }); describe('off', () => { it('应该移除事件监听器', () => { eventManager.on('login_success', mockListener1); eventManager.on('login_success', mockListener2); // 移除第一个监听器 eventManager.off('login_success', mockListener1); // 触发事件 eventManager.emit('login_success', { user: 'test' }); expect(mockListener1).not.toHaveBeenCalled(); expect(mockListener2).toHaveBeenCalledWith({ user: 'test' }); expect(mockListener2).toHaveBeenCalledTimes(1); }); it('应该只移除指定的监听器', () => { eventManager.on('login_success', mockListener1); eventManager.on('logout', mockListener1); // 只移除登录成功事件的监听器 eventManager.off('login_success', mockListener1); // 触发两个事件 eventManager.emit('login_success', { user: 'test' }); eventManager.emit('logout', { user: 'test' }); expect(mockListener1).toHaveBeenCalledTimes(1); expect(mockListener1).toHaveBeenCalledWith({ user: 'test' }); }); it('应该处理移除不存在的监听器', () => { // 尝试移除未添加的监听器 eventManager.off('login_success', mockListener1); // 添加并触发事件 eventManager.on('login_success', mockListener2); eventManager.emit('login_success', { user: 'test' }); expect(mockListener1).not.toHaveBeenCalled(); expect(mockListener2).toHaveBeenCalledWith({ user: 'test' }); }); }); describe('emit', () => { it('应该触发事件并传递参数', () => { eventManager.on('login_success', mockListener1); const args = [{ user: 'test' }, { token: 'abc123' }]; eventManager.emit('login_success', ...args); expect(mockListener1).toHaveBeenCalledWith(...args); }); it('应该触发所有监听器', () => { eventManager.on('login_success', mockListener1); eventManager.on('login_success', mockListener2); eventManager.emit('login_success', { user: 'test' }); expect(mockListener1).toHaveBeenCalledWith({ user: 'test' }); expect(mockListener2).toHaveBeenCalledWith({ user: 'test' }); }); it('应该处理没有监听器的事件', () => { // 尝试触发没有监听器的事件 expect(() => { eventManager.emit('login_success', { user: 'test' }); }).not.toThrow(); }); it('应该处理监听器中的异常', () => { const errorListener = vi.fn(() => { throw new Error('Test error'); }); eventManager.on('login_success', errorListener); eventManager.on('login_success', mockListener2); // 即使一个监听器抛出异常,其他监听器也应该被调用 expect(() => { eventManager.emit('login_success', { user: 'test' }); }).toThrow('Error in auth event listener for login_success'); expect(errorListener).toHaveBeenCalled(); // 注意:由于第一个监听器抛出异常,第二个监听器可能不会被调用 // 这取决于具体实现,这里我们只验证错误监听器被调用 }); }); describe('clear', () => { it('应该清除所有监听器', () => { // 添加多个事件监听器 eventManager.on('login_success', mockListener1); eventManager.on('logout', mockListener2); // 清除所有监听器 eventManager.clear(); // 触发事件,验证监听器已被清除 eventManager.emit('login_success', { user: 'test' }); eventManager.emit('logout', { user: 'test' }); expect(mockListener1).not.toHaveBeenCalled(); expect(mockListener2).not.toHaveBeenCalled(); }); }); }); describe('authEventManager', () => { it('应该是AuthEventManager的实例', () => { expect(authEventManager).toBeInstanceOf(AuthEventManager); }); it('应该是单例', () => { const anotherInstance = authEventManager; expect(anotherInstance).toBe(authEventManager); }); });