Skip to content

Commit 5b067ea

Browse files
Merge pull request #15760 from logonoff/OCPBUGS-65930-release-4.19-preserve-search
[release-4.19] OCPBUGS-65930: Preserve query string in perspective switch + remove dev console folks from `reviewers`
2 parents 2545c7f + dda94bd commit 5b067ea

File tree

26 files changed

+91
-151
lines changed

26 files changed

+91
-151
lines changed

frontend/OWNERS

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
reviewers:
2+
- cajieh
23
- jhadvig
3-
- kyoto
4+
- krishagarwal278
5+
- Leo6Leo
46
- rhamilto
7+
- sg00dwin
58
- spadgett
69
- TheRealJon
7-
- cajieh
8-
- Mylanos
910
approvers:
10-
- christoph-jerolimov
1111
- cajieh
12-
- invincibleJai
1312
- jhadvig
14-
- kyoto
13+
- logonoff
1514
- rawagner
1615
- rhamilto
1716
- spadgett
1817
- vikram-raj
1918
- vojtechszocs
20-
- logonoff
21-
- Mylanos

frontend/integration-tests/OWNERS

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
reviewers:
2-
- sanketpathak
3-
- the-anton
42
- yapei
53
approvers:
64
- jrichter1

frontend/packages/console-app/src/components/detect-perspective/DetectPerspective.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import * as React from 'react';
2-
import { useLocation } from 'react-router-dom-v5-compat';
1+
import { FC, useEffect } from 'react';
2+
import { createPath, useLocation } from 'react-router-dom-v5-compat';
33
import { Perspective, PerspectiveContext } from '@console/dynamic-plugin-sdk';
44
import { usePerspectives } from '@console/shared/src';
55
import PerspectiveDetector from './PerspectiveDetector';
@@ -19,14 +19,14 @@ const getPerspectiveURLParam = (perspectives: Perspective[]) => {
1919
return perspectiveIDs.includes(perspectiveParam) ? perspectiveParam : null;
2020
};
2121

22-
const DetectPerspective: React.FC<DetectPerspectiveProps> = ({ children }) => {
22+
const DetectPerspective: FC<DetectPerspectiveProps> = ({ children }) => {
2323
const [activePerspective, setActivePerspective, loaded] = useValuesForPerspectiveContext();
2424
const perspectiveExtensions = usePerspectives();
2525
const perspectiveParam = getPerspectiveURLParam(perspectiveExtensions);
2626
const location = useLocation();
27-
React.useEffect(() => {
27+
useEffect(() => {
2828
if (perspectiveParam && perspectiveParam !== activePerspective) {
29-
setActivePerspective(perspectiveParam, location.pathname);
29+
setActivePerspective(perspectiveParam, createPath(location));
3030
}
3131
}, [perspectiveParam, activePerspective, setActivePerspective, location]);
3232
return loaded ? (

frontend/packages/console-app/src/components/detect-perspective/PerspectiveDetector.tsx

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import * as React from 'react';
2-
import { useLocation } from 'react-router';
1+
import { FC, useEffect, useState } from 'react';
2+
import { useLocation, createPath } from 'react-router-dom-v5-compat';
33
import { Perspective, ResolvedExtension } from '@console/dynamic-plugin-sdk';
44
import { usePerspectives } from '@console/shared/src';
55

@@ -16,13 +16,13 @@ type PerspectiveDetectorProps = {
1616
setActivePerspective: (perspective: string, next: string) => void;
1717
};
1818

19-
const Detector: React.FC<DetectorProps> = ({
19+
const Detector: FC<DetectorProps> = ({
2020
setActivePerspective,
2121
perspectiveExtensions,
2222
detectors,
2323
}) => {
24-
const { pathname } = useLocation() ?? {};
25-
let detectedPerspective: string;
24+
const location = useLocation();
25+
let detectedPerspective: string | undefined;
2626
const defaultPerspective =
2727
perspectiveExtensions.find((p) => p.properties.default) || perspectiveExtensions[0];
2828
const detectionResults = detectors.map((detector) => detector?.());
@@ -38,31 +38,31 @@ const Detector: React.FC<DetectorProps> = ({
3838
return true;
3939
});
4040

41-
React.useEffect(() => {
41+
useEffect(() => {
4242
if (detectedPerspective) {
43-
setActivePerspective(detectedPerspective, pathname);
43+
setActivePerspective(detectedPerspective, createPath(location));
4444
} else if (defaultPerspective && (detectors.length < 1 || detectionComplete)) {
45-
// set default perspective if there are no detectors or none of the detections were successfull
46-
setActivePerspective(defaultPerspective.properties.id, pathname);
45+
// set default perspective if there are no detectors or none of the detections were successful
46+
setActivePerspective(defaultPerspective.properties.id, createPath(location));
4747
}
4848
}, [
4949
defaultPerspective,
5050
detectedPerspective,
5151
detectionComplete,
5252
detectors.length,
53-
pathname,
53+
location,
5454
setActivePerspective,
5555
]);
5656

5757
return null;
5858
};
5959

60-
const PerspectiveDetector: React.FC<PerspectiveDetectorProps> = ({ setActivePerspective }) => {
60+
const PerspectiveDetector: FC<PerspectiveDetectorProps> = ({ setActivePerspective }) => {
6161
const perspectiveExtensions = usePerspectives();
62-
const [detectors, setDetectors] = React.useState<
62+
const [detectors, setDetectors] = useState<
6363
(undefined | ResolvedExtension<Perspective>['properties']['usePerspectiveDetection'])[]
6464
>();
65-
React.useEffect(() => {
65+
useEffect(() => {
6666
let resolveCount = 0;
6767
const resolvedDetectors: ResolvedExtension<
6868
Perspective

frontend/packages/console-app/src/components/detect-perspective/__tests__/PerspectiveDetector.spec.tsx

Lines changed: 63 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { mount } from 'enzyme';
2-
import { act } from 'react-dom/test-utils';
1+
import { render, waitFor } from '@testing-library/react';
2+
import { useLocation } from 'react-router-dom-v5-compat';
33
import { Perspective } from '@console/dynamic-plugin-sdk';
44
import { LoadedExtension } from '@console/plugin-sdk';
55
import { usePerspectives } from '@console/shared/src';
@@ -13,12 +13,10 @@ jest.mock('@console/shared/src', () => ({
1313
usePerspectives: jest.fn(),
1414
}));
1515

16-
jest.mock('react-router', () => {
17-
return {
18-
...jest.requireActual('react-router'),
19-
useLocation: jest.fn(() => ({ pathname: '' })),
20-
};
21-
});
16+
jest.mock('react-router-dom-v5-compat', () => ({
17+
...jest.requireActual('react-router-dom-v5-compat'),
18+
useLocation: jest.fn(() => ({ pathname: '' })),
19+
}));
2220

2321
const mockPerspectives = [
2422
{
@@ -41,18 +39,24 @@ const mockPerspectives = [
4139

4240
const setActivePerspective = jest.fn();
4341

42+
const useLocationMock = useLocation as jest.Mock;
43+
4444
describe('PerspectiveDetector', () => {
45-
it('should set default perspective if there are no perspective detectors available', async () => {
45+
beforeEach(() => {
46+
setActivePerspective.mockClear();
47+
});
48+
49+
it('should set default perspective when there are no perspective detectors available', async () => {
4650
(usePerspectives as jest.Mock).mockImplementation(() => mockPerspectives);
4751

48-
const wrapper = mount(<PerspectiveDetector setActivePerspective={setActivePerspective} />);
49-
expect(wrapper.isEmptyRender()).toBe(true);
50-
expect(setActivePerspective).toHaveBeenCalledWith('admin', '');
52+
render(<PerspectiveDetector setActivePerspective={setActivePerspective} />);
53+
54+
await waitFor(() => {
55+
expect(setActivePerspective).toHaveBeenCalledWith('admin', '');
56+
});
5157
});
5258

53-
it('should set detected perspective if detection is successful', async () => {
54-
// create a promise and capture the resolver such that we can use act later on to ensure
55-
// the test waits for this promise to resolve before continuing
59+
it('should set detected perspective when detection is successful', async () => {
5660
let promiseResolver: (value: () => [boolean, boolean]) => void;
5761
const testPromise = new Promise<() => [boolean, boolean]>(
5862
(resolver) => (promiseResolver = resolver),
@@ -61,17 +65,16 @@ describe('PerspectiveDetector', () => {
6165

6266
(usePerspectives as jest.Mock).mockImplementation(() => mockPerspectives);
6367

64-
const wrapper = mount(<PerspectiveDetector setActivePerspective={setActivePerspective} />);
65-
await act(async () => {
66-
promiseResolver(() => [true, false]);
68+
render(<PerspectiveDetector setActivePerspective={setActivePerspective} />);
69+
70+
promiseResolver(() => [true, false]);
71+
72+
await waitFor(() => {
73+
expect(setActivePerspective).toHaveBeenCalledWith('dev', '');
6774
});
68-
expect(wrapper.isEmptyRender()).toBe(true);
69-
expect(setActivePerspective).toHaveBeenCalledWith('dev', '');
7075
});
7176

72-
it('should set default perspective if detection fails', async () => {
73-
// create a promise and capture the resolver such that we can use act later on to ensure
74-
// the test waits for this promise to resolve before continuing
77+
it('should set default perspective when detection fails', async () => {
7578
let promiseResolver: (value: () => [boolean, boolean]) => void;
7679
const testPromise = new Promise<() => [boolean, boolean]>(
7780
(resolver) => (promiseResolver = resolver),
@@ -80,15 +83,16 @@ describe('PerspectiveDetector', () => {
8083

8184
(usePerspectives as jest.Mock).mockImplementation(() => mockPerspectives);
8285

83-
const wrapper = mount(<PerspectiveDetector setActivePerspective={setActivePerspective} />);
84-
await act(async () => {
85-
promiseResolver(() => [false, false]);
86+
render(<PerspectiveDetector setActivePerspective={setActivePerspective} />);
87+
88+
promiseResolver(() => [false, false]);
89+
90+
await waitFor(() => {
91+
expect(setActivePerspective).toHaveBeenCalledWith('admin', '');
8692
});
87-
expect(wrapper.isEmptyRender()).toBe(true);
88-
expect(setActivePerspective).toHaveBeenCalledWith('admin', '');
8993
});
9094

91-
it('should set admin as default perspective if all perspectives are disabled', async () => {
95+
it('should set admin as default perspective when all perspectives are disabled', async () => {
9296
const perspectives: PerspectiveType[] = [
9397
{
9498
id: 'dev',
@@ -118,8 +122,7 @@ describe('PerspectiveDetector', () => {
118122
},
119123
];
120124
window.SERVER_FLAGS.perspectives = JSON.stringify(perspectives);
121-
// create a promise and capture the resolver such that we can use act later on to ensure
122-
// the test waits for this promise to resolve before continuing
125+
123126
let promiseResolver: (value: () => [boolean, boolean]) => void;
124127
const testPromise = new Promise<() => [boolean, boolean]>(
125128
(resolver) => (promiseResolver = resolver),
@@ -128,11 +131,35 @@ describe('PerspectiveDetector', () => {
128131

129132
(usePerspectives as jest.Mock).mockImplementation(() => mockPerspectives);
130133

131-
const wrapper = mount(<PerspectiveDetector setActivePerspective={setActivePerspective} />);
132-
await act(async () => {
133-
promiseResolver(() => [false, false]);
134+
render(<PerspectiveDetector setActivePerspective={setActivePerspective} />);
135+
136+
promiseResolver(() => [false, false]);
137+
138+
await waitFor(() => {
139+
expect(setActivePerspective).toHaveBeenCalledWith('admin', '');
140+
});
141+
});
142+
143+
it('preserves query and hash when setting perspective', async () => {
144+
let promiseResolver: (value: () => [boolean, boolean]) => void;
145+
const testPromise = new Promise<() => [boolean, boolean]>(
146+
(resolver) => (promiseResolver = resolver),
147+
);
148+
mockPerspectives[1].properties.usePerspectiveDetection = () => testPromise;
149+
150+
(usePerspectives as jest.Mock).mockImplementation(() => mockPerspectives);
151+
useLocationMock.mockImplementation(() => ({
152+
pathname: '/some/path',
153+
search: '?query=param',
154+
hash: '#some-hash',
155+
}));
156+
157+
render(<PerspectiveDetector setActivePerspective={setActivePerspective} />);
158+
159+
promiseResolver(() => [true, false]);
160+
161+
await waitFor(() => {
162+
expect(setActivePerspective).toHaveBeenCalledWith('dev', '/some/path?query=param#some-hash');
134163
});
135-
expect(wrapper.isEmptyRender()).toBe(true);
136-
expect(setActivePerspective).toHaveBeenCalledWith('admin', '');
137164
});
138165
});

frontend/packages/console-telemetry-plugin/OWNERS

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
reviewers:
2-
- christoph-jerolimov
3-
- lokanandaprabhu
4-
- lucifergene
5-
- vikram-raj
61
approvers:
72
- christoph-jerolimov
83
- debsmita1

frontend/packages/console-telemetry-plugin/integration-tests/OWNERS

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
reviewers:
2-
- sanketpathak
3-
- the-anton
41
approvers:
52
- jrichter1
63
- psrna

frontend/packages/dev-console/OWNERS

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
reviewers:
2-
- jerolimov
3-
- lokanandaprabhu
4-
- lucifergene
5-
- vikram-raj
61
approvers:
72
- debsmita1
83
- divyanshiGupta

frontend/packages/dev-console/integration-tests/OWNERS

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
reviewers:
2-
- sanketpathak
3-
- the-anton
41
approvers:
52
- jrichter1
63
- psrna

frontend/packages/git-service/OWNERS

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
reviewers:
2-
- jerolimov
3-
- lokanandaprabhu
4-
- lucifergene
5-
- vikram-raj
61
approvers:
72
- debsmita1
83
- divyanshiGupta

0 commit comments

Comments
 (0)