import * as React from 'react' import { TestContext } from 'ra-test' import { DataProviderContext } from 'react-admin' import { cleanup, fireEvent, render, screen, waitFor, } from '@testing-library/react' import { describe, afterEach, it, expect, vi } from 'vitest' import { QuickConnectDialog } from './QuickConnectDialog' const finamp = { appName: 'Finamp', appVersion: '1.0.0', deviceName: 'Pixel 7' } const renderDialog = (dataProvider, onClose = vi.fn()) => { render( , ) return onClose } const enterCode = (code) => { fireEvent.change(screen.getByRole('textbox'), { target: { value: code } }) fireEvent.click(screen.getByText('menu.quickConnect.continue')) } describe('QuickConnectDialog', () => { afterEach(cleanup) it('shows the device before approving the code', async () => { const dataProvider = { lookupQuickConnect: vi.fn().mockResolvedValue({ data: finamp }), authorizeQuickConnect: vi.fn().mockResolvedValue({ data: finamp }), } const onClose = renderDialog(dataProvider) enterCode('123 456') await screen.findByText('menu.quickConnect.approve') expect(dataProvider.lookupQuickConnect.mock.calls[0][0]).toBe('123 456') expect(dataProvider.authorizeQuickConnect).not.toHaveBeenCalled() fireEvent.click(screen.getByText('menu.quickConnect.approve')) await waitFor(() => expect(onClose).toHaveBeenCalled()) expect(dataProvider.authorizeQuickConnect.mock.calls[0][0]).toBe('123 456') }) it('goes back to the code input', async () => { const dataProvider = { lookupQuickConnect: vi.fn().mockResolvedValue({ data: finamp }), authorizeQuickConnect: vi.fn(), } renderDialog(dataProvider) enterCode('123456') await screen.findByText('menu.quickConnect.approve') fireEvent.click(screen.getByText('ra.action.back')) expect(screen.getByRole('textbox')).toHaveValue('123456') expect(dataProvider.authorizeQuickConnect).not.toHaveBeenCalled() }) it('stays on the code input when the code is unknown', async () => { const dataProvider = { lookupQuickConnect: vi.fn().mockRejectedValue({ status: 404 }), authorizeQuickConnect: vi.fn(), } const onClose = renderDialog(dataProvider) enterCode('000000') await waitFor(() => expect(dataProvider.lookupQuickConnect).toHaveBeenCalled(), ) expect(screen.getByRole('textbox')).toBeInTheDocument() expect(screen.queryByText('menu.quickConnect.approve')).toBeNull() expect(onClose).not.toHaveBeenCalled() }) it('returns to the code input when approval fails', async () => { const dataProvider = { lookupQuickConnect: vi.fn().mockResolvedValue({ data: finamp }), authorizeQuickConnect: vi.fn().mockRejectedValue({ status: 409 }), } const onClose = renderDialog(dataProvider) enterCode('123456') fireEvent.click(await screen.findByText('menu.quickConnect.approve')) await screen.findByRole('textbox') expect(onClose).not.toHaveBeenCalled() }) it('disables Continue until a code is typed', () => { renderDialog({ lookupQuickConnect: vi.fn() }) expect( screen.getByText('menu.quickConnect.continue').closest('button'), ).toBeDisabled() }) })