From 2868e0a85b5be6eba3cd56f2b85a0b4c2a0fe633 Mon Sep 17 00:00:00 2001 From: Lu Yu Date: Tue, 27 Feb 2024 14:05:22 -0800 Subject: [PATCH] [Manual Backport 2.x]Fix missing customApiRegistryPromise param for test connection (#5944) (#5971) * Fix missing customApiRegistryPromise param for test connection (#5944) * fix missing param and add changelog and test Signed-off-by: Lu Yu * change pr number Signed-off-by: Lu Yu * remove dangling changelog Signed-off-by: Lu Yu --------- Signed-off-by: Lu Yu * remove dangling changelog Signed-off-by: Lu Yu --------- Signed-off-by: Lu Yu --- CHANGELOG.md | 2 + src/plugins/data_source/server/plugin.ts | 3 +- .../server/routes/test_connection.test.ts | 96 +++++++++++++++++++ .../server/routes/test_connection.ts | 4 +- 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 src/plugins/data_source/server/routes/test_connection.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b641739a8b7..31bf05d5003a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -81,6 +81,8 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - [Discover] Fix missing index pattern field from breaking Discover [#5626](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/5626) - [BUG] Remove duplicate sample data as id 90943e30-9a47-11e8-b64d-95841ca0b247 ([5668](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/5668)) - [BUG][Multiple Datasource] Fix datasource testing connection unexpectedly passed with wrong endpoint [#5663](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/5663) +- [BUG][Multiple Datasource] Fix missing customApiRegistryPromise param for test connection ([#5944](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/5944)) + ### 🚞 Infrastructure diff --git a/src/plugins/data_source/server/plugin.ts b/src/plugins/data_source/server/plugin.ts index e9569956e282..56b5f5caf2e8 100644 --- a/src/plugins/data_source/server/plugin.ts +++ b/src/plugins/data_source/server/plugin.ts @@ -129,7 +129,8 @@ export class DataSourcePlugin implements Plugin { diff --git a/src/plugins/data_source/server/routes/test_connection.test.ts b/src/plugins/data_source/server/routes/test_connection.test.ts new file mode 100644 index 000000000000..888a241e464d --- /dev/null +++ b/src/plugins/data_source/server/routes/test_connection.test.ts @@ -0,0 +1,96 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import supertest from 'supertest'; +import { UnwrapPromise } from '@osd/utility-types'; +import { setupServer } from '../../../../../src/core/server/test_utils'; + +import { + IAuthenticationMethodRegistery, + authenticationMethodRegisteryMock, +} from '../auth_registry'; +import { CustomApiSchemaRegistry } from '../schema_registry'; +import { DataSourceServiceSetup } from '../../server/data_source_service'; +import { CryptographyServiceSetup } from '../cryptography_service'; +import { registerTestConnectionRoute } from './test_connection'; +import { AuthType } from '../../common/data_sources'; +// eslint-disable-next-line @osd/eslint/no-restricted-paths +import { opensearchClientMock } from '../../../../../src/core/server/opensearch/client/mocks'; + +type SetupServerReturn = UnwrapPromise>; + +const URL = '/internal/data-source-management/validate'; + +describe(`Test connection ${URL}`, () => { + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; + let handlerContext: SetupServerReturn['handlerContext']; + let cryptographyMock: jest.Mocked; + const customApiSchemaRegistry = new CustomApiSchemaRegistry(); + let customApiSchemaRegistryPromise: Promise; + let dataSourceClient: ReturnType; + let dataSourceServiceSetupMock: DataSourceServiceSetup; + let authRegistryPromiseMock: Promise; + const dataSourceAttr = { + endpoint: 'https://test.com', + auth: { + type: AuthType.UsernamePasswordType, + credentials: { + username: 'testUser', + password: 'testPassword', + }, + }, + }; + + beforeEach(async () => { + ({ server, httpSetup, handlerContext } = await setupServer()); + customApiSchemaRegistryPromise = Promise.resolve(customApiSchemaRegistry); + authRegistryPromiseMock = Promise.resolve(authenticationMethodRegisteryMock.create()); + dataSourceClient = opensearchClientMock.createInternalClient(); + + dataSourceServiceSetupMock = { + getDataSourceClient: jest.fn(() => Promise.resolve(dataSourceClient)), + getDataSourceLegacyClient: jest.fn(), + }; + + const router = httpSetup.createRouter(''); + dataSourceClient.info.mockImplementationOnce(() => + opensearchClientMock.createSuccessTransportRequestPromise({ cluster_name: 'testCluster' }) + ); + registerTestConnectionRoute( + router, + dataSourceServiceSetupMock, + cryptographyMock, + authRegistryPromiseMock, + customApiSchemaRegistryPromise + ); + + await server.start(); + }); + + afterEach(async () => { + await server.stop(); + }); + + it('shows successful response', async () => { + const result = await supertest(httpSetup.server.listener) + .post(URL) + .send({ + id: 'testId', + dataSourceAttr, + }) + .expect(200); + expect(result.body).toEqual({ success: true }); + expect(dataSourceServiceSetupMock.getDataSourceClient).toHaveBeenCalledWith( + expect.objectContaining({ + savedObjects: handlerContext.savedObjects.client, + cryptography: cryptographyMock, + dataSourceId: 'testId', + testClientDataSourceAttr: dataSourceAttr, + customApiSchemaRegistryPromise, + }) + ); + }); +}); diff --git a/src/plugins/data_source/server/routes/test_connection.ts b/src/plugins/data_source/server/routes/test_connection.ts index e1205687bd17..b4c3d091aa35 100644 --- a/src/plugins/data_source/server/routes/test_connection.ts +++ b/src/plugins/data_source/server/routes/test_connection.ts @@ -15,7 +15,8 @@ export const registerTestConnectionRoute = async ( router: IRouter, dataSourceServiceSetup: DataSourceServiceSetup, cryptography: CryptographyServiceSetup, - authRegistryPromise: Promise + authRegistryPromise: Promise, + customApiSchemaRegistryPromise: Promise ) => { const authRegistry = await authRegistryPromise; router.post( @@ -68,6 +69,7 @@ export const registerTestConnectionRoute = async ( testClientDataSourceAttr: dataSourceAttr as DataSourceAttributes, request, authRegistry, + customApiSchemaRegistryPromise, } );