test: add tests to catalog.for_each, set FnMut requirement for predicate

This commit is contained in:
2025-11-11 15:23:31 +01:00
parent f8b8d4c9e3
commit bbc6105452
4 changed files with 48 additions and 6 deletions

View File

@@ -1,16 +1,17 @@
use crate::*; use crate::*;
impl Catalog { impl Catalog {
pub fn for_each<T, F>(&self, predicate: F) -> Result<(), FailedTo> pub fn for_each<T, F>(&self, mut predicate: F) -> Result<(), FailedTo>
where where
T: EAV, T: EAV,
F: Fn(&T) -> (), F: FnMut(&T),
{ {
self.with_items(|items| { self.with_items(|items| {
Ok(items items
.values() .values()
.flat_map(|entity| T::try_from(entity.clone()).map_err(|_| FailedTo::ConvertEntity)) .flat_map(|entity| T::try_from(entity.clone()).map_err(|_| FailedTo::ConvertEntity))
.for_each(|item| predicate(&item))) .for_each(|item| predicate(&item));
Ok(())
}) })
} }
} }

View File

@@ -1,10 +1,10 @@
use crate::*; use crate::*;
impl Catalog { impl Catalog {
pub fn for_each_mut<T, F>(&self, predicate: F) -> Result<(), FailedTo> pub fn for_each_mut<T, F>(&self, mut predicate: F) -> Result<(), FailedTo>
where where
T: EAV, T: EAV,
F: Fn(&mut T) -> (), F: FnMut(&mut T),
{ {
self.on_items(|items| { self.on_items(|items| {
for entity in items.values_mut() { for entity in items.values_mut() {

View File

@@ -0,0 +1,40 @@
#[cfg(test)]
mod tests {
use crate::*;
use std::collections::HashMap;
#[test]
fn for_each_should_iterate_over_all_items() {
let catalog = Catalog::new("test.db");
let item1 = Item {
id: "1".to_string(),
name: "Item 1".to_string(),
price: 10,
..Default::default()
};
let item2 = Item {
id: "2".to_string(),
name: "Item 2".to_string(),
price: 20,
..Default::default()
};
let item3 = Item {
id: "3".to_string(),
name: "Item 3".to_string(),
price: 30,
..Default::default()
};
let _ = catalog.upsert(item1.clone());
let _ = catalog.upsert(item2.clone());
let _ = catalog.upsert(item3.clone());
let mut collected_items = HashMap::new();
catalog
.for_each::<Item, _>(|item| {
collected_items.insert(item.id.clone(), item.clone());
})
.unwrap();
assert_eq!(collected_items.len(), 3);
assert_eq!(collected_items.get("1").unwrap(), &item1);
assert_eq!(collected_items.get("2").unwrap(), &item2);
assert_eq!(collected_items.get("3").unwrap(), &item3);
}
}

View File

@@ -1,4 +1,5 @@
pub mod catalog_delete; pub mod catalog_delete;
pub mod catalog_for_each;
pub mod catalog_get; pub mod catalog_get;
pub mod catalog_get_by; pub mod catalog_get_by;
pub mod catalog_init; pub mod catalog_init;