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 a94d5b2260e6..a113c114310e 100644 --- a/src/plugins/data_source_management/public/components/utils.test.ts +++ b/src/plugins/data_source_management/public/components/utils.test.ts @@ -212,6 +212,9 @@ describe('DataSourceManagement: Utils.ts', () => { expect(isValidUrl('')).toBeFalsy(); expect(isValidUrl('test')).toBeFalsy(); + /* False cases: path name scenario*/ + expect(isValidUrl('https://test.com/_somepath')).toBeFalsy(); + /* True cases */ expect(isValidUrl('https://test.com')).toBeTruthy(); expect(isValidUrl('http://test.com')).toBeTruthy(); diff --git a/src/plugins/data_source_management/public/components/utils.ts b/src/plugins/data_source_management/public/components/utils.ts index 5f2cfb2337ad..1ef80e3eb45c 100644 --- a/src/plugins/data_source_management/public/components/utils.ts +++ b/src/plugins/data_source_management/public/components/utils.ts @@ -103,7 +103,11 @@ export async function testConnection( export const isValidUrl = (endpoint: string) => { try { const url = new URL(endpoint); - return Boolean(url) && (url.protocol === 'http:' || url.protocol === 'https:'); + return ( + Boolean(url) && + (url.protocol === 'http:' || url.protocol === 'https:') && + (!url.pathname || url.pathname.length === 0 || url.pathname === '/') + ); } catch (e) { return false; } diff --git a/src/plugins/data_source_management/public/components/validation/datasource_form_validation.test.ts b/src/plugins/data_source_management/public/components/validation/datasource_form_validation.test.ts index 9a00d0f29c91..c93f935063ba 100644 --- a/src/plugins/data_source_management/public/components/validation/datasource_form_validation.test.ts +++ b/src/plugins/data_source_management/public/components/validation/datasource_form_validation.test.ts @@ -7,7 +7,11 @@ import { AuthType } from '../../types'; import { CreateDataSourceState } from '../create_data_source_wizard/components/create_form/create_data_source_form'; import { EditDataSourceState } from '../edit_data_source/components/edit_form/edit_data_source_form'; import { defaultValidation, performDataSourceFormValidation } from './datasource_form_validation'; -import { mockDataSourceAttributesWithAuth } from '../../mocks'; +import { + mockDataSourceAttributesWithAuth, + mockDataSourceAttributesWithValidEndpoint, + mockDataSourceAttributesWithInvalidEndpoint, +} from '../../mocks'; describe('DataSourceManagement: Form Validation', () => { describe('validate create/edit datasource', () => { @@ -49,6 +53,16 @@ describe('DataSourceManagement: Form Validation', () => { const result = performDataSourceFormValidation(form, [], ''); expect(result).toBe(false); }); + test('should fail validation when endpoint path is not empty', () => { + form.endpoint = mockDataSourceAttributesWithInvalidEndpoint.endpoint; + const result = performDataSourceFormValidation(form, [], ''); + expect(result).toBe(false); + }); + test('should NOT fail validation when endpoint path is empty', () => { + form.endpoint = mockDataSourceAttributesWithValidEndpoint.endpoint; + const result = performDataSourceFormValidation(form, [], ''); + expect(result).toBe(false); + }); test('should NOT fail validation on empty username/password when No Auth is selected', () => { form.auth.type = AuthType.NoAuth; form.title = 'test'; diff --git a/src/plugins/data_source_management/public/mocks.ts b/src/plugins/data_source_management/public/mocks.ts index c078247956e0..d3236daae8fb 100644 --- a/src/plugins/data_source_management/public/mocks.ts +++ b/src/plugins/data_source_management/public/mocks.ts @@ -131,6 +131,34 @@ export const getMappedDataSources = [ }, ]; +export const mockDataSourceAttributesWithValidEndpoint = { + id: 'test', + title: 'create-test-ds', + description: 'jest testing', + endpoint: 'https://test.com', + auth: { + type: AuthType.UsernamePasswordType, + credentials: { + username: 'test123', + password: 'test123', + }, + }, +}; + +export const mockDataSourceAttributesWithInvalidEndpoint = { + id: 'test', + title: 'create-test-ds', + description: 'jest testing', + endpoint: 'https://test.com/_somepath', + auth: { + type: AuthType.UsernamePasswordType, + credentials: { + username: 'test123', + password: 'test123', + }, + }, +}; + export const mockDataSourceAttributesWithAuth = { id: 'test', title: 'create-test-ds',