mirror of
https://codeberg.org/Toasterson/ips.git
synced 2026-04-10 21:30:41 +00:00
121 lines
3.9 KiB
Rust
121 lines
3.9 KiB
Rust
|
|
use super::*;
|
||
|
|
use crate::actions::{Attr, Manifest};
|
||
|
|
use crate::fmri::Fmri;
|
||
|
|
use redb::ReadableTable;
|
||
|
|
use std::str::FromStr;
|
||
|
|
use tempfile::tempdir;
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_installed_packages() {
|
||
|
|
// Create a temporary directory for the test
|
||
|
|
let temp_dir = tempdir().unwrap();
|
||
|
|
let image_path = temp_dir.path().join("image");
|
||
|
|
|
||
|
|
// Create the image
|
||
|
|
let image = Image::create_image(&image_path).unwrap();
|
||
|
|
|
||
|
|
// Verify that the installed packages database was initialized
|
||
|
|
assert!(image.installed_db_path().exists());
|
||
|
|
|
||
|
|
// Create a test manifest
|
||
|
|
let mut manifest = Manifest::new();
|
||
|
|
|
||
|
|
// Add some attributes to the manifest
|
||
|
|
let mut attr = Attr::default();
|
||
|
|
attr.key = "pkg.fmri".to_string();
|
||
|
|
attr.values = vec!["pkg://test/example/package@1.0".to_string()];
|
||
|
|
manifest.attributes.push(attr);
|
||
|
|
|
||
|
|
let mut attr = Attr::default();
|
||
|
|
attr.key = "pkg.summary".to_string();
|
||
|
|
attr.values = vec!["Example package".to_string()];
|
||
|
|
manifest.attributes.push(attr);
|
||
|
|
|
||
|
|
let mut attr = Attr::default();
|
||
|
|
attr.key = "pkg.description".to_string();
|
||
|
|
attr.values = vec!["An example package for testing".to_string()];
|
||
|
|
manifest.attributes.push(attr);
|
||
|
|
|
||
|
|
// Create an FMRI for the package
|
||
|
|
let fmri = Fmri::from_str("pkg://test/example/package@1.0").unwrap();
|
||
|
|
|
||
|
|
// Install the package
|
||
|
|
image.install_package(&fmri, &manifest).unwrap();
|
||
|
|
|
||
|
|
// Verify that the package is installed
|
||
|
|
assert!(image.is_package_installed(&fmri).unwrap());
|
||
|
|
|
||
|
|
// Query the installed packages
|
||
|
|
let packages = image.query_installed_packages(None).unwrap();
|
||
|
|
|
||
|
|
// Verify that the package is in the results
|
||
|
|
assert_eq!(packages.len(), 1);
|
||
|
|
assert_eq!(packages[0].fmri.to_string(), "pkg://test/example/package@1.0");
|
||
|
|
assert_eq!(packages[0].publisher, "test");
|
||
|
|
|
||
|
|
// Get the manifest from the installed packages database
|
||
|
|
let installed_manifest = image.get_manifest_from_installed(&fmri).unwrap().unwrap();
|
||
|
|
|
||
|
|
// Verify that the manifest is correct
|
||
|
|
assert_eq!(installed_manifest.attributes.len(), 3);
|
||
|
|
|
||
|
|
// Uninstall the package
|
||
|
|
image.uninstall_package(&fmri).unwrap();
|
||
|
|
|
||
|
|
// Verify that the package is no longer installed
|
||
|
|
assert!(!image.is_package_installed(&fmri).unwrap());
|
||
|
|
|
||
|
|
// Query the installed packages again
|
||
|
|
let packages = image.query_installed_packages(None).unwrap();
|
||
|
|
|
||
|
|
// Verify that there are no packages
|
||
|
|
assert_eq!(packages.len(), 0);
|
||
|
|
|
||
|
|
// Clean up
|
||
|
|
temp_dir.close().unwrap();
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_installed_packages_key_format() {
|
||
|
|
// Create a temporary directory for the test
|
||
|
|
let temp_dir = tempdir().unwrap();
|
||
|
|
let db_path = temp_dir.path().join("installed.redb");
|
||
|
|
|
||
|
|
// Create the installed packages database
|
||
|
|
let installed = InstalledPackages::new(&db_path);
|
||
|
|
installed.init_db().unwrap();
|
||
|
|
|
||
|
|
// Create a test manifest
|
||
|
|
let mut manifest = Manifest::new();
|
||
|
|
|
||
|
|
// Add some attributes to the manifest
|
||
|
|
let mut attr = Attr::default();
|
||
|
|
attr.key = "pkg.fmri".to_string();
|
||
|
|
attr.values = vec!["pkg://test/example/package@1.0".to_string()];
|
||
|
|
manifest.attributes.push(attr);
|
||
|
|
|
||
|
|
// Create an FMRI for the package
|
||
|
|
let fmri = Fmri::from_str("pkg://test/example/package@1.0").unwrap();
|
||
|
|
|
||
|
|
// Add the package to the database
|
||
|
|
installed.add_package(&fmri, &manifest).unwrap();
|
||
|
|
|
||
|
|
// Open the database directly to check the key format
|
||
|
|
let db = Database::open(&db_path).unwrap();
|
||
|
|
let tx = db.begin_read().unwrap();
|
||
|
|
let table = tx.open_table(installed::INSTALLED_TABLE).unwrap();
|
||
|
|
|
||
|
|
// Iterate through the keys
|
||
|
|
let mut keys = Vec::new();
|
||
|
|
for entry in table.iter().unwrap() {
|
||
|
|
let (key, _) = entry.unwrap();
|
||
|
|
keys.push(key.value().to_string());
|
||
|
|
}
|
||
|
|
|
||
|
|
// Verify that there is one key and it has the correct format
|
||
|
|
assert_eq!(keys.len(), 1);
|
||
|
|
assert_eq!(keys[0], "pkg://test/example/package@1.0");
|
||
|
|
|
||
|
|
// Clean up
|
||
|
|
temp_dir.close().unwrap();
|
||
|
|
}
|