From 8de353d646db53d26f7a95fbc213bd44ac70825a Mon Sep 17 00:00:00 2001 From: Bharat Pasupula Date: Wed, 12 Feb 2025 19:34:46 +0100 Subject: [PATCH 1/2] Fix generated name for integration title --- .../steps/data_stream_step/data_stream_step.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/platform/plugins/shared/automatic_import/public/components/create_integration/create_automatic_import/steps/data_stream_step/data_stream_step.tsx b/x-pack/platform/plugins/shared/automatic_import/public/components/create_integration/create_automatic_import/steps/data_stream_step/data_stream_step.tsx index d929dae7812e3..1d0b46e68bd6d 100644 --- a/x-pack/platform/plugins/shared/automatic_import/public/components/create_integration/create_automatic_import/steps/data_stream_step/data_stream_step.tsx +++ b/x-pack/platform/plugins/shared/automatic_import/public/components/create_integration/create_automatic_import/steps/data_stream_step/data_stream_step.tsx @@ -132,7 +132,7 @@ export const DataStreamStep = React.memo( // Only executed once when the packageNames are loaded if (packageNames != null && integrationSettings?.name == null && integrationSettings?.title) { const generatedName = getNameFromTitle(integrationSettings.title); - if (!packageNames.has(generatedName)) { + if (!packageNames.has(generatedName) && isValidName(generatedName)) { setName(generatedName); setIntegrationValues({ name: generatedName }); } @@ -195,7 +195,7 @@ export const DataStreamStep = React.memo( Date: Thu, 13 Feb 2025 09:41:48 +0100 Subject: [PATCH 2/2] Add jest tests --- .../data_stream_step.test.tsx | 55 ++++++++++++++++++- .../data_stream_step/data_stream_step.tsx | 3 +- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/x-pack/platform/plugins/shared/automatic_import/public/components/create_integration/create_automatic_import/steps/data_stream_step/data_stream_step.test.tsx b/x-pack/platform/plugins/shared/automatic_import/public/components/create_integration/create_automatic_import/steps/data_stream_step/data_stream_step.test.tsx index a7dd8eae0fdab..18b670b8d7b93 100644 --- a/x-pack/platform/plugins/shared/automatic_import/public/components/create_integration/create_automatic_import/steps/data_stream_step/data_stream_step.test.tsx +++ b/x-pack/platform/plugins/shared/automatic_import/public/components/create_integration/create_automatic_import/steps/data_stream_step/data_stream_step.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { render, act, type RenderResult, fireEvent } from '@testing-library/react'; import { TestProvider } from '../../../../../mocks/test_provider'; -import { DataStreamStep } from './data_stream_step'; +import { DataStreamStep, getNameFromTitle } from './data_stream_step'; import { ActionsProvider } from '../../state'; import { mockActions, mockState } from '../../mocks/state'; @@ -284,4 +284,57 @@ describe('DataStreamStep', () => { expect(result.queryByTestId('generationModal')).toBeInTheDocument(); }); }); + + describe('when integrationSettings has an invalid generated name from title', () => { + describe.each(['123 abc', '1a'])('should render error for %s', (invalidTitle) => { + let result: RenderResult; + beforeEach(() => { + jest.clearAllMocks(); + result = render( + , + { wrapper } + ); + }); + + it('should set empty name for invalid title', () => { + const input = result.getByTestId('nameInput'); + expect(input).toHaveValue(''); // name is not set + }); + }); + }); + + describe('when integrationSettings has an valid generated name from title', () => { + describe.each(['abc 123', '$abc123', 'abc 123 abc', 'abc_123', 'abc_123_abc'])( + 'should render error for %s', + (validTitle) => { + let result: RenderResult; + beforeEach(() => { + jest.clearAllMocks(); + result = render( + , + { wrapper } + ); + }); + + it('should auto-generate name from title', () => { + const input = result.getByTestId('nameInput'); + expect(input).toHaveValue(getNameFromTitle(validTitle)); + expect(mockActions.setIntegrationSettings).toHaveBeenCalledWith({ + name: getNameFromTitle(validTitle), + title: validTitle, + }); + }); + } + ); + }); }); diff --git a/x-pack/platform/plugins/shared/automatic_import/public/components/create_integration/create_automatic_import/steps/data_stream_step/data_stream_step.tsx b/x-pack/platform/plugins/shared/automatic_import/public/components/create_integration/create_automatic_import/steps/data_stream_step/data_stream_step.tsx index 1d0b46e68bd6d..4c9e9270b9c71 100644 --- a/x-pack/platform/plugins/shared/automatic_import/public/components/create_integration/create_automatic_import/steps/data_stream_step/data_stream_step.tsx +++ b/x-pack/platform/plugins/shared/automatic_import/public/components/create_integration/create_automatic_import/steps/data_stream_step/data_stream_step.tsx @@ -55,7 +55,8 @@ export const InputTypeOptions: Array> = [ const isValidName = (name: string) => NAME_REGEX_PATTERN.test(name); const isValidDatastreamName = (name: string) => DATASTREAM_NAME_REGEX_PATTERN.test(name); -const getNameFromTitle = (title: string) => title.toLowerCase().replaceAll(/[^a-z0-9]/g, '_'); +export const getNameFromTitle = (title: string) => + title.toLowerCase().replaceAll(/[^a-z0-9]/g, '_'); interface DataStreamStepProps { integrationSettings: State['integrationSettings'];