From aa3182ea3507fd3392ecc6c94af1086831c5c6d6 Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Wed, 8 May 2024 14:06:54 -0400 Subject: [PATCH] Fix tests --- .../src/SqlLab/actions/sqlLab.test.js | 13 ++++++++++++- .../AceEditorWrapper/useKeywords.test.ts | 1 + .../SaveDatasetModal/SaveDatasetModal.test.tsx | 1 + .../SqlEditorLeftBar/SqlEditorLeftBar.test.tsx | 8 ++++++-- .../DatabaseSelector/DatabaseSelector.test.tsx | 8 ++++++++ .../TableSelector/TableSelector.test.tsx | 7 +++++++ .../UploadDataModel/UploadDataModal.test.tsx | 4 ++++ .../src/hooks/apiResources/schemas.test.ts | 10 +++++----- .../src/hooks/apiResources/tables.test.ts | 16 ++++++++++++++++ 9 files changed, 60 insertions(+), 8 deletions(-) diff --git a/superset-frontend/src/SqlLab/actions/sqlLab.test.js b/superset-frontend/src/SqlLab/actions/sqlLab.test.js index 871b3ff6f6b4f..145c492a4e4eb 100644 --- a/superset-frontend/src/SqlLab/actions/sqlLab.test.js +++ b/superset-frontend/src/SqlLab/actions/sqlLab.test.js @@ -419,6 +419,7 @@ describe('async actions', () => { queryEditor: { name: 'Copy of Dummy query editor', dbId: 1, + catalog: query.catalog, schema: query.schema, autorun: true, sql: 'SELECT * FROM something', @@ -481,6 +482,7 @@ describe('async actions', () => { sql: expect.stringContaining('SELECT ...'), name: `Untitled Query 7`, dbId: defaultQueryEditor.dbId, + catalog: defaultQueryEditor.catalog, schema: defaultQueryEditor.schema, autorun: false, queryLimit: @@ -747,6 +749,7 @@ describe('async actions', () => { describe('addTable', () => { it('dispatches table state from unsaved change', () => { const tableName = 'table'; + const catalogName = null; const schemaName = 'schema'; const expectedDbId = 473892; const store = mockStore({ @@ -759,12 +762,18 @@ describe('async actions', () => { }, }, }); - const request = actions.addTable(query, tableName, schemaName); + const request = actions.addTable( + query, + tableName, + catalogName, + schemaName, + ); request(store.dispatch, store.getState); expect(store.getActions()[0]).toEqual( expect.objectContaining({ table: expect.objectContaining({ name: tableName, + catalog: catalogName, schema: schemaName, dbId: expectedDbId, }), @@ -811,6 +820,7 @@ describe('async actions', () => { }); const tableName = 'table'; + const catalogName = null; const schemaName = 'schema'; const store = mockStore({ ...initialState, @@ -829,6 +839,7 @@ describe('async actions', () => { const request = actions.runTablePreviewQuery({ dbId: 1, name: tableName, + catalog: catalogName, schema: schemaName, }); return request(store.dispatch, store.getState).then(() => { diff --git a/superset-frontend/src/SqlLab/components/AceEditorWrapper/useKeywords.test.ts b/superset-frontend/src/SqlLab/components/AceEditorWrapper/useKeywords.test.ts index 3a136dcd4acbc..193e715fb220f 100644 --- a/superset-frontend/src/SqlLab/components/AceEditorWrapper/useKeywords.test.ts +++ b/superset-frontend/src/SqlLab/components/AceEditorWrapper/useKeywords.test.ts @@ -237,6 +237,7 @@ test('returns column keywords among selected tables', async () => { useKeywords({ queryEditorId: expectQueryEditorId, dbId: expectDbId, + catalog: null, schema: expectSchema, }), { diff --git a/superset-frontend/src/SqlLab/components/SaveDatasetModal/SaveDatasetModal.test.tsx b/superset-frontend/src/SqlLab/components/SaveDatasetModal/SaveDatasetModal.test.tsx index 8568bf20809e5..30e3d045ca766 100644 --- a/superset-frontend/src/SqlLab/components/SaveDatasetModal/SaveDatasetModal.test.tsx +++ b/superset-frontend/src/SqlLab/components/SaveDatasetModal/SaveDatasetModal.test.tsx @@ -210,6 +210,7 @@ describe('SaveDatasetModal', () => { expect(createDatasource).toHaveBeenCalledWith({ datasourceName: 'my dataset', dbId: 1, + catalog: null, schema: 'main', sql: 'SELECT *', templateParams: undefined, diff --git a/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.tsx b/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.tsx index b5003b16f7b47..922987480a6b3 100644 --- a/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.tsx +++ b/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/SqlEditorLeftBar.test.tsx @@ -44,6 +44,10 @@ const mockedProps = { beforeEach(() => { fetchMock.get('glob:*/api/v1/database/?*', { result: [] }); + fetchMock.get('glob:*/api/v1/database/*/catalogs/?*', { + count: 0, + result: [], + }); fetchMock.get('glob:*/api/v1/database/*/schemas/?*', { count: 2, result: ['main', 'new_schema'], @@ -115,14 +119,14 @@ 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(/Table/i); + const dropdown = getByText(/Select table/i); const abUser = queryAllByText(/ab_user/i); expect(getByText(/Database/i)).toBeInTheDocument(); expect(dbSelect).toBeInTheDocument(); expect(schemaSelect).toBeInTheDocument(); expect(dropdown).toBeInTheDocument(); - expect(abUser).toHaveLength(2); + expect(abUser).toHaveLength(1); expect( container.querySelector('.ant-collapse-content-active'), ).toBeInTheDocument(); diff --git a/superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx b/superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx index c3ad51cf60799..32373301f6030 100644 --- a/superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx +++ b/superset-frontend/src/components/DatabaseSelector/DatabaseSelector.test.tsx @@ -40,6 +40,7 @@ const createProps = (): DatabaseSelectorProps => ({ formMode: false, isDatabaseSelectEnabled: true, readOnly: false, + catalog: null, schema: 'public', sqlLabMode: true, getDbList: jest.fn(), @@ -158,16 +159,23 @@ const fakeSchemaApiResult = { result: ['information_schema', 'public'], }; +const fakeCatalogApiResult = { + count: 0, + result: [], +}; + const fakeFunctionNamesApiResult = { function_names: [], }; const databaseApiRoute = 'glob:*/api/v1/database/?*'; +const catalogApiRoute = 'glob:*/api/v1/database/*/catalogs/?*'; const schemaApiRoute = 'glob:*/api/v1/database/*/schemas/?*'; const tablesApiRoute = 'glob:*/api/v1/database/*/tables/*'; function setupFetchMock() { fetchMock.get(databaseApiRoute, fakeDatabaseApiResult); + fetchMock.get(catalogApiRoute, fakeCatalogApiResult); fetchMock.get(schemaApiRoute, fakeSchemaApiResult); fetchMock.get(tablesApiRoute, fakeFunctionNamesApiResult); } diff --git a/superset-frontend/src/components/TableSelector/TableSelector.test.tsx b/superset-frontend/src/components/TableSelector/TableSelector.test.tsx index 13a2c33248bea..8f82818b8e16c 100644 --- a/superset-frontend/src/components/TableSelector/TableSelector.test.tsx +++ b/superset-frontend/src/components/TableSelector/TableSelector.test.tsx @@ -54,6 +54,7 @@ const getTableMockFunction = () => }) as any; const databaseApiRoute = 'glob:*/api/v1/database/?*'; +const catalogApiRoute = 'glob:*/api/v1/database/*/catalogs/?*'; const schemaApiRoute = 'glob:*/api/v1/database/*/schemas/?*'; const tablesApiRoute = 'glob:*/api/v1/database/*/tables/*'; @@ -74,6 +75,7 @@ afterEach(() => { }); test('renders with default props', async () => { + fetchMock.get(catalogApiRoute, { result: [] }); fetchMock.get(schemaApiRoute, { result: [] }); fetchMock.get(tablesApiRoute, getTableMockFunction()); @@ -96,6 +98,7 @@ test('renders with default props', async () => { }); test('skips select all options', async () => { + fetchMock.get(catalogApiRoute, { result: [] }); fetchMock.get(schemaApiRoute, { result: ['test_schema'] }); fetchMock.get(tablesApiRoute, getTableMockFunction()); @@ -115,6 +118,7 @@ test('skips select all options', async () => { }); test('renders table options without Select All option', async () => { + fetchMock.get(catalogApiRoute, { result: [] }); fetchMock.get(schemaApiRoute, { result: ['test_schema'] }); fetchMock.get(tablesApiRoute, getTableMockFunction()); @@ -133,6 +137,7 @@ test('renders table options without Select All option', async () => { }); test('renders disabled without schema', async () => { + fetchMock.get(catalogApiRoute, { result: [] }); fetchMock.get(schemaApiRoute, { result: [] }); fetchMock.get(tablesApiRoute, getTableMockFunction()); @@ -150,6 +155,7 @@ test('renders disabled without schema', async () => { }); test('table select retain value if not in SQL Lab mode', async () => { + fetchMock.get(catalogApiRoute, { result: [] }); fetchMock.get(schemaApiRoute, { result: ['test_schema'] }); fetchMock.get(tablesApiRoute, getTableMockFunction()); @@ -191,6 +197,7 @@ test('table select retain value if not in SQL Lab mode', async () => { }); test('table multi select retain all the values selected', async () => { + fetchMock.get(catalogApiRoute, { result: [] }); fetchMock.get(schemaApiRoute, { result: ['test_schema'] }); fetchMock.get(tablesApiRoute, getTableMockFunction()); diff --git a/superset-frontend/src/features/databases/UploadDataModel/UploadDataModal.test.tsx b/superset-frontend/src/features/databases/UploadDataModel/UploadDataModal.test.tsx index 44a8a60738a70..37f827c1ba413 100644 --- a/superset-frontend/src/features/databases/UploadDataModel/UploadDataModal.test.tsx +++ b/superset-frontend/src/features/databases/UploadDataModel/UploadDataModal.test.tsx @@ -47,6 +47,10 @@ fetchMock.get( }, ); +fetchMock.get('glob:*api/v1/database/*/schemas/', { + result: [], +}); + fetchMock.get('glob:*api/v1/database/1/schemas/', { result: ['information_schema', 'public'], }); diff --git a/superset-frontend/src/hooks/apiResources/schemas.test.ts b/superset-frontend/src/hooks/apiResources/schemas.test.ts index 70c1289d576a1..62e154acbe09d 100644 --- a/superset-frontend/src/hooks/apiResources/schemas.test.ts +++ b/superset-frontend/src/hooks/apiResources/schemas.test.ts @@ -80,7 +80,7 @@ describe('useSchemas hook', () => { })}`, ).length, ).toBe(1); - expect(onSuccess).toHaveBeenCalledTimes(1); + expect(onSuccess).toHaveBeenCalledTimes(2); act(() => { result.current.refetch(); }); @@ -92,7 +92,7 @@ describe('useSchemas hook', () => { })}`, ).length, ).toBe(1); - expect(onSuccess).toHaveBeenCalledTimes(2); + expect(onSuccess).toHaveBeenCalledTimes(3); expect(result.current.data).toEqual(expectedResult); }); @@ -143,17 +143,17 @@ describe('useSchemas hook', () => { await waitFor(() => expect(result.current.data).toEqual(expectedResult)); expect(fetchMock.calls(schemaApiRoute).length).toBe(1); - expect(onSuccess).toHaveBeenCalledTimes(1); + expect(onSuccess).toHaveBeenCalledTimes(2); rerender({ dbId: 'db2' }); await waitFor(() => expect(result.current.data).toEqual(expectedResult2)); expect(fetchMock.calls(schemaApiRoute).length).toBe(2); - expect(onSuccess).toHaveBeenCalledTimes(2); + expect(onSuccess).toHaveBeenCalledTimes(4); rerender({ dbId: expectDbId }); await waitFor(() => expect(result.current.data).toEqual(expectedResult)); expect(fetchMock.calls(schemaApiRoute).length).toBe(2); - expect(onSuccess).toHaveBeenCalledTimes(3); + expect(onSuccess).toHaveBeenCalledTimes(5); // clean up cache act(() => { diff --git a/superset-frontend/src/hooks/apiResources/tables.test.ts b/superset-frontend/src/hooks/apiResources/tables.test.ts index e461b4f86b2b5..7919370817db2 100644 --- a/superset-frontend/src/hooks/apiResources/tables.test.ts +++ b/superset-frontend/src/hooks/apiResources/tables.test.ts @@ -81,9 +81,11 @@ describe('useTables hook', () => { test('returns api response mapping json options', async () => { const expectDbId = 'db1'; const expectedSchema = 'schema1'; + const catalogApiRoute = `glob:*/api/v1/database/${expectDbId}/catalogs/*`; const schemaApiRoute = `glob:*/api/v1/database/${expectDbId}/schemas/*`; const tableApiRoute = `glob:*/api/v1/database/${expectDbId}/tables/?q=*`; fetchMock.get(tableApiRoute, fakeApiResult); + fetchMock.get(catalogApiRoute, { count: 0, result: [] }); fetchMock.get(schemaApiRoute, { result: fakeSchemaApiResult, }); @@ -130,9 +132,11 @@ describe('useTables hook', () => { test('skips the deprecated schema option', async () => { const expectDbId = 'db1'; const unexpectedSchema = 'invalid schema'; + const catalogApiRoute = `glob:*/api/v1/database/${expectDbId}/catalogs/*`; const schemaApiRoute = `glob:*/api/v1/database/${expectDbId}/schemas/*`; const tableApiRoute = `glob:*/api/v1/database/${expectDbId}/tables/?q=*`; fetchMock.get(tableApiRoute, fakeApiResult); + fetchMock.get(catalogApiRoute, { count: 0, result: [] }); fetchMock.get(schemaApiRoute, { result: fakeSchemaApiResult, }); @@ -166,6 +170,10 @@ describe('useTables hook', () => { const expectedSchema = 'schema2'; const tableApiRoute = `glob:*/api/v1/database/${expectDbId}/tables/?q=*`; fetchMock.get(tableApiRoute, fakeHasMoreApiResult); + fetchMock.get(`glob:*/api/v1/database/${expectDbId}/catalogs/*`, { + count: 0, + result: [], + }); fetchMock.get(`glob:*/api/v1/database/${expectDbId}/schemas/*`, { result: fakeSchemaApiResult, }); @@ -191,6 +199,10 @@ describe('useTables hook', () => { const expectedSchema = 'schema1'; const tableApiRoute = `glob:*/api/v1/database/${expectDbId}/tables/?q=*`; fetchMock.get(tableApiRoute, fakeApiResult); + fetchMock.get(`glob:*/api/v1/database/${expectDbId}/catalogs/*`, { + count: 0, + result: [], + }); fetchMock.get(`glob:*/api/v1/database/${expectDbId}/schemas/*`, { result: fakeSchemaApiResult, }); @@ -220,6 +232,10 @@ describe('useTables hook', () => { fetchMock.get(tableApiRoute, url => url.includes(expectedSchema) ? fakeApiResult : fakeHasMoreApiResult, ); + fetchMock.get(`glob:*/api/v1/database/${expectDbId}/catalogs/*`, { + count: 0, + result: [], + }); fetchMock.get(`glob:*/api/v1/database/${expectDbId}/schemas/*`, { result: fakeSchemaApiResult, });