//! Integration tests for APT wrapper //! //! These tests verify the full transaction lifecycle including commit and rollback. //! They use safe, existing packages to avoid affecting the system. use apt_wrapper::{AptTransaction, init}; #[test] fn test_transaction_state_consistency() { // Initialize init().expect("Failed to initialize APT wrapper"); let mut tx = AptTransaction::new().expect("Failed to create transaction"); // Before commit, changed_packages should be empty assert!(tx.changed_packages().is_empty()); // Add a safe package that should exist tx.add_package("apt").expect("Failed to add apt package"); // Still empty before commit assert!(tx.changed_packages().is_empty()); // Resolve dependencies tx.resolve().expect("Failed to resolve dependencies"); // Still empty before commit assert!(tx.changed_packages().is_empty()); } #[test] fn test_empty_transaction_rollback() { let tx = AptTransaction::new().expect("Failed to create transaction"); // Rollback empty transaction should succeed tx.rollback().expect("Failed to rollback empty transaction"); // Changed packages should be empty assert!(tx.changed_packages().is_empty()); } #[test] fn test_transaction_creation_and_validation() { let mut tx = AptTransaction::new().expect("Failed to create transaction"); // Initially empty assert!(tx.is_empty()); assert_eq!(tx.packages().len(), 0); // Add a package tx.add_package("apt").expect("Failed to add package"); assert!(!tx.is_empty()); assert_eq!(tx.packages().len(), 1); // Add another package tx.add_package("curl").expect("Failed to add second package"); assert_eq!(tx.packages().len(), 2); } #[test] fn test_package_validation() { let mut tx = AptTransaction::new().expect("Failed to create transaction"); // Valid package should succeed tx.add_package("apt").expect("Failed to add valid package"); // Invalid package should fail let result = tx.add_package("this-package-definitely-does-not-exist-12345"); assert!(result.is_err()); // Transaction should still have the valid package assert_eq!(tx.packages().len(), 1); } #[test] fn test_resolve_dependencies() { let mut tx = AptTransaction::new().expect("Failed to create transaction"); // Add a package tx.add_package("apt").expect("Failed to add package"); // Resolve should succeed tx.resolve().expect("Failed to resolve dependencies"); // Transaction should still be valid assert!(!tx.is_empty()); } #[test] fn test_changed_packages_tracking() { let mut tx = AptTransaction::new().expect("Failed to create transaction"); // Before any operations assert!(tx.changed_packages().is_empty()); // After adding packages but before commit tx.add_package("apt").expect("Failed to add package"); assert!(tx.changed_packages().is_empty()); // After resolve but before commit tx.resolve().expect("Failed to resolve dependencies"); assert!(tx.changed_packages().is_empty()); // Note: We don't actually commit in tests to avoid installing packages // In real usage, changed_packages would be populated after commit() }