071faa482c
纳入 AGC Cargo workspace 的统一 rustfmt 检查与格式化入口 完成项目 TypeScript/Prettier 与 Rust 全量格式化 修复 Pingora expected executable 门禁的空白敏感误报 同步开发运维文档与 AGC skill pack 格式化忽略规则
114 lines
3.5 KiB
TypeScript
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();
|
|
});
|