feat: add channel report batch briefs
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
import { render, screen, waitFor } from '@testing-library/react';
|
||||
import userEvent from '@testing-library/user-event';
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
import { MemoryRouter } from 'react-router-dom';
|
||||
import { AdminReportBatchesPage } from './AdminReportBatchesPage';
|
||||
import { AdminReportTasksPage } from './AdminReportTasksPage';
|
||||
|
||||
const { adminApi, clipboardWriteText } = vi.hoisted(() => ({
|
||||
adminApi: {
|
||||
changeReportTaskStatuses: vi.fn(),
|
||||
exportSingleReportMaterial: vi.fn(),
|
||||
getReportMaterialBatch: vi.fn(),
|
||||
getSingleReportMaterialDetail: vi.fn(),
|
||||
listReportDetailsPage: vi.fn(),
|
||||
listReportMaterialBatches: vi.fn(),
|
||||
listReportMaterialBatchTasks: vi.fn(),
|
||||
},
|
||||
clipboardWriteText: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock('@/api/adminApi', () => ({ adminApi, fileDownloadUrl: (id: string) => `/api/files/${id}` }));
|
||||
|
||||
const task = (id: string) => ({
|
||||
id,
|
||||
tenantId: 'tenant-1',
|
||||
signatureId: `signature-${id}`,
|
||||
channelId: 'channel-1',
|
||||
carrier: 'mobile',
|
||||
reportType: 'signature',
|
||||
status: 'pending',
|
||||
createdAt: '2026-09-02T01:00:00.000Z',
|
||||
updatedAt: '2026-09-02T01:00:00.000Z',
|
||||
signature: {
|
||||
id: `signature-${id}`,
|
||||
name: `签名${id}`,
|
||||
tenant: { id: 'tenant-1', name: '测试企业' },
|
||||
application: { id: 'app-1', name: '测试应用' },
|
||||
},
|
||||
channel: { id: 'channel-1', name: '测试通道' },
|
||||
});
|
||||
|
||||
describe('report workbench pages', () => {
|
||||
beforeEach(() => {
|
||||
Object.values(adminApi).forEach((method) => method.mockReset());
|
||||
clipboardWriteText.mockReset().mockResolvedValue(undefined);
|
||||
});
|
||||
|
||||
it('selects and clears every detail on the current page', async () => {
|
||||
adminApi.listReportDetailsPage.mockResolvedValue({ items: [task('1'), task('2')], total: 2, page: 1, pageSize: 10 });
|
||||
render(
|
||||
<MemoryRouter>
|
||||
<AdminReportTasksPage />
|
||||
</MemoryRouter>,
|
||||
);
|
||||
|
||||
const user = userEvent.setup();
|
||||
const selectPage = await screen.findByRole('button', { name: '全选当前页' });
|
||||
await user.click(selectPage);
|
||||
expect(screen.getByRole('button', { name: '取消全选' })).toBeVisible();
|
||||
expect(screen.getByRole('button', { name: '批量修改状态(2)' })).toBeEnabled();
|
||||
expect(screen.getAllByRole('checkbox')).toHaveLength(2);
|
||||
screen.getAllByRole('checkbox').forEach((checkbox) => expect(checkbox).toBeChecked());
|
||||
|
||||
await user.click(screen.getByRole('button', { name: '取消全选' }));
|
||||
screen.getAllByRole('checkbox').forEach((checkbox) => expect(checkbox).not.toBeChecked());
|
||||
});
|
||||
|
||||
it('shows and copies the channel brief returned by the batch detail API', async () => {
|
||||
const batch = {
|
||||
id: 'batch-1',
|
||||
batchNo: 'RB20260902090000TEST',
|
||||
status: 'completed',
|
||||
selectedCount: 1,
|
||||
channelCount: 1,
|
||||
fileCount: 1,
|
||||
reportTotal: 1,
|
||||
successCount: 0,
|
||||
successRate: 0,
|
||||
createdAt: '2026-09-02T01:00:00.000Z',
|
||||
exportFiles: [],
|
||||
};
|
||||
const content =
|
||||
'尊敬的供应商您好,今天是2026年9月2日,辛苦报备以下签名或引流信息:\n' +
|
||||
'1.短信签名:【测试签名】,短信内容:【测试签名】您本次提交的验证码1234;\n' +
|
||||
'报备材料在表格里,报备批次号RB20260902090000TEST。';
|
||||
adminApi.listReportMaterialBatches.mockResolvedValue({ items: [batch], total: 1, page: 1, pageSize: 20 });
|
||||
adminApi.getReportMaterialBatch.mockResolvedValue({
|
||||
...batch,
|
||||
briefs: [
|
||||
{
|
||||
channelId: 'channel-1',
|
||||
channelName: '测试通道',
|
||||
fileId: 'file-1',
|
||||
fileName: '测试通道.xlsx',
|
||||
itemCount: 1,
|
||||
content,
|
||||
},
|
||||
],
|
||||
});
|
||||
adminApi.listReportMaterialBatchTasks.mockResolvedValue({ items: [], total: 0, page: 1, pageSize: 100 });
|
||||
render(
|
||||
<MemoryRouter>
|
||||
<AdminReportBatchesPage />
|
||||
</MemoryRouter>,
|
||||
);
|
||||
|
||||
const user = userEvent.setup();
|
||||
Object.defineProperty(navigator, 'clipboard', {
|
||||
configurable: true,
|
||||
value: { writeText: clipboardWriteText },
|
||||
});
|
||||
await user.click(await screen.findByRole('button', { name: '打开明细' }));
|
||||
expect(await screen.findByText('测试通道')).toBeVisible();
|
||||
expect(screen.getByText(/1\.短信签名:/)).toBeVisible();
|
||||
await user.click(screen.getByRole('button', { name: '复制简报' }));
|
||||
await waitFor(() => expect(clipboardWriteText).toHaveBeenCalledWith(content));
|
||||
expect(screen.getByRole('button', { name: '已复制' })).toBeVisible();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user