Skip to content

Commit

Permalink
Add component templates tests
Browse files Browse the repository at this point in the history
  • Loading branch information
sebelga committed Sep 9, 2020
1 parent 6fd8073 commit e8bdc75
Show file tree
Hide file tree
Showing 7 changed files with 171 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,15 @@ describe('<TemplateCreate />', () => {

beforeAll(() => {
jest.useFakeTimers();

// disable all react-beautiful-dnd development warnings
(window as any)['__react-beautiful-dnd-disable-dev-warnings'] = true;
});

afterAll(() => {
server.restore();
jest.useRealTimers();
(window as any)['__react-beautiful-dnd-disable-dev-warnings'] = false;
});

describe('on component mount', () => {
Expand Down Expand Up @@ -107,16 +111,16 @@ describe('<TemplateCreate />', () => {
const componentTemplate1 = {
name: 'test_component_template_1',
hasMappings: true,
hasAliases: true,
hasSettings: true,
hasAliases: false,
hasSettings: false,
usedBy: [],
isManaged: false,
};

const componentTemplate2 = {
name: 'test_component_template_2',
hasMappings: true,
hasAliases: true,
hasMappings: false,
hasAliases: false,
hasSettings: true,
usedBy: ['test_index_template_1'],
isManaged: false,
Expand Down Expand Up @@ -146,7 +150,102 @@ describe('<TemplateCreate />', () => {
expect(find('stepTitle').text()).toEqual('Component templates (optional)');
});

// TODO add tests for component templates selector
it('should list the available component templates', () => {
const {
actions: {
componentTemplates: { getComponentTemplatesInList },
},
} = testBed;
const componentsFound = getComponentTemplatesInList();
expect(componentsFound).toEqual(componentTemplates.map((c) => c.name));
});

it('should allow to search for a component', async () => {
const {
component,
form: { setInputValue },
actions: {
componentTemplates: { getComponentTemplatesInList },
},
} = testBed;

await act(async () => {
setInputValue('componentTemplateSearchBox', 'template_2');
});
component.update();

const componentsFound = getComponentTemplatesInList();
expect(componentsFound).toEqual(['test_component_template_2']);
});

it('should allow to filter component by Index settings, mappings and aliases', async () => {
const {
find,
exists,
actions: {
componentTemplates: { showFilters, selectFilter, getComponentTemplatesInList },
},
} = testBed;

showFilters();

expect(find('filterList.filterItem').map((wrapper) => wrapper.text())).toEqual([
'Index settings',
'Mappings',
'Aliases',
]);

await selectFilter('settings');
expect(getComponentTemplatesInList()).toEqual(['test_component_template_2']); // only this one has settings

await selectFilter('mappings');
expect(exists('componentTemplatesList')).toBe(false); // no component has **both** settings and mappings
expect(exists('componentTemplates.emptySearchResult')).toBe(true);
expect(find('componentTemplates.emptySearchResult').text()).toContain(
'No components match your search'
);

await selectFilter('settings'); // unselect settings
expect(getComponentTemplatesInList()).toEqual(['test_component_template_1']); // only this one has mappings

await selectFilter('mappings'); // unselect mappings (back to start)
expect(getComponentTemplatesInList()).toEqual([
'test_component_template_1',
'test_component_template_2',
]);

await selectFilter('aliases');
expect(exists('componentTemplatesList')).toBe(false); // no component has aliases defined.
});

it('should allow to select and unselect a component template', async () => {
const {
find,
exists,
actions: {
componentTemplates: {
selectComponentAt,
unSelectComponentAt,
getComponentTemplatesSelected,
},
},
} = testBed;

// Start with empty selection
expect(exists('componentTemplatesSelection.emptyPrompt')).toBe(true);
expect(find('componentTemplatesSelection.emptyPrompt').text()).toContain(
'Add component template building blocks to this template.'
);

// Select first component in the list
await selectComponentAt(0);
expect(exists('componentTemplatesSelection.emptyPrompt')).toBe(false);
expect(getComponentTemplatesSelected()).toEqual(['test_component_template_1']);

// Unselect the component
await unSelectComponentAt(0);
expect(exists('componentTemplatesSelection.emptyPrompt')).toBe(true);
});
});

// describe('index settings (step 3)', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,50 @@ export const formSetup = async (initTestBed: SetupFunc<TestSubjects>) => {
component.update();
};

const componentTemplates = {
getComponentTemplatesInList() {
const { find } = testBed;
return find('componentTemplatesList.item.name').map((wrapper) => wrapper.text());
},
getComponentTemplatesSelected() {
const { find } = testBed;
return find('componentTemplatesSelection.item.name').map((wrapper) => wrapper.text());
},
showFilters() {
const { find, component } = testBed;
act(() => {
find('componentTemplates.filterButton').simulate('click');
});
component.update();
},
async selectFilter(filter: 'settings' | 'mappings' | 'aliases') {
const { find, component } = testBed;
const filters = ['settings', 'mappings', 'aliases'];
const index = filters.indexOf(filter);

await act(async () => {
find('filterList.filterItem').at(index).simulate('click');
});
component.update();
},
async selectComponentAt(index: number) {
const { find, component } = testBed;

await act(async () => {
find('componentTemplatesList.item.action-plusInCircle').at(index).simulate('click');
});
component.update();
},
async unSelectComponentAt(index: number) {
const { find, component } = testBed;

await act(async () => {
find('componentTemplatesSelection.item.action-minusInCircle').at(index).simulate('click');
});
component.update();
},
};

return {
...testBed,
actions: {
Expand All @@ -184,6 +228,7 @@ export const formSetup = async (initTestBed: SetupFunc<TestSubjects>) => {
completeStepFour,
selectSummaryTab,
addMappingField,
componentTemplates,
},
};
};
Expand All @@ -194,6 +239,17 @@ export type TestSubjects =
| 'backButton'
| 'codeEditorContainer'
| 'confirmModalConfirmButton'
| 'componentTemplates.filterButton'
| 'componentTemplates.emptySearchResult'
| 'filterList.filterItem'
| 'componentTemplatesList'
| 'componentTemplatesList.item.name'
| 'componentTemplatesList.item.action-plusInCircle'
| 'componentTemplatesSelection'
| 'componentTemplatesSelection.item.name'
| 'componentTemplatesSelection.item.action-minusInCircle'
| 'componentTemplatesSelection.emptyPrompt'
| 'componentTemplateSearchBox'
| 'createFieldForm.addPropertyButton'
| 'createFieldForm.addButton'
| 'createFieldForm.addFieldButton'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,12 +145,13 @@ export const ComponentTemplates = ({ isLoading, components, listItemProps }: Pro
/>
</EuiButton>
}
data-test-subj="emptySearchResult"
/>
);
};

return (
<div className="componentTemplates">
<div className="componentTemplates" data-test-subj="componentTemplates">
<div className="componentTemplates__header">
<EuiFlexGroup gutterSize="none">
<EuiFlexItem>
Expand All @@ -162,6 +163,7 @@ export const ComponentTemplates = ({ isLoading, components, listItemProps }: Pro
}}
aria-label={i18nTexts.searchBoxPlaceholder}
className="componentTemplates__searchBox"
data-test-subj="componentTemplateSearchBox"
/>
</EuiFlexItem>
<EuiFlexItem grow={false}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ interface Props {

export const ComponentTemplatesList = ({ components, listItemProps }: Props) => {
return (
<>
<div data-test-subj="componentTemplatesList">
{components.map((component) => (
<ComponentTemplatesListItem key={component.name} component={component} {...listItemProps} />
))}
</>
</div>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export const ComponentTemplatesListItem = ({
className={classNames('componentTemplatesListItem', {
'componentTemplatesListItem--selected': isSelectedValue,
})}
data-test-subj="item"
>
<EuiFlexGroup justifyContent="spaceBetween">
<EuiFlexItem grow={false}>
Expand All @@ -59,7 +60,7 @@ export const ComponentTemplatesListItem = ({
</div>
</EuiFlexItem>
)}
<EuiFlexItem grow={false}>
<EuiFlexItem grow={false} data-test-subj="name">
{/* <EuiText>{component.name}</EuiText> */}
<EuiLink onClick={() => onViewDetail(component)}>{component.name}</EuiLink>
</EuiFlexItem>
Expand All @@ -83,7 +84,7 @@ export const ComponentTemplatesListItem = ({
<EuiButtonIcon
iconType={action.icon}
onClick={() => action.handler(component)}
data-test-subj="addPropertyButton"
data-test-subj={`action-${action.icon}`}
aria-label={action.label}
/>
</EuiToolTip>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ export const ComponentTemplatesSelector = ({
// eslint-disable-next-line @typescript-eslint/naming-convention
'componentTemplatesSelector__selection--is-empty': !hasSelection,
})}
data-test-subj="componentTemplatesSelection"
>
{hasSelection ? (
<>
Expand Down Expand Up @@ -200,7 +201,7 @@ export const ComponentTemplatesSelector = ({
</div>
</>
) : (
<EuiText textAlign="center">
<EuiText textAlign="center" data-test-subj="emptyPrompt">
<p>
<FormattedMessage
id="xpack.idxMgmt.componentTemplatesSelector.noComponentSelectedLabel-1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export function FilterListButton({ onChange, filters }: Props) {
numFilters={Object.keys(filters).length}
hasActiveFilters={activeFilters.length > 0}
numActiveFilters={activeFilters.length}
data-test-subj="viewButton"
data-test-subj="filterButton"
>
<FormattedMessage
id="xpack.idxMgmt.indexTemplatesList.filterButtonLabel"
Expand Down

0 comments on commit e8bdc75

Please sign in to comment.