// ErrorMessage.test.tsx
import React from 'react'
import { render, screen, fireEvent } from '@testing-library/react'
import '@testing-library/jest-dom'
import ErrorMessage from './index'
import { ThreadMessage, MessageStatus, ErrorCode } from '@janhq/core'
import { useAtomValue, useSetAtom } from 'jotai'
import useSendChatMessage from '@/hooks/useSendChatMessage'
// Mock the dependencies
jest.mock('jotai', () => {
const originalModule = jest.requireActual('jotai')
return {
...originalModule,
useAtomValue: jest.fn(),
useSetAtom: jest.fn(),
}
})
jest.mock('@/hooks/useSendChatMessage', () => ({
__esModule: true,
default: jest.fn(),
}))
describe('ErrorMessage Component', () => {
const mockSetMainState = jest.fn()
const mockSetSelectedSettingScreen = jest.fn()
const mockSetModalTroubleShooting = jest.fn()
const mockResendChatMessage = jest.fn()
beforeEach(() => {
jest.clearAllMocks()
; (useAtomValue as jest.Mock).mockReturnValue([])
; (useSetAtom as jest.Mock).mockReturnValue(mockSetMainState)
; (useSetAtom as jest.Mock).mockReturnValue(mockSetSelectedSettingScreen)
; (useSetAtom as jest.Mock).mockReturnValue(mockSetModalTroubleShooting)
; (useSendChatMessage as jest.Mock).mockReturnValue({
resendChatMessage: mockResendChatMessage,
})
})
it('renders error message with InvalidApiKey correctly', () => {
const message: ThreadMessage = {
id: '1',
metadata: {
error: MessageStatus.Error,
error_code: ErrorCode.InvalidApiKey,
},
status: "completed",
content: [{ text: { value: 'Invalid API Key' } }],
} as ThreadMessage
render()
expect(screen.getByTestId('invalid-API-key-error')).toBeInTheDocument()
expect(screen.getByText('Settings')).toBeInTheDocument()
})
it('renders general error message correctly', () => {
const message: ThreadMessage = {
id: '1',
status: "completed",
metadata: {
error: MessageStatus.Error,
error_code: ErrorCode.Unknown
},
content: [{ text: { value: 'Unknown error occurred' } }],
} as ThreadMessage
render()
expect(screen.getByText('Troubleshooting')).toBeInTheDocument()
})
it('opens troubleshooting modal when link is clicked', () => {
const message: ThreadMessage = {
id: '1',
status: "completed",
metadata: {
error: MessageStatus.Error,
error_code: ErrorCode.Unknown,
}, content: [{ text: { value: 'Unknown error occurred' } }],
} as ThreadMessage
render()
fireEvent.click(screen.getByText('Troubleshooting'))
expect(mockSetModalTroubleShooting).toHaveBeenCalledWith(true)
})
})