test: add tests for catalog.list_by_class_and_subclass function

This commit is contained in:
2025-10-20 16:29:13 +02:00
parent baa3fc9147
commit 276d6bd0bb

View File

@@ -169,7 +169,10 @@ impl Catalog {
/// # Returns /// # Returns
/// ///
/// An iterator that yields items of type `T` from the in-memory cache. /// An iterator that yields items of type `T` from the in-memory cache.
pub fn list_by_class_and_subclass<T>(&self, subclass: &str) -> impl Iterator<Item = Result<T, FailedTo>> pub fn list_by_class_and_subclass<T>(
&self,
subclass: &str,
) -> impl Iterator<Item = Result<T, FailedTo>>
where where
T: EAV, T: EAV,
{ {
@@ -355,6 +358,7 @@ mod tests {
pub discount: f64, pub discount: f64,
pub sell_trend: i64, pub sell_trend: i64,
pub in_stock: bool, pub in_stock: bool,
pub subclass: Option<String>,
} }
impl EAV for Item { impl EAV for Item {
fn class() -> &'static str { fn class() -> &'static str {
@@ -363,13 +367,17 @@ mod tests {
} }
impl From<Item> for Entity { impl From<Item> for Entity {
fn from(value: Item) -> Entity { fn from(value: Item) -> Entity {
Entity::new::<Item>() let mut entity = Entity::new::<Item>()
.with_id(&value.id) .with_id(&value.id)
.with_attribute("name", value.name) .with_attribute("name", value.name)
.with_attribute("price", value.price) .with_attribute("price", value.price)
.with_attribute("discount", value.discount) .with_attribute("discount", value.discount)
.with_attribute("sell_trend", value.sell_trend) .with_attribute("sell_trend", value.sell_trend)
.with_attribute("in_stock", value.in_stock) .with_attribute("in_stock", value.in_stock);
if let Some(subclass) = value.subclass {
entity = entity.with_subclass(&subclass);
}
entity
} }
} }
impl From<Entity> for Item { impl From<Entity> for Item {
@@ -387,6 +395,7 @@ mod tests {
in_stock: entity in_stock: entity
.unwrap("in_stock") .unwrap("in_stock")
.expect("in_stock is always present"), .expect("in_stock is always present"),
subclass: entity.subclass,
} }
} }
} }
@@ -3140,6 +3149,58 @@ mod tests {
assert!(catalog.load_by_filter(&filter).is_ok()); assert!(catalog.load_by_filter(&filter).is_ok());
assert_eq!(catalog.items.len(), 1); assert_eq!(catalog.items.len(), 1);
assert!(catalog.items.contains_key("item-1")); assert!(catalog.items.contains_key("item-1"));
std::fs::remove_file(path).unwrap(); std::fs::remove_file(path).unwrap();
} }
#[test]
fn list_by_class_and_subclass_should_return_matching_entities() {
let mut catalog = Catalog::new("dummy.db");
let item1 = Item {
id: "item-1".to_string(),
subclass: Some("electronics".to_string()),
..Default::default()
};
let item2 = Item {
id: "item-2".to_string(),
subclass: Some("books".to_string()),
..Default::default()
};
let item3 = Item {
id: "item-3".to_string(),
subclass: Some("electronics".to_string()),
..Default::default()
};
let _ = catalog.upsert(item1.clone());
let _ = catalog.upsert(item2.clone());
let _ = catalog.upsert(item3.clone());
let results: Vec<Item> = catalog
.list_by_class_and_subclass("electronics")
.map(|item| item.unwrap())
.collect();
assert_eq!(results.len(), 2);
assert!(results.contains(&item1));
assert!(results.contains(&item3));
assert!(!results.contains(&item2));
}
#[test]
fn list_by_class_and_subclass_should_return_empty_if_no_match() {
let mut catalog = Catalog::new("dummy.db");
let item1 = Item {
id: "item-1".to_string(),
subclass: Some("electronics".to_string()),
..Default::default()
};
let _ = catalog.upsert(item1.clone());
let results: Vec<Item> = catalog
.list_by_class_and_subclass("books")
.map(|item| item.unwrap())
.collect();
assert!(results.is_empty());
}
} }