import { describe, it, expect, beforeEach, afterEach } from 'vitest'
import { http } from 'msw'
import { server } from '../../../../tests/msw/server'
import { jsonResponse } from '../../../../tests/msw/helpers'
import { renderWithProviders, screen, waitFor, userEvent } from '../../../../tests/helpers/render'
import { seedBearer, clearBearer } from '../../../../tests/helpers/auth'
import { AdminPage } from '..'
// v2 admin — GPS Device Link panel.
//
// AI and GPS share APPLY label; GPS is the SECOND APPLY in DOM order.
function gpsApplyButton(): HTMLElement {
return screen.getAllByRole('button', { name: /apply/i })[1]
}
beforeEach(() => {
seedBearer()
})
afterEach(() => {
clearBearer()
})
describe('AdminPage — GPS Device Link', () => {
it('renders initial settings + telemetry from GET /api/admin/gps-settings', async () => {
renderWithProviders()
expect(await screen.findByDisplayValue('192.168.1.100')).toBeInTheDocument()
expect(screen.getByDisplayValue('9001')).toBeInTheDocument()
expect(screen.getByText('UDP/192.168.1.100:9001')).toBeInTheDocument()
})
it('protocol segmented control switches active value and APPLY PATCHes', async () => {
const calls: { body: unknown }[] = []
server.use(
http.patch('/api/admin/gps-settings', async ({ request }) => {
const body = await request.json()
calls.push({ body })
return jsonResponse({
settings: { ...(body as object), address: '192.168.1.100', port: 9001 },
telemetry: { socket: 'UDP/192.168.1.100:9001', connected: true, fix: '3D', satellites: 11, hdop: 0.82, lastPacketMs: 12 },
})
}),
)
renderWithProviders()
await screen.findByDisplayValue('192.168.1.100')
const ubxBtn = screen.getByRole('button', { name: 'UBX' })
await userEvent.click(ubxBtn)
expect(ubxBtn).toHaveAttribute('aria-pressed', 'true')
await userEvent.click(gpsApplyButton())
await waitFor(() => expect(calls.length).toBe(1))
expect((calls[0].body as { protocol: string }).protocol).toBe('UBX')
})
it('PING and RECONNECT fire their dedicated endpoints', async () => {
let pingHits = 0
let reconnectHits = 0
server.use(
http.post('/api/admin/gps-settings/ping', () => { pingHits += 1; return new Response(null, { status: 204 }) }),
http.post('/api/admin/gps-settings/reconnect', () => {
reconnectHits += 1
return jsonResponse({
settings: { address: '192.168.1.100', port: 9001, protocol: 'NMEA' },
telemetry: { socket: 'UDP/192.168.1.100:9001', connected: true, fix: '3D', satellites: 11, hdop: 0.82, lastPacketMs: 0 },
})
}),
)
renderWithProviders()
await screen.findByDisplayValue('192.168.1.100')
await userEvent.click(screen.getByRole('button', { name: /^ping$/i }))
await waitFor(() => expect(pingHits).toBe(1))
await userEvent.click(screen.getByRole('button', { name: /reconnect/i }))
await waitFor(() => expect(reconnectHits).toBe(1))
})
})