Skip to content

Commit c15dc7a

Browse files
committed
RI-5934 Added specs
1 parent f0d3d53 commit c15dc7a

File tree

5 files changed

+92
-8
lines changed

5 files changed

+92
-8
lines changed

redisinsight/ui/src/components/formated-date/FormatedDate.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const FormatedDate = ({ date }: Props) => {
1515
const dateFormat = config?.dateFormat || DATETIME_FORMATTER_DEFAULT
1616
const timezone = config?.timezone || TimezoneOption.Local
1717

18-
if (!date) return <span />
18+
if (!date) return null
1919

2020
const formatedDate = formatTimestamp(date, dateFormat, timezone)
2121

redisinsight/ui/src/pages/settings/components/general-settings/datetime-formatter/DateTimeFormatter.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const DateTimeFormatter = () => {
3636
Specifies the date and time format to be used in Redis Insight:
3737
</EuiText>
3838
<EuiSpacer size="m" />
39-
<DatetimeForm setPreview={setPreview} />
39+
<DatetimeForm onFormatChange={(newPreview) => setPreview(newPreview)} />
4040
<EuiSpacer size="m" />
4141
<EuiText className={styles.dateTimeSubtitle} color="subdued">Specifies the time zone to be used in Redis Insight:</EuiText>
4242
<EuiSpacer size="s" />
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import React from 'react'
2+
import { instance, mock } from 'ts-mockito'
3+
import { act, fireEvent, render, screen } from 'uiSrc/utils/test-utils'
4+
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
5+
import { dateTimeOptions } from 'uiSrc/constants'
6+
import { Nullable } from 'uiSrc/utils'
7+
import DatetimeForm, { Props } from './DatetimeForm'
8+
9+
const mockedProps = mock<Props>()
10+
11+
jest.mock('uiSrc/slices/user/user-settings', () => ({
12+
...jest.requireActual('uiSrc/slices/user/user-settings'),
13+
userSettingsConfigSelector: jest.fn().mockReturnValue({
14+
dateFormat: null,
15+
timezone: null
16+
}),
17+
}))
18+
19+
jest.mock('uiSrc/telemetry', () => ({
20+
...jest.requireActual('uiSrc/telemetry'),
21+
sendEventTelemetry: jest.fn(),
22+
}))
23+
24+
describe('DatetimeForm', () => {
25+
it('should render', () => {
26+
expect(render(<DatetimeForm {...instance(mockedProps)} />)).toBeTruthy()
27+
})
28+
29+
it('should not show custom btn and input unless custom radio btn is clicked ', async () => {
30+
const { container } = render(<DatetimeForm {...instance(mockedProps)} />)
31+
expect(screen.getByText('Pre-selected formats')).toBeTruthy()
32+
expect(container.querySelector('[data-test-subj="select-datetime"]')).toBeTruthy()
33+
expect(screen.queryByTestId('datetime-custom-btn')).toBeFalsy()
34+
await act(() => fireEvent.click(screen.getByText('Custom')))
35+
expect(screen.queryByTestId('datetime-custom-btn')).toBeTruthy()
36+
})
37+
38+
it('should display invalid format when wrong format is typed in a custom input', async () => {
39+
const onFormatChange = jest.fn()
40+
render(<DatetimeForm {...instance(mockedProps)} onFormatChange={onFormatChange} />)
41+
42+
await act(() => fireEvent.click(screen.getByText('Custom')))
43+
const customInput: Nullable<HTMLElement> = screen.getByTestId('custom-datetime-input')
44+
45+
await act(() => fireEvent.change(customInput, { target: { value: 'fffffinvalid' } }))
46+
47+
expect(onFormatChange).toBeCalledWith('Invalid Format')
48+
})
49+
50+
it('should call proper telemetry events', async () => {
51+
const sendEventTelemetryMock = jest.fn()
52+
sendEventTelemetry.mockImplementation(() => sendEventTelemetryMock)
53+
54+
render(<DatetimeForm {...instance(mockedProps)} />)
55+
56+
await act(() => fireEvent.click(screen.getByText('Custom')))
57+
const customInput: Nullable<HTMLElement> = screen.getByTestId('custom-datetime-input')
58+
59+
await act(() => fireEvent.change(customInput, { target: { value: dateTimeOptions[1].value } }))
60+
await act(() => fireEvent.click(screen.getByTestId('datetime-custom-btn')))
61+
62+
expect(sendEventTelemetry).toBeCalledWith({
63+
event: TelemetryEvent.SETTINGS_DATE_TIME_FORMAT_CHANGED,
64+
eventData: {
65+
currentFormat: dateTimeOptions[1].value
66+
}
67+
})
68+
})
69+
})

redisinsight/ui/src/pages/settings/components/general-settings/datetime-formatter/components/datetime-form/DatetimeForm.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { ChangeEvent, Dispatch, SetStateAction, useMemo, useState } from 'react'
1+
import React, { ChangeEvent, useMemo, useState } from 'react'
22
import { useDispatch, useSelector } from 'react-redux'
33
import { useFormik } from 'formik'
44
import {
@@ -25,11 +25,11 @@ interface InitialValuesType {
2525
selectedRadioOption: DatetimeRadioOption;
2626
}
2727

28-
interface Props {
29-
setPreview: Dispatch<SetStateAction<string>>;
28+
export interface Props {
29+
onFormatChange: (newPreview: string) => void;
3030
}
3131

32-
const DatetimeForm = ({ setPreview }: Props) => {
32+
const DatetimeForm = ({ onFormatChange }: Props) => {
3333
const [error, setError] = useState('')
3434
const [saveFormatSucceed, setSaveFormatSucceed] = useState(false)
3535
const config = useSelector(userSettingsConfigSelector)
@@ -86,11 +86,11 @@ const DatetimeForm = ({ setPreview }: Props) => {
8686
const { valid, error: errorMsg } = checkDateTimeFormat(format)
8787
if (!valid) {
8888
setError(errorMsg || 'This format is not supported')
89-
setPreview('Invalid Format')
89+
onFormatChange?.('Invalid Format')
9090
} else {
9191
setError('')
9292
const newPreview = formatTimestamp(new Date(), format, config?.timezone || TimezoneOption.Local)
93-
setPreview(newPreview)
93+
onFormatChange?.(newPreview)
9494
}
9595
return valid
9696
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import React from 'react'
2+
import { render } from 'uiSrc/utils/test-utils'
3+
4+
import TimezoneForm from './TimezoneForm'
5+
6+
describe('TimezoneForm', () => {
7+
it('should render', () => {
8+
expect(render(<TimezoneForm />)).toBeTruthy()
9+
})
10+
11+
it('should include timezone select', () => {
12+
const { container } = render(<TimezoneForm />)
13+
expect(container.querySelector('[data-test-subj="select-timezone"]')).toBeTruthy()
14+
})
15+
})

0 commit comments

Comments
 (0)