Skip to content

Commit a9e672e

Browse files
authored
#RI-6379 - refactor cli output (#4176)
* #RI-6379 - refactor cli output * #RI-6379 - fix tests
1 parent fcfad96 commit a9e672e

File tree

21 files changed

+366
-375
lines changed

21 files changed

+366
-375
lines changed

redisinsight/ui/src/components/cli/CliWrapper.spec.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { cloneDeep } from 'lodash'
22
import React from 'react'
3-
import { InitOutputText } from 'uiSrc/constants/cliOutput'
3+
import { InitOutputText } from 'uiSrc/components/messages/cli-output/cliOutput'
44
import { concatToOutput } from 'uiSrc/slices/cli/cli-output'
55
import { setCliEnteringCommand } from 'uiSrc/slices/cli/cli-settings'
66
import { cleanup, clearStoreActions, mockedStore, render } from 'uiSrc/utils/test-utils'

redisinsight/ui/src/components/cli/components/cli-body/CliBodyWrapper.spec.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,10 @@ import {
1010
clearStoreActions,
1111
} from 'uiSrc/utils/test-utils'
1212

13-
import {
14-
processUnsupportedCommand,
15-
sendCliClusterCommandAction,
16-
} from 'uiSrc/slices/cli/cli-output'
13+
import { sendCliClusterCommandAction } from 'uiSrc/slices/cli/cli-output'
1714
import { processCliClient } from 'uiSrc/slices/cli/cli-settings'
1815
import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances'
16+
import { processUnsupportedCommand } from 'uiSrc/utils/cliOutputActions'
1917

2018
import CliBodyWrapper from './CliBodyWrapper'
2119

redisinsight/ui/src/components/cli/components/cli-body/CliBodyWrapper.tsx

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,16 @@ import {
1616
outputSelector,
1717
sendCliCommandAction,
1818
sendCliClusterCommandAction,
19-
processUnsupportedCommand,
20-
processUnrepeatableNumber,
2119
} from 'uiSrc/slices/cli/cli-output'
2220
import { CommandMonitor, CommandPSubscribe, CommandSubscribe, CommandHello3, Pages } from 'uiSrc/constants'
2321
import { getCommandRepeat, isRepeatCountCorrect } from 'uiSrc/utils'
2422
import { ConnectionType } from 'uiSrc/slices/interfaces'
2523
import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances'
2624
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
2725
import { checkUnsupportedCommand, clearOutput, cliCommandOutput } from 'uiSrc/utils/cliHelper'
28-
import { cliTexts } from 'uiSrc/constants/cliOutput'
26+
import { cliTexts, ConnectionSuccessOutputText, InitOutputText } from 'uiSrc/components/messages/cli-output/cliOutput'
2927
import { showMonitor } from 'uiSrc/slices/cli/monitor'
30-
import UseProfilerLink from 'uiSrc/components/monitor/UseProfilerLink'
31-
28+
import { cliCommandError, processUnrepeatableNumber, processUnsupportedCommand } from 'uiSrc/utils/cliOutputActions'
3229
import CliBody from './CliBody'
3330

3431
import styles from './CliBody/styles.module.scss'
@@ -48,11 +45,22 @@ const CliBodyWrapper = () => {
4845
matchedCommand,
4946
cliClientUuid,
5047
} = useSelector(cliSettingsSelector)
51-
const { connectionType } = useSelector(connectedInstanceSelector)
48+
const { connectionType, host, port, db } = useSelector(connectedInstanceSelector)
5249
const { db: currentDbIndex } = useSelector(outputSelector)
5350

5451
useEffect(() => {
55-
!cliClientUuid && dispatch(createCliClientAction(instanceId, handleWorkbenchClick))
52+
if (!cliClientUuid) {
53+
dispatch(createCliClientAction(
54+
instanceId,
55+
() => {
56+
dispatch(concatToOutput(ConnectionSuccessOutputText))
57+
},
58+
(errorMessage: string) => {
59+
dispatch(concatToOutput(cliTexts.CLI_ERROR_MESSAGE(errorMessage)))
60+
}
61+
))
62+
dispatch(concatToOutput(InitOutputText(host, port, db, !data.length, handleWorkbenchClick)))
63+
}
5664
}, [])
5765

5866
useEffect(() => {
@@ -88,16 +96,15 @@ const CliBodyWrapper = () => {
8896
dispatch(concatToOutput(cliCommandOutput(decode(command), currentDbIndex)))
8997

9098
if (!isRepeatCountCorrect(countRepeat)) {
91-
dispatch(processUnrepeatableNumber(commandLine, resetCommand))
99+
processUnrepeatableNumber(commandLine, resetCommand)
92100
return
93101
}
94102

95103
// Flow if MONITOR command was executed
96104
if (checkUnsupportedCommand([CommandMonitor.toLowerCase()], commandLine)) {
97-
dispatch(concatToOutput([
98-
<UseProfilerLink onClick={() => { dispatch(showMonitor()) }} />,
99-
'\n'
100-
]))
105+
dispatch(
106+
concatToOutput([cliTexts.MONITOR_COMMAND(() => { dispatch(showMonitor()) }), '\n'])
107+
)
101108
resetCommand()
102109
return
103110
}
@@ -111,7 +118,9 @@ const CliBodyWrapper = () => {
111118

112119
// Flow if SUBSCRIBE command was executed
113120
if (checkUnsupportedCommand([CommandSubscribe.toLowerCase()], commandLine)) {
114-
dispatch(concatToOutput(cliTexts.SUBSCRIBE_COMMAND_CLI(Pages.pubSub(instanceId))))
121+
dispatch(
122+
concatToOutput([cliTexts.SUBSCRIBE_COMMAND_CLI(Pages.pubSub(instanceId)), '\n'])
123+
)
115124
resetCommand()
116125
return
117126
}
@@ -124,7 +133,7 @@ const CliBodyWrapper = () => {
124133
}
125134

126135
if (unsupportedCommand) {
127-
dispatch(processUnsupportedCommand(commandLine, unsupportedCommand, resetCommand))
136+
processUnsupportedCommand(commandLine, unsupportedCommand, resetCommand)
128137
return
129138
}
130139

@@ -141,11 +150,11 @@ const CliBodyWrapper = () => {
141150
}
142151
})
143152
if (connectionType !== ConnectionType.Cluster) {
144-
dispatch(sendCliCommandAction(command, resetCommand))
153+
dispatch(sendCliCommandAction(command, resetCommand, (error) => cliCommandError(error, command)))
145154
return
146155
}
147156

148-
dispatch(sendCliClusterCommandAction(command, resetCommand))
157+
dispatch(sendCliClusterCommandAction(command, resetCommand, (error) => cliCommandError(error, command)))
149158
}
150159

151160
const resetCommand = () => {

redisinsight/ui/src/components/feature-flag-component/FeatureFlagComponent.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
import { isArray } from 'lodash'
33
import { useSelector } from 'react-redux'
4-
import { FeatureFlags } from 'uiSrc/constants'
4+
import { FeatureFlags } from 'uiSrc/constants/featureFlags'
55
import { appFeatureFlagsFeaturesSelector } from 'uiSrc/slices/app/features'
66

77
export interface Props {
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import { cloneDeep, set } from 'lodash'
2+
import { render, screen, fireEvent, initialStateDefault, mockStore } from 'uiSrc/utils/test-utils'
3+
4+
import { FeatureFlags } from 'uiSrc/constants'
5+
import { cliTexts } from './cliOutput'
6+
7+
describe('cliTexts', () => {
8+
describe('Feature flag dependend', () => {
9+
describe('MONITOR_COMMAND', () => {
10+
it('should render proper content with flag disabled', async () => {
11+
const initialStoreState = set(
12+
cloneDeep(initialStateDefault),
13+
`app.features.featureFlags.features.${FeatureFlags.envDependent}`,
14+
{ flag: false }
15+
)
16+
17+
const onClick = jest.fn()
18+
19+
render(cliTexts.MONITOR_COMMAND(onClick), {
20+
store: mockStore(initialStoreState)
21+
})
22+
23+
expect(screen.getByTestId('user-profiler-link-disabled')).toBeInTheDocument()
24+
})
25+
26+
it('should render proper content with flag enabled', () => {
27+
const initialStoreState = set(
28+
cloneDeep(initialStateDefault),
29+
`app.features.featureFlags.features.${FeatureFlags.envDependent}`,
30+
{ flag: true }
31+
)
32+
33+
const onClick = jest.fn()
34+
35+
render(cliTexts.MONITOR_COMMAND(onClick), {
36+
store: mockStore(initialStoreState)
37+
})
38+
39+
fireEvent.click(screen.getByTestId('monitor-btn'))
40+
expect(onClick).toBeCalled()
41+
})
42+
})
43+
44+
describe('SUBSCRIBE_COMMAND_CLI', () => {
45+
it('should render proper content with flag disabled', async () => {
46+
const initialStoreState = set(
47+
cloneDeep(initialStateDefault),
48+
`app.features.featureFlags.features.${FeatureFlags.envDependent}`,
49+
{ flag: false }
50+
)
51+
52+
render(cliTexts.SUBSCRIBE_COMMAND_CLI(), {
53+
store: mockStore(initialStoreState)
54+
})
55+
56+
expect(screen.getByTestId('user-pub-sub-link-disabled')).toBeInTheDocument()
57+
expect(screen.queryByTestId('user-pub-sub-link')).not.toBeInTheDocument()
58+
})
59+
60+
it('should render proper content with flag enabled', () => {
61+
const initialStoreState = set(
62+
cloneDeep(initialStateDefault),
63+
`app.features.featureFlags.features.${FeatureFlags.envDependent}`,
64+
{ flag: true }
65+
)
66+
67+
render(cliTexts.SUBSCRIBE_COMMAND_CLI(), {
68+
store: mockStore(initialStoreState)
69+
})
70+
71+
expect(screen.getByTestId('user-pub-sub-link')).toBeInTheDocument()
72+
expect(screen.queryByTestId('user-pub-sub-link-disabled')).not.toBeInTheDocument()
73+
})
74+
})
75+
})
76+
})

redisinsight/ui/src/constants/cliOutput.tsx renamed to redisinsight/ui/src/components/messages/cli-output/cliOutput.tsx

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,8 @@ import { EuiLink, EuiTextColor } from '@elastic/eui'
22
import React, { Fragment } from 'react'
33
import { getRouterLinkProps } from 'uiSrc/services'
44
import { getDbIndex } from 'uiSrc/utils'
5-
import UsePubSubLink from 'uiSrc/components/pub-sub/UsePubSubLink'
6-
7-
export const ClearCommand = 'clear'
8-
export const SelectCommand = 'select'
9-
10-
export enum CliOutputFormatterType {
11-
Text = 'TEXT',
12-
Raw = 'RAW',
13-
}
5+
import { FeatureFlagComponent } from 'uiSrc/components'
6+
import { FeatureFlags } from 'uiSrc/constants/featureFlags'
147

158
export const InitOutputText = (
169
host: string = '',
@@ -77,11 +70,46 @@ export const cliTexts = {
7770
'\n',
7871
]
7972
),
73+
MONITOR_NOT_SUPPORTED_ENV: (
74+
<div className="cli-output-response-fail" data-testid="user-profiler-link-disabled">
75+
Monitor not supported in this environment.
76+
</div>
77+
),
78+
USE_PROFILER_TOOL: (onClick: () => void) => (
79+
<EuiTextColor color="danger" key={Date.now()}>
80+
{'Use '}
81+
<EuiLink onClick={onClick} className="btnLikeLink" color="text" data-testid="monitor-btn">
82+
Profiler
83+
</EuiLink>
84+
{' tool to see all the requests processed by the server.'}
85+
</EuiTextColor>
86+
),
87+
MONITOR_COMMAND: (onClick: () => void) => (
88+
<FeatureFlagComponent
89+
name={FeatureFlags.envDependent}
90+
otherwise={cliTexts.MONITOR_NOT_SUPPORTED_ENV}
91+
>
92+
{cliTexts.USE_PROFILER_TOOL(onClick)}
93+
</FeatureFlagComponent>
94+
),
95+
PUB_SUB_NOT_SUPPORTED_ENV: (
96+
<div className="cli-output-response-fail" data-testid="user-pub-sub-link-disabled">
97+
PubSub not supported in this environment.
98+
</div>
99+
),
100+
USE_PUB_SUB_TOOL: (path: string = '') => (
101+
<EuiTextColor color="danger" key={Date.now()} data-testid="user-pub-sub-link">
102+
{'Use '}
103+
<EuiLink {...getRouterLinkProps(path)} color="text" data-test-subj="pubsub-page-btn">
104+
Pub/Sub
105+
</EuiLink>
106+
{' tool to subscribe to channels.'}
107+
</EuiTextColor>
108+
),
80109
SUBSCRIBE_COMMAND_CLI: (path: string = '') => (
81-
[
82-
<UsePubSubLink path={path} />,
83-
'\n',
84-
]
110+
<FeatureFlagComponent name={FeatureFlags.envDependent} otherwise={cliTexts.PUB_SUB_NOT_SUPPORTED_ENV}>
111+
{cliTexts.USE_PUB_SUB_TOOL(path)}
112+
</FeatureFlagComponent>
85113
),
86114
HELLO3_COMMAND: () => (
87115
<EuiTextColor color="danger" key={Date.now()}>

redisinsight/ui/src/components/monitor/MonitorWrapper.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import React from 'react'
22
import { useDispatch, useSelector } from 'react-redux'
33
import { useParams } from 'react-router-dom'
44

5-
import { EuiTextColor } from '@elastic/eui'
65
import { monitorSelector, startMonitor, togglePauseMonitor } from 'uiSrc/slices/cli/monitor'
76
import { cliSettingsSelector } from 'uiSrc/slices/cli/cli-settings'
87
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'

redisinsight/ui/src/components/monitor/UseProfilerLink/UseProfilerLink.spec.tsx

Lines changed: 0 additions & 57 deletions
This file was deleted.

redisinsight/ui/src/components/monitor/UseProfilerLink/UseProfilerLink.tsx

Lines changed: 0 additions & 25 deletions
This file was deleted.

redisinsight/ui/src/components/monitor/UseProfilerLink/index.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)