fix: update trash test mocks to simulate PG CASCADE on clear_trash

MockTrashRepository now holds shared Arc<Mutex> refs to the
trashed_files and trashed_folders collections so that clear_trash()
also purges them — mirroring the ON DELETE CASCADE + PG trigger
behaviour in production.

All 112 tests pass.
This commit is contained in:
Dionisio
2026-02-25 10:49:20 +01:00
parent 97cf6402e2
commit 6479da35f2
+44 -22
View File
@@ -20,12 +20,21 @@ use crate::domain::services::path_service::StoragePath;
// Mock repositories for testing
struct MockTrashRepository {
trash_items: Mutex<HashMap<Uuid, TrashedItem>>,
/// Shared refs to the file/folder trashed maps so `clear_trash` can
/// simulate the PG CASCADE + trigger behaviour.
trashed_files: Arc<Mutex<HashMap<String, File>>>,
trashed_folders: Arc<Mutex<HashMap<String, Folder>>>,
}
impl MockTrashRepository {
fn new() -> Self {
fn new(
trashed_files: Arc<Mutex<HashMap<String, File>>>,
trashed_folders: Arc<Mutex<HashMap<String, Folder>>>,
) -> Self {
Self {
trash_items: Mutex::new(HashMap::new()),
trashed_files,
trashed_folders,
}
}
}
@@ -80,6 +89,9 @@ impl TrashRepository for MockTrashRepository {
async fn clear_trash(&self, user_id: &Uuid) -> Result<()> {
let mut items = self.trash_items.lock().unwrap();
items.retain(|_, item| item.user_id() != *user_id);
// Simulate PG CASCADE: clear trashed file/folder storage too
self.trashed_files.lock().unwrap().clear();
self.trashed_folders.lock().unwrap().clear();
Ok(())
}
@@ -97,14 +109,14 @@ impl TrashRepository for MockTrashRepository {
struct MockFileRepository {
files: Mutex<HashMap<String, File>>,
trashed_files: Mutex<HashMap<String, File>>,
trashed_files: Arc<Mutex<HashMap<String, File>>>,
}
impl MockFileRepository {
fn new() -> Self {
fn new(trashed_files: Arc<Mutex<HashMap<String, File>>>) -> Self {
Self {
files: Mutex::new(HashMap::new()),
trashed_files: Mutex::new(HashMap::new()),
trashed_files,
}
}
@@ -322,14 +334,14 @@ impl FileWritePort for MockFileRepository {
struct MockFolderRepository {
folders: Mutex<HashMap<String, Folder>>,
trashed_folders: Mutex<HashMap<String, Folder>>,
trashed_folders: Arc<Mutex<HashMap<String, Folder>>>,
}
impl MockFolderRepository {
fn new() -> Self {
fn new(trashed_folders: Arc<Mutex<HashMap<String, Folder>>>) -> Self {
Self {
folders: Mutex::new(HashMap::new()),
trashed_folders: Mutex::new(HashMap::new()),
trashed_folders,
}
}
@@ -500,9 +512,11 @@ mod tests {
#[tokio::test]
async fn test_move_file_to_trash() {
// Arrange
let trash_repo = Arc::new(MockTrashRepository::new());
let file_repo = Arc::new(MockFileRepository::new());
let folder_repo = Arc::new(MockFolderRepository::new());
let trashed_files = Arc::new(Mutex::new(HashMap::new()));
let trashed_folders = Arc::new(Mutex::new(HashMap::new()));
let trash_repo = Arc::new(MockTrashRepository::new(trashed_files.clone(), trashed_folders.clone()));
let file_repo = Arc::new(MockFileRepository::new(trashed_files));
let folder_repo = Arc::new(MockFolderRepository::new(trashed_folders));
let service = TrashService::new(
trash_repo.clone(),
@@ -569,9 +583,11 @@ mod tests {
#[tokio::test]
async fn test_move_folder_to_trash() {
// Arrange
let trash_repo = Arc::new(MockTrashRepository::new());
let file_repo = Arc::new(MockFileRepository::new());
let folder_repo = Arc::new(MockFolderRepository::new());
let trashed_files = Arc::new(Mutex::new(HashMap::new()));
let trashed_folders = Arc::new(Mutex::new(HashMap::new()));
let trash_repo = Arc::new(MockTrashRepository::new(trashed_files.clone(), trashed_folders.clone()));
let file_repo = Arc::new(MockFileRepository::new(trashed_files));
let folder_repo = Arc::new(MockFolderRepository::new(trashed_folders));
let service = TrashService::new(
trash_repo.clone(),
@@ -629,9 +645,11 @@ mod tests {
#[tokio::test]
async fn test_restore_file_from_trash() {
// Arrange
let trash_repo = Arc::new(MockTrashRepository::new());
let file_repo = Arc::new(MockFileRepository::new());
let folder_repo = Arc::new(MockFolderRepository::new());
let trashed_files = Arc::new(Mutex::new(HashMap::new()));
let trashed_folders = Arc::new(Mutex::new(HashMap::new()));
let trash_repo = Arc::new(MockTrashRepository::new(trashed_files.clone(), trashed_folders.clone()));
let file_repo = Arc::new(MockFileRepository::new(trashed_files));
let folder_repo = Arc::new(MockFolderRepository::new(trashed_folders));
let service = TrashService::new(
trash_repo.clone(),
@@ -694,9 +712,11 @@ mod tests {
#[tokio::test]
async fn test_delete_permanently() {
// Arrange
let trash_repo = Arc::new(MockTrashRepository::new());
let file_repo = Arc::new(MockFileRepository::new());
let folder_repo = Arc::new(MockFolderRepository::new());
let trashed_files = Arc::new(Mutex::new(HashMap::new()));
let trashed_folders = Arc::new(Mutex::new(HashMap::new()));
let trash_repo = Arc::new(MockTrashRepository::new(trashed_files.clone(), trashed_folders.clone()));
let file_repo = Arc::new(MockFileRepository::new(trashed_files));
let folder_repo = Arc::new(MockFolderRepository::new(trashed_folders));
let service = TrashService::new(
trash_repo.clone(),
@@ -758,9 +778,11 @@ mod tests {
#[tokio::test]
async fn test_empty_trash() {
// Arrange
let trash_repo = Arc::new(MockTrashRepository::new());
let file_repo = Arc::new(MockFileRepository::new());
let folder_repo = Arc::new(MockFolderRepository::new());
let trashed_files = Arc::new(Mutex::new(HashMap::new()));
let trashed_folders = Arc::new(Mutex::new(HashMap::new()));
let trash_repo = Arc::new(MockTrashRepository::new(trashed_files.clone(), trashed_folders.clone()));
let file_repo = Arc::new(MockFileRepository::new(trashed_files));
let folder_repo = Arc::new(MockFolderRepository::new(trashed_folders));
let service = TrashService::new(
trash_repo.clone(),