Skip to content

Commit 6b7cd4f

Browse files
author
Artyom Podymov
committed
#RI-2083 add unit test
1 parent 6681cca commit 6b7cd4f

File tree

11 files changed

+86
-19
lines changed

11 files changed

+86
-19
lines changed

redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/EnablementArea.spec.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react'
22
import { cloneDeep } from 'lodash'
33
import { instance, mock } from 'ts-mockito'
4-
import { cleanup, mockedStore, render } from 'uiSrc/utils/test-utils'
4+
import { cleanup, mockedEAFormatSelector, mockedStore, render } from 'uiSrc/utils/test-utils'
55
import { MOCK_ENABLEMENT_AREA_ITEMS } from 'uiSrc/constants'
66
import { EnablementAreaComponent } from 'uiSrc/slices/interfaces'
77

@@ -26,6 +26,9 @@ jest.mock('uiSrc/slices/workbench/wb-enablement-area', () => {
2626
}),
2727
}
2828
})
29+
jest.mock('./utils/formatter/FormatSelector', () => {
30+
return mockedEAFormatSelector
31+
})
2932

3033
describe('EnablementArea', () => {
3134
it('should render', () => {

redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/EnablementArea.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import styles from './styles.module.scss'
2121
export interface Props {
2222
items: Record<string, IEnablementAreaItem>;
2323
loading: boolean;
24-
openScript: (script: string, path: string) => void;
24+
openScript: (script: string, path?: string, name?: string) => void;
2525
openInternalPage: (page: IInternalPage) => void;
2626
}
2727

@@ -77,7 +77,7 @@ const EnablementArea = ({ items, openScript, loading }: Props) => {
7777
case EnablementAreaComponent.CodeButton:
7878
return args?.path
7979
? <div style={{ marginTop: '16px' }}><LazyCodeButton label={label} {...args} /></div>
80-
: <div style={{ marginTop: '16px' }}><CodeButton onClick={() => openScript(args?.content || '', '')} label={label} {...args} /></div>
80+
: <div style={{ marginTop: '16px' }}><CodeButton onClick={() => openScript(args?.content || '')} label={label} {...args} /></div>
8181
case EnablementAreaComponent.InternalLink:
8282
return (
8383
<InternalLink testId={id || label} label={label} {...args}>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React from 'react'
2+
import { instance, mock } from 'ts-mockito'
3+
import { fireEvent, render } from 'uiSrc/utils/test-utils'
4+
import { EnablementAreaProvider, defaultValue } from 'uiSrc/pages/workbench/contexts/enablementAreaContext'
5+
import { MONACO_MANUAL } from 'uiSrc/constants'
6+
7+
import Code, { Props } from './Code'
8+
9+
const mockedProps = mock<Props>()
10+
11+
describe('Code', () => {
12+
it('should render', () => {
13+
const label = 'Manual'
14+
const component = render(<Code {...instance(mockedProps)} label={label}>{MONACO_MANUAL}</Code>)
15+
const { container } = component
16+
17+
expect(component).toBeTruthy()
18+
expect(container).toHaveTextContent(label)
19+
})
20+
it('should call onClick function if path provided', () => {
21+
const setScript = jest.fn()
22+
const label = 'Manual'
23+
24+
const { queryByTestId } = render(
25+
<EnablementAreaProvider value={{ ...defaultValue, setScript }}>
26+
<Code {...instance(mockedProps)} label={label}>{MONACO_MANUAL}</Code>
27+
</EnablementAreaProvider>
28+
)
29+
30+
const link = queryByTestId(`preselect-${label}`)
31+
fireEvent.click(link as Element)
32+
expect(setScript).toBeCalledWith(MONACO_MANUAL)
33+
})
34+
})

redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/Code/Code.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import React, { useContext } from 'react'
2+
import { startCase } from 'lodash'
3+
import { useLocation } from 'react-router-dom'
4+
25
import EnablementAreaContext from 'uiSrc/pages/workbench/contexts/enablementAreaContext'
6+
import { getFileInfo } from 'uiSrc/pages/workbench/components/enablament-area/EnablementArea/utils/getFileInfo'
37

48
import CodeButton from '../CodeButton'
59

@@ -9,10 +13,17 @@ export interface Props {
913
}
1014

1115
const Code = ({ children, ...rest }: Props) => {
16+
const { search } = useLocation()
1217
const { setScript } = useContext(EnablementAreaContext)
1318

1419
const loadContent = () => {
15-
setScript(children)
20+
const pagePath = new URLSearchParams(search).get('guide')
21+
if (pagePath) {
22+
const pageInfo = getFileInfo(pagePath)
23+
setScript(children, `${pageInfo.location}/${pageInfo.name}`, startCase(rest.label))
24+
} else {
25+
setScript(children)
26+
}
1627
}
1728

1829
return (

redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/InternalPage/InternalPage.spec.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import React from 'react'
22
import { instance, mock } from 'ts-mockito'
3-
import { fireEvent, render } from 'uiSrc/utils/test-utils'
4-
3+
import { fireEvent, mockedEAFormatSelector, render } from 'uiSrc/utils/test-utils'
54
import InternalPage, { Props } from './InternalPage'
65

76
const mockedProps = mock<Props>()
87

8+
jest.mock('../../utils/formatter/FormatSelector', () => {
9+
return mockedEAFormatSelector
10+
})
11+
912
describe('InternalPage', () => {
1013
it('should render', () => {
1114
expect(render(<InternalPage {...instance(mockedProps)} />)).toBeTruthy()

redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/components/LazyCodeButton/LazyCodeButton.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import React, { useContext, useState } from 'react'
2+
import { startCase } from 'lodash'
3+
24
import { getApiErrorMessage, isStatusSuccessful } from 'uiSrc/utils'
35
import { resourcesService } from 'uiSrc/services'
46
import EnablementAreaContext from 'uiSrc/pages/workbench/contexts/enablementAreaContext'
7+
import { getFileInfo } from 'uiSrc/pages/workbench/components/enablament-area/EnablementArea/utils/getFileInfo'
58

69
import CodeButton from '../CodeButton'
710

@@ -22,7 +25,8 @@ const LazyCodeButton = ({ path = '', ...rest }: Props) => {
2225
const { data, status } = await resourcesService.get<string>(path)
2326
if (isStatusSuccessful(status)) {
2427
setLoading(false)
25-
setScript(data)
28+
const pageInfo = getFileInfo(path)
29+
setScript(data, pageInfo.location, startCase(pageInfo.name))
2630
}
2731
} catch (error) {
2832
setLoading(false)

redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementArea/utils/formatter/FormatSelector.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@ import { IFormatter } from './formatter.interfaces'
22
import MarkdownToJsxString from './MarkdownToJsxString'
33
import HtmlToJsxString from './HtmlToJsxString'
44

5-
enum FilesFormat {
5+
export enum FileExtension {
66
Html = 'html',
77
Markdown = 'md'
88
}
99

1010
class FormatSelector {
1111
private static formatters = {
12-
[FilesFormat.Html]: HtmlToJsxString,
13-
[FilesFormat.Markdown]: MarkdownToJsxString,
12+
[FileExtension.Html]: new HtmlToJsxString(),
13+
[FileExtension.Markdown]: new MarkdownToJsxString(),
1414
}
1515

16-
static selectFor(fileFormat: string): IFormatter {
17-
const FormatterFactory = FormatSelector.formatters[fileFormat as FilesFormat]
16+
static selectFor(extension: string): IFormatter {
17+
const FormatterFactory = FormatSelector.formatters[extension as FileExtension]
1818
if (FormatterFactory) {
19-
return new FormatterFactory()
19+
return FormatterFactory
2020
}
2121
throw new Error('Unsupported format')
2222
}

redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementAreaWrapper.spec.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react'
22
import { cloneDeep } from 'lodash'
33
import { instance, mock } from 'ts-mockito'
4-
import { cleanup, clearStoreActions, mockedStore, render } from 'uiSrc/utils/test-utils'
4+
import { cleanup, clearStoreActions, mockedEAFormatSelector, mockedStore, render } from 'uiSrc/utils/test-utils'
55
import { getWBEnablementArea } from 'uiSrc/slices/workbench/wb-enablement-area'
66
import EnablementAreaWrapper, { Props } from './EnablementAreaWrapper'
77

@@ -25,6 +25,10 @@ jest.mock('uiSrc/slices/workbench/wb-enablement-area', () => {
2525
}
2626
})
2727

28+
jest.mock('./EnablementArea/utils/formatter/FormatSelector', () => {
29+
return mockedEAFormatSelector
30+
})
31+
2832
describe('EnablementAreaWrapper', () => {
2933
it('should render and call getWBEnablementArea action', () => {
3034
const expectedActions = [getWBEnablementArea()]

redisinsight/ui/src/pages/workbench/components/enablament-area/EnablementAreaWrapper.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,18 @@ const EnablementAreaWrapper = React.memo(({ scriptEl, setScript }: Props) => {
2525
dispatch(fetchEnablementArea())
2626
}, [])
2727

28-
const sendEventButtonClickedTelemetry = (path: string = '') => {
28+
const sendEventButtonClickedTelemetry = (data: Record<string, any>) => {
2929
sendEventTelemetry({
3030
event: TelemetryEvent.WORKBENCH_ENABLEMENT_AREA_COMMAND_CLICKED,
3131
eventData: {
32-
path,
3332
databaseId: instanceId,
33+
...data,
3434
}
3535
})
3636
}
3737

38-
const openScript = (script: string, path: string) => {
39-
sendEventButtonClickedTelemetry(path)
38+
const openScript = (script: string, path?: string, name?: string) => {
39+
sendEventButtonClickedTelemetry({ path, name })
4040
setScript(script)
4141

4242
setTimeout(() => {

redisinsight/ui/src/pages/workbench/contexts/enablementAreaContext.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react'
22

33
interface IContext {
4-
setScript: (script: string) => void;
4+
setScript: (script: string, path?: string, name?: string) => void;
55
openPage: (page: IInternalPage) => void;
66
}
77
export interface IInternalPage {

0 commit comments

Comments
 (0)