Merge pull request #31756 from coltMcKissick/31502-colt

catalog-react: OwnerEntityPicker case insensitive
This commit is contained in:
Ben Lambert
2025-12-02 11:10:24 +01:00
committed by GitHub
3 changed files with 80 additions and 1 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-catalog-react': patch
---
Fixed an issue where `EntityOwnerPicker` failed to filter options when the input text contained uppercase characters.
@@ -362,6 +362,76 @@ describe('<EntityOwnerPicker mode="all" />', () => {
owners: new EntityOwnerFilter(['group:default/team-b']),
});
});
it('calls fetch with lowercased input and displays results', async () => {
const updateFilters = jest.fn();
const someOwnerEntities: Entity[] = [
{
apiVersion: '1',
kind: 'Group',
metadata: {
name: 'some-owner',
},
},
{
apiVersion: '1',
kind: 'Group',
metadata: {
name: 'some-owner-2',
},
spec: {
profile: {
displayName: 'Some Owner 2',
},
},
},
];
mockCatalogApi.queryEntities.mockImplementation(async _request => {
const totalItems = 2;
return {
items: someOwnerEntities,
pageInfo: {
nextCursor: '',
},
totalItems,
};
});
await renderInTestApp(
<ApiProvider apis={mockApis}>
<MockEntityListContextProvider
value={{
updateFilters,
}}
>
<EntityOwnerPicker mode="all" />
</MockEntityListContextProvider>
</ApiProvider>,
);
expect(mockCatalogApi.getEntitiesByRefs).not.toHaveBeenCalled();
expect(updateFilters).toHaveBeenLastCalledWith({
owners: undefined,
});
const input = screen.getByRole('textbox');
fireEvent.change(input, { target: { value: 'Some-Owner' } });
await waitFor(() =>
expect(screen.getByText('some-owner')).toBeInTheDocument(),
);
expect(mockCatalogApi.queryEntities).toHaveBeenLastCalledWith(
expect.objectContaining({
fullTextFilter: expect.objectContaining({
term: 'some-owner',
}),
}),
);
fireEvent.click(screen.getByText('some-owner'));
expect(updateFilters).toHaveBeenLastCalledWith({
owners: new EntityOwnerFilter(['group:default/some-owner']),
});
});
});
describe('<EntityOwnerPicker mode="owners-only" />', () => {
@@ -146,7 +146,11 @@ export const EntityOwnerPicker = (props?: EntityOwnerPickerProps) => {
mode,
initialSelectedOwnersRefs: selectedOwners,
});
useDebouncedEffect(() => handleFetch({ text }), [text, handleFetch], 250);
useDebouncedEffect(
() => handleFetch({ text: text.toLocaleLowerCase('en-US') }),
[text, handleFetch],
250,
);
const availableOwners = value?.items || [];