/* @vitest-environment jsdom */ import { fireEvent, render, screen } from '@testing-library/react'; import { expect, test, vi } from 'vitest'; import { PlatformUploadTile } from './PlatformUploadTile'; test('renders platform upload tile with default button semantics', () => { render(); const button = screen.getByRole('button', { name: '上传凭证 (最多四张)', }); expect(button.getAttribute('type')).toBe('button'); expect(button.className).toContain('border-dashed'); expect(button.className).toContain('bg-[var(--platform-input-fill)]'); expect(screen.getByText('上传凭证')).toBeTruthy(); expect(screen.getByText('(最多四张)')).toBeTruthy(); }); test('keeps disabled upload tile inert', () => { const onClick = vi.fn(); render(); const button = screen.getByRole('button', { name: '上传凭证' }); fireEvent.click(button); expect(button).toHaveProperty('disabled', true); expect(button.className).toContain('cursor-not-allowed'); expect(onClick).not.toHaveBeenCalled(); }); test('supports label semantics for file inputs', () => { render( <> , ); const input = screen.getByLabelText('上传参考图'); const label = screen.getByText('上传参考图').closest('label'); expect(input.getAttribute('type')).toBe('file'); expect(label?.getAttribute('for')).toBe('reference-upload'); expect(label?.className).toContain('h-20'); }); test('supports editor dark panel upload labels', () => { render( <> , ); const input = screen.getByLabelText(/上传封面/u); const label = screen.getByText('上传封面').closest('label'); expect(input.getAttribute('type')).toBe('file'); expect(label?.className).toContain('min-h-[7rem]'); expect(label?.className).toContain('items-start'); expect(label?.className).toContain('border-white/12'); expect(label?.className).toContain('bg-black/20'); expect(screen.getByText('支持 png、jpg、webp。').className).toContain( 'leading-5', ); }); test('prevents disabled label uploads from opening the nested input', () => { const onClick = vi.fn(); render( , ); const label = screen.getByText('上传参考图').closest('label'); const clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true, }); label?.dispatchEvent(clickEvent); expect(clickEvent.defaultPrevented).toBe(true); expect(label?.getAttribute('aria-disabled')).toBe('true'); expect(onClick).not.toHaveBeenCalled(); }); test('supports custom icon content', () => { render(