WP-10: contract and failing tests for OS and package inventory
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
67
backend/crates/application/src/tests/inventory_tests.rs
Normal file
67
backend/crates/application/src/tests/inventory_tests.rs
Normal file
@ -0,0 +1,67 @@
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
use async_trait::async_trait;
|
||||
use domain::DomainError;
|
||||
|
||||
use crate::jobs::{JobHandler, JobLog};
|
||||
use crate::test_fakes::{FakeInspector, MemInventory};
|
||||
use crate::{InventoryService, PackageRefreshJob};
|
||||
|
||||
#[derive(Default)]
|
||||
struct VecLog(Mutex<Vec<String>>);
|
||||
#[async_trait]
|
||||
impl JobLog for VecLog {
|
||||
async fn line(&self, text: &str) {
|
||||
self.0.lock().unwrap().push(text.into());
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn refresh_persists_snapshot_and_current_returns_it() {
|
||||
let repo = Arc::new(MemInventory::default());
|
||||
let svc = InventoryService::new(Arc::new(FakeInspector { fail: false }), repo.clone());
|
||||
assert_eq!(svc.current().await.unwrap(), None);
|
||||
let inv = svc.refresh().await.unwrap();
|
||||
assert_eq!(inv.os.hostname, "srv");
|
||||
assert_eq!(inv.packages.len(), 3);
|
||||
assert_eq!(inv.upgradable(), 1);
|
||||
assert_eq!(inv.security_upgrades(), 1);
|
||||
assert_eq!(svc.current().await.unwrap(), Some(inv));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn refresh_failure_keeps_previous_snapshot() {
|
||||
let repo = Arc::new(MemInventory::default());
|
||||
let ok = InventoryService::new(Arc::new(FakeInspector { fail: false }), repo.clone());
|
||||
let before = ok.refresh().await.unwrap();
|
||||
let failing = InventoryService::new(Arc::new(FakeInspector { fail: true }), repo.clone());
|
||||
assert!(matches!(
|
||||
failing.refresh().await.unwrap_err(),
|
||||
DomainError::Unavailable(_)
|
||||
));
|
||||
assert_eq!(failing.current().await.unwrap(), Some(before));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn job_handler_logs_summary_and_maps_errors() {
|
||||
let repo = Arc::new(MemInventory::default());
|
||||
let job = PackageRefreshJob(Arc::new(InventoryService::new(
|
||||
Arc::new(FakeInspector { fail: false }),
|
||||
repo.clone(),
|
||||
)));
|
||||
let log = VecLog::default();
|
||||
job.run(None, &log).await.unwrap();
|
||||
let lines = log.0.lock().unwrap().join("\n");
|
||||
assert!(lines.contains("3 packages"), "{lines}");
|
||||
assert!(lines.contains("1 upgradable"), "{lines}");
|
||||
|
||||
let job = PackageRefreshJob(Arc::new(InventoryService::new(
|
||||
Arc::new(FakeInspector { fail: true }),
|
||||
repo,
|
||||
)));
|
||||
assert!(job
|
||||
.run(None, &VecLog::default())
|
||||
.await
|
||||
.unwrap_err()
|
||||
.contains("host down"));
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
mod auth_service_tests;
|
||||
mod inventory_tests;
|
||||
mod jobs_tests;
|
||||
mod scheduler_tests;
|
||||
mod settings_tests;
|
||||
|
||||
Reference in New Issue
Block a user