import * as EventApi from '@/features/Events/EventApi' import searchResultReducer, { searchEventsAsync, setHits, setResults } from '@/features/Search/SearchSlice' import { configureStore } from '@reduxjs/toolkit' jest.mock('@/features/Events/EventApi') describe('SearchSlice', () => { let store: any beforeEach(() => { store = configureStore({ reducer: { searchResult: searchResultReducer } }) }) describe('initial state', () => { it('should have correct initial state', () => { const state = store.getState().searchResult expect(state).toEqual({ results: [], hits: 0, error: null, loading: false }) }) }) describe('reducers', () => { it('should handle setResults', () => { const mockResults = [ { uid: '1', summary: 'Event 1' }, { uid: '2', summary: 'Event 2' } ] store.dispatch(setResults(mockResults as any)) expect(store.getState().searchResult.results).toEqual(mockResults) }) it('should handle setHits', () => { store.dispatch(setHits(42)) expect(store.getState().searchResult.hits).toBe(42) }) }) describe('searchEventsAsync', () => { const mockFilters = { searchIn: ['user1/calendar1'], keywords: 'meeting', organizers: ['user@example.com'], attendees: ['attendee@example.com'] } it('should handle successful search', async () => { const mockResponse = { _total_hits: 5, _embedded: { events: [ { data: { uid: '1', summary: 'Test Event' } }, { data: { uid: '2', summary: 'Another Event' } } ] } } ;(EventApi.searchEvent as jest.Mock).mockResolvedValue(mockResponse) await store.dispatch( searchEventsAsync({ search: 'test', filters: mockFilters }) ) const state = store.getState().searchResult expect(state.loading).toBe(false) expect(state.hits).toBe(5) expect(state.results).toEqual(mockResponse._embedded.events) expect(state.error).toBeNull() }) it('should handle search with no results', async () => { const mockResponse = { _total_hits: 0, _embedded: { events: [] } } ;(EventApi.searchEvent as jest.Mock).mockResolvedValue(mockResponse) await store.dispatch( searchEventsAsync({ search: 'nonexistent', filters: mockFilters }) ) const state = store.getState().searchResult expect(state.hits).toBe(0) expect(state.results).toEqual([]) }) it('should handle search error', async () => { const mockError = new Error('Network error') ;(EventApi.searchEvent as jest.Mock).mockRejectedValue(mockError) await store.dispatch( searchEventsAsync({ search: 'test', filters: mockFilters }) ) const state = store.getState().searchResult expect(state.loading).toBe(false) expect(state.error).toBeTruthy() expect(state.results).toEqual([]) }) it('should set loading state during search', async () => { ;(EventApi.searchEvent as jest.Mock).mockImplementation( () => new Promise(resolve => setTimeout(resolve, 100)) ) const promise = store.dispatch( searchEventsAsync({ search: 'test', filters: mockFilters }) ) expect(store.getState().searchResult.loading).toBe(true) await promise }) }) })