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

johnbodley 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 3a62eab163 fix(SIP-95): missing catalog cache key (#28415)
3a62eab163 is described below

commit 3a62eab1631ec412659604246e21494c4889f3d7
Author: JUST.in DO IT <[email protected]>
AuthorDate: Fri May 10 10:18:14 2024 -0700

    fix(SIP-95): missing catalog cache key (#28415)
---
 .../SqlEditorLeftBar/SqlEditorLeftBar.test.tsx     | 21 +++++-----
 .../src/components/DatabaseSelector/index.tsx      |  2 +-
 .../src/hooks/apiResources/schemas.test.ts         | 49 +++++++++++++++++++++-
 .../src/hooks/apiResources/schemas.ts              |  3 +-
 4 files changed, 61 insertions(+), 14 deletions(-)

diff --git 
a/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.tsx
 
b/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.tsx
index 27d6c44d01..962b81062a 100644
--- 
a/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.tsx
+++ 
b/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.tsx
@@ -18,7 +18,7 @@
  */
 import React from 'react';
 import fetchMock from 'fetch-mock';
-import { render, screen, waitFor } from 'spec/helpers/testing-library';
+import { render, screen, waitFor, within } from 'spec/helpers/testing-library';
 import userEvent from '@testing-library/user-event';
 import SqlEditorLeftBar, {
   SqlEditorLeftBarProps,
@@ -107,14 +107,11 @@ test('renders a TableElement', async () => {
 });
 
 test('table should be visible when expanded is true', async () => {
-  const { container, getByText, getByRole } = await renderAndWait(
-    mockedProps,
-    undefined,
-    {
+  const { container, getByText, getByRole, getAllByLabelText } =
+    await renderAndWait(mockedProps, undefined, {
       ...initialState,
       sqlLab: { ...initialState.sqlLab, tables: [table] },
-    },
-  );
+    });
 
   const dbSelect = getByRole('combobox', {
     name: 'Select database or type to search databases',
@@ -122,14 +119,16 @@ test('table should be visible when expanded is true', 
async () => {
   const schemaSelect = getByRole('combobox', {
     name: 'Select schema or type to search schemas',
   });
-  const dropdown = getByText(/Select table/i);
-  const abUser = getByText(/ab_user/i);
+  const tableSelect = getAllByLabelText(
+    /Select table or type to search tables/i,
+  )[0];
+  const tableOption = within(tableSelect).getByText(/ab_user/i);
 
   expect(getByText(/Database/i)).toBeInTheDocument();
   expect(dbSelect).toBeInTheDocument();
   expect(schemaSelect).toBeInTheDocument();
-  expect(dropdown).toBeInTheDocument();
-  expect(abUser).toBeInTheDocument();
+  expect(tableSelect).toBeInTheDocument();
+  expect(tableOption).toBeInTheDocument();
   expect(
     container.querySelector('.ant-collapse-content-active'),
   ).toBeInTheDocument();
diff --git a/superset-frontend/src/components/DatabaseSelector/index.tsx 
b/superset-frontend/src/components/DatabaseSelector/index.tsx
index 23767ba9f7..14753c6dfe 100644
--- a/superset-frontend/src/components/DatabaseSelector/index.tsx
+++ b/superset-frontend/src/components/DatabaseSelector/index.tsx
@@ -278,7 +278,7 @@ export default function DatabaseSelector({
     isFetching: loadingCatalogs,
     refetch: refetchCatalogs,
   } = useCatalogs({
-    dbId: currentDb?.value,
+    dbId: showCatalogSelector ? currentDb?.value : undefined,
     onSuccess: (catalogs, isFetched) => {
       if (!showCatalogSelector) {
         changeCatalog(null);
diff --git a/superset-frontend/src/hooks/apiResources/schemas.test.ts 
b/superset-frontend/src/hooks/apiResources/schemas.test.ts
index 62e154acbe..78df4f850e 100644
--- a/superset-frontend/src/hooks/apiResources/schemas.test.ts
+++ b/superset-frontend/src/hooks/apiResources/schemas.test.ts
@@ -32,6 +32,9 @@ const fakeApiResult = {
 const fakeApiResult2 = {
   result: ['test schema 2', 'test schema a'],
 };
+const fakeApiResult3 = {
+  result: ['test schema 3', 'test schema c'],
+};
 
 const expectedResult = fakeApiResult.result.map((value: string) => ({
   value,
@@ -43,6 +46,11 @@ const expectedResult2 = fakeApiResult2.result.map((value: 
string) => ({
   label: value,
   title: value,
 }));
+const expectedResult3 = fakeApiResult3.result.map((value: string) => ({
+  value,
+  label: value,
+  title: value,
+}));
 
 describe('useSchemas hook', () => {
   afterEach(() => {
@@ -119,7 +127,7 @@ describe('useSchemas hook', () => {
     expect(fetchMock.calls(schemaApiRoute).length).toBe(1);
   });
 
-  it('returns refreshed data after expires', async () => {
+  test('returns refreshed data after expires', async () => {
     const expectDbId = 'db1';
     const schemaApiRoute = `glob:*/api/v1/database/*/schemas/*`;
     fetchMock.get(schemaApiRoute, url =>
@@ -164,4 +172,43 @@ describe('useSchemas hook', () => {
     expect(fetchMock.calls(schemaApiRoute)[2][0]).toContain(expectDbId);
     await waitFor(() => expect(result.current.data).toEqual(expectedResult));
   });
+
+  test('returns correct schema list by a catalog', async () => {
+    const dbId = '1';
+    const expectCatalog = 'catalog3';
+    const schemaApiRoute = `glob:*/api/v1/database/*/schemas/*`;
+    fetchMock.get(schemaApiRoute, url =>
+      url.includes(`catalog:${expectCatalog}`)
+        ? fakeApiResult3
+        : fakeApiResult2,
+    );
+    const onSuccess = jest.fn();
+    const { result, rerender, waitFor } = renderHook(
+      ({ dbId, catalog }) =>
+        useSchemas({
+          dbId,
+          catalog,
+          onSuccess,
+        }),
+      {
+        initialProps: { dbId, catalog: expectCatalog },
+        wrapper: createWrapper({
+          useRedux: true,
+          store,
+        }),
+      },
+    );
+
+    await waitFor(() => 
expect(fetchMock.calls(schemaApiRoute).length).toBe(1));
+    expect(result.current.data).toEqual(expectedResult3);
+    expect(onSuccess).toHaveBeenCalledTimes(2);
+
+    rerender({ dbId, catalog: 'catalog2' });
+    await waitFor(() => 
expect(fetchMock.calls(schemaApiRoute).length).toBe(2));
+    expect(result.current.data).toEqual(expectedResult2);
+
+    rerender({ dbId, catalog: expectCatalog });
+    expect(result.current.data).toEqual(expectedResult3);
+    expect(fetchMock.calls(schemaApiRoute).length).toBe(2);
+  });
 });
diff --git a/superset-frontend/src/hooks/apiResources/schemas.ts 
b/superset-frontend/src/hooks/apiResources/schemas.ts
index d5cec1daea..51e8528ce5 100644
--- a/superset-frontend/src/hooks/apiResources/schemas.ts
+++ b/superset-frontend/src/hooks/apiResources/schemas.ts
@@ -54,8 +54,9 @@ const schemaApi = api.injectEndpoints({
             title: value,
           })),
       }),
-      serializeQueryArgs: ({ queryArgs: { dbId } }) => ({
+      serializeQueryArgs: ({ queryArgs: { dbId, catalog } }) => ({
         dbId,
+        catalog,
       }),
     }),
   }),

Reply via email to