🏡 index : quine-global/quintodrome.git

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(
    <DataProviderContext.Provider value={dataProvider}>
      <TestContext initialState={{ admin: { ui: { optimistic: false } } }}>
        <QuickConnectDialog open={true} onClose={onClose} />
      </TestContext>
    </DataProviderContext.Provider>,
  )
  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()
  })
})