[9.0] [Automatic Import] Fix generated name for integration title (#210916) (#211037)

# Backport

This will backport the following commits from `main` to `9.0`:
- [[Automatic Import] Fix generated name for integration title
(#210916)](https://github.com/elastic/kibana/pull/210916)

<!--- Backport version: 9.4.3 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sqren/backport)

<!--BACKPORT [{"author":{"name":"Bharat
Pasupula","email":"123897612+bhapas@users.noreply.github.com"},"sourceCommit":{"committedDate":"2025-02-13T16:02:03Z","message":"[Automatic
Import] Fix generated name for integration title (#210916)\n\n##
Summary\r\n\r\nA bug was introduced with #210770 and this PR fixes that.
The Package\r\nname generated is
validated.","sha":"cf0f338d8749c90024b2409fbb7b036469bfab6e","branchLabelMapping":{"^v9.1.0$":"main","^v8.19.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:fix","backport:prev-minor","Team:Security-Scalability","Feature:AutomaticImport","v9.1.0"],"title":"[Automatic
Import] Fix generated name for integration
title","number":210916,"url":"https://github.com/elastic/kibana/pull/210916","mergeCommit":{"message":"[Automatic
Import] Fix generated name for integration title (#210916)\n\n##
Summary\r\n\r\nA bug was introduced with #210770 and this PR fixes that.
The Package\r\nname generated is
validated.","sha":"cf0f338d8749c90024b2409fbb7b036469bfab6e"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.1.0","branchLabelMappingKey":"^v9.1.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/210916","number":210916,"mergeCommit":{"message":"[Automatic
Import] Fix generated name for integration title (#210916)\n\n##
Summary\r\n\r\nA bug was introduced with #210770 and this PR fixes that.
The Package\r\nname generated is
validated.","sha":"cf0f338d8749c90024b2409fbb7b036469bfab6e"}}]}]
BACKPORT-->

Co-authored-by: Bharat Pasupula <123897612+bhapas@users.noreply.github.com>
This commit is contained in:
Kibana Machine 2025-02-14 04:48:17 +11:00 committed by GitHub
parent ab905d5587
commit badb523efc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 58 additions and 4 deletions

View file

@ -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(
<DataStreamStep
integrationSettings={{ title: invalidTitle }}
connector={mockState.connector}
isGenerating={false}
celInputResult={undefined}
/>,
{ 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(
<DataStreamStep
integrationSettings={{ title: validTitle }}
connector={mockState.connector}
isGenerating={false}
celInputResult={undefined}
/>,
{ 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,
});
});
}
);
});
});

View file

@ -55,7 +55,8 @@ export const InputTypeOptions: Array<EuiComboBoxOptionOption<InputType>> = [
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'];
@ -132,7 +133,7 @@ export const DataStreamStep = React.memo<DataStreamStepProps>(
// 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 +196,7 @@ export const DataStreamStep = React.memo<DataStreamStepProps>(
<EuiFieldText
name="name"
data-test-subj="nameInput"
value={isValidName(name) ? name : ''}
value={name}
onChange={onChange.name}
isInvalid={invalidFields.name}
isLoading={isLoadingPackageNames}