@@ -1318,6 +1318,36 @@ mod tests {
13181318 super :: super :: Scanner :: new ( config:: ScannerConfig :: default ( ) , PathBuf :: from ( "." ) , false )
13191319 }
13201320
1321+ /// Helper for testing phases that skip when disabled or missing config
1322+ async fn run_phase_skip_test (
1323+ phase : ScanPhase ,
1324+ config_modifier : impl Fn ( & mut config:: ScannerConfig ) ,
1325+ ) {
1326+ let scanner = create_test_scanner ( ) ;
1327+ let mut config = create_test_config ( ) ;
1328+ config_modifier ( & mut config) ;
1329+ let pb = ProgressBar :: hidden ( ) ;
1330+ let metrics_tracker = LlmMetricsTracker :: new ( ) ;
1331+ let analyzed_files: Vec < String > = vec ! [ ] ;
1332+ let target_path = PathBuf :: from ( "." ) ;
1333+ let project_stack: Option < crate :: scanner_types:: project:: ProjectStack > = None ;
1334+ let findings = vec ! [ create_test_finding( "test-1" , Severity :: High ) ] ;
1335+ let phase_config = PhaseConfig {
1336+ phase : & phase,
1337+ findings : findings. clone ( ) ,
1338+ pb : & pb,
1339+ analyzed_files : & analyzed_files,
1340+ metrics_tracker : & metrics_tracker,
1341+ target_path : & target_path,
1342+ config : & config,
1343+ project_stack : & project_stack,
1344+ } ;
1345+ let result = run_phase ( & scanner, phase_config) . await ;
1346+ assert ! ( result. is_ok( ) ) ;
1347+ let ( updated, _) = result. unwrap ( ) ;
1348+ assert_eq ! ( updated. len( ) , findings. len( ) ) ;
1349+ }
1350+
13211351 // Indexing Phase Tests
13221352 #[ tokio:: test]
13231353 async fn test_indexing_phase_basic ( ) {
@@ -1397,85 +1427,28 @@ mod tests {
13971427 // LLM Static Analysis Tests
13981428 #[ tokio:: test]
13991429 async fn test_llm_static_analysis_skips_without_api_key ( ) {
1400- let scanner = create_test_scanner ( ) ;
1401- let mut config = create_test_config ( ) ;
1402- config. llm . phases . discovery . api_key = None ;
1403- let pb = ProgressBar :: hidden ( ) ;
1404- let metrics_tracker = LlmMetricsTracker :: new ( ) ;
1405- let analyzed_files: Vec < String > = vec ! [ ] ;
1406- let target_path = PathBuf :: from ( "." ) ;
1407- let project_stack: Option < crate :: scanner_types:: project:: ProjectStack > = None ;
1408- let findings = vec ! [ create_test_finding( "test-1" , Severity :: High ) ] ;
1409- let phase_config = PhaseConfig {
1410- phase : & ScanPhase :: LlmStaticAnalysis ,
1411- findings : findings. clone ( ) ,
1412- pb : & pb,
1413- analyzed_files : & analyzed_files,
1414- metrics_tracker : & metrics_tracker,
1415- target_path : & target_path,
1416- config : & config,
1417- project_stack : & project_stack,
1418- } ;
1419- let result = run_phase ( & scanner, phase_config) . await ;
1420- assert ! ( result. is_ok( ) ) ;
1421- let ( updated, _) = result. unwrap ( ) ;
1422- assert_eq ! ( updated. len( ) , findings. len( ) ) ;
1430+ run_phase_skip_test ( ScanPhase :: LlmStaticAnalysis , |c| {
1431+ c. llm . phases . discovery . api_key = None ;
1432+ } )
1433+ . await ;
14231434 }
14241435
14251436 // LLM Discovery Tests
14261437 #[ tokio:: test]
14271438 async fn test_llm_discovery_skips_without_api_key ( ) {
1428- let scanner = create_test_scanner ( ) ;
1429- let mut config = create_test_config ( ) ;
1430- config. llm . phases . discovery . api_key = None ;
1431- let pb = ProgressBar :: hidden ( ) ;
1432- let metrics_tracker = LlmMetricsTracker :: new ( ) ;
1433- let analyzed_files: Vec < String > = vec ! [ ] ;
1434- let target_path = PathBuf :: from ( "." ) ;
1435- let project_stack: Option < crate :: scanner_types:: project:: ProjectStack > = None ;
1436- let findings = vec ! [ create_test_finding( "test-1" , Severity :: High ) ] ;
1437- let phase_config = PhaseConfig {
1438- phase : & ScanPhase :: LlmDiscovery ,
1439- findings : findings. clone ( ) ,
1440- pb : & pb,
1441- analyzed_files : & analyzed_files,
1442- metrics_tracker : & metrics_tracker,
1443- target_path : & target_path,
1444- config : & config,
1445- project_stack : & project_stack,
1446- } ;
1447- let result = run_phase ( & scanner, phase_config) . await ;
1448- assert ! ( result. is_ok( ) ) ;
1449- let ( updated, _) = result. unwrap ( ) ;
1450- assert_eq ! ( updated. len( ) , findings. len( ) ) ;
1439+ run_phase_skip_test ( ScanPhase :: LlmDiscovery , |c| {
1440+ c. llm . phases . discovery . api_key = None ;
1441+ } )
1442+ . await ;
14511443 }
14521444
14531445 // LLM Verification Tests
14541446 #[ tokio:: test]
14551447 async fn test_llm_verification_skips_without_api_key ( ) {
1456- let scanner = create_test_scanner ( ) ;
1457- let mut config = create_test_config ( ) ;
1458- config. llm . phases . verification . api_key = None ;
1459- let pb = ProgressBar :: hidden ( ) ;
1460- let metrics_tracker = LlmMetricsTracker :: new ( ) ;
1461- let analyzed_files: Vec < String > = vec ! [ ] ;
1462- let target_path = PathBuf :: from ( "." ) ;
1463- let project_stack: Option < crate :: scanner_types:: project:: ProjectStack > = None ;
1464- let findings = vec ! [ create_test_finding( "test-1" , Severity :: High ) ] ;
1465- let phase_config = PhaseConfig {
1466- phase : & ScanPhase :: LlmVerification ,
1467- findings : findings. clone ( ) ,
1468- pb : & pb,
1469- analyzed_files : & analyzed_files,
1470- metrics_tracker : & metrics_tracker,
1471- target_path : & target_path,
1472- config : & config,
1473- project_stack : & project_stack,
1474- } ;
1475- let result = run_phase ( & scanner, phase_config) . await ;
1476- assert ! ( result. is_ok( ) ) ;
1477- let ( updated, _) = result. unwrap ( ) ;
1478- assert_eq ! ( updated. len( ) , findings. len( ) ) ;
1448+ run_phase_skip_test ( ScanPhase :: LlmVerification , |c| {
1449+ c. llm . phases . verification . api_key = None ;
1450+ } )
1451+ . await ;
14791452 }
14801453
14811454 // Security Agent Tests
@@ -1596,29 +1569,10 @@ mod tests {
15961569 // Confidence Scoring Tests
15971570 #[ tokio:: test]
15981571 async fn test_confidence_scoring_skips_when_disabled ( ) {
1599- let scanner = create_test_scanner ( ) ;
1600- let mut config = create_test_config ( ) ;
1601- config. scanner . performance . enable_confidence_refinement = false ;
1602- let pb = ProgressBar :: hidden ( ) ;
1603- let metrics_tracker = LlmMetricsTracker :: new ( ) ;
1604- let analyzed_files: Vec < String > = vec ! [ ] ;
1605- let target_path = PathBuf :: from ( "." ) ;
1606- let project_stack: Option < crate :: scanner_types:: project:: ProjectStack > = None ;
1607- let findings = vec ! [ create_test_finding( "test-1" , Severity :: High ) ] ;
1608- let phase_config = PhaseConfig {
1609- phase : & ScanPhase :: ConfidenceScoring ,
1610- findings : findings. clone ( ) ,
1611- pb : & pb,
1612- analyzed_files : & analyzed_files,
1613- metrics_tracker : & metrics_tracker,
1614- target_path : & target_path,
1615- config : & config,
1616- project_stack : & project_stack,
1617- } ;
1618- let result = run_phase ( & scanner, phase_config) . await ;
1619- assert ! ( result. is_ok( ) ) ;
1620- let ( updated, _) = result. unwrap ( ) ;
1621- assert_eq ! ( updated. len( ) , findings. len( ) ) ;
1572+ run_phase_skip_test ( ScanPhase :: ConfidenceScoring , |c| {
1573+ c. scanner . performance . enable_confidence_refinement = false ;
1574+ } )
1575+ . await ;
16221576 }
16231577
16241578 // AI Aggregation Tests
@@ -1709,141 +1663,46 @@ mod tests {
17091663 // Root Cause Dedup Tests
17101664 #[ tokio:: test]
17111665 async fn test_root_cause_dedup_skips_when_disabled ( ) {
1712- let scanner = create_test_scanner ( ) ;
1713- let mut config = create_test_config ( ) ;
1714- config. scanner . performance . enable_root_cause_dedup = false ;
1715- let pb = ProgressBar :: hidden ( ) ;
1716- let metrics_tracker = LlmMetricsTracker :: new ( ) ;
1717- let analyzed_files: Vec < String > = vec ! [ ] ;
1718- let target_path = PathBuf :: from ( "." ) ;
1719- let project_stack: Option < crate :: scanner_types:: project:: ProjectStack > = None ;
1720- let findings = vec ! [ create_test_finding( "test-1" , Severity :: High ) ] ;
1721- let phase_config = PhaseConfig {
1722- phase : & ScanPhase :: RootCauseDedup ,
1723- findings : findings. clone ( ) ,
1724- pb : & pb,
1725- analyzed_files : & analyzed_files,
1726- metrics_tracker : & metrics_tracker,
1727- target_path : & target_path,
1728- config : & config,
1729- project_stack : & project_stack,
1730- } ;
1731- let result = run_phase ( & scanner, phase_config) . await ;
1732- assert ! ( result. is_ok( ) ) ;
1733- let ( updated, _) = result. unwrap ( ) ;
1734- assert_eq ! ( updated. len( ) , findings. len( ) ) ;
1666+ run_phase_skip_test ( ScanPhase :: RootCauseDedup , |c| {
1667+ c. scanner . performance . enable_root_cause_dedup = false ;
1668+ } )
1669+ . await ;
17351670 }
17361671
17371672 // Multi Verifier Tests
17381673 #[ tokio:: test]
17391674 async fn test_multi_verifier_skips_when_disabled ( ) {
1740- let scanner = create_test_scanner ( ) ;
1741- let mut config = create_test_config ( ) ;
1742- config. scanner . performance . enable_multi_verifier = false ;
1743- let pb = ProgressBar :: hidden ( ) ;
1744- let metrics_tracker = LlmMetricsTracker :: new ( ) ;
1745- let analyzed_files: Vec < String > = vec ! [ ] ;
1746- let target_path = PathBuf :: from ( "." ) ;
1747- let project_stack: Option < crate :: scanner_types:: project:: ProjectStack > = None ;
1748- let findings = vec ! [ create_test_finding( "test-1" , Severity :: High ) ] ;
1749- let phase_config = PhaseConfig {
1750- phase : & ScanPhase :: MultiVerifier ,
1751- findings : findings. clone ( ) ,
1752- pb : & pb,
1753- analyzed_files : & analyzed_files,
1754- metrics_tracker : & metrics_tracker,
1755- target_path : & target_path,
1756- config : & config,
1757- project_stack : & project_stack,
1758- } ;
1759- let result = run_phase ( & scanner, phase_config) . await ;
1760- assert ! ( result. is_ok( ) ) ;
1761- let ( updated, _) = result. unwrap ( ) ;
1762- assert_eq ! ( updated. len( ) , findings. len( ) ) ;
1675+ run_phase_skip_test ( ScanPhase :: MultiVerifier , |c| {
1676+ c. scanner . performance . enable_multi_verifier = false ;
1677+ } )
1678+ . await ;
17631679 }
17641680
17651681 // Auto Patching Tests
17661682 #[ tokio:: test]
17671683 async fn test_auto_patching_skips_when_disabled ( ) {
1768- let scanner = create_test_scanner ( ) ;
1769- let mut config = create_test_config ( ) ;
1770- config. scanner . performance . enable_auto_patching = false ;
1771- let pb = ProgressBar :: hidden ( ) ;
1772- let metrics_tracker = LlmMetricsTracker :: new ( ) ;
1773- let analyzed_files: Vec < String > = vec ! [ ] ;
1774- let target_path = PathBuf :: from ( "." ) ;
1775- let project_stack: Option < crate :: scanner_types:: project:: ProjectStack > = None ;
1776- let findings = vec ! [ create_test_finding( "test-1" , Severity :: High ) ] ;
1777- let phase_config = PhaseConfig {
1778- phase : & ScanPhase :: AutoPatching ,
1779- findings : findings. clone ( ) ,
1780- pb : & pb,
1781- analyzed_files : & analyzed_files,
1782- metrics_tracker : & metrics_tracker,
1783- target_path : & target_path,
1784- config : & config,
1785- project_stack : & project_stack,
1786- } ;
1787- let result = run_phase ( & scanner, phase_config) . await ;
1788- assert ! ( result. is_ok( ) ) ;
1789- let ( updated, _) = result. unwrap ( ) ;
1790- assert_eq ! ( updated. len( ) , findings. len( ) ) ;
1684+ run_phase_skip_test ( ScanPhase :: AutoPatching , |c| {
1685+ c. scanner . performance . enable_auto_patching = false ;
1686+ } )
1687+ . await ;
17911688 }
17921689
17931690 // CVE Bootstrap Tests
17941691 #[ tokio:: test]
17951692 async fn test_cve_bootstrap_skips_when_disabled ( ) {
1796- let scanner = create_test_scanner ( ) ;
1797- let mut config = create_test_config ( ) ;
1798- config. scanner . performance . enable_cve_bootstrap = false ;
1799- let pb = ProgressBar :: hidden ( ) ;
1800- let metrics_tracker = LlmMetricsTracker :: new ( ) ;
1801- let analyzed_files: Vec < String > = vec ! [ ] ;
1802- let target_path = PathBuf :: from ( "." ) ;
1803- let project_stack: Option < crate :: scanner_types:: project:: ProjectStack > = None ;
1804- let findings = vec ! [ create_test_finding( "test-1" , Severity :: High ) ] ;
1805- let phase_config = PhaseConfig {
1806- phase : & ScanPhase :: CveBootstrap ,
1807- findings : findings. clone ( ) ,
1808- pb : & pb,
1809- analyzed_files : & analyzed_files,
1810- metrics_tracker : & metrics_tracker,
1811- target_path : & target_path,
1812- config : & config,
1813- project_stack : & project_stack,
1814- } ;
1815- let result = run_phase ( & scanner, phase_config) . await ;
1816- assert ! ( result. is_ok( ) ) ;
1817- let ( updated, _) = result. unwrap ( ) ;
1818- assert_eq ! ( updated. len( ) , findings. len( ) ) ;
1693+ run_phase_skip_test ( ScanPhase :: CveBootstrap , |c| {
1694+ c. scanner . performance . enable_cve_bootstrap = false ;
1695+ } )
1696+ . await ;
18191697 }
18201698
18211699 // PoC Compiler Tests
18221700 #[ tokio:: test]
18231701 async fn test_poc_compiler_skips_when_disabled ( ) {
1824- let scanner = create_test_scanner ( ) ;
1825- let mut config = create_test_config ( ) ;
1826- config. scanner . performance . enable_poc_compilation = false ;
1827- let pb = ProgressBar :: hidden ( ) ;
1828- let metrics_tracker = LlmMetricsTracker :: new ( ) ;
1829- let analyzed_files: Vec < String > = vec ! [ ] ;
1830- let target_path = PathBuf :: from ( "." ) ;
1831- let project_stack: Option < crate :: scanner_types:: project:: ProjectStack > = None ;
1832- let findings = vec ! [ create_test_finding( "test-1" , Severity :: High ) ] ;
1833- let phase_config = PhaseConfig {
1834- phase : & ScanPhase :: PocCompiler ,
1835- findings : findings. clone ( ) ,
1836- pb : & pb,
1837- analyzed_files : & analyzed_files,
1838- metrics_tracker : & metrics_tracker,
1839- target_path : & target_path,
1840- config : & config,
1841- project_stack : & project_stack,
1842- } ;
1843- let result = run_phase ( & scanner, phase_config) . await ;
1844- assert ! ( result. is_ok( ) ) ;
1845- let ( updated, _) = result. unwrap ( ) ;
1846- assert_eq ! ( updated. len( ) , findings. len( ) ) ;
1702+ run_phase_skip_test ( ScanPhase :: PocCompiler , |c| {
1703+ c. scanner . performance . enable_poc_compilation = false ;
1704+ } )
1705+ . await ;
18471706 }
18481707
18491708 // Variant Search Tests
0 commit comments