Skip to content

Commit 9a66803

Browse files
committed
feat(tests): finishing
1 parent bc0c3c7 commit 9a66803

18 files changed

Lines changed: 740 additions & 2902 deletions

‎src/file_hash.rs‎

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,6 @@ pub fn calculate_content_hash(content: &[u8]) -> String {
6868
/// * `old_hash` - Previous hash value
6969
/// * `new_content` - New content to compare
7070
///
71-
/// # Returns
72-
/// * `true` if content has changed (hash differs)
73-
/// * `false` if content is unchanged (hash matches)
74-
pub fn hash_changed(old_hash: &str, new_content: &[u8]) -> bool {
75-
let new_hash = calculate_content_hash(new_content);
76-
old_hash != new_hash
77-
}
78-
7971
/// File hash calculator for use in FileIndex
8072
pub struct FileHasher {
8173
/// Cache of calculated hashes (file_path -> hash)
@@ -145,20 +137,6 @@ mod tests {
145137
);
146138
}
147139

148-
#[test]
149-
fn test_hash_changed() {
150-
let content1 = b"Hello";
151-
let content2 = b"World";
152-
153-
let hash1 = calculate_content_hash(content1);
154-
155-
// Same content should not show as changed
156-
assert!(!hash_changed(&hash1, content1));
157-
158-
// Different content should show as changed
159-
assert!(hash_changed(&hash1, content2));
160-
}
161-
162140
#[test]
163141
fn test_calculate_file_hash() {
164142
let temp_dir = TempDir::new().unwrap();

‎src/scanner/phases.rs‎

Lines changed: 66 additions & 207 deletions
Original file line numberDiff line numberDiff line change
@@ -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

‎tests/unit/mod.rs‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ mod git_analysis;
77

88
// Include agent module tests
99
mod agent;
10+
11+
// Validation function tests
12+
mod validation_tests;
1013
// Include centralized fixtures - copy from tests/fixtures.rs
1114
mod agent_executor;
1215
mod confidence_refinement;

0 commit comments

Comments
 (0)