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 ' ;
33import { Perspective } from '@console/dynamic-plugin-sdk' ;
44import { LoadedExtension } from '@console/plugin-sdk' ;
55import { 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
2321const mockPerspectives = [
2422 {
@@ -41,18 +39,24 @@ const mockPerspectives = [
4139
4240const setActivePerspective = jest . fn ( ) ;
4341
42+ const useLocationMock = useLocation as jest . Mock ;
43+
4444describe ( '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} ) ;
0 commit comments