|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import { act, renderHook } from '@testing-library/react'; |
|
|
import { useConsoleMessages } from './useConsoleMessages.js'; |
|
|
import { ConsoleMessageItem } from '../types.js'; |
|
|
|
|
|
|
|
|
vi.useFakeTimers(); |
|
|
|
|
|
describe('useConsoleMessages', () => { |
|
|
it('should initialize with an empty array of console messages', () => { |
|
|
const { result } = renderHook(() => useConsoleMessages()); |
|
|
expect(result.current.consoleMessages).toEqual([]); |
|
|
}); |
|
|
|
|
|
it('should add a new message', () => { |
|
|
const { result } = renderHook(() => useConsoleMessages()); |
|
|
const message: ConsoleMessageItem = { |
|
|
type: 'log', |
|
|
content: 'Test message', |
|
|
count: 1, |
|
|
}; |
|
|
|
|
|
act(() => { |
|
|
result.current.handleNewMessage(message); |
|
|
}); |
|
|
|
|
|
act(() => { |
|
|
vi.runAllTimers(); |
|
|
}); |
|
|
|
|
|
expect(result.current.consoleMessages).toEqual([{ ...message, count: 1 }]); |
|
|
}); |
|
|
|
|
|
it('should consolidate identical consecutive messages', () => { |
|
|
const { result } = renderHook(() => useConsoleMessages()); |
|
|
const message: ConsoleMessageItem = { |
|
|
type: 'log', |
|
|
content: 'Test message', |
|
|
count: 1, |
|
|
}; |
|
|
|
|
|
act(() => { |
|
|
result.current.handleNewMessage(message); |
|
|
result.current.handleNewMessage(message); |
|
|
}); |
|
|
|
|
|
act(() => { |
|
|
vi.runAllTimers(); |
|
|
}); |
|
|
|
|
|
expect(result.current.consoleMessages).toEqual([{ ...message, count: 2 }]); |
|
|
}); |
|
|
|
|
|
it('should not consolidate different messages', () => { |
|
|
const { result } = renderHook(() => useConsoleMessages()); |
|
|
const message1: ConsoleMessageItem = { |
|
|
type: 'log', |
|
|
content: 'Test message 1', |
|
|
count: 1, |
|
|
}; |
|
|
const message2: ConsoleMessageItem = { |
|
|
type: 'error', |
|
|
content: 'Test message 2', |
|
|
count: 1, |
|
|
}; |
|
|
|
|
|
act(() => { |
|
|
result.current.handleNewMessage(message1); |
|
|
result.current.handleNewMessage(message2); |
|
|
}); |
|
|
|
|
|
act(() => { |
|
|
vi.runAllTimers(); |
|
|
}); |
|
|
|
|
|
expect(result.current.consoleMessages).toEqual([ |
|
|
{ ...message1, count: 1 }, |
|
|
{ ...message2, count: 1 }, |
|
|
]); |
|
|
}); |
|
|
|
|
|
it('should not consolidate messages if type is different', () => { |
|
|
const { result } = renderHook(() => useConsoleMessages()); |
|
|
const message1: ConsoleMessageItem = { |
|
|
type: 'log', |
|
|
content: 'Test message', |
|
|
count: 1, |
|
|
}; |
|
|
const message2: ConsoleMessageItem = { |
|
|
type: 'error', |
|
|
content: 'Test message', |
|
|
count: 1, |
|
|
}; |
|
|
|
|
|
act(() => { |
|
|
result.current.handleNewMessage(message1); |
|
|
result.current.handleNewMessage(message2); |
|
|
}); |
|
|
|
|
|
act(() => { |
|
|
vi.runAllTimers(); |
|
|
}); |
|
|
|
|
|
expect(result.current.consoleMessages).toEqual([ |
|
|
{ ...message1, count: 1 }, |
|
|
{ ...message2, count: 1 }, |
|
|
]); |
|
|
}); |
|
|
|
|
|
it('should clear console messages', () => { |
|
|
const { result } = renderHook(() => useConsoleMessages()); |
|
|
const message: ConsoleMessageItem = { |
|
|
type: 'log', |
|
|
content: 'Test message', |
|
|
count: 1, |
|
|
}; |
|
|
|
|
|
act(() => { |
|
|
result.current.handleNewMessage(message); |
|
|
}); |
|
|
|
|
|
act(() => { |
|
|
vi.runAllTimers(); |
|
|
}); |
|
|
|
|
|
expect(result.current.consoleMessages).toHaveLength(1); |
|
|
|
|
|
act(() => { |
|
|
result.current.clearConsoleMessages(); |
|
|
}); |
|
|
|
|
|
expect(result.current.consoleMessages).toEqual([]); |
|
|
}); |
|
|
|
|
|
it('should clear pending timeout on clearConsoleMessages', () => { |
|
|
const { result } = renderHook(() => useConsoleMessages()); |
|
|
const message: ConsoleMessageItem = { |
|
|
type: 'log', |
|
|
content: 'Test message', |
|
|
count: 1, |
|
|
}; |
|
|
|
|
|
act(() => { |
|
|
result.current.handleNewMessage(message); |
|
|
}); |
|
|
|
|
|
act(() => { |
|
|
result.current.clearConsoleMessages(); |
|
|
}); |
|
|
|
|
|
|
|
|
act(() => { |
|
|
vi.runAllTimers(); |
|
|
}); |
|
|
|
|
|
expect(result.current.consoleMessages).toEqual([]); |
|
|
}); |
|
|
|
|
|
it('should clear message queue on clearConsoleMessages', () => { |
|
|
const { result } = renderHook(() => useConsoleMessages()); |
|
|
const message: ConsoleMessageItem = { |
|
|
type: 'log', |
|
|
content: 'Test message', |
|
|
count: 1, |
|
|
}; |
|
|
|
|
|
act(() => { |
|
|
|
|
|
result.current.handleNewMessage(message); |
|
|
}); |
|
|
|
|
|
act(() => { |
|
|
result.current.clearConsoleMessages(); |
|
|
}); |
|
|
|
|
|
|
|
|
act(() => { |
|
|
vi.runAllTimers(); |
|
|
}); |
|
|
|
|
|
|
|
|
expect(result.current.consoleMessages).toEqual([]); |
|
|
}); |
|
|
|
|
|
it('should cleanup timeout on unmount', () => { |
|
|
const { result, unmount } = renderHook(() => useConsoleMessages()); |
|
|
const message: ConsoleMessageItem = { |
|
|
type: 'log', |
|
|
content: 'Test message', |
|
|
count: 1, |
|
|
}; |
|
|
|
|
|
act(() => { |
|
|
result.current.handleNewMessage(message); |
|
|
}); |
|
|
|
|
|
unmount(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expect(vi.getTimerCount()).toBe(0); |
|
|
}); |
|
|
}); |
|
|
|