|
21 | 21 | check_lighthouse_provider_connection_task, |
22 | 22 | generate_outputs_task, |
23 | 23 | perform_attack_paths_scan_task, |
| 24 | + perform_scan_task, |
24 | 25 | perform_scheduled_scan_task, |
25 | 26 | reaggregate_all_finding_group_summaries_task, |
26 | 27 | refresh_lighthouse_provider_models_task, |
@@ -2454,6 +2455,57 @@ def _complete_scan(tenant_id, scan_id, provider_id): |
2454 | 2455 | == 1 |
2455 | 2456 | ) |
2456 | 2457 |
|
| 2458 | + def test_no_op_when_provider_does_not_exist(self, tenants_fixture): |
| 2459 | + """Return None without raising when the provider was already deleted.""" |
| 2460 | + tenant = tenants_fixture[0] |
| 2461 | + missing_provider_id = str(uuid.uuid4()) |
| 2462 | + task_id = str(uuid.uuid4()) |
| 2463 | + self._create_task_result(tenant.id, task_id) |
| 2464 | + # Orphan PeriodicTask left behind from a previous lifecycle. |
| 2465 | + self._create_periodic_task(missing_provider_id, tenant.id) |
| 2466 | + orphan_name = f"scan-perform-scheduled-{missing_provider_id}" |
| 2467 | + assert PeriodicTask.objects.filter(name=orphan_name).exists() |
| 2468 | + |
| 2469 | + with ( |
| 2470 | + patch("tasks.tasks.perform_prowler_scan") as mock_scan, |
| 2471 | + patch("tasks.tasks._perform_scan_complete_tasks") as mock_complete_tasks, |
| 2472 | + self._override_task_request(perform_scheduled_scan_task, id=task_id), |
| 2473 | + ): |
| 2474 | + result = perform_scheduled_scan_task.run( |
| 2475 | + tenant_id=str(tenant.id), provider_id=missing_provider_id |
| 2476 | + ) |
| 2477 | + |
| 2478 | + assert result is None |
| 2479 | + mock_scan.assert_not_called() |
| 2480 | + mock_complete_tasks.assert_not_called() |
| 2481 | + # Orphan PeriodicTask is cleaned up so beat stops re-firing it. |
| 2482 | + assert not PeriodicTask.objects.filter(name=orphan_name).exists() |
| 2483 | + |
| 2484 | + |
| 2485 | +@pytest.mark.django_db |
| 2486 | +class TestPerformScanTask: |
| 2487 | + """Unit tests for perform_scan_task.""" |
| 2488 | + |
| 2489 | + def test_no_op_when_provider_does_not_exist(self, tenants_fixture): |
| 2490 | + """Return None without raising when the provider was already deleted.""" |
| 2491 | + tenant = tenants_fixture[0] |
| 2492 | + missing_provider_id = str(uuid.uuid4()) |
| 2493 | + scan_id = str(uuid.uuid4()) |
| 2494 | + |
| 2495 | + with ( |
| 2496 | + patch("tasks.tasks.perform_prowler_scan") as mock_scan, |
| 2497 | + patch("tasks.tasks._perform_scan_complete_tasks") as mock_complete_tasks, |
| 2498 | + ): |
| 2499 | + result = perform_scan_task.run( |
| 2500 | + tenant_id=str(tenant.id), |
| 2501 | + scan_id=scan_id, |
| 2502 | + provider_id=missing_provider_id, |
| 2503 | + ) |
| 2504 | + |
| 2505 | + assert result is None |
| 2506 | + mock_scan.assert_not_called() |
| 2507 | + mock_complete_tasks.assert_not_called() |
| 2508 | + |
2457 | 2509 |
|
2458 | 2510 | @pytest.mark.django_db |
2459 | 2511 | class TestReaggregateAllFindingGroupSummaries: |
|
0 commit comments