#![cfg(feature = "local_calendar_mocks_remote_calendars")]
use std::error::Error;
#[derive(Default, Clone, Debug)]
pub struct MockBehaviour {
pub is_suspended: bool,
pub get_calendars_behaviour: (u32, u32),
pub create_calendar_behaviour: (u32, u32),
pub add_item_behaviour: (u32, u32),
pub update_item_behaviour: (u32, u32),
pub get_item_version_tags_behaviour: (u32, u32),
pub get_item_by_url_behaviour: (u32, u32),
pub delete_item_behaviour: (u32, u32),
}
impl MockBehaviour {
pub fn new() -> Self {
Self::default()
}
pub fn fail_now(n_fails: u32) -> Self {
Self {
is_suspended: false,
get_calendars_behaviour: (0, n_fails),
create_calendar_behaviour: (0, n_fails),
add_item_behaviour: (0, n_fails),
update_item_behaviour: (0, n_fails),
get_item_version_tags_behaviour: (0, n_fails),
get_item_by_url_behaviour: (0, n_fails),
delete_item_behaviour: (0, n_fails),
}
}
pub fn suspend(&mut self) {
self.is_suspended = true;
}
pub fn resume(&mut self) {
self.is_suspended = false;
}
pub fn copy_from(&mut self, other: &Self) {
self.get_calendars_behaviour = other.get_calendars_behaviour;
self.create_calendar_behaviour = other.create_calendar_behaviour;
}
pub fn can_get_calendars(&mut self) -> Result<(), Box<dyn Error>> {
if self.is_suspended { return Ok(()) }
decrement(&mut self.get_calendars_behaviour, "get_calendars")
}
pub fn can_create_calendar(&mut self) -> Result<(), Box<dyn Error>> {
if self.is_suspended { return Ok(()) }
decrement(&mut self.create_calendar_behaviour, "create_calendar")
}
pub fn can_add_item(&mut self) -> Result<(), Box<dyn Error>> {
if self.is_suspended { return Ok(()) }
decrement(&mut self.add_item_behaviour, "add_item")
}
pub fn can_update_item(&mut self) -> Result<(), Box<dyn Error>> {
if self.is_suspended { return Ok(()) }
decrement(&mut self.update_item_behaviour, "update_item")
}
pub fn can_get_item_version_tags(&mut self) -> Result<(), Box<dyn Error>> {
if self.is_suspended { return Ok(()) }
decrement(&mut self.get_item_version_tags_behaviour, "get_item_version_tags")
}
pub fn can_get_item_by_url(&mut self) -> Result<(), Box<dyn Error>> {
if self.is_suspended { return Ok(()) }
decrement(&mut self.get_item_by_url_behaviour, "get_item_by_url")
}
pub fn can_delete_item(&mut self) -> Result<(), Box<dyn Error>> {
if self.is_suspended { return Ok(()) }
decrement(&mut self.delete_item_behaviour, "delete_item")
}
}
fn decrement(value: &mut (u32, u32), descr: &str) -> Result<(), Box<dyn Error>> {
let remaining_successes = value.0;
let remaining_failures = value.1;
if remaining_successes > 0 {
value.0 = value.0 - 1;
log::debug!("Mock behaviour: allowing a {} ({:?})", descr, value);
Ok(())
} else {
if remaining_failures > 0 {
value.1 = value.1 - 1;
log::debug!("Mock behaviour: failing a {} ({:?})", descr, value);
Err(format!("Mocked behaviour requires this {} to fail this time. ({:?})", descr, value).into())
} else {
log::debug!("Mock behaviour: allowing a {} ({:?})", descr, value);
Ok(())
}
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_mock_behaviour() {
let mut ok = MockBehaviour::new();
assert!(ok.can_get_calendars().is_ok());
assert!(ok.can_get_calendars().is_ok());
assert!(ok.can_get_calendars().is_ok());
assert!(ok.can_get_calendars().is_ok());
assert!(ok.can_get_calendars().is_ok());
assert!(ok.can_get_calendars().is_ok());
assert!(ok.can_get_calendars().is_ok());
let mut now = MockBehaviour::fail_now(2);
assert!(now.can_get_calendars().is_err());
assert!(now.can_create_calendar().is_err());
assert!(now.can_create_calendar().is_err());
assert!(now.can_get_calendars().is_err());
assert!(now.can_get_calendars().is_ok());
assert!(now.can_get_calendars().is_ok());
assert!(now.can_create_calendar().is_ok());
let mut custom = MockBehaviour{
get_calendars_behaviour: (0,1),
create_calendar_behaviour: (1,3),
..MockBehaviour::default()
};
assert!(custom.can_get_calendars().is_err());
assert!(custom.can_get_calendars().is_ok());
assert!(custom.can_get_calendars().is_ok());
assert!(custom.can_get_calendars().is_ok());
assert!(custom.can_get_calendars().is_ok());
assert!(custom.can_get_calendars().is_ok());
assert!(custom.can_get_calendars().is_ok());
assert!(custom.can_create_calendar().is_ok());
assert!(custom.can_create_calendar().is_err());
assert!(custom.can_create_calendar().is_err());
assert!(custom.can_create_calendar().is_err());
assert!(custom.can_create_calendar().is_ok());
assert!(custom.can_create_calendar().is_ok());
}
}