diff --git a/src/plugins/data_source_management/public/components/create_data_source_wizard/create_data_source_wizard.test.tsx b/src/plugins/data_source_management/public/components/create_data_source_wizard/create_data_source_wizard.test.tsx index bc47fbaa12e..aa4e128094c 100644 --- a/src/plugins/data_source_management/public/components/create_data_source_wizard/create_data_source_wizard.test.tsx +++ b/src/plugins/data_source_management/public/components/create_data_source_wizard/create_data_source_wizard.test.tsx @@ -53,7 +53,7 @@ describe('Datasource Management: Create Datasource Wizard', () => { test('should create datasource successfully', async () => { spyOn(utils, 'createSingleDataSource').and.returnValue({}); - spyOn(utils, 'handleSetDefaultDatasourceDuringCreation').and.returnValue({}); + spyOn(utils, 'handleSetDefaultDatasource').and.returnValue({}); await act(async () => { // @ts-ignore await component.find(formIdentifier).first().prop('handleSubmit')( @@ -62,7 +62,7 @@ describe('Datasource Management: Create Datasource Wizard', () => { }); expect(utils.createSingleDataSource).toHaveBeenCalled(); expect(history.push).toBeCalledWith(''); - expect(utils.handleSetDefaultDatasourceDuringCreation).toHaveBeenCalled(); + expect(utils.handleSetDefaultDatasource).toHaveBeenCalled(); }); test('should fail to create datasource', async () => { diff --git a/src/plugins/data_source_management/public/components/create_data_source_wizard/create_data_source_wizard.tsx b/src/plugins/data_source_management/public/components/create_data_source_wizard/create_data_source_wizard.tsx index 9409f9ef9c1..58f9ae10808 100644 --- a/src/plugins/data_source_management/public/components/create_data_source_wizard/create_data_source_wizard.tsx +++ b/src/plugins/data_source_management/public/components/create_data_source_wizard/create_data_source_wizard.tsx @@ -21,7 +21,7 @@ import { getDataSources, testConnection, fetchDataSourceVersion, - handleSetDefaultDatasourceDuringCreation, + handleSetDefaultDatasource, } from '../utils'; import { LoadingMask } from '../loading_mask'; @@ -79,7 +79,7 @@ export const CreateDataSourceWizard: React.FunctionComponent { it('should delete confirm modal confirm button work normally', async () => { spyOn(utils, 'deleteMultipleDataSources').and.returnValue(Promise.resolve({})); - spyOn(utils, 'handleSetDefaultDatasourceAfterDeletion').and.returnValue({}); + spyOn(utils, 'setFirstDataSourceAsDefault').and.returnValue({}); act(() => { // @ts-ignore component.find(tableIdentifier).props().selection.onSelectionChange(getMappedDataSources); @@ -143,12 +143,12 @@ describe('DataSourceTable', () => { }); component.update(); expect(component.find(confirmModalIdentifier).exists()).toBe(false); - expect(utils.handleSetDefaultDatasourceAfterDeletion).toHaveBeenCalled(); + expect(utils.setFirstDataSourceAsDefault).toHaveBeenCalled(); }); it('should delete datasources & fail', async () => { spyOn(utils, 'deleteMultipleDataSources').and.returnValue(Promise.reject({})); - spyOn(utils, 'handleSetDefaultDatasourceAfterDeletion').and.returnValue({}); + spyOn(utils, 'setFirstDataSourceAsDefault').and.returnValue({}); act(() => { // @ts-ignore component.find(tableIdentifier).props().selection.onSelectionChange(getMappedDataSources); @@ -164,7 +164,7 @@ describe('DataSourceTable', () => { }); component.update(); expect(utils.deleteMultipleDataSources).toHaveBeenCalled(); - expect(utils.handleSetDefaultDatasourceAfterDeletion).not.toHaveBeenCalled(); + expect(utils.setFirstDataSourceAsDefault).not.toHaveBeenCalled(); // @ts-ignore expect(component.find(confirmModalIdentifier).exists()).toBe(false); }); diff --git a/src/plugins/data_source_management/public/components/data_source_table/data_source_table.tsx b/src/plugins/data_source_management/public/components/data_source_table/data_source_table.tsx index d1564aa8e05..9b9fd948829 100644 --- a/src/plugins/data_source_management/public/components/data_source_table/data_source_table.tsx +++ b/src/plugins/data_source_management/public/components/data_source_table/data_source_table.tsx @@ -29,11 +29,7 @@ import { } from '../../../../opensearch_dashboards_react/public'; import { DataSourceManagementContext, DataSourceTableItem, ToastMessageItem } from '../../types'; import { CreateButton } from '../create_button'; -import { - deleteMultipleDataSources, - getDataSources, - handleSetDefaultDatasourceAfterDeletion, -} from '../utils'; +import { deleteMultipleDataSources, getDataSources, setFirstDataSourceAsDefault } from '../utils'; import { LoadingMask } from '../loading_mask'; /* Table config */ @@ -256,7 +252,7 @@ export const DataSourceTable = ({ history }: RouteComponentProps) => { try { for (const dataSource of selectedDataSources) { if (uiSettings.get('defaultDataSource') === dataSource.id) { - await handleSetDefaultDatasourceAfterDeletion(savedObjects.client, uiSettings); + await setFirstDataSourceAsDefault(savedObjects.client, uiSettings, true); } } } catch (e) { diff --git a/src/plugins/data_source_management/public/components/edit_data_source/edit_data_source.test.tsx b/src/plugins/data_source_management/public/components/edit_data_source/edit_data_source.test.tsx index 99e8fa9a67b..d8d175a920d 100644 --- a/src/plugins/data_source_management/public/components/edit_data_source/edit_data_source.test.tsx +++ b/src/plugins/data_source_management/public/components/edit_data_source/edit_data_source.test.tsx @@ -138,7 +138,7 @@ describe('Datasource Management: Edit Datasource Wizard', () => { }); test('should delete datasource successfully', async () => { spyOn(utils, 'deleteDataSourceById').and.returnValue({}); - spyOn(utils, 'handleSetDefaultDatasourceAfterDeletion').and.returnValue({}); + spyOn(utils, 'setFirstDataSourceAsDefault').and.returnValue({}); spyOn(uiSettings, 'get').and.returnValue('test1'); await act(async () => { // @ts-ignore @@ -148,11 +148,11 @@ describe('Datasource Management: Edit Datasource Wizard', () => { }); expect(utils.deleteDataSourceById).toHaveBeenCalled(); expect(history.push).toBeCalledWith(''); - expect(utils.handleSetDefaultDatasourceAfterDeletion).toHaveBeenCalled(); + expect(utils.setFirstDataSourceAsDefault).toHaveBeenCalled(); }); test('should fail to delete datasource', async () => { spyOn(utils, 'deleteDataSourceById').and.throwError('error'); - spyOn(utils, 'handleSetDefaultDatasourceAfterDeletion').and.returnValue({}); + spyOn(utils, 'setFirstDataSourceAsDefault').and.returnValue({}); spyOn(uiSettings, 'get').and.returnValue('test1'); await act(async () => { // @ts-ignore @@ -162,7 +162,7 @@ describe('Datasource Management: Edit Datasource Wizard', () => { }); component.update(); expect(utils.deleteDataSourceById).toHaveBeenCalled(); - expect(utils.handleSetDefaultDatasourceAfterDeletion).not.toHaveBeenCalled(); + expect(utils.setFirstDataSourceAsDefault).not.toHaveBeenCalled(); }); test('should test connection', () => { spyOn(utils, 'testConnection'); diff --git a/src/plugins/data_source_management/public/components/edit_data_source/edit_data_source.tsx b/src/plugins/data_source_management/public/components/edit_data_source/edit_data_source.tsx index 84290671c43..ab1e8531c80 100644 --- a/src/plugins/data_source_management/public/components/edit_data_source/edit_data_source.tsx +++ b/src/plugins/data_source_management/public/components/edit_data_source/edit_data_source.tsx @@ -17,7 +17,7 @@ import { getDataSources, testConnection, updateDataSourceById, - handleSetDefaultDatasourceAfterDeletion, + setFirstDataSourceAsDefault, } from '../utils'; import { getEditBreadcrumbs } from '../breadcrumbs'; import { EditDataSourceForm } from './components/edit_form/edit_data_source_form'; @@ -127,15 +127,14 @@ export const EditDataSource: React.FunctionComponent { try { if (uiSettings.get('defaultDataSource') === dataSourceID) { - await handleSetDefaultDatasourceAfterDeletion(savedObjects.client, uiSettings); + await setFirstDataSourceAsDefault(savedObjects.client, uiSettings, true); } } catch (e) { + setIsLoading(false); handleDisplayToastMessage({ id: 'dataSourcesManagement.editDataSource.setDefaultDataSourceFailMsg', defaultMessage: 'Unable to find a default datasource. Please set a new default datasource.', }); - } finally { - setIsLoading(false); } }; diff --git a/src/plugins/data_source_management/public/components/utils.test.ts b/src/plugins/data_source_management/public/components/utils.test.ts index 052ed502686..f2b1f709cb1 100644 --- a/src/plugins/data_source_management/public/components/utils.test.ts +++ b/src/plugins/data_source_management/public/components/utils.test.ts @@ -14,8 +14,8 @@ import { isValidUrl, testConnection, updateDataSourceById, - handleSetDefaultDatasourceAfterDeletion, - handleSetDefaultDatasourceDuringCreation, + handleSetDefaultDatasource, + setFirstDataSourceAsDefault, } from './utils'; import { coreMock } from '../../../../core/public/mocks'; import { @@ -279,29 +279,49 @@ describe('DataSourceManagement: Utils.ts', () => { expect(getDefaultAuthMethod(authenticationMethodRegistry)?.name).toBe(AuthType.NoAuth); }); }); - describe('handleSetDefaultDatasourceAfterDeletion', () => { - test('should remove defaultDataSource setting and set new defaultDataSource if data sources exist', async () => { + describe('handle set default datasource', () => { + beforeEach(() => { + jest.clearAllMocks(); // Reset all mock calls before each test + }); + test('should set default datasource when it does not have default datasource ', async () => { + mockUiSettingsCalls(uiSettings, 'get', null); mockResponseForSavedObjectsCalls(savedObjects.client, 'find', getDataSourcesResponse); + await handleSetDefaultDatasource(savedObjects.client, uiSettings); + expect(uiSettings.set).toHaveBeenCalled(); + }); + test('should not set default datasource when it has default datasouce', async () => { mockUiSettingsCalls(uiSettings, 'get', 'test'); - - await handleSetDefaultDatasourceAfterDeletion(savedObjects.client, uiSettings); - expect(uiSettings.set).toHaveBeenCalledWith('defaultDataSource', 'test'); + mockResponseForSavedObjectsCalls(savedObjects.client, 'find', getDataSourcesResponse); + await handleSetDefaultDatasource(savedObjects.client, uiSettings); + expect(uiSettings.set).not.toHaveBeenCalled(); }); }); - describe('handleSetDefaultDatasourceDuringCreation', () => { + describe('set first aataSource as default', () => { beforeEach(() => { jest.clearAllMocks(); // Reset all mock calls before each test }); - test('should not set defaultDataSource if more than one data source exists', async () => { + test('should set defaultDataSource if more than one data source exists', async () => { mockResponseForSavedObjectsCalls(savedObjects.client, 'find', getDataSourcesResponse); - await handleSetDefaultDatasourceDuringCreation(savedObjects.client, uiSettings); - expect(uiSettings.set).not.toHaveBeenCalled(); + await setFirstDataSourceAsDefault(savedObjects.client, uiSettings, true); + expect(uiSettings.set).toHaveBeenCalled(); }); test('should set defaultDataSource if only one data source exists', async () => { mockResponseForSavedObjectsCalls(savedObjects.client, 'find', getSingleDataSourceResponse); - await handleSetDefaultDatasourceDuringCreation(savedObjects.client, uiSettings); + await setFirstDataSourceAsDefault(savedObjects.client, uiSettings, true); expect(uiSettings.set).toHaveBeenCalled(); }); + test('should not set defaultDataSource if no data source exists', async () => { + mockResponseForSavedObjectsCalls(savedObjects.client, 'find', { savedObjects: [] }); + await setFirstDataSourceAsDefault(savedObjects.client, uiSettings, true); + expect(uiSettings.remove).toHaveBeenCalled(); + expect(uiSettings.set).not.toHaveBeenCalled(); + }); + test('should not set defaultDataSource if no data source exists and no default datasouce', async () => { + mockResponseForSavedObjectsCalls(savedObjects.client, 'find', { savedObjects: [] }); + await setFirstDataSourceAsDefault(savedObjects.client, uiSettings, false); + expect(uiSettings.remove).not.toHaveBeenCalled(); + expect(uiSettings.set).not.toHaveBeenCalled(); + }); }); describe('Check extractRegisteredAuthTypeCredentials method', () => { test('Should extract credential field successfully', () => { diff --git a/src/plugins/data_source_management/public/components/utils.ts b/src/plugins/data_source_management/public/components/utils.ts index ef2173ce96d..b911203cd28 100644 --- a/src/plugins/data_source_management/public/components/utils.ts +++ b/src/plugins/data_source_management/public/components/utils.ts @@ -54,26 +54,27 @@ export async function getDataSourcesWithFields( return response?.savedObjects; } -export async function handleSetDefaultDatasourceAfterDeletion( +export async function handleSetDefaultDatasource( savedObjectsClient: SavedObjectsClientContract, uiSettings: IUiSettingsClient ) { - uiSettings.remove('defaultDataSource'); - const listOfDataSources: DataSourceTableItem[] = await getDataSources(savedObjectsClient); - if (Array.isArray(listOfDataSources) && listOfDataSources.length >= 1) { - const datasourceId = listOfDataSources[0].id; - await uiSettings.set('defaultDataSource', datasourceId); + if (uiSettings.get('defaultDataSource', null) === null) { + return await setFirstDataSourceAsDefault(savedObjectsClient, uiSettings, false); } } -export async function handleSetDefaultDatasourceDuringCreation( +export async function setFirstDataSourceAsDefault( savedObjectsClient: SavedObjectsClientContract, - uiSettings: IUiSettingsClient + uiSettings: IUiSettingsClient, + exists: boolean ) { + if (exists) { + uiSettings.remove('defaultDataSource'); + } const listOfDataSources: DataSourceTableItem[] = await getDataSources(savedObjectsClient); - if (Array.isArray(listOfDataSources) && listOfDataSources.length === 1) { + if (Array.isArray(listOfDataSources) && listOfDataSources.length >= 1) { const datasourceId = listOfDataSources[0].id; - await uiSettings.set('defaultDataSource', datasourceId); + return await uiSettings.set('defaultDataSource', datasourceId); } }