59 lines
3.2 KiB
TypeScript
59 lines
3.2 KiB
TypeScript
/* @vitest-environment jsdom */
|
|
|
|
import {fireEvent, render, screen, waitFor} from '@testing-library/react';
|
|
import userEvent from '@testing-library/user-event';
|
|
import {beforeEach, expect, test, vi} from 'vitest';
|
|
|
|
import {getProfileWalletConfig, upsertProfileWalletConfig} from '../api/adminApiClient';
|
|
import type {ProfileWalletConfigAdminResponse} from '../api/adminApiTypes';
|
|
import {AdminProfileWalletConfigPage} from './AdminProfileWalletConfigPage';
|
|
|
|
vi.mock('../api/adminApiClient', () => ({
|
|
formatAdminApiError: vi.fn((error: unknown) => error instanceof Error ? error.message : '请求失败'),
|
|
getProfileWalletConfig: vi.fn(),
|
|
isAdminApiError: vi.fn(() => false),
|
|
upsertProfileWalletConfig: vi.fn(),
|
|
}));
|
|
|
|
const configResponse: ProfileWalletConfigAdminResponse = {
|
|
configId: 'profile_wallet', initialMudPoints: 100, dailyFreePointsPerDay: 20,
|
|
createdBy: 'owner-1', createdByDisplayName: '管理员',
|
|
createdAt: '2026-07-31T01:00:00Z', updatedBy: 'owner-1',
|
|
updatedByDisplayName: '管理员', updatedAt: '2026-07-31T01:00:00Z',
|
|
};
|
|
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
vi.mocked(getProfileWalletConfig).mockResolvedValue(configResponse);
|
|
vi.mocked(upsertProfileWalletConfig).mockResolvedValue({...configResponse, initialMudPoints: 120, dailyFreePointsPerDay: 35});
|
|
});
|
|
|
|
test('账号配置页加载并展示每日免费泥点', async () => {
|
|
render(<AdminProfileWalletConfigPage token="admin-token" result={configResponse} onUnauthorized={vi.fn()} onResultChange={vi.fn()} />);
|
|
expect((await screen.findByLabelText('每日免费泥点数') as HTMLInputElement).value).toBe('20');
|
|
expect(getProfileWalletConfig).toHaveBeenCalledWith('admin-token');
|
|
expect(screen.getByText('每日免费泥点')).toBeTruthy();
|
|
});
|
|
|
|
test('账号配置页一次保存初始和每日免费泥点', async () => {
|
|
const user = userEvent.setup();
|
|
const onResultChange = vi.fn();
|
|
render(<AdminProfileWalletConfigPage token="admin-token" result={configResponse} onUnauthorized={vi.fn()} onResultChange={onResultChange} />);
|
|
await screen.findByLabelText('每日免费泥点数');
|
|
fireEvent.change(screen.getByLabelText('账号初始泥点数'), {target: {value: '120'}});
|
|
fireEvent.change(screen.getByLabelText('每日免费泥点数'), {target: {value: '35'}});
|
|
await user.click(screen.getByRole('button', {name: '保存'}));
|
|
expect(screen.getByText('初始 120 泥点,每日免费 35 泥点')).toBeTruthy();
|
|
await user.click(screen.getByRole('button', {name: '确认'}));
|
|
await waitFor(() => expect(upsertProfileWalletConfig).toHaveBeenCalledWith('admin-token', {initialMudPoints: 120, dailyFreePointsPerDay: 35}));
|
|
expect(onResultChange).toHaveBeenLastCalledWith(expect.objectContaining({initialMudPoints: 120, dailyFreePointsPerDay: 35}));
|
|
});
|
|
|
|
test('账号配置页拒绝非正整数每日免费额度', async () => {
|
|
render(<AdminProfileWalletConfigPage token="admin-token" result={configResponse} onUnauthorized={vi.fn()} onResultChange={vi.fn()} />);
|
|
const input = await screen.findByLabelText('每日免费泥点数');
|
|
fireEvent.change(input, {target: {value: '1.5'}});
|
|
expect((screen.getByRole('button', {name: '保存'}) as HTMLButtonElement).disabled).toBe(true);
|
|
expect(upsertProfileWalletConfig).not.toHaveBeenCalled();
|
|
});
|