import ImportAlert from '@/features/Events/ImportAlert'
import { fireEvent, screen } from '@testing-library/react'
import { renderWithProviders } from '../../utils/Renderwithproviders'
// Mock the ErrorSnackbar component since we want to test ImportAlert logic,
// but we can also test integration if we don't mock it.
// Given ImportAlert uses EventErrorSnackbar which uses MUI Snackbar,
// it's better to render it and check for text presence.
describe('ImportAlert', () => {
const preloadedState = {
calendars: {
list: {
cal1: {
id: 'cal1',
name: 'Calendar 1',
events: {
event1: {
uid: 'event1',
title: 'Event 1',
error: 'Error message 1'
},
event2: {
uid: 'event2',
title: 'Event 2'
// No error
}
}
},
cal2: {
id: 'cal2',
name: 'Calendar 2',
events: {
event3: {
uid: 'event3',
title: 'Event 3',
error: 'Error message 2'
}
}
}
}
}
}
it('renders nothing when there are no errors', () => {
const state = {
calendars: {
list: {
cal1: {
id: 'cal1',
events: {
event1: { uid: 'event1' }
}
}
}
}
}
const { container } = renderWithProviders(, state)
expect(container).toBeEmptyDOMElement()
})
it('renders snackbar with error message when there is one error', () => {
renderWithProviders(, preloadedState)
// EventErrorSnackbar shows "multipleEvents" if > 1, or the message if 1.
// Here we have 2 errors in preloadedState.
// Let's adjust state for single error test.
const singleErrorState = {
calendars: {
list: {
cal1: {
id: 'cal1',
events: {
event1: {
uid: 'event1',
error: 'Single Error'
}
}
}
}
}
}
renderWithProviders(, singleErrorState)
expect(screen.getByText('Single Error')).toBeInTheDocument()
})
it('renders summary message when there are multiple errors', () => {
renderWithProviders(, preloadedState)
// 2 errors in preloadedState
// "error.multipleEvents" key is used.
// In test environment, t function usually returns the key or formatted string.
// We should check what the real t function does or if it's mocked.
// Based on other tests, it seems we might need to check for the translation key or value.
// Let's assume standard behavior: "error.multipleEvents"
// Actually, EventErrorSnackbar uses: t("error.multipleEvents", { count: messages.length })
// If we don't have full i18n setup in tests, it might be tricky.
// But renderWithProviders likely sets up i18n.
// Let's check for the text that appears.
// If translation is missing, it might show "error.multipleEvents".
// Or if we can match regex.
// Let's try to match partial text or use a custom state with known behavior.
// If we look at EventErrorSnackbar:
// const summary = messages.length === 1 ? messages[0] : t("error.multipleEvents", { count: messages.length });
// We can check if the Alert is present.
expect(screen.getByRole('alert')).toBeInTheDocument()
})
it('dismisses error when close button is clicked', () => {
const singleErrorState = {
calendars: {
list: {
cal1: {
id: 'cal1',
events: {
event1: {
uid: 'event1',
error: 'Dismiss Me'
}
}
}
}
}
}
renderWithProviders(, singleErrorState)
expect(screen.getByText('Dismiss Me')).toBeInTheDocument()
const closeButton = screen.getByRole('button', { name: /ok/i }) // EventErrorSnackbar has an "OK" button
fireEvent.click(closeButton)
// After clicking, it should disappear (or at least be removed from DOM or hidden)
// Since we use local state to filter dismissed errors, it should re-render with null.
expect(screen.queryByText('Dismiss Me')).not.toBeInTheDocument()
})
})