diff --git a/src/api/Ticker.ts b/src/api/Ticker.ts index 71ff9777..24f0aa6f 100644 --- a/src/api/Ticker.ts +++ b/src/api/Ticker.ts @@ -121,7 +121,7 @@ export function useTickerApi(token: string) { }).then(response => response.json()) } - const putTickerUsers = (ticker: Ticker, users: number[]): Promise> => { + const putTickerUsers = (ticker: Ticker, users: User[]): Promise> => { return fetch(`${ApiUrl}/admin/tickers/${ticker.id}/users`, { headers: headers, method: 'put', diff --git a/src/components/ticker/TickerUsersForm.test.tsx b/src/components/ticker/TickerUsersForm.test.tsx new file mode 100644 index 00000000..0d5df532 --- /dev/null +++ b/src/components/ticker/TickerUsersForm.test.tsx @@ -0,0 +1,57 @@ +import React from 'react' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { Ticker } from '../../api/Ticker' +import { User } from '../../api/User' +import { fireEvent, render, screen } from '@testing-library/react' +import TickerUsersForm from './TickerUsersForm' + +describe('TickerUsersForm', () => { + beforeEach(() => { + fetchMock.resetMocks() + }) + + function setup(defaultValue: Array, ticker: Ticker, onSubmit: () => void) { + const client = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + }, + }, + }) + return render( + + + + ) + } + + it('should renders correctly', async () => { + const ticker = { + id: 1, + title: 'Ticker 1', + } as Ticker + const user = { + id: 1, + email: 'user@systemli.org', + } as User + fetchMock.mockResponseOnce( + JSON.stringify({ + data: { + users: [user], + }, + status: 'success', + }) + ) + + const handleSubmit = jest.fn() + setup([user], ticker, handleSubmit) + + fireEvent.mouseDown(screen.getByRole('button')) + const listbox = await screen.findByRole('listbox') + expect(listbox).toBeInTheDocument() + const option = await screen.findByRole('option') + expect(option).toBeInTheDocument() + fireEvent.click(option) + expect(fetchMock).toHaveBeenCalledTimes(1) + }) +}) diff --git a/src/components/ticker/TickerUsersForm.tsx b/src/components/ticker/TickerUsersForm.tsx index 81e9c274..baa5ae9b 100644 --- a/src/components/ticker/TickerUsersForm.tsx +++ b/src/components/ticker/TickerUsersForm.tsx @@ -9,15 +9,15 @@ import { Box, Chip, FormControl, InputLabel, MenuItem, OutlinedInput, Select, Se interface Props { ticker: Ticker onSubmit: () => void - defaultValue: number[] + defaultValue: User[] } interface FormValues { - users: Array + users: Array } const TickerUsersForm: FC = ({ onSubmit, ticker, defaultValue }) => { - const [users, setUsers] = useState>(defaultValue) + const [users, setUsers] = useState>(defaultValue) const [options, setOptions] = useState>([]) const { token } = useAuth() const { getUsers } = useUserApi(token) @@ -26,10 +26,12 @@ const TickerUsersForm: FC = ({ onSubmit, ticker, defaultValue }) => { const { handleSubmit } = useForm() const queryClient = useQueryClient() - const handleChange = (event: SelectChangeEvent) => { - if (typeof event.target.value !== 'string') { - setUsers(event.target.value) - } + const handleChange = (event: SelectChangeEvent) => { + const userIds = event.target.value as Array + const selectedUsers = options.filter(user => { + return userIds.includes(user.id) + }) + setUsers(selectedUsers) } const updateTickerUsers: SubmitHandler = () => { @@ -59,13 +61,13 @@ const TickerUsersForm: FC = ({ onSubmit, ticker, defaultValue }) => { return ( - {selectedUsers.map(user => ( + {selectedUsers.map(selectedUser => ( { - const reduced = users.filter(id => { - return id !== user.id + const reduced = users.filter(user => { + return user.id !== selectedUser.id }) setUsers(reduced) }} @@ -78,19 +80,22 @@ const TickerUsersForm: FC = ({ onSubmit, ticker, defaultValue }) => { ) } - const getStyle = (value: number, users: number[]) => { + const getStyle = (value: User, users: User[]) => { + const userIds = users.map(user => user.id) return { - fontWeight: users.indexOf(value) === -1 ? theme.typography.fontWeightRegular : theme.typography.fontWeightMedium, + fontWeight: userIds.indexOf(value.id) === -1 ? theme.typography.fontWeightRegular : theme.typography.fontWeightMedium, } } + const userIds = users.map(user => user.id) + return (
Users - } label="Users" multiple name="users" onChange={handleChange} renderValue={renderValue} value={userIds}> {options.map(user => ( - + {user.email} ))} diff --git a/src/components/ticker/TickerUsersModal.tsx b/src/components/ticker/TickerUsersModal.tsx index b90b771b..2d3a93f8 100644 --- a/src/components/ticker/TickerUsersModal.tsx +++ b/src/components/ticker/TickerUsersModal.tsx @@ -14,13 +14,7 @@ interface Props { const TickerUsersModal: FC = ({ onClose, open, ticker, users }) => { return ( - { - return user.id - })} - onSubmit={onClose} - ticker={ticker} - /> + ) }