feat(infra): temp IdeA généralisé à tous les agents + purge du store managed-tmp au shutdown d'IdeA — #200 (QA verte)

This commit is contained in:
2026-08-15 00:14:25 +02:00
parent e6f6eb5b1b
commit b5653b24b5
10 changed files with 271 additions and 14 deletions

View File

@ -10,7 +10,7 @@ use domain::{
use uuid::Uuid;
use application::{
AllocateManagedTemp, AllocateManagedTempInput, AppError, ResolveManagedTemp,
AllocateManagedTemp, AllocateManagedTempInput, AppError, PurgeManagedTemp, ResolveManagedTemp,
ResolveManagedTempInput, MANAGED_TEMP_DEFAULT_TTL_MS, MANAGED_TEMP_PURPOSE_MAX_CHARS,
};
@ -90,6 +90,12 @@ impl ManagedTempStore for FakeManagedTempStore {
async fn gc(&self, _now_ms: u64) -> Result<ManagedTempGcReport, ManagedTempError> {
Ok(ManagedTempGcReport { deleted: 0 })
}
async fn purge_all(&self) -> Result<ManagedTempGcReport, ManagedTempError> {
let deleted = self.leases.lock().unwrap().len();
self.leases.lock().unwrap().clear();
Ok(ManagedTempGcReport { deleted })
}
}
#[tokio::test]
@ -132,6 +138,31 @@ async fn allocate_uses_generated_opaque_handle_and_default_ttl() {
);
}
#[tokio::test]
async fn purge_managed_temp_calls_store_and_returns_report() {
let store = Arc::new(FakeManagedTempStore::default());
let allocate = AllocateManagedTemp::new(
Arc::clone(&store) as Arc<dyn ManagedTempStore>,
Arc::new(FixedIds),
Arc::new(FixedClock),
);
allocate
.execute(AllocateManagedTempInput {
owner_project_id: None,
kind: ManagedTempKind::Directory,
purpose: "purge me".to_owned(),
ttl_ms: None,
})
.await
.unwrap();
let purge = PurgeManagedTemp::new(Arc::clone(&store) as Arc<dyn ManagedTempStore>);
let out = purge.execute().await.unwrap();
assert_eq!(out.report.deleted, 1);
assert!(store.leases.lock().unwrap().is_empty());
}
#[tokio::test]
async fn allocate_rejects_empty_or_zero_ttl_and_bounds_purpose_metadata() {
let store = Arc::new(FakeManagedTempStore::default());