Skip to content

Commit

Permalink
chore: modify and add test cases for different supported calendars
Browse files Browse the repository at this point in the history
  • Loading branch information
d-rita committed Jul 25, 2024
1 parent a9a65e9 commit ad759a3
Show file tree
Hide file tree
Showing 2 changed files with 166 additions and 22 deletions.
4 changes: 2 additions & 2 deletions src/data-workspace/inputs/date-input.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ export const DateInput = ({
date={input.value}
calendar={calendar}
onDateSelect={(date) => {
input.onChange(date?.calendarDateString)
handleChange(date?.calendarDateString)
input.onChange(date ? date?.calendarDateString : '')
handleChange(date ? date?.calendarDateString : '')
}}
locale={keyUiLocale}
clearable
Expand Down
184 changes: 164 additions & 20 deletions src/data-workspace/inputs/date-input.test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useConfig } from '@dhis2/app-runtime'
import userEvent from '@testing-library/user-event'
import React from 'react'
import { useUserInfo } from '../../shared/index.js'
import { useSetDataValueMutation, useUserInfo } from '../../shared/index.js'
import { render } from '../../test-utils/index.js'
import { FinalFormWrapper } from '../final-form-wrapper.js'
import { DateInput } from './date-input.js'
Expand All @@ -10,9 +10,12 @@ jest.mock('../../shared/use-user-info/use-user-info.js', () => ({
useUserInfo: jest.fn(),
}))

jest.mock('../../shared/data-value-mutations/data-value-mutations.js', () => ({
useSetDataValueMutation: jest.fn(),
}))

jest.mock('@dhis2/app-runtime', () => {
const originalModule = jest.requireActual('@dhis2/app-runtime')

return {
...originalModule,
useConfig: jest.fn(),
Expand All @@ -31,47 +34,188 @@ describe('date input field', () => {
onKeyDown: jest.fn(),
}

const mutate = jest.fn()

const mockDate = new Date('25 July 2024 12:00:00 GMT+0300')

beforeEach(() => {
useUserInfo.mockImplementation(() => ({
useUserInfo.mockReturnValue({
data: {
settings: {
keyUiLocale: 'en',
},
},
}))
})

useSetDataValueMutation.mockReturnValue({
mutate,
})

// 25th July 2024 (2024-07-25) - gregorian
// 10, Shrawan 2081 (2081-04-10) - nepali
// 18 Hamle 2016 (2016-11-18) - ethiopian
jest.spyOn(Date, 'now').mockImplementation(() => mockDate.getTime())
})

afterEach(jest.clearAllMocks)

it('renders date input component', async () => {
useConfig.mockImplementation(() => ({
systemInfo: { calendar: 'gregory' },
}))
it('renders date input component (gregorian calendar)', async () => {
useConfig.mockReturnValue({
systemInfo: { calendar: 'gregorian' },
})

const { getByText, getByRole, getByTestId, queryByTestId } = render(
<DateInput {...props} />,
{
wrapper: ({ children }) => (
<FinalFormWrapper dataValueSet={{}}>
{children}
</FinalFormWrapper>
),
}
<FinalFormWrapper
onSubmit={() => jest.fn()}
initialValues={{}}
keepDirtyOnReinitialize
>
<DateInput {...props} />
</FinalFormWrapper>
)
const calendarInputLabel = getByText('Pick a date')
const clearCalendarInputButton = getByText('Clear')
const calendarInput = getByRole('textbox')
let calendar = queryByTestId('calendar')

expect(calendarInputLabel).toBeInTheDocument()
expect(clearCalendarInputButton).toBeInTheDocument()
expect(calendarInput.value).toBe('')
expect(calendar).not.toBeInTheDocument()

// open calendar
await userEvent.click(calendarInput)
calendar = getByTestId('calendar')

expect(calendar).toBeInTheDocument()

// select today's date: 25th July 2024
const today = getByText('25')
expect(today.classList.contains('isToday')).toBe(true)
await userEvent.click(today)

// check that mutate function was called
expect(mutate.mock.calls).toHaveLength(1)
expect(mutate.mock.calls[0][0]).toHaveProperty('value', '2024-07-25')

expect(calendarInput.value).toBe('2024-07-25')

// clear date input
const clearCalendarInputButton = getByText('Clear')
await userEvent.click(clearCalendarInputButton)

// check that mutate function was called again on clicking Clear button
expect(mutate.mock.calls).toHaveLength(2)
expect(mutate.mock.calls[1][0]).toHaveProperty('value', '')

expect(calendarInput.value).toBe('')
})

// todo: test calendar input for different calendars
it('allows user to navigate calendar component', async () => {
useConfig.mockReturnValue({
systemInfo: { calendar: 'gregorian' },
})

const { getByText, getByRole, getByTestId, getByLabelText } = render(
<FinalFormWrapper
onSubmit={() => jest.fn()}
initialValues={{}}
keepDirtyOnReinitialize
>
<DateInput {...props} />
</FinalFormWrapper>
)

const calendarInput = getByRole('textbox')
await userEvent.click(calendarInput) // open calendar

// previous month and previous year selection
// select 20th June, 2023
const prevMonthBtn = getByTestId('calendar-previous-month')
await userEvent.click(prevMonthBtn) // June

const prevYearBtn = getByLabelText('Go to previous year')
await userEvent.click(prevYearBtn) // 2023

let dateToSelect = getByText('20')
await userEvent.click(dateToSelect)

expect(calendarInput.value).toBe('2023-06-20')

// check that mutate function was called
expect(mutate.mock.calls).toHaveLength(1)
expect(mutate.mock.calls[0][0]).toHaveProperty('value', '2023-06-20')

// next month and next year selection
// select 18th July, 2024
await userEvent.click(calendarInput)

const nextMonthBtn = getByTestId('calendar-next-month')
await userEvent.click(nextMonthBtn) // July
const nextYearBtn = getByLabelText('Go to next year')
await userEvent.click(nextYearBtn) // 2024

dateToSelect = getByText('18')
await userEvent.click(dateToSelect)
expect(calendarInput.value).toBe('2024-07-18')

// check that mutate function was called again
expect(mutate.mock.calls).toHaveLength(2)
expect(mutate.mock.calls[1][0]).toHaveProperty('value', '2024-07-18')
})

it('renders system set calendar, i.e. nepali', async () => {
useConfig.mockReturnValue({
systemInfo: { calendar: 'nepali' },
})

const { getByText, getByRole } = render(
<FinalFormWrapper
onSubmit={() => jest.fn()}
initialValues={{}}
keepDirtyOnReinitialize
>
<DateInput {...props} />
</FinalFormWrapper>
)

const calendarInput = getByRole('textbox')
expect(calendarInput.value).toBe('')
await userEvent.click(calendarInput)

const today = getByText('10')
expect(today.classList.contains('isToday')).toBe(true)
await userEvent.click(today)

expect(calendarInput.value).toBe('2081-04-10')
// check that mutate function was called
expect(mutate.mock.calls).toHaveLength(1)
expect(mutate.mock.calls[0][0]).toHaveProperty('value', '2081-04-10')
})

it('renders system set calendar, i.e. ethiopian', async () => {
useConfig.mockReturnValue({
systemInfo: { calendar: 'ethiopian' },
})

const { getByText, getByRole } = render(
<FinalFormWrapper
onSubmit={() => jest.fn()}
initialValues={{}}
keepDirtyOnReinitialize
>
<DateInput {...props} />
</FinalFormWrapper>
)

const calendarInput = getByRole('textbox')
expect(calendarInput.value).toBe('')
await userEvent.click(calendarInput)

const today = getByText('18')
expect(today.classList.contains('isToday')).toBe(true)
await userEvent.click(today)

expect(calendarInput.value).toBe('2016-11-18')
// check that mutate function was called
expect(mutate.mock.calls).toHaveLength(1)
expect(mutate.mock.calls[0][0]).toHaveProperty('value', '2016-11-18')
})
})

0 comments on commit ad759a3

Please sign in to comment.