#[cfg(test)]
mod tests {
use inventory_kit::error::InventoryError;
use inventory_kit::in_memory;
use inventory_kit::model::InventoryItem;
use inventory_kit::repository::{AtomicInventoryOps, InventoryRepository};
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
struct HotelRoom {
id: u32,
}
impl InventoryItem for HotelRoom {
type Id = u32;
fn id(&self) -> Self::Id {
self.id
}
}
#[test]
fn test_reserve_and_release() {
let mut repo = in_memory::InMemoryInventoryRepository::<HotelRoom, u32>::new();
let room = HotelRoom { id: 1 };
let _ = repo.insert_availability(room.id(), 1000, 2000, 10);
assert_eq!(
repo.get_availability(&room.id(), 1000, 2000).unwrap()[0].available,
10
);
repo.reserve(&room.id(), 1000, 2000, 3).unwrap();
assert_eq!(
repo.get_availability(&room.id(), 1000, 2000).unwrap()[0].available,
7
);
repo.release(&room.id(), 1000, 2000, 2).unwrap();
assert_eq!(
repo.get_availability(&room.id(), 1000, 2000).unwrap()[0].available,
9
);
}
#[test]
fn test_atomic_reserve_success_and_fail() {
let mut repo = in_memory::InMemoryInventoryRepository::<HotelRoom, u32>::new();
let room_id = 1;
let _ = repo.insert_availability(room_id, 1000, 1100, 5);
let _ = repo.insert_availability(room_id, 1100, 1200, 3);
let result = repo.reserve_many(&room_id, &[
(1000, 1100, 2),
(1100, 1200, 1),
]);
assert!(result.is_ok());
let result = repo.reserve_many(&room_id, &[
(1000, 1100, 2),
(1100, 1200, 5),
]);
assert_eq!(result, Err(InventoryError::Insufficient));
let slots = repo.get_availability(&room_id, 1000, 1200).unwrap();
assert_eq!(slots[0].available, 3); assert_eq!(slots[1].available, 2); }
}