From c4b87052417ba02dd7825f72e4cdb7b5055ab1dc Mon Sep 17 00:00:00 2001 From: louis Date: Sun, 2 Feb 2025 21:16:06 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=84=20Improve=20Ticker=20Users=20Form?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ticker/TickerUsersForm.test.tsx | 35 +++++++++++++++++-- src/components/ticker/TickerUsersForm.tsx | 26 +++++++++++--- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/src/components/ticker/TickerUsersForm.test.tsx b/src/components/ticker/TickerUsersForm.test.tsx index ba8797c..3eb5bdd 100644 --- a/src/components/ticker/TickerUsersForm.test.tsx +++ b/src/components/ticker/TickerUsersForm.test.tsx @@ -1,6 +1,7 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' +import sign from 'jwt-encode' import { MemoryRouter } from 'react-router' import { vi } from 'vitest' import { Ticker } from '../../api/Ticker' @@ -9,12 +10,21 @@ import { AuthProvider } from '../../contexts/AuthContext' import { NotificationProvider } from '../../contexts/NotificationContext' import TickerUsersForm from './TickerUsersForm' +const token = sign({ id: 1, email: 'user@example.org', roles: ['user'], exp: new Date().getTime() / 1000 + 600 }, 'secret') + describe('TickerUsersForm', () => { + beforeAll(() => { + localStorage.setItem('token', token) + }) + beforeEach(() => { fetchMock.resetMocks() + handleSubmit.mockClear() }) - function setup(defaultValue: Array, ticker: Ticker, onSubmit: () => void) { + const handleSubmit = vi.fn() + + const setup = (defaultValue: Array, ticker: Ticker, onSubmit: () => void) => { const client = new QueryClient({ defaultOptions: { queries: { @@ -28,6 +38,7 @@ describe('TickerUsersForm', () => { + @@ -44,6 +55,7 @@ describe('TickerUsersForm', () => { id: 1, email: 'user@systemli.org', } as User + fetchMock.mockResponseOnce( JSON.stringify({ data: { @@ -53,7 +65,6 @@ describe('TickerUsersForm', () => { }) ) - const handleSubmit = vi.fn() setup([user], ticker, handleSubmit) expect(screen.getByRole('combobox')).toBeInTheDocument() @@ -64,5 +75,25 @@ describe('TickerUsersForm', () => { expect(screen.getAllByText('user@systemli.org')).toHaveLength(2) await userEvent.click(screen.getAllByText('user@systemli.org')[1]) + + fetchMock.mockResponseOnce( + JSON.stringify({ + status: 'success', + }) + ) + + await userEvent.click(screen.getByRole('button', { name: 'Submit' })) + + expect(handleSubmit).toHaveBeenCalledTimes(1) + expect(fetchMock).toHaveBeenCalledTimes(2) + expect(fetchMock).toHaveBeenCalledWith('http://localhost:8080/v1/admin/tickers/1/users', { + body: JSON.stringify({ users: [] }), + headers: { + Accept: 'application/json', + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + method: 'put', + }) }) }) diff --git a/src/components/ticker/TickerUsersForm.tsx b/src/components/ticker/TickerUsersForm.tsx index 97626cc..acbc15f 100644 --- a/src/components/ticker/TickerUsersForm.tsx +++ b/src/components/ticker/TickerUsersForm.tsx @@ -21,6 +21,7 @@ const TickerUsersForm: FC = ({ onSubmit, ticker, defaultValue }) => { const { createNotification } = useNotification() const [users, setUsers] = useState>(defaultValue) const [options, setOptions] = useState>([]) + const [open, setOpen] = useState(false) const { token } = useAuth() const theme = useTheme() const { handleSubmit } = useForm() @@ -32,13 +33,18 @@ const TickerUsersForm: FC = ({ onSubmit, ticker, defaultValue }) => { return userIds.includes(user.id) }) setUsers(selectedUsers) + setOpen(false) } const updateTickerUsers: SubmitHandler = () => { - putTickerUsersApi(token, ticker, users).then(() => { - queryClient.invalidateQueries({ queryKey: ['tickerUsers', ticker.id] }) - createNotification({ content: 'Users were successfully updated', severity: 'success' }) - onSubmit() + putTickerUsersApi(token, ticker, users).then(response => { + if (response.status !== 'success') { + createNotification({ content: 'Failed to update users', severity: 'error' }) + } else { + queryClient.invalidateQueries({ queryKey: ['tickerUsers', ticker.id] }) + createNotification({ content: 'Users were successfully updated', severity: 'success' }) + onSubmit() + } }) } @@ -98,7 +104,17 @@ const TickerUsersForm: FC = ({ onSubmit, ticker, defaultValue }) => {
Users - } + label="Users" + multiple + name="users" + onChange={handleChange} + onClick={() => setOpen(!open)} + renderValue={renderValue} + value={userIds} + > {options.map(user => ( {user.email}