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>
299 lines
8.3 KiB
TypeScript
299 lines
8.3 KiB
TypeScript
import CalendarSelection from '@/components/Calendar/CalendarSelection'
|
|
import * as calendarThunks from '@/features/Calendars/services'
|
|
import '@testing-library/jest-dom'
|
|
import { cleanup, fireEvent, screen, waitFor } from '@testing-library/react'
|
|
import userEvent from '@testing-library/user-event'
|
|
import { renderWithProviders } from '../utils/Renderwithproviders'
|
|
|
|
describe('CalendarSelection', () => {
|
|
beforeEach(() => {
|
|
localStorage.clear()
|
|
})
|
|
const baseUser = {
|
|
userData: {
|
|
sub: 'test',
|
|
email: 'test@test.com',
|
|
sid: 'mockSid',
|
|
openpaasId: 'user1'
|
|
},
|
|
tokens: { accessToken: 'token' }
|
|
}
|
|
|
|
const calendarsMock = {
|
|
'user1/cal1': {
|
|
name: 'Calendar personal',
|
|
id: 'user1/cal1',
|
|
color: '#FF0000',
|
|
owner: { emails: ['alice@example.com'], lastname: 'alice' }
|
|
},
|
|
'user2/cal1': {
|
|
name: 'Calendar delegated',
|
|
delegated: true,
|
|
id: 'user2/cal1',
|
|
color: '#00FF00',
|
|
owner: {
|
|
firstname: 'Bob',
|
|
lastname: 'Builder',
|
|
emails: ['bob@example.com']
|
|
}
|
|
},
|
|
'user3/cal1': {
|
|
name: 'Calendar shared',
|
|
id: 'user3/cal1',
|
|
color: '#0000FF',
|
|
owner: {
|
|
firstname: 'Charlie',
|
|
lastname: 'Chaplin',
|
|
emails: ['charlie@example.com']
|
|
}
|
|
}
|
|
}
|
|
beforeAll(() => {
|
|
jest.clearAllMocks()
|
|
cleanup()
|
|
})
|
|
it('renders personal, delegated and calendar.other', () => {
|
|
renderWithProviders(
|
|
<CalendarSelection
|
|
selectedCalendars={['user1/cal1']}
|
|
setSelectedCalendars={jest.fn()}
|
|
/>,
|
|
{
|
|
user: baseUser,
|
|
calendars: { list: calendarsMock, pending: false }
|
|
}
|
|
)
|
|
|
|
expect(screen.getByText('calendar.personal')).toBeInTheDocument()
|
|
expect(screen.getByText('calendar.delegated')).toBeInTheDocument()
|
|
expect(screen.getByText('calendar.other')).toBeInTheDocument()
|
|
|
|
expect(screen.getByLabelText('Calendar personal')).toBeChecked()
|
|
expect(screen.getByLabelText('Calendar delegated')).not.toBeChecked()
|
|
expect(screen.getByLabelText('Calendar shared')).not.toBeChecked()
|
|
})
|
|
|
|
it('toggles a calendar selection on click', () => {
|
|
const setSelectedCalendars = jest.fn()
|
|
|
|
renderWithProviders(
|
|
<CalendarSelection
|
|
selectedCalendars={[]}
|
|
setSelectedCalendars={setSelectedCalendars}
|
|
/>,
|
|
{
|
|
user: baseUser,
|
|
calendars: { list: calendarsMock, pending: false }
|
|
}
|
|
)
|
|
|
|
const checkbox = screen.getByLabelText('Calendar personal')
|
|
fireEvent.click(checkbox)
|
|
|
|
expect(setSelectedCalendars).toHaveBeenCalledWith(expect.any(Function))
|
|
|
|
const updater = setSelectedCalendars.mock.calls[0][0]
|
|
expect(updater([])).toEqual(['user1/cal1'])
|
|
})
|
|
|
|
it('removes calendar from selection if already selected', () => {
|
|
const setSelectedCalendars = jest.fn()
|
|
|
|
renderWithProviders(
|
|
<CalendarSelection
|
|
selectedCalendars={['user1/cal1']}
|
|
setSelectedCalendars={setSelectedCalendars}
|
|
/>,
|
|
{
|
|
user: baseUser,
|
|
calendars: { list: calendarsMock, pending: false }
|
|
}
|
|
)
|
|
|
|
const checkbox = screen.getByLabelText('Calendar personal')
|
|
fireEvent.click(checkbox)
|
|
|
|
const updater = setSelectedCalendars.mock.calls[0][0]
|
|
expect(updater(['user1/cal1'])).toEqual([])
|
|
})
|
|
|
|
it('opens CalendarPopover modal when personal Add button is clicked', async () => {
|
|
renderWithProviders(
|
|
<CalendarSelection
|
|
selectedCalendars={[]}
|
|
setSelectedCalendars={jest.fn()}
|
|
/>,
|
|
{
|
|
user: baseUser,
|
|
calendars: { list: calendarsMock, pending: false }
|
|
}
|
|
)
|
|
|
|
const addButtons = screen.getAllByRole('button')
|
|
fireEvent.click(addButtons[1])
|
|
|
|
await waitFor(() =>
|
|
expect(
|
|
screen.getByText('calendarPopover.tabs.addNew')
|
|
).toBeInTheDocument()
|
|
)
|
|
})
|
|
|
|
it('Navigates to deletion dialog and deletes personal cal', async () => {
|
|
const spy = jest
|
|
.spyOn(calendarThunks, 'removeCalendarAsync')
|
|
.mockImplementation(payload => {
|
|
return () => Promise.resolve(payload) as any
|
|
})
|
|
renderWithProviders(
|
|
<CalendarSelection
|
|
selectedCalendars={[]}
|
|
setSelectedCalendars={jest.fn()}
|
|
/>,
|
|
{
|
|
user: baseUser,
|
|
calendars: { list: calendarsMock, pending: false }
|
|
}
|
|
)
|
|
|
|
const addButtons = screen.getAllByTestId('MoreHorizIcon')
|
|
fireEvent.click(addButtons[0])
|
|
|
|
userEvent.click(screen.getByText(/delete/i))
|
|
|
|
await waitFor(() =>
|
|
expect(
|
|
screen.getByText('calendar.delete.title(name=Calendar personal)')
|
|
).toBeInTheDocument()
|
|
)
|
|
fireEvent.click(screen.getByRole('button', { name: /delete/i }))
|
|
|
|
await waitFor(() => expect(spy).toHaveBeenCalled())
|
|
})
|
|
|
|
it('Navigates to deletion dialog and deletes other cal', async () => {
|
|
const spy = jest
|
|
.spyOn(calendarThunks, 'removeCalendarAsync')
|
|
.mockImplementation(payload => {
|
|
return () => Promise.resolve(payload) as any
|
|
})
|
|
renderWithProviders(
|
|
<CalendarSelection
|
|
selectedCalendars={[]}
|
|
setSelectedCalendars={jest.fn()}
|
|
/>,
|
|
{
|
|
user: baseUser,
|
|
calendars: { list: calendarsMock, pending: false }
|
|
}
|
|
)
|
|
|
|
const addButtons = screen.getAllByTestId('MoreHorizIcon')
|
|
fireEvent.click(addButtons[1])
|
|
|
|
userEvent.click(screen.getByText(/remove/i))
|
|
|
|
await waitFor(() =>
|
|
expect(
|
|
screen.getByText('calendar.delete.title(name=Calendar delegated)')
|
|
).toBeInTheDocument()
|
|
)
|
|
fireEvent.click(screen.getByRole('button', { name: /remove/i }))
|
|
|
|
await waitFor(() => expect(spy).toHaveBeenCalled())
|
|
})
|
|
|
|
it('opens CalendarSearch modal when Other Add button is clicked', () => {
|
|
renderWithProviders(
|
|
<CalendarSelection
|
|
selectedCalendars={[]}
|
|
setSelectedCalendars={jest.fn()}
|
|
/>,
|
|
{
|
|
user: baseUser,
|
|
calendars: { list: calendarsMock, pending: false }
|
|
}
|
|
)
|
|
|
|
const addButtons = screen.getAllByTestId('AddIcon')
|
|
fireEvent.click(addButtons[1]) // seccond Add button (other)
|
|
|
|
expect(
|
|
screen.getByText('calendar.browseOtherCalendars')
|
|
).toBeInTheDocument()
|
|
})
|
|
|
|
it('when only calendar.personal are in the state, only calendar.personal and the title for other to be added are shown', () => {
|
|
renderWithProviders(
|
|
<CalendarSelection
|
|
selectedCalendars={[]}
|
|
setSelectedCalendars={jest.fn()}
|
|
/>,
|
|
{
|
|
user: baseUser,
|
|
calendars: {
|
|
list: {
|
|
'user1/cal1': calendarsMock['user1/cal1']
|
|
},
|
|
pending: false
|
|
}
|
|
}
|
|
)
|
|
|
|
expect(screen.getByText('calendar.personal')).toBeInTheDocument()
|
|
expect(screen.queryByText('calendar.delegated')).not.toBeInTheDocument()
|
|
expect(screen.queryByText('calendar.other')).toBeInTheDocument()
|
|
})
|
|
|
|
it('renders nothing when no calendars are present', () => {
|
|
renderWithProviders(
|
|
<CalendarSelection
|
|
selectedCalendars={[]}
|
|
setSelectedCalendars={jest.fn()}
|
|
/>,
|
|
{
|
|
user: baseUser,
|
|
calendars: { list: {}, pending: false }
|
|
}
|
|
)
|
|
|
|
expect(screen.queryByLabelText(/Calendar/)).not.toBeInTheDocument()
|
|
})
|
|
|
|
it('expands and collapses accordions when clicked', () => {
|
|
renderWithProviders(
|
|
<CalendarSelection
|
|
selectedCalendars={[]}
|
|
setSelectedCalendars={jest.fn()}
|
|
/>,
|
|
{
|
|
user: baseUser,
|
|
calendars: { list: calendarsMock, pending: false }
|
|
}
|
|
)
|
|
const delegatedAccordionSummary = screen
|
|
.getByText('calendar.delegated')
|
|
.closest('.MuiAccordionSummary-root')
|
|
|
|
fireEvent.click(delegatedAccordionSummary!)
|
|
expect(delegatedAccordionSummary).toHaveAttribute('aria-expanded', 'false')
|
|
|
|
fireEvent.click(delegatedAccordionSummary!)
|
|
expect(delegatedAccordionSummary).toHaveAttribute('aria-expanded', 'true')
|
|
})
|
|
|
|
it('renders owner name caption for non-personal, non-default calendars', () => {
|
|
renderWithProviders(
|
|
<CalendarSelection
|
|
selectedCalendars={[]}
|
|
setSelectedCalendars={jest.fn()}
|
|
/>,
|
|
{ user: baseUser, calendars: { list: calendarsMock, pending: false } }
|
|
)
|
|
expect(screen.getByText('Bob Builder')).toBeInTheDocument()
|
|
expect(screen.getByText('Charlie Chaplin')).toBeInTheDocument()
|
|
// personal calendar should NOT show a caption
|
|
expect(screen.queryByText('alice')).not.toBeInTheDocument()
|
|
})
|
|
})
|