import { describe, it, expect, vi, beforeEach } from 'vitest'; import { screen } from '@testing-library/react'; // 隔离网络:版本取数返回空列表,避免 act 警告与真实请求 vi.mock('../../src/api/usrApi', () => ({ fetchCompanies: vi.fn().mockResolvedValue([]), login: vi.fn(), })); import LoginPage from '../../src/pages/usr/Login/LoginPage'; import { renderWithProviders } from './renderLogin'; describe('LoginPage 布局', () => { beforeEach(() => { localStorage.clear(); }); it('renders brand header / hero slogan / footer', () => { renderWithProviders(); expect(screen.getByText('Antler ERP')).toBeInTheDocument(); expect(screen.getByText('欢迎登录EBC平台')).toBeInTheDocument(); expect(screen.getByText('企业业务能力平台')).toBeInTheDocument(); expect(screen.getByText('ERP')).toBeInTheDocument(); // 页脚版权 + 备案号 expect(screen.getByText(/Antler Software/)).toBeInTheDocument(); expect(screen.getByText(/沪ICP备14034791号-1/)).toBeInTheDocument(); }); it('renders login card title 用户登录', () => { renderWithProviders(); expect(screen.getByText('用户登录')).toBeInTheDocument(); }); it('renders username/password/version fields and submit button 登 录', () => { renderWithProviders(); const username = screen.getByPlaceholderText('请输入你的用户名'); expect(username).toBeInTheDocument(); const password = screen.getByPlaceholderText('请输入你的密码'); expect(password).toBeInTheDocument(); // BR3:密码掩码显示 expect(password).toHaveAttribute('type', 'password'); // 版本下拉 placeholder(idle 后为「请选择版本」,初始 loading 为「加载版本中…」) expect( screen.getByText((t) => t.includes('请选择版本') || t.includes('加载版本中')), ).toBeInTheDocument(); // 提交按钮 expect(screen.getByRole('button', { name: /登\s*录/ })).toBeInTheDocument(); }); });