use backend::ModifyEntryError;
use super::*;
#[derive(Default)]
pub struct MockDataProvider {
entries: Vec<Entry>,
return_error: bool,
}
impl MockDataProvider {
pub fn new_with_data() -> Self {
MockDataProvider {
entries: get_default_entries(),
return_error: false,
}
}
pub fn set_return_err(&mut self, return_error: bool) {
self.return_error = return_error
}
fn early_return(&self) -> anyhow::Result<()> {
match self.return_error {
true => bail!("Test Error"),
false => Ok(()),
}
}
}
impl DataProvider for MockDataProvider {
async fn load_all_entries(&mut self) -> anyhow::Result<Vec<Entry>> {
self.early_return()?;
Ok(self.entries.clone())
}
async fn add_entry(&mut self, entry: EntryDraft) -> Result<Entry, ModifyEntryError> {
self.early_return()?;
let new_id = self
.entries
.iter()
.map(|entry| entry.id + 1)
.max()
.unwrap_or(0);
let entry = Entry::from_draft(new_id, entry);
self.entries.push(entry.clone());
Ok(entry)
}
async fn restore_entry(&mut self, entry: Entry) -> Result<Entry, ModifyEntryError> {
self.early_return()?;
if self.entries.iter().any(|existing| existing.id == entry.id) {
return Err(ModifyEntryError::ValidationError(format!(
"Entry id {} already exists",
entry.id
)));
}
self.entries.push(entry.clone());
Ok(entry)
}
async fn remove_entry(&mut self, entry_id: u32) -> anyhow::Result<()> {
self.early_return()?;
self.entries.retain(|entry| entry.id != entry_id);
Ok(())
}
async fn update_entry(&mut self, entry: Entry) -> Result<Entry, ModifyEntryError> {
self.early_return()?;
let entry_to_change = self
.entries
.iter_mut()
.find(|existing| existing.id == entry.id)
.ok_or(anyhow!("No item found"))?;
*entry_to_change = entry.clone();
Ok(entry)
}
async fn get_export_object(&mut self, entries_ids: &[u32]) -> anyhow::Result<EntriesDTO> {
self.early_return()?;
Ok(EntriesDTO::new(
self.entries
.iter()
.filter(|entry| entries_ids.contains(&entry.id))
.cloned()
.map(EntryDraft::from_entry)
.collect(),
))
}
async fn import_entries(&mut self, entries_dto: EntriesDTO) -> anyhow::Result<()> {
self.early_return()?;
for draft in entries_dto.entries {
self.add_entry(draft).await?;
}
Ok(())
}
async fn assign_priority_to_entries(&mut self, _priority: u32) -> anyhow::Result<()> {
unimplemented!("There are not tests for assigning priority on the app level");
}
}