Bugfix: Rebuild iterator when changing collection
This patch fixes a bug where the following code (here pseudocode) did the wrong thing: store.entries().in_collection("foo").for_each(||...) because the `.in_collection()` call for the underlying PathIterator object did not actually re-build the iterator. It only changed the contained `PathIterBuilder`, but did not call `.build_iter()` on it to rebuild the iterator object. The test added with this patch checks whether the iterator does the right thing. Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
This commit is contained in:
parent
2a07c8a0c2
commit
0916c92a18
2 changed files with 51 additions and 0 deletions
|
@ -67,6 +67,7 @@ impl PathIterator {
|
||||||
pub fn in_collection(mut self, c: &str) -> Self {
|
pub fn in_collection(mut self, c: &str) -> Self {
|
||||||
trace!("Generating iterator object for collection: {}", c);
|
trace!("Generating iterator object for collection: {}", c);
|
||||||
self.iter_builder.in_collection(c);
|
self.iter_builder.in_collection(c);
|
||||||
|
self.iter = self.iter_builder.build_iter();
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -214,3 +214,53 @@ impl<'a> Iterator for Entries<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
extern crate env_logger;
|
||||||
|
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
fn setup_logging() {
|
||||||
|
let _ = env_logger::try_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
use store::Store;
|
||||||
|
use storeid::StoreId;
|
||||||
|
use file_abstraction::InMemoryFileAbstraction;
|
||||||
|
use libimagutil::variants::generate_variants;
|
||||||
|
|
||||||
|
pub fn get_store() -> Store {
|
||||||
|
let backend = Arc::new(InMemoryFileAbstraction::default());
|
||||||
|
Store::new_with_backend(PathBuf::from("/"), &None, backend).unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_entries_iterator_in_collection() {
|
||||||
|
setup_logging();
|
||||||
|
let store = get_store();
|
||||||
|
|
||||||
|
let ids = {
|
||||||
|
let base = String::from("entry");
|
||||||
|
let variants = vec!["coll_1", "coll_2", "coll_3"];
|
||||||
|
let modifier = |base: &String, v: &&str| {
|
||||||
|
StoreId::new(Some(store.path().clone()), PathBuf::from(format!("{}/{}", *v, base))).unwrap()
|
||||||
|
};
|
||||||
|
|
||||||
|
generate_variants(&base, variants.iter(), &modifier)
|
||||||
|
};
|
||||||
|
|
||||||
|
for id in ids {
|
||||||
|
let _ = store.retrieve(id).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
let succeeded = store.entries()
|
||||||
|
.unwrap()
|
||||||
|
.in_collection("coll_3")
|
||||||
|
.map(|id| { debug!("Processing id = {:?}", id); id })
|
||||||
|
.all(|id| id.unwrap().is_in_collection(&["coll_3"]));
|
||||||
|
|
||||||
|
assert!(succeeded, "not all entries in iterator are from coll_3 collection");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue