Skip to content

Commit

Permalink
[Automatic Import] Fix generated name for integration title (elastic#…
Browse files Browse the repository at this point in the history
…210916)

## Summary

A bug was introduced with elastic#210770 and this PR fixes that. The Package
name generated is validated.
  • Loading branch information
bhapas authored Feb 13, 2025
1 parent fe96fe2 commit cf0f338
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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,
});
});
}
);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -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'];
Expand Down Expand Up @@ -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 });
}
Expand Down Expand Up @@ -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}
Expand Down

0 comments on commit cf0f338

Please sign in to comment.