feat: add Deep Scan toggle to scan dialog

Collapsible Deep Scan section in ScanConfigModal exposes extra port ranges,
HTTP probe and TLS-verify switches. Pre-filled from saved defaults; edits are
passed to trigger() as a per-scan override and do not change the persisted
defaults (those live in the Options/scan config). scanApi.trigger now accepts
an optional deep-scan body.

ha-relevant: yes
This commit is contained in:
Pouzor
2026-06-24 10:31:32 +02:00
parent b6423c0115
commit d01630bf37
3 changed files with 160 additions and 9 deletions
@@ -82,7 +82,12 @@ describe('ScanConfigModal', () => {
await screen.findByDisplayValue('192.168.1.0/24')
fireEvent.click(screen.getByRole('button', { name: 'Scan Now' }))
await waitFor(() => {
expect(scanApi.saveConfig).toHaveBeenCalledWith({ ranges: ['192.168.1.0/24'] })
expect(scanApi.saveConfig).toHaveBeenCalledWith({
ranges: ['192.168.1.0/24'],
http_ranges: [],
http_probe_enabled: false,
verify_tls: false,
})
expect(scanApi.trigger).toHaveBeenCalledOnce()
expect(onScanNow).toHaveBeenCalledOnce()
expect(onClose).toHaveBeenCalledOnce()
@@ -108,4 +113,59 @@ describe('ScanConfigModal', () => {
)
})
})
// --- Deep scan ---
it('reveals deep-scan fields when the section is toggled', async () => {
render(<ScanConfigModal open onClose={vi.fn()} onScanNow={vi.fn()} />)
await screen.findByDisplayValue('192.168.1.0/24')
expect(screen.queryByText('Enable HTTP probe')).toBeNull()
fireEvent.click(screen.getByText('Deep Scan'))
expect(screen.getByText('Enable HTTP probe')).toBeDefined()
})
it('passes deep-scan overrides to trigger() as a per-scan override', async () => {
render(<ScanConfigModal open onClose={vi.fn()} onScanNow={vi.fn()} />)
await screen.findByDisplayValue('192.168.1.0/24')
fireEvent.click(screen.getByText('Deep Scan'))
fireEvent.change(screen.getByPlaceholderText('8000-8100, 9000-9100'), {
target: { value: '8000-8100, 9000' },
})
fireEvent.click(screen.getByLabelText('Enable HTTP probe'))
fireEvent.click(screen.getByRole('button', { name: 'Scan Now' }))
await waitFor(() => {
expect(scanApi.trigger).toHaveBeenCalledWith({
http_ranges: ['8000-8100', '9000'],
http_probe_enabled: true,
verify_tls: false,
})
})
})
it('auto-opens deep-scan section when a default probe is enabled', async () => {
vi.mocked(scanApi.getConfig).mockResolvedValue({
data: { ranges: ['192.168.1.0/24'], http_ranges: ['7000-7100'], http_probe_enabled: true, verify_tls: false },
} as never)
render(<ScanConfigModal open onClose={vi.fn()} onScanNow={vi.fn()} />)
await screen.findByDisplayValue('192.168.1.0/24')
expect(screen.getByText('Enable HTTP probe')).toBeDefined()
expect(screen.getByDisplayValue('7000-7100')).toBeDefined()
})
it('saving keeps deep-scan defaults untouched (modal only overrides per-scan)', async () => {
vi.mocked(scanApi.getConfig).mockResolvedValue({
data: { ranges: ['192.168.1.0/24'], http_ranges: ['7000-7100'], http_probe_enabled: true, verify_tls: true },
} as never)
render(<ScanConfigModal open onClose={vi.fn()} onScanNow={vi.fn()} />)
await screen.findByDisplayValue('192.168.1.0/24')
fireEvent.click(screen.getByRole('button', { name: 'Scan Now' }))
await waitFor(() => {
expect(scanApi.saveConfig).toHaveBeenCalledWith({
ranges: ['192.168.1.0/24'],
http_ranges: ['7000-7100'],
http_probe_enabled: true,
verify_tls: true,
})
})
})
})