Files
Genarrative/apps/admin-web/src/pages/AdminProfileWalletConfigPage.test.tsx
T
kdletters 071faa482c 统一 Rust 与 TypeScript 格式化门禁
纳入 AGC Cargo workspace 的统一 rustfmt 检查与格式化入口

完成项目 TypeScript/Prettier 与 Rust 全量格式化

修复 Pingora expected executable 门禁的空白敏感误报

同步开发运维文档与 AGC skill pack 格式化忽略规则
2026-09-01 16:28:34 +08:00

114 lines
3.5 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();
});