WP-10: contract and failing tests for OS and package inventory
Some checks failed
CI / backend (push) Has been cancelled
CI / frontend (push) Has been cancelled
CI / ui (push) Has been cancelled

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-09-02 22:19:25 +02:00
parent b6c3ddf040
commit 7b6d242988
21 changed files with 698 additions and 0 deletions

View 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"));
}

View File

@ -1,4 +1,5 @@
mod auth_service_tests;
mod inventory_tests;
mod jobs_tests;
mod scheduler_tests;
mod settings_tests;