Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions src/__testing__/UserSearchFieldInput.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import React from 'react';
import UserSearchField from '../custom/UserSearchField/UserSearchFieldInput';
import { SistentThemeProvider } from '../theme';

Comment thread
yi-nuo426 marked this conversation as resolved.
// Regression guard for the user-picker type-ahead.
//
// The picker is a controlled MUI Autocomplete. In MUI v9 the `renderInput`
// params expose the native <input> wiring (value, onChange, onKeyDown, focus
// handlers and the anchor ref from `getInputProps`) under
// `params.slotProps.htmlInput`. If the TextField is handed an explicit
// `slotProps` object that omits `htmlInput`, that object REPLACES the one
// spread from `{...params}` and the input is silently disconnected from the
// Autocomplete: keystrokes no longer reach `onInputChange`, the search never
// fires and the suggestion list never opens. These tests assert the wiring
// survives so the type-ahead keeps working.

type FieldProps = React.ComponentProps<typeof UserSearchField>;

const renderWithTheme = (ui: React.ReactElement) =>
render(<SistentThemeProvider>{ui}</SistentThemeProvider>);

const jane = {
userId: 'u-jane',
firstName: 'Jane',
lastName: 'Doe',
email: 'jane@example.com'
};

const renderField = (overrides: Partial<FieldProps> = {}) => {
const props: FieldProps = {
usersData: [],
setUsersData: jest.fn(),
currentUserData: null,
searchedUsers: [jane],
isUserSearchLoading: false,
fetchSearchedUsers: jest.fn(),
usersSearch: '',
setUsersSearch: jest.fn(),
...overrides
};
const utils = renderWithTheme(<UserSearchField {...props} />);
const input = screen.getByRole('combobox') as HTMLInputElement;
return { props, input, ...utils };
};

describe('UserSearchField type-ahead wiring', () => {
it('forwards keystrokes to the search callback', () => {
const { props, input } = renderField();

fireEvent.change(input, { target: { value: 'jane' } });

// Only reachable when the Autocomplete's htmlInput slot is forwarded to
// the TextField; a dropped slot leaves the input inert and this stays 0.
expect(props.fetchSearchedUsers).toHaveBeenCalledWith('jane');
});

it('opens the suggestion list with matching users as the query is typed', async () => {
const { input } = renderField({ usersSearch: 'jane' });

fireEvent.change(input, { target: { value: 'jane' } });

await waitFor(() => {
expect(screen.queryByText('jane@example.com')).not.toBeNull();
});
expect(screen.queryByText('Jane Doe')).not.toBeNull();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ const TeamSearchField: React.FC<TeamSearchFieldProps> = ({
helperText={error ? 'Team Already Selected' : ''}
fullWidth
slotProps={{
...params.slotProps,
input: {
...params.slotProps?.input,
endAdornment: isLoading ? <CircularProgress color="inherit" size={20} /> : null
Expand Down
2 changes: 2 additions & 0 deletions src/custom/InputSearchField/InputSearchField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,9 @@ const InputSearchField: React.FC<InputSearchFieldProps> = ({
helperText={error}
fullWidth
slotProps={{
...params.slotProps,
inputLabel: {
...params.slotProps?.inputLabel,
style: {
fontFamily: 'inherit'
}
Expand Down
5 changes: 2 additions & 3 deletions src/custom/UserSearchField/UserSearchField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -156,12 +156,11 @@ const UserShareSearch: React.FC<UserSearchFieldProps> = ({
}
}}
slotProps={{
...params.slotProps,
input: {
...params.slotProps?.input,
endAdornment: (
<>
{searchUserLoading ? <CircularProgress color="inherit" size={20} /> : null}
</>
<>{searchUserLoading ? <CircularProgress color="inherit" size={20} /> : null}</>
)
}
Comment thread
yi-nuo426 marked this conversation as resolved.
}}
Expand Down
2 changes: 2 additions & 0 deletions src/custom/UserSearchField/UserSearchFieldInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,9 @@ const UserSearchField: React.FC<UserSearchFieldProps> = ({
error={!!error}
helperText={error}
slotProps={{
...params.slotProps,
inputLabel: {
...params.slotProps?.inputLabel,
style: {
fontFamily: 'inherit'
}
Expand Down
Loading