cadfa70e60
* #708 apply strictier linting rules and fix simple eslint bugs * #708 fix eslint errors relate to promise * #708 fix eslint import/no-extraneous-dependencies * #708 fix eslint errors of react-hook * #708 enable eslint check for typescript --------- Co-authored-by: lethemanh <lethemanh@lethemanhs-MacBook-Pro.local>
225 lines
6.3 KiB
TypeScript
225 lines
6.3 KiB
TypeScript
import SearchResultsPage from '@/features/Search/SearchResultsPage'
|
|
import { screen } from '@testing-library/react'
|
|
import { renderWithProviders } from '../../utils/Renderwithproviders'
|
|
|
|
describe('SearchResultsPage', () => {
|
|
const today = new Date()
|
|
const start = new Date(today)
|
|
start.setHours(10, 0, 0, 0)
|
|
const end = new Date(today)
|
|
end.setHours(11, 0, 0, 0)
|
|
const preloadedState = {
|
|
user: {
|
|
userData: {
|
|
sub: 'test',
|
|
email: 'test@test.com',
|
|
sid: 'mockSid',
|
|
openpaasId: 'user1'
|
|
},
|
|
tokens: { accessToken: 'token' }
|
|
},
|
|
calendars: {
|
|
list: {
|
|
'user1/cal1': {
|
|
name: 'Calendar personal',
|
|
id: 'user1/cal1',
|
|
color: { light: '#FF0000', dark: '#000' },
|
|
owner: { emails: ['alice@example.com'] },
|
|
events: {
|
|
event1: {
|
|
id: 'event1',
|
|
calId: 'user1/cal1',
|
|
uid: 'event1',
|
|
title: 'Test Event',
|
|
start: start.toISOString(),
|
|
end: end.toISOString(),
|
|
partstat: 'ACCEPTED',
|
|
organizer: {
|
|
cn: 'Alice',
|
|
cal_address: 'alice@example.com'
|
|
},
|
|
attendee: [
|
|
{
|
|
cn: 'Alice',
|
|
partstat: 'ACCEPTED',
|
|
rsvp: 'TRUE',
|
|
role: 'REQ-PARTICIPANT',
|
|
cutype: 'INDIVIDUAL',
|
|
cal_address: 'alice@example.com'
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'user2/cal1': {
|
|
name: 'Calendar delegated',
|
|
delegated: true,
|
|
id: 'user2/cal1',
|
|
color: { light: '#FF0000', dark: '#000' },
|
|
owner: { emails: ['alice@example.com'] },
|
|
events: {
|
|
event1: {
|
|
id: 'event1',
|
|
calId: 'user2/cal1',
|
|
uid: 'event1',
|
|
title: 'Test Event',
|
|
start: start.toISOString(),
|
|
end: end.toISOString(),
|
|
partstat: 'ACCEPTED',
|
|
organizer: {
|
|
cn: 'Alice',
|
|
cal_address: 'alice@example.com'
|
|
},
|
|
attendee: [
|
|
{
|
|
cn: 'Alice',
|
|
partstat: 'ACCEPTED',
|
|
rsvp: 'TRUE',
|
|
role: 'REQ-PARTICIPANT',
|
|
cutype: 'INDIVIDUAL',
|
|
cal_address: 'alice@example.com'
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
'user3/cal1': {
|
|
name: 'Calendar shared',
|
|
id: 'user3/cal1',
|
|
color: { light: '#FF0000', dark: '#000' },
|
|
owner: { emails: ['alice@example.com'] },
|
|
events: {
|
|
event1: {
|
|
id: 'event1',
|
|
calId: 'user3/cal1',
|
|
uid: 'event1',
|
|
title: 'Test Event',
|
|
start: start.toISOString(),
|
|
end: end.toISOString(),
|
|
partstat: 'ACCEPTED',
|
|
organizer: {
|
|
cn: 'Alice',
|
|
cal_address: 'alice@example.com'
|
|
},
|
|
attendee: [
|
|
{
|
|
cn: 'Alice',
|
|
partstat: 'ACCEPTED',
|
|
rsvp: 'TRUE',
|
|
role: 'REQ-PARTICIPANT',
|
|
cutype: 'INDIVIDUAL',
|
|
cal_address: 'alice@example.com'
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
pending: false
|
|
}
|
|
}
|
|
|
|
it('should show loading spinner when loading', () => {
|
|
renderWithProviders(<SearchResultsPage />, {
|
|
...preloadedState,
|
|
searchResult: { loading: true, error: null, hits: 0, results: [] }
|
|
})
|
|
expect(screen.getByRole('progressbar')).toBeInTheDocument()
|
|
})
|
|
|
|
it('should show error message when error occurs', () => {
|
|
renderWithProviders(<SearchResultsPage />, {
|
|
...preloadedState,
|
|
searchResult: {
|
|
loading: false,
|
|
error: 'Network error',
|
|
hits: 0,
|
|
results: []
|
|
}
|
|
})
|
|
expect(screen.getByText('Network error')).toBeInTheDocument()
|
|
})
|
|
|
|
it('should show no results message when no hits', () => {
|
|
renderWithProviders(<SearchResultsPage />, {
|
|
...preloadedState,
|
|
searchResult: { loading: false, error: null, hits: null, results: [] }
|
|
})
|
|
expect(screen.getByText('search.noResults')).toBeInTheDocument()
|
|
})
|
|
|
|
it('should render search results', () => {
|
|
const mockResults = [
|
|
{
|
|
data: {
|
|
uid: '1',
|
|
summary: 'Team Meeting',
|
|
start: '2025-06-26T15:00:00Z',
|
|
organizer: { cn: 'John Doe', email: 'john@example.com' },
|
|
allDay: false
|
|
}
|
|
},
|
|
{
|
|
data: {
|
|
uid: '2',
|
|
summary: 'Project Review',
|
|
start: '2025-06-27T10:00:00Z',
|
|
organizer: { cn: 'Jane Smith', email: 'jane@example.com' },
|
|
allDay: false
|
|
}
|
|
}
|
|
]
|
|
|
|
renderWithProviders(<SearchResultsPage />, {
|
|
...preloadedState,
|
|
searchResult: { results: mockResults, hits: 2 }
|
|
})
|
|
expect(screen.getByText('search.resultsTitle')).toBeInTheDocument()
|
|
expect(screen.getByText('Team Meeting')).toBeInTheDocument()
|
|
expect(screen.getByText('Project Review')).toBeInTheDocument()
|
|
expect(screen.getByText('John Doe')).toBeInTheDocument()
|
|
expect(screen.getByText('Jane Smith')).toBeInTheDocument()
|
|
})
|
|
|
|
it('should handle events without organizer', () => {
|
|
const mockResults = [
|
|
{
|
|
data: {
|
|
uid: '1',
|
|
summary: 'Untitled Event',
|
|
start: '2025-06-26T15:00:00Z',
|
|
allDay: false
|
|
}
|
|
}
|
|
]
|
|
|
|
renderWithProviders(<SearchResultsPage />, {
|
|
...preloadedState,
|
|
searchResult: { results: mockResults, hits: 1 }
|
|
})
|
|
|
|
expect(screen.getByText('Untitled Event')).toBeInTheDocument()
|
|
})
|
|
|
|
it('should format all-day events correctly', () => {
|
|
const mockResults = [
|
|
{
|
|
data: {
|
|
uid: '1',
|
|
summary: 'All Day Event',
|
|
start: '2025-06-26T00:00:00Z',
|
|
organizer: { cn: 'Organizer' },
|
|
allDay: true
|
|
}
|
|
}
|
|
]
|
|
|
|
renderWithProviders(<SearchResultsPage />, {
|
|
...preloadedState,
|
|
searchResult: { results: mockResults, hits: 1 }
|
|
})
|
|
|
|
expect(screen.getByText('All Day Event')).toBeInTheDocument()
|
|
})
|
|
})
|