datasources 0.1.22

Async datasource interfaces, middleware, registry, and test doubles
Documentation
use crate::crud_repository_builder::CRUDRepositoryBuilder;
use crate::crud_repository_options::CRUDRepositoryOptions;
use crate::mocks::MockConnection;
use crate::repository_builder_options_factory::RepositoryBuilderOptionsFactory;

#[test]
fn for_provider_returns_the_dialect_or_the_default() {
    let mut fallback = CRUDRepositoryOptions::default();
    fallback.create_properties = Some(vec!["name".into()]);
    let mut mysql = CRUDRepositoryOptions::default();
    mysql.create_properties = Some(vec!["id".into(), "name".into()]);
    let mut factory = RepositoryBuilderOptionsFactory::new();
    factory.add(fallback.clone()).add_for("mysql", mysql.clone());
    assert_eq!(
        factory.for_provider("mysql").unwrap().create_properties,
        mysql.create_properties
    );
    assert_eq!(
        factory.for_provider("sqlite").unwrap().create_properties,
        fallback.create_properties
    );
}

#[test]
fn builder_selects_by_connection_provider() {
    let mut fallback = CRUDRepositoryOptions::default();
    fallback.create_properties = Some(vec!["name".into()]);
    let mut mysql = CRUDRepositoryOptions::default();
    mysql.create_properties = Some(vec!["id".into()]);
    let builder = CRUDRepositoryBuilder::new()
        .add(fallback.clone())
        .add_for("mysql", mysql.clone());
    assert_eq!(
        builder
            .for_connection(MockConnection::with_command_provider(
                std::sync::Arc::new(crate::mocks::MockCommand::new()),
                "mysql",
            ).as_ref())
            .unwrap()
            .create_properties,
        mysql.create_properties
    );
    assert_eq!(
        builder
            .for_connection(MockConnection::new().as_ref())
            .unwrap()
            .create_properties,
        fallback.create_properties
    );
}

#[test]
fn for_provider_errors_when_no_options_were_added() {
    let error = match RepositoryBuilderOptionsFactory::new().for_provider("mysql") {
        Ok(_) => panic!("expected error"),
        Err(error) => error,
    };
    assert_eq!(error.to_string(), "repository options required");
}