cartulary 0.3.0-alpha.1

The knowledge layer of your project — decisions, issues, docs, all in one place.
Documentation
use crate::domain::model::query::Queries;

use super::store::QueryStore;

/// Return every query, sorted alphabetically by identifier.
pub fn list_queries(store: &dyn QueryStore) -> anyhow::Result<Queries> {
    let mut qs = store.list()?;
    qs.sort_by_name();
    Ok(qs)
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::domain::model::query::{Query, QueryIdentifier, QueryScript};

    struct StubStore {
        listing: Queries,
    }

    impl QueryStore for StubStore {
        fn list(&self) -> anyhow::Result<Queries> {
            Ok(self.listing.clone())
        }
    }

    fn nq(n: &str) -> Query {
        Query::new(QueryIdentifier::new(n).unwrap(), QueryScript::new(""), None)
    }

    #[test]
    fn list_sorts_alphabetically_even_when_store_returns_shuffled() {
        let store = StubStore {
            listing: [nq("charlie"), nq("alpha"), nq("bravo")]
                .into_iter()
                .collect(),
        };
        let qs = list_queries(&store).unwrap();
        let names: Vec<&str> = qs.iter().map(|q| q.name.as_str()).collect();
        assert_eq!(names, vec!["alpha", "bravo", "charlie"]);
    }

    #[test]
    fn list_on_empty_store_returns_empty_collection() {
        let store = StubStore {
            listing: Queries::new(),
        };
        assert!(list_queries(&store).unwrap().is_empty());
    }
}