Skip to content

Commit fcfad96

Browse files
authored
Merge pull request #4166 from RedisInsight/fe/bugfix/CR-220-do-not-reference-pub-sub
CR-220 do not reference pub sub
2 parents 114a78b + 68eb629 commit fcfad96

File tree

9 files changed

+100
-25
lines changed

9 files changed

+100
-25
lines changed

redisinsight/ui/src/components/main-router/constants/defaultRoutes.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ const INSTANCE_ROUTES: IRoute[] = [
5252
pageName: PageNames.pubSub,
5353
path: Pages.pubSub(':instanceId'),
5454
component: LAZY_LOAD ? LazyPubSubPage : PubSubPage,
55+
featureFlag: FeatureFlags.envDependent
5556
},
5657
...getRouteIncludedByEnv([{
5758
path: Pages.analytics(':instanceId'),

redisinsight/ui/src/components/onboarding-features/OnboardingFeatures.spec.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
appFeatureFlagsFeaturesSelector,
1010
appFeatureOnboardingSelector,
1111
setOnboardNextStep,
12-
setOnboardPrevStep
12+
setOnboardPrevStep,
1313
} from 'uiSrc/slices/app/features'
1414
import { keysDataSelector } from 'uiSrc/slices/browser/keys'
1515
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'

redisinsight/ui/src/components/onboarding-tour/OnboardingTourWrapper.spec.tsx

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from 'react'
22
import { render, screen } from 'uiSrc/utils/test-utils'
33

4-
import { appFeatureOnboardingSelector } from 'uiSrc/slices/app/features'
4+
import * as featureSlice from 'uiSrc/slices/app/features'
55
import OnboardingTourWrapper from './OnboardingTourWrapper'
66

77
const mockedOptions = {
@@ -12,14 +12,11 @@ const mockedOptions = {
1212
})
1313
}
1414

15-
jest.mock('uiSrc/slices/app/features', () => ({
16-
...jest.requireActual('uiSrc/slices/app/features'),
17-
appFeatureOnboardingSelector: jest.fn().mockReturnValue({
18-
currentStep: 2,
19-
isActive: true,
20-
totalSteps: 10
21-
})
22-
}))
15+
jest.spyOn(featureSlice, 'appFeatureOnboardingSelector').mockReturnValue({
16+
currentStep: 2,
17+
isActive: true,
18+
totalSteps: 10
19+
})
2320

2421
describe('OnboardingTourWrapper', () => {
2522
it('should render', () => {
@@ -33,7 +30,7 @@ describe('OnboardingTourWrapper', () => {
3330
})
3431

3532
it('should not render tour with isActive = false', () => {
36-
(appFeatureOnboardingSelector as jest.Mock).mockReturnValue({
33+
(featureSlice.appFeatureOnboardingSelector as jest.Mock).mockReturnValue({
3734
currentStep: 2,
3835
isActive: false,
3936
totalSteps: 10
@@ -45,7 +42,7 @@ describe('OnboardingTourWrapper', () => {
4542
})
4643

4744
it('should not render tour with isActive = true & different step', () => {
48-
(appFeatureOnboardingSelector as jest.Mock).mockReturnValue({
45+
(featureSlice.appFeatureOnboardingSelector as jest.Mock).mockReturnValue({
4946
currentStep: 3,
5047
isActive: true,
5148
totalSteps: 10
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { cloneDeep, set } from 'lodash'
2+
import React from 'react'
3+
import { initialStateDefault, mockStore, render, screen } from 'uiSrc/utils/test-utils'
4+
import { FeatureFlags } from 'uiSrc/constants'
5+
import UsePubSubLink from './UsePubSubLink'
6+
7+
const props = {
8+
path: '/pub-sub',
9+
}
10+
11+
describe('UsePubSubLink', () => {
12+
it('should render', () => {
13+
expect(render(<UsePubSubLink {...props} />)).toBeTruthy()
14+
})
15+
16+
it('should show the link when envDependent.flag = true', () => {
17+
render(<UsePubSubLink {...props} />)
18+
19+
expect(screen.getByTestId('user-pub-sub-link')).toBeInTheDocument()
20+
})
21+
22+
it('should show feature dependent items when feature flag is on', async () => {
23+
const initialStoreState = set(
24+
cloneDeep(initialStateDefault),
25+
`app.features.featureFlags.features.${FeatureFlags.envDependent}`,
26+
{ flag: true }
27+
)
28+
29+
render(<UsePubSubLink {...props} />, {
30+
store: mockStore(initialStoreState)
31+
})
32+
expect(screen.queryByTestId('user-pub-sub-link')).toBeInTheDocument()
33+
expect(screen.queryByTestId('user-pub-sub-link-disabled')).not.toBeInTheDocument()
34+
})
35+
36+
it('should hide feature dependent items when feature flag is off', async () => {
37+
const initialStoreState = set(
38+
cloneDeep(initialStateDefault),
39+
`app.features.featureFlags.features.${FeatureFlags.envDependent}`,
40+
{ flag: false }
41+
)
42+
43+
render(<UsePubSubLink {...props} />, {
44+
store: mockStore(initialStoreState)
45+
})
46+
expect(screen.queryByTestId('user-pub-sub-link')).not.toBeInTheDocument()
47+
expect(screen.queryByTestId('user-pub-sub-link-disabled')).toBeInTheDocument()
48+
})
49+
})
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import React from 'react'
2+
import { EuiLink, EuiTextColor } from '@elastic/eui'
3+
import { useSelector } from 'react-redux'
4+
import { FeatureFlags } from 'uiSrc/constants/featureFlags'
5+
import { getRouterLinkProps } from 'uiSrc/services'
6+
import { appFeatureFlagsFeaturesSelector } from 'uiSrc/slices/app/features'
7+
8+
export interface Props {
9+
path: string;
10+
}
11+
12+
const UsePubSubLink = ({ path }: Props) => {
13+
const { [FeatureFlags.envDependent]: envDependentFeature } = useSelector(appFeatureFlagsFeaturesSelector)
14+
if (envDependentFeature?.flag === false) {
15+
return (
16+
<div className="cli-output-response-fail" data-testid="user-pub-sub-link-disabled">PubSub not supported
17+
in this environment.
18+
</div>
19+
)
20+
}
21+
return (
22+
<EuiTextColor color="danger" key={Date.now()} data-testid="user-pub-sub-link">
23+
{'Use '}
24+
<EuiLink {...getRouterLinkProps(path)} color="text" data-test-subj="pubsub-page-btn">
25+
Pub/Sub
26+
</EuiLink>
27+
{' tool to subscribe to channels.'}
28+
</EuiTextColor>
29+
)
30+
}
31+
32+
export default UsePubSubLink
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import UsePubSubLink from './UsePubSubLink'
2+
3+
export default UsePubSubLink

redisinsight/ui/src/components/query/query-card/QueryCardCommonResult/components/CommonErrorResponse/CommonErrorResponse.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances'
1818

1919
import { showMonitor } from 'uiSrc/slices/cli/monitor'
2020
import UseProfilerLink from 'uiSrc/components/monitor/UseProfilerLink'
21+
import UsePubSubLink from 'uiSrc/components/pub-sub/UsePubSubLink'
2122

2223
const CommonErrorResponse = (id: string, command = '', result?: any) => {
2324
const { instanceId = '' } = useParams<{ instanceId: string }>()
@@ -33,7 +34,7 @@ const CommonErrorResponse = (id: string, command = '', result?: any) => {
3334
}
3435
// Flow if SUBSCRIBE command was executed
3536
if (checkUnsupportedCommand([CommandSubscribe.toLowerCase()], commandLine)) {
36-
return cliTexts.SUBSCRIBE_COMMAND(Pages.pubSub(instanceId))
37+
return <UsePubSubLink path={Pages.pubSub(instanceId)} />
3738
}
3839
// Flow if PSUBSCRIBE command was executed
3940
if (checkUnsupportedCommand([CommandPSubscribe.toLowerCase()], commandLine)) {

redisinsight/ui/src/constants/cliOutput.tsx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ 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'
56

67
export const ClearCommand = 'clear'
78
export const SelectCommand = 'select'
@@ -70,15 +71,6 @@ export const cliTexts = {
7071
{' to see the messages published to all channels in your database.'}
7172
</EuiTextColor>
7273
),
73-
SUBSCRIBE_COMMAND: (path: string = '') => (
74-
<EuiTextColor color="danger" key={Date.now()}>
75-
{'Use '}
76-
<EuiLink {...getRouterLinkProps(path)} color="text" data-test-subj="pubsub-page-btn">
77-
Pub/Sub
78-
</EuiLink>
79-
{' tool to subscribe to channels.'}
80-
</EuiTextColor>
81-
),
8274
PSUBSCRIBE_COMMAND_CLI: (path: string = '') => (
8375
[
8476
cliTexts.PSUBSCRIBE_COMMAND(path),
@@ -87,7 +79,7 @@ export const cliTexts = {
8779
),
8880
SUBSCRIBE_COMMAND_CLI: (path: string = '') => (
8981
[
90-
cliTexts.SUBSCRIBE_COMMAND(path),
82+
<UsePubSubLink path={path} />,
9183
'\n',
9284
]
9385
),

redisinsight/ui/src/utils/routerWithSubRoutes.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Redirect, Route } from 'react-router-dom'
33
import { useSelector } from 'react-redux'
44
import { userSettingsSelector } from 'uiSrc/slices/user/user-settings'
55
import { appFeatureFlagsFeaturesSelector } from 'uiSrc/slices/app/features'
6-
import { IRoute, FeatureFlags } from 'uiSrc/constants'
6+
import { IRoute, FeatureFlags, Pages } from 'uiSrc/constants'
77

88
const PrivateRoute = (route: IRoute) => {
99
const { path, exact, routes, featureFlag, redirect } = route
@@ -29,7 +29,7 @@ const PrivateRoute = (route: IRoute) => {
2929
}
3030

3131
return haveToAcceptAgreements || feature?.flag === false
32-
? <Redirect to="/" />
32+
? <Redirect to={Pages.notFound} />
3333
: (
3434
// pass the sub-routes down to keep nesting
3535
// @ts-ignore

0 commit comments

Comments
 (0)