Phase 2: Core API Development - 15 REST API endpoints (packages, patches, system, jobs, websocket) - mTLS authentication layer (src/auth/mtls.rs) - IP whitelist enforcement (src/auth/whitelist.rs) - Job manager with async operation support - WebSocket streaming for job status Phase 3: Security Hardening - Security testing: 16/16 tests passing - Fuzz testing: 21 tests, all findings resolved - Threat model validation (STRIDE matrix) - TLS binding fix (critical vulnerability resolved) - Security documentation complete Phase 4: Production Readiness - Performance benchmarking (all targets met) - Package creation (.deb/.rpm structures) - Documentation (README, API docs, deployment guide) - Security hardening (6 vulnerabilities fixed) Deliverables: - API_DOCUMENTATION.md (889 lines) - DEPLOYMENT_GUIDE.md (733 lines) - SECURITY.md (346 lines) - README.md (525 lines) - debian/ package structure - linux-patch-api.spec (RPM) - install.sh installer script - benches/api_benchmarks.rs - Multiple security/performance reports Security Status: 0 vulnerabilities remaining Test Coverage: 31 unit tests, 21 integration tests Build Status: Release optimized
86 lines
2.8 KiB
Rust
86 lines
2.8 KiB
Rust
//! Unit Tests - Configuration Module
|
|
//!
|
|
//! Tests for configuration loading and validation.
|
|
|
|
use linux_patch_api::config::loader::AppConfig;
|
|
|
|
#[test]
|
|
fn test_config_load_valid_yaml() {
|
|
let result = AppConfig::load("tests/fixtures/valid_config.yaml");
|
|
assert!(result.is_ok(), "Failed to load valid config: {:?}", result.err());
|
|
|
|
let config = result.unwrap();
|
|
assert_eq!(config.server.port, 12443);
|
|
assert_eq!(config.server.bind, "127.0.0.1");
|
|
assert_eq!(config.jobs.max_concurrent, 5);
|
|
assert_eq!(config.jobs.timeout_minutes, 30);
|
|
assert_eq!(config.logging.level, "info");
|
|
}
|
|
|
|
#[test]
|
|
fn test_config_load_missing_file() {
|
|
let result = AppConfig::load("/nonexistent/path/config.yaml");
|
|
assert!(result.is_err(), "Should fail for missing file");
|
|
let err = result.unwrap_err();
|
|
assert!(err.to_string().contains("Failed to read config file"));
|
|
}
|
|
|
|
#[test]
|
|
fn test_config_load_invalid_yaml() {
|
|
// Create a temporary invalid yaml file
|
|
let invalid_path = "/tmp/invalid_config.yaml";
|
|
std::fs::write(invalid_path, "invalid: yaml: content: [").unwrap();
|
|
|
|
let result = AppConfig::load(invalid_path);
|
|
assert!(result.is_err(), "Should fail for invalid yaml");
|
|
|
|
// Cleanup
|
|
std::fs::remove_file(invalid_path).unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn test_config_validation_port_range() {
|
|
// Test that port is within valid range (1-65535)
|
|
let result = AppConfig::load("tests/fixtures/valid_config.yaml");
|
|
assert!(result.is_ok());
|
|
let config = result.unwrap();
|
|
assert!(config.server.port >= 1 && config.server.port <= 65535);
|
|
}
|
|
|
|
#[test]
|
|
fn test_config_validation_bind_address() {
|
|
// Test that bind address is a valid string
|
|
let result = AppConfig::load("tests/fixtures/valid_config.yaml");
|
|
assert!(result.is_ok());
|
|
let config = result.unwrap();
|
|
assert!(!config.server.bind.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_config_validation_max_concurrent() {
|
|
// Test that max_concurrent is positive
|
|
let result = AppConfig::load("tests/fixtures/valid_config.yaml");
|
|
assert!(result.is_ok());
|
|
let config = result.unwrap();
|
|
assert!(config.jobs.max_concurrent > 0);
|
|
}
|
|
|
|
#[test]
|
|
fn test_config_validation_timeout() {
|
|
// Test that timeout is reasonable (1-1440 minutes)
|
|
let result = AppConfig::load("tests/fixtures/valid_config.yaml");
|
|
assert!(result.is_ok());
|
|
let config = result.unwrap();
|
|
assert!(config.jobs.timeout_minutes >= 1 && config.jobs.timeout_minutes <= 1440);
|
|
}
|
|
|
|
#[test]
|
|
fn test_config_load_dev_config() {
|
|
// Test loading development config if it exists
|
|
let dev_path = "configs/config.yaml.example";
|
|
if std::path::Path::new(dev_path).exists() {
|
|
let result = AppConfig::load(dev_path);
|
|
assert!(result.is_ok(), "Failed to load example config: {:?}", result.err());
|
|
}
|
|
}
|