import { afterEach, describe, expect, it, vi } from 'vitest' import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react' import { CoreAdminContext } from 'ra-core' import { GatewayList } from './GatewayList' afterEach(cleanup) const gateways = [{ id: 'gw-1', name: 'gw-1', endpoint: 'http://docker-gateway:8081', token: 'unit-test-gateway-token' }] function provider(overrides = {}) { return { getList: vi.fn(() => Promise.resolve({ data: gateways, total: gateways.length })), create: vi.fn().mockResolvedValue({ data: { name: 'gw-2', endpoint: 'http://gw2:8081', token: 'generated-token-abcdef' } }), delete: vi.fn().mockResolvedValue({ data: { id: 'gw-1' } }), getOne: vi.fn(), getMany: vi.fn(), getManyReference: vi.fn(), update: vi.fn(), updateMany: vi.fn(), deleteMany: vi.fn(), browserAction: vi.fn(), ...overrides, } } describe('GatewayList', () => { it('registers a gateway and reveals the generated token', async () => { const dataProvider = provider() render() await screen.findAllByText('gw-1') fireEvent.change(screen.getByRole('textbox', { name: '网关名称' }), { target: { value: 'gw-2' } }) fireEvent.change(screen.getByRole('textbox', { name: 'Endpoint' }), { target: { value: 'http://gw2:8081' } }) fireEvent.click(screen.getByRole('button', { name: '注册网关' })) await waitFor(() => expect(dataProvider.create).toHaveBeenCalledWith('gateways', { data: { name: 'gw-2', endpoint: 'http://gw2:8081', token: '' } })) expect((await screen.findByRole('alert')).textContent).toContain('generated-token-abcdef') }) it('rejects an invalid endpoint before submit', async () => { const dataProvider = provider() render() await screen.findAllByText('gw-1') fireEvent.change(screen.getByRole('textbox', { name: '网关名称' }), { target: { value: 'gw-2' } }) fireEvent.change(screen.getByRole('textbox', { name: 'Endpoint' }), { target: { value: 'ftp://gw2:8081' } }) expect(screen.getByRole('button', { name: '注册网关' }).disabled).toBe(true) expect(dataProvider.create).not.toHaveBeenCalled() }) it('deletes a gateway after confirm', async () => { const dataProvider = provider() window.confirm = vi.fn(() => true) render() fireEvent.click(await screen.findByLabelText('删除 gw-1')) await waitFor(() => expect(dataProvider.delete).toHaveBeenCalledWith('gateways', { id: 'gw-1' })) }) })