This is an automated email from the ASF dual-hosted git repository.

rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new 61bd8f0cf26 chore(deps): bump use-query-params from 1.2.3 to 2.2.2 in 
/superset-frontend (#36997)
61bd8f0cf26 is described below

commit 61bd8f0cf26c14d13eef9cbdbbfeed78699de46f
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
AuthorDate: Sun Feb 1 23:55:39 2026 -0800

    chore(deps): bump use-query-params from 1.2.3 to 2.2.2 in 
/superset-frontend (#36997)
    
    Signed-off-by: dependabot[bot] <[email protected]>
    Signed-off-by: hainenber <[email protected]>
    Co-authored-by: dependabot[bot] 
<49699333+dependabot[bot]@users.noreply.github.com>
    Co-authored-by: hainenber <[email protected]>
---
 superset-frontend/package-lock.json                | 34 +++++++++++++---------
 superset-frontend/package.json                     |  2 +-
 superset-frontend/spec/helpers/ProviderWrapper.tsx | 12 ++++++--
 superset-frontend/spec/helpers/testing-library.tsx |  7 ++++-
 .../src/components/ListView/ListView.test.tsx      | 20 +++++--------
 .../src/embedded/EmbeddedContextProviders.tsx      | 11 +++++--
 .../features/allEntities/AllEntitiesTable.test.tsx |  7 -----
 .../src/features/home/RightMenu.test.tsx           |  2 ++
 .../pages/AlertReportList/AlertReportList.test.jsx |  3 +-
 .../AnnotationLayerList.test.jsx                   |  3 +-
 .../pages/ChartList/ChartList.permissions.test.tsx |  3 +-
 .../src/pages/ChartList/ChartList.test.tsx         | 16 ++++------
 .../src/pages/ChartList/ChartList.testHelpers.tsx  |  9 +++---
 .../pages/CssTemplateList/CssTemplateList.test.jsx |  3 +-
 .../src/pages/DashboardList/DashboardList.test.jsx |  5 ++--
 .../src/pages/GroupsList/GroupsList.test.tsx       | 10 ++++---
 .../src/pages/RolesList/RolesList.test.tsx         |  3 +-
 .../RowLevelSecurityList.test.tsx                  |  3 +-
 .../pages/SavedQueryList/SavedQueryList.test.tsx   |  3 +-
 .../src/pages/UserInfo/UserInfo.test.tsx           |  3 +-
 .../src/pages/UsersList/UsersList.test.tsx         |  3 +-
 .../src/views/RootContextProviders.tsx             | 11 +++++--
 superset-frontend/src/views/menu.tsx               | 12 ++++++--
 23 files changed, 108 insertions(+), 77 deletions(-)

diff --git a/superset-frontend/package-lock.json 
b/superset-frontend/package-lock.json
index 7a13d6b7187..740f2735abb 100644
--- a/superset-frontend/package-lock.json
+++ b/superset-frontend/package-lock.json
@@ -135,7 +135,7 @@
         "urijs": "^1.19.8",
         "use-event-callback": "^0.1.0",
         "use-immer": "^0.11.0",
-        "use-query-params": "^1.1.9",
+        "use-query-params": "^2.2.2",
         "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz";,
         "yargs": "^17.7.2"
       },
@@ -53153,13 +53153,10 @@
       }
     },
     "node_modules/serialize-query-params": {
-      "version": "1.3.6",
-      "resolved": 
"https://registry.npmjs.org/serialize-query-params/-/serialize-query-params-1.3.6.tgz";,
-      "integrity": 
"sha512-VlH7sfWNyPVZClPkRacopn6sn5uQMXBsjPVz1+pBHX895VpcYVznfJtZ49e6jymcrz+l/vowkepCZn/7xEAEdw==",
-      "license": "ISC",
-      "peerDependencies": {
-        "query-string": ">=5.1.1"
-      }
+      "version": "2.0.4",
+      "resolved": 
"https://registry.npmjs.org/serialize-query-params/-/serialize-query-params-2.0.4.tgz";,
+      "integrity": 
"sha512-y9WzzDj3BsGgKLCh0ugiinufS//YqOfao/yVJjkXA4VLuyNCfHOLU/cbulGPxs3aeCqhvROw7qPL04JSZnCo0w==",
+      "license": "ISC"
     },
     "node_modules/serve-index": {
       "version": "1.9.1",
@@ -57955,17 +57952,26 @@
       }
     },
     "node_modules/use-query-params": {
-      "version": "1.2.3",
-      "resolved": 
"https://registry.npmjs.org/use-query-params/-/use-query-params-1.2.3.tgz";,
-      "integrity": 
"sha512-cdG0tgbzK+FzsV6DAt2CN8Saa3WpRnze7uC4Rdh7l15epSFq7egmcB/zuREvPNwO5Yk80nUpDZpiyHsoq50d8w==",
+      "version": "2.2.2",
+      "resolved": 
"https://registry.npmjs.org/use-query-params/-/use-query-params-2.2.2.tgz";,
+      "integrity": 
"sha512-OwGab8u8/x2xZp9uSyBsx0kXlkR9IR436zbygsYVGikPYY3OJosvve6IJVGwIJPcfyb/YHwvPrUNu65/JR++Kw==",
       "license": "ISC",
       "dependencies": {
-        "serialize-query-params": "^1.3.5"
+        "serialize-query-params": "^2.0.3"
       },
       "peerDependencies": {
-        "query-string": ">=5.1.1",
+        "@reach/router": "^1.2.1",
         "react": ">=16.8.0",
-        "react-dom": ">=16.8.0"
+        "react-dom": ">=16.8.0",
+        "react-router-dom": ">=5"
+      },
+      "peerDependenciesMeta": {
+        "@reach/router": {
+          "optional": true
+        },
+        "react-router-dom": {
+          "optional": true
+        }
       }
     },
     "node_modules/use-sync-external-store": {
diff --git a/superset-frontend/package.json b/superset-frontend/package.json
index 8eea2c1ebf7..7e77bcc8230 100644
--- a/superset-frontend/package.json
+++ b/superset-frontend/package.json
@@ -217,7 +217,7 @@
     "urijs": "^1.19.8",
     "use-event-callback": "^0.1.0",
     "use-immer": "^0.11.0",
-    "use-query-params": "^1.1.9",
+    "use-query-params": "^2.2.2",
     "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz";,
     "yargs": "^17.7.2"
   },
diff --git a/superset-frontend/spec/helpers/ProviderWrapper.tsx 
b/superset-frontend/spec/helpers/ProviderWrapper.tsx
index d8d63cf3de6..33d5b6bad3f 100644
--- a/superset-frontend/spec/helpers/ProviderWrapper.tsx
+++ b/superset-frontend/spec/helpers/ProviderWrapper.tsx
@@ -18,8 +18,10 @@
  */
 
 import { ThemeProvider } from '@apache-superset/core/ui';
-import { BrowserRouter as Router, Route } from 'react-router-dom';
+import { parse, stringify } from 'query-string';
+import { BrowserRouter as Router } from 'react-router-dom';
 import { QueryParamProvider } from 'use-query-params';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 export function ProviderWrapper(props: any) {
   const { children, theme } = props;
@@ -28,8 +30,12 @@ export function ProviderWrapper(props: any) {
     <ThemeProvider theme={theme}>
       <Router>
         <QueryParamProvider
-          ReactRouterRoute={Route}
-          stringifyOptions={{ encode: false }}
+          adapter={ReactRouter5Adapter}
+          options={{
+            searchStringToObject: parse,
+            objectToSearchString: (object: Record<string, any>) =>
+              stringify(object, { encode: false }),
+          }}
         >
           {children}
         </QueryParamProvider>
diff --git a/superset-frontend/spec/helpers/testing-library.tsx 
b/superset-frontend/spec/helpers/testing-library.tsx
index 1a841a32483..151c5d54e75 100644
--- a/superset-frontend/spec/helpers/testing-library.tsx
+++ b/superset-frontend/spec/helpers/testing-library.tsx
@@ -43,6 +43,7 @@ import { configureStore, Store } from '@reduxjs/toolkit';
 import { api } from 'src/hooks/apiResources/queryApi';
 import userEvent from '@testing-library/user-event';
 import { ExtensionsProvider } from 'src/extensions/ExtensionsContext';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 type Options = Omit<RenderOptions, 'queries'> & {
   useRedux?: boolean;
@@ -109,7 +110,11 @@ export function createWrapper(options?: Options) {
     }
 
     if (useQueryParams) {
-      result = <QueryParamProvider>{result}</QueryParamProvider>;
+      result = (
+        <QueryParamProvider adapter={ReactRouter5Adapter}>
+          {result}
+        </QueryParamProvider>
+      );
     }
 
     if (useRouter) {
diff --git a/superset-frontend/src/components/ListView/ListView.test.tsx 
b/superset-frontend/src/components/ListView/ListView.test.tsx
index 6434b11839f..f278e607ac6 100644
--- a/superset-frontend/src/components/ListView/ListView.test.tsx
+++ b/superset-frontend/src/components/ListView/ListView.test.tsx
@@ -19,6 +19,8 @@
 import { render, screen, within, waitFor } from 'spec/helpers/testing-library';
 import userEvent from '@testing-library/user-event';
 import { QueryParamProvider } from 'use-query-params';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
+import { MemoryRouter } from 'react-router-dom';
 import thunk from 'redux-thunk';
 import configureStore from 'redux-mock-store';
 import { ReactNode } from 'react';
@@ -51,16 +53,6 @@ type MockedListViewProps = Omit<
 const middlewares = [thunk];
 const mockStore = configureStore(middlewares);
 
-function makeMockLocation(query?: string) {
-  const queryStr = query ? encodeURIComponent(query) : '';
-  return {
-    protocol: 'http:',
-    host: 'localhost',
-    pathname: '/',
-    search: queryStr.length ? `?${queryStr}` : '',
-  } as Location;
-}
-
 const fetchSelectsMock = jest.fn(() =>
   Promise.resolve({ data: [], totalCount: 0 }),
 );
@@ -214,9 +206,11 @@ test('redirects to first page when page index is invalid', 
async () => {
 const factory = (overrides?: Partial<ListViewProps>) => {
   const props = { ...mockedPropsComprehensive, ...overrides };
   return render(
-    <QueryParamProvider location={makeMockLocation()}>
-      <ListView {...props} />
-    </QueryParamProvider>,
+    <MemoryRouter>
+      <QueryParamProvider adapter={ReactRouter5Adapter}>
+        <ListView {...props} />
+      </QueryParamProvider>
+    </MemoryRouter>,
     { store: mockStore() },
   );
 };
diff --git a/superset-frontend/src/embedded/EmbeddedContextProviders.tsx 
b/superset-frontend/src/embedded/EmbeddedContextProviders.tsx
index c7b2b48ae8e..a2a43b16d6e 100644
--- a/superset-frontend/src/embedded/EmbeddedContextProviders.tsx
+++ b/superset-frontend/src/embedded/EmbeddedContextProviders.tsx
@@ -16,7 +16,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Route } from 'react-router-dom';
 import { getExtensionsRegistry } from '@superset-ui/core';
 import { Provider as ReduxProvider } from 'react-redux';
 import { QueryParamProvider } from 'use-query-params';
@@ -28,6 +27,8 @@ import { SupersetThemeProvider } from 
'src/theme/ThemeProvider';
 import { ThemeController } from 'src/theme/ThemeController';
 import type { ThemeStorage } from '@apache-superset/core/ui';
 import { store } from 'src/views/store';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
+import { parse, stringify } from 'query-string';
 
 /**
  * In-memory implementation of ThemeStorage interface for embedded contexts.
@@ -69,8 +70,12 @@ export const EmbeddedContextProviders: React.FC = ({ 
children }) => {
           <EmbeddedUiConfigProvider>
             <DynamicPluginProvider>
               <QueryParamProvider
-                ReactRouterRoute={Route}
-                stringifyOptions={{ encode: false }}
+                adapter={ReactRouter5Adapter}
+                options={{
+                  searchStringToObject: parse,
+                  objectToSearchString: (object: Record<string, any>) =>
+                    stringify(object, { encode: false }),
+                }}
               >
                 {RootContextProviderExtension ? (
                   <RootContextProviderExtension>
diff --git 
a/superset-frontend/src/features/allEntities/AllEntitiesTable.test.tsx 
b/superset-frontend/src/features/allEntities/AllEntitiesTable.test.tsx
index 149ca183b03..98bd548b4bd 100644
--- a/superset-frontend/src/features/allEntities/AllEntitiesTable.test.tsx
+++ b/superset-frontend/src/features/allEntities/AllEntitiesTable.test.tsx
@@ -18,7 +18,6 @@
  */
 
 import { render, screen } from 'spec/helpers/testing-library';
-import * as useQueryParamsModule from 'use-query-params';
 import AllEntitiesTable from './AllEntitiesTable';
 
 // eslint-disable-next-line no-restricted-globals -- TODO: Migrate from 
describe blocks
@@ -82,12 +81,6 @@ describe('AllEntitiesTable', () => {
     ],
   };
 
-  beforeEach(() => {
-    jest
-      .spyOn(useQueryParamsModule, 'useQueryParam')
-      .mockReturnValue([42, jest.fn()]);
-  });
-
   afterEach(() => {
     jest.restoreAllMocks();
   });
diff --git a/superset-frontend/src/features/home/RightMenu.test.tsx 
b/superset-frontend/src/features/home/RightMenu.test.tsx
index e861a00342a..78002025b44 100644
--- a/superset-frontend/src/features/home/RightMenu.test.tsx
+++ b/superset-frontend/src/features/home/RightMenu.test.tsx
@@ -212,6 +212,7 @@ test('renders', async () => {
   resetUseSelectorMock();
   const { container } = render(<RightMenu {...mockedProps} />, {
     useRedux: true,
+    useRouter: true,
     useQueryParams: true,
     useTheme: true,
   });
@@ -225,6 +226,7 @@ test('If user has permission to upload files AND connect 
DBs we query existing D
   resetUseSelectorMock();
   const { container } = render(<RightMenu {...mockedProps} />, {
     useRedux: true,
+    useRouter: true,
     useQueryParams: true,
     useTheme: true,
   });
diff --git 
a/superset-frontend/src/pages/AlertReportList/AlertReportList.test.jsx 
b/superset-frontend/src/pages/AlertReportList/AlertReportList.test.jsx
index 80ef800b88e..85dd7d9f4af 100644
--- a/superset-frontend/src/pages/AlertReportList/AlertReportList.test.jsx
+++ b/superset-frontend/src/pages/AlertReportList/AlertReportList.test.jsx
@@ -28,6 +28,7 @@ import {
 import { MemoryRouter } from 'react-router-dom';
 import { QueryParamProvider } from 'use-query-params';
 import AlertList from 'src/pages/AlertReportList';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 const mockStore = configureStore([thunk]);
 const store = mockStore({});
@@ -86,7 +87,7 @@ fetchMock.delete(alertsEndpoint, {});
 const renderAlertList = (props = {}) =>
   render(
     <MemoryRouter>
-      <QueryParamProvider>
+      <QueryParamProvider adapter={ReactRouter5Adapter}>
         <AlertList user={mockUser} {...props} />
       </QueryParamProvider>
     </MemoryRouter>,
diff --git 
a/superset-frontend/src/pages/AnnotationLayerList/AnnotationLayerList.test.jsx 
b/superset-frontend/src/pages/AnnotationLayerList/AnnotationLayerList.test.jsx
index 4ebcf526107..d3fc63221be 100644
--- 
a/superset-frontend/src/pages/AnnotationLayerList/AnnotationLayerList.test.jsx
+++ 
b/superset-frontend/src/pages/AnnotationLayerList/AnnotationLayerList.test.jsx
@@ -29,6 +29,7 @@ import { MemoryRouter } from 'react-router-dom';
 import { QueryParamProvider } from 'use-query-params';
 
 import AnnotationLayersList from 'src/pages/AnnotationLayerList';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 const mockStore = configureStore([thunk]);
 const store = mockStore({});
@@ -76,7 +77,7 @@ fetchMock.get(layersRelatedEndpoint, {
 const renderAnnotationLayersList = (props = {}) =>
   render(
     <MemoryRouter>
-      <QueryParamProvider>
+      <QueryParamProvider adapter={ReactRouter5Adapter}>
         <AnnotationLayersList user={mockUser} {...props} />
       </QueryParamProvider>
     </MemoryRouter>,
diff --git 
a/superset-frontend/src/pages/ChartList/ChartList.permissions.test.tsx 
b/superset-frontend/src/pages/ChartList/ChartList.permissions.test.tsx
index 5406f7b4caf..b5dd95211c9 100644
--- a/superset-frontend/src/pages/ChartList/ChartList.permissions.test.tsx
+++ b/superset-frontend/src/pages/ChartList/ChartList.permissions.test.tsx
@@ -25,6 +25,7 @@ import { QueryParamProvider } from 'use-query-params';
 import { isFeatureEnabled } from '@superset-ui/core';
 import ChartList from 'src/pages/ChartList';
 import { API_ENDPOINTS, mockCharts, setupMocks } from 
'./ChartList.testHelpers';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 // Increase default timeout for all tests
 jest.setTimeout(30000);
@@ -116,7 +117,7 @@ const renderChartList = (
   return render(
     <Provider store={store}>
       <MemoryRouter>
-        <QueryParamProvider>
+        <QueryParamProvider adapter={ReactRouter5Adapter}>
           <ChartList user={user} {...props} />
         </QueryParamProvider>
       </MemoryRouter>
diff --git a/superset-frontend/src/pages/ChartList/ChartList.test.tsx 
b/superset-frontend/src/pages/ChartList/ChartList.test.tsx
index cd0b95befe4..a515fcc9059 100644
--- a/superset-frontend/src/pages/ChartList/ChartList.test.tsx
+++ b/superset-frontend/src/pages/ChartList/ChartList.test.tsx
@@ -31,12 +31,6 @@ import {
   setupMocks,
 } from './ChartList.testHelpers';
 
-const mockPush = jest.fn();
-jest.mock('react-router-dom', () => ({
-  ...jest.requireActual('react-router-dom'),
-  useHistory: () => ({ push: mockPush }),
-}));
-
 jest.mock('@superset-ui/core', () => ({
   ...jest.requireActual('@superset-ui/core'),
   isFeatureEnabled: jest.fn(),
@@ -76,7 +70,6 @@ describe('ChartList', () => {
   beforeEach(() => {
     fetchMock.removeRoutes();
     setupMocks();
-    mockPush.mockClear();
   });
 
   afterEach(() => {
@@ -107,9 +100,12 @@ describe('ChartList', () => {
     fireEvent.click(newChartButton);
 
     // Verify it triggers navigation to chart creation
-    await waitFor(() => {
-      expect(mockPush).toHaveBeenCalledWith('/chart/add');
-    });
+    await waitFor(
+      () => {
+        expect(window.location.pathname).toEqual('/chart/add');
+      },
+      { timeout: 5000 },
+    );
   });
 
   test('verify Import button existence and functionality', async () => {
diff --git a/superset-frontend/src/pages/ChartList/ChartList.testHelpers.tsx 
b/superset-frontend/src/pages/ChartList/ChartList.testHelpers.tsx
index d6518a0a4df..53934e66dc7 100644
--- a/superset-frontend/src/pages/ChartList/ChartList.testHelpers.tsx
+++ b/superset-frontend/src/pages/ChartList/ChartList.testHelpers.tsx
@@ -20,11 +20,12 @@
 import fetchMock from 'fetch-mock';
 import { render } from 'spec/helpers/testing-library';
 import { Provider } from 'react-redux';
-import { MemoryRouter } from 'react-router-dom';
+import { BrowserRouter } from 'react-router-dom';
 import { configureStore } from '@reduxjs/toolkit';
 import { QueryParamProvider } from 'use-query-params';
 import ChartList from 'src/pages/ChartList';
 import handleResourceExport from 'src/utils/export';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 export const mockHandleResourceExport =
   handleResourceExport as jest.MockedFunction<typeof handleResourceExport>;
@@ -268,11 +269,11 @@ export const renderChartList = (user: any, props = {}, 
storeState = {}) => {
 
   return render(
     <Provider store={store}>
-      <MemoryRouter>
-        <QueryParamProvider>
+      <BrowserRouter>
+        <QueryParamProvider adapter={ReactRouter5Adapter}>
           <ChartList user={user} {...props} />
         </QueryParamProvider>
-      </MemoryRouter>
+      </BrowserRouter>
     </Provider>,
   );
 };
diff --git 
a/superset-frontend/src/pages/CssTemplateList/CssTemplateList.test.jsx 
b/superset-frontend/src/pages/CssTemplateList/CssTemplateList.test.jsx
index d8f17c541a4..c24a094f20a 100644
--- a/superset-frontend/src/pages/CssTemplateList/CssTemplateList.test.jsx
+++ b/superset-frontend/src/pages/CssTemplateList/CssTemplateList.test.jsx
@@ -29,6 +29,7 @@ import { MemoryRouter } from 'react-router-dom';
 import { QueryParamProvider } from 'use-query-params';
 
 import CssTemplatesList from 'src/pages/CssTemplateList';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 const mockStore = configureStore([thunk]);
 const store = mockStore({});
@@ -75,7 +76,7 @@ fetchMock.get(templatesRelatedEndpoint, {
 const renderCssTemplatesList = (props = {}) =>
   render(
     <MemoryRouter>
-      <QueryParamProvider>
+      <QueryParamProvider adapter={ReactRouter5Adapter}>
         <CssTemplatesList user={mockUser} {...props} />
       </QueryParamProvider>
     </MemoryRouter>,
diff --git a/superset-frontend/src/pages/DashboardList/DashboardList.test.jsx 
b/superset-frontend/src/pages/DashboardList/DashboardList.test.jsx
index 18879e4e676..c9daf3caa8f 100644
--- a/superset-frontend/src/pages/DashboardList/DashboardList.test.jsx
+++ b/superset-frontend/src/pages/DashboardList/DashboardList.test.jsx
@@ -28,6 +28,7 @@ import {
 import { QueryParamProvider } from 'use-query-params';
 
 import DashboardList from 'src/pages/DashboardList';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 const dashboardsInfoEndpoint = 'glob:*/api/v1/dashboard/_info*';
 const dashboardOwnersEndpoint = 'glob:*/api/v1/dashboard/related/owners*';
@@ -89,7 +90,7 @@ describe('DashboardList', () => {
   const renderDashboardList = (props = {}, userProp = mockUser) =>
     render(
       <MemoryRouter>
-        <QueryParamProvider>
+        <QueryParamProvider adapter={ReactRouter5Adapter}>
           <DashboardList {...props} user={userProp} />
         </QueryParamProvider>
       </MemoryRouter>,
@@ -225,7 +226,7 @@ describe('DashboardList - anonymous view', () => {
   test('does not render favorite stars for anonymous user', async () => {
     render(
       <MemoryRouter>
-        <QueryParamProvider>
+        <QueryParamProvider adapter={ReactRouter5Adapter}>
           <DashboardList user={{}} />
         </QueryParamProvider>
       </MemoryRouter>,
diff --git a/superset-frontend/src/pages/GroupsList/GroupsList.test.tsx 
b/superset-frontend/src/pages/GroupsList/GroupsList.test.tsx
index 4acb6c21d47..328064248a2 100644
--- a/superset-frontend/src/pages/GroupsList/GroupsList.test.tsx
+++ b/superset-frontend/src/pages/GroupsList/GroupsList.test.tsx
@@ -31,6 +31,7 @@ import {
 import { MemoryRouter } from 'react-router-dom';
 import { QueryParamProvider } from 'use-query-params';
 import GroupsList from './index';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 const mockStore = configureStore([thunk]);
 const store = mockStore({});
@@ -66,7 +67,7 @@ fetchMock.get(rolesEndpoint, {
   count: 3,
 });
 
-fetchMock.get(groupsEndpoint, { result: [] });
+fetchMock.get(groupsEndpoint, { result: [] }, { name: groupsEndpoint });
 
 jest.mock('src/dashboard/util/permissionUtils', () => ({
   ...jest.requireActual('src/dashboard/util/permissionUtils'),
@@ -79,7 +80,7 @@ describe('GroupsList', () => {
     await act(async () => {
       render(
         <MemoryRouter>
-          <QueryParamProvider>
+          <QueryParamProvider adapter={ReactRouter5Adapter}>
             <GroupsList user={mockUser} />
           </QueryParamProvider>
         </MemoryRouter>,
@@ -113,7 +114,7 @@ describe('GroupsList', () => {
     expect(await screen.findByTestId('Add Group-modal')).toBeInTheDocument();
   });
 
-  test.only('renders actions column for admin', async () => {
+  test('renders actions column for admin', async () => {
     await renderComponent();
     expect(screen.getAllByText('Actions')[0]).toBeInTheDocument();
   });
@@ -129,7 +130,7 @@ describe('GroupsList', () => {
     expect(within(filtersSelect).getByText(/users/i)).toBeInTheDocument();
   });
 
-  test.only('renders correct columns in the table', async () => {
+  test('renders correct columns in the table', async () => {
     await renderComponent();
     const table = screen.getByRole('table');
 
@@ -147,6 +148,7 @@ describe('GroupsList', () => {
   });
 
   test('opens edit modal on edit button click', async () => {
+    fetchMock.removeRoute(groupsEndpoint);
     fetchMock.get('glob:*/security/groups/?*', {
       result: [
         {
diff --git a/superset-frontend/src/pages/RolesList/RolesList.test.tsx 
b/superset-frontend/src/pages/RolesList/RolesList.test.tsx
index eca699352ed..fd0c814e869 100644
--- a/superset-frontend/src/pages/RolesList/RolesList.test.tsx
+++ b/superset-frontend/src/pages/RolesList/RolesList.test.tsx
@@ -30,6 +30,7 @@ import {
 import { MemoryRouter } from 'react-router-dom';
 import { QueryParamProvider } from 'use-query-params';
 import RolesList from './index';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 const mockStore = configureStore([thunk]);
 const store = mockStore({});
@@ -107,7 +108,7 @@ describe('RolesList', () => {
       const mockedProps = {};
       render(
         <MemoryRouter>
-          <QueryParamProvider>
+          <QueryParamProvider adapter={ReactRouter5Adapter}>
             <RolesList
               user={mockUser}
               addDangerToast={() => {}}
diff --git 
a/superset-frontend/src/pages/RowLevelSecurityList/RowLevelSecurityList.test.tsx
 
b/superset-frontend/src/pages/RowLevelSecurityList/RowLevelSecurityList.test.tsx
index f68c44d03d8..1174530fe2a 100644
--- 
a/superset-frontend/src/pages/RowLevelSecurityList/RowLevelSecurityList.test.tsx
+++ 
b/superset-frontend/src/pages/RowLevelSecurityList/RowLevelSecurityList.test.tsx
@@ -22,6 +22,7 @@ import { MemoryRouter } from 'react-router-dom';
 import { QueryParamProvider } from 'use-query-params';
 import userEvent from '@testing-library/user-event';
 import RowLevelSecurityList from '.';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 const ruleListEndpoint = 'glob:*/api/v1/rowlevelsecurity/?*';
 const ruleInfoEndpoint = 'glob:*/api/v1/rowlevelsecurity/_info*';
@@ -109,7 +110,7 @@ describe('RuleList RTL', () => {
       const mockedProps = {};
       render(
         <MemoryRouter>
-          <QueryParamProvider>
+          <QueryParamProvider adapter={ReactRouter5Adapter}>
             <RowLevelSecurityList {...mockedProps} user={mockUser} />
           </QueryParamProvider>
         </MemoryRouter>,
diff --git a/superset-frontend/src/pages/SavedQueryList/SavedQueryList.test.tsx 
b/superset-frontend/src/pages/SavedQueryList/SavedQueryList.test.tsx
index dc89f50fc14..8b660fe544d 100644
--- a/superset-frontend/src/pages/SavedQueryList/SavedQueryList.test.tsx
+++ b/superset-frontend/src/pages/SavedQueryList/SavedQueryList.test.tsx
@@ -28,6 +28,7 @@ import {
 import { MemoryRouter } from 'react-router-dom';
 import { QueryParamProvider } from 'use-query-params';
 import SavedQueryList from '.';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 // Increase default timeout
 jest.setTimeout(30000);
@@ -85,7 +86,7 @@ fetchMock.delete(queryEndpoint, {}, { name: queryEndpoint });
 const renderList = (props = {}, storeOverrides = {}) =>
   render(
     <MemoryRouter>
-      <QueryParamProvider>
+      <QueryParamProvider adapter={ReactRouter5Adapter}>
         <SavedQueryList user={mockUser} {...props} />
       </QueryParamProvider>
     </MemoryRouter>,
diff --git a/superset-frontend/src/pages/UserInfo/UserInfo.test.tsx 
b/superset-frontend/src/pages/UserInfo/UserInfo.test.tsx
index e12ce245b4e..f447d6d324b 100644
--- a/superset-frontend/src/pages/UserInfo/UserInfo.test.tsx
+++ b/superset-frontend/src/pages/UserInfo/UserInfo.test.tsx
@@ -30,6 +30,7 @@ import { MemoryRouter } from 'react-router-dom';
 import { QueryParamProvider } from 'use-query-params';
 import UserInfo from 'src/pages/UserInfo';
 import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 const mockStore = configureStore([thunk]);
 const store = mockStore({});
@@ -64,7 +65,7 @@ describe('UserInfo', () => {
     act(async () => {
       render(
         <MemoryRouter>
-          <QueryParamProvider>
+          <QueryParamProvider adapter={ReactRouter5Adapter}>
             <UserInfo user={mockUser} />
           </QueryParamProvider>
         </MemoryRouter>,
diff --git a/superset-frontend/src/pages/UsersList/UsersList.test.tsx 
b/superset-frontend/src/pages/UsersList/UsersList.test.tsx
index 62ff7ff4756..9a0d0b7d75e 100644
--- a/superset-frontend/src/pages/UsersList/UsersList.test.tsx
+++ b/superset-frontend/src/pages/UsersList/UsersList.test.tsx
@@ -30,6 +30,7 @@ import {
 import { MemoryRouter } from 'react-router-dom';
 import { QueryParamProvider } from 'use-query-params';
 import UsersList from './index';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
 
 const mockStore = configureStore([thunk]);
 const store = mockStore({});
@@ -100,7 +101,7 @@ describe('UsersList', () => {
       const mockedProps = {};
       render(
         <MemoryRouter>
-          <QueryParamProvider>
+          <QueryParamProvider adapter={ReactRouter5Adapter}>
             <UsersList user={mockUser} {...mockedProps} />
           </QueryParamProvider>
         </MemoryRouter>,
diff --git a/superset-frontend/src/views/RootContextProviders.tsx 
b/superset-frontend/src/views/RootContextProviders.tsx
index c10f04ae816..a0dece042ae 100644
--- a/superset-frontend/src/views/RootContextProviders.tsx
+++ b/superset-frontend/src/views/RootContextProviders.tsx
@@ -17,7 +17,6 @@
  * under the License.
  */
 
-import { Route } from 'react-router-dom';
 import { getExtensionsRegistry } from '@superset-ui/core';
 import { Provider as ReduxProvider } from 'react-redux';
 import { QueryParamProvider } from 'use-query-params';
@@ -30,6 +29,8 @@ import { ThemeController } from 'src/theme/ThemeController';
 import { ExtensionsProvider } from 'src/extensions/ExtensionsContext';
 import { store } from './store';
 import '../preamble';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
+import { parse, stringify } from 'query-string';
 
 const themeController = new ThemeController();
 const extensionsRegistry = getExtensionsRegistry();
@@ -46,8 +47,12 @@ export const RootContextProviders: React.FC = ({ children }) 
=> {
           <EmbeddedUiConfigProvider>
             <DynamicPluginProvider>
               <QueryParamProvider
-                ReactRouterRoute={Route}
-                stringifyOptions={{ encode: false }}
+                adapter={ReactRouter5Adapter}
+                options={{
+                  searchStringToObject: parse,
+                  objectToSearchString: (object: Record<string, any>) =>
+                    stringify(object, { encode: false }),
+                }}
               >
                 <ExtensionsProvider>
                   {RootContextProviderExtension ? (
diff --git a/superset-frontend/src/views/menu.tsx 
b/superset-frontend/src/views/menu.tsx
index fd72529bee2..5cffb94f4fd 100644
--- a/superset-frontend/src/views/menu.tsx
+++ b/superset-frontend/src/views/menu.tsx
@@ -22,7 +22,7 @@ import 'src/public-path';
 // eg, backend rendered views
 import { Provider } from 'react-redux';
 import ReactDOM from 'react-dom';
-import { Route, BrowserRouter } from 'react-router-dom';
+import { BrowserRouter } from 'react-router-dom';
 import { CacheProvider } from '@emotion/react';
 import { QueryParamProvider } from 'use-query-params';
 import createCache from '@emotion/cache';
@@ -30,6 +30,8 @@ import { ThemeProvider, theme } from 
'@apache-superset/core/ui';
 import Menu from 'src/features/home/Menu';
 import getBootstrapData from 'src/utils/getBootstrapData';
 import { setupStore } from './store';
+import { ReactRouter5Adapter } from 'use-query-params/adapters/react-router-5';
+import { parse, stringify } from 'query-string';
 
 // Disable connecting to redux debugger so that the React app injected
 // Below the menu like SqlLab or Explore can connect its redux store to the 
debugger
@@ -48,8 +50,12 @@ const app = (
       <Provider store={store}>
         <BrowserRouter>
           <QueryParamProvider
-            ReactRouterRoute={Route}
-            stringifyOptions={{ encode: false }}
+            adapter={ReactRouter5Adapter}
+            options={{
+              searchStringToObject: parse,
+              objectToSearchString: (object: Record<string, any>) =>
+                stringify(object, { encode: false }),
+            }}
           >
             <Menu data={menu} />
           </QueryParamProvider>

Reply via email to