sift-query-sqlx 0.1.0

PostgreSQL renderer and sqlx executor for SiftQuery
Documentation
#![allow(dead_code)]
extern crate sift_query_core as sift_query;
use sift_query::SearchEntity;
use sift_query_derive::SearchEntity;
use sift_query_sqlx::*;
use std::sync::Arc;

mod first {
    use super::*;
    #[derive(Debug, SearchEntity)]
    #[search_entity(stable_order = "id:asc")]
    pub struct Entity {
        #[search_field(sortable)]
        pub id: i64,
    }
}
mod second {
    use super::*;
    #[derive(Debug, SearchEntity)]
    #[search_entity(stable_order = "id:asc")]
    pub struct Entity {
        #[search_field(sortable)]
        pub id: i64,
    }
}

fn searcher() -> PgSiftQuery {
    PgSiftQuery::new(
        sqlx::postgres::PgPoolOptions::new()
            .connect_lazy("postgres://localhost:1/unused")
            .unwrap(),
    )
}

#[tokio::test]
async fn named_registry_validates_configuration_and_routes_by_type_identity() {
    let router = PgPoolRouter::default()
        .register_named("primary", searcher())
        .unwrap()
        .register_named("archive", searcher())
        .unwrap()
        .route_entity::<first::Entity>("primary")
        .unwrap()
        .route_entity::<second::Entity>("archive")
        .unwrap();
    assert_eq!(
        first::Entity::META.entity_name,
        second::Entity::META.entity_name
    );
    assert!(!Arc::ptr_eq(
        &router.searcher::<first::Entity>().unwrap(),
        &router.searcher::<second::Entity>().unwrap()
    ));
    assert!(matches!(
        router.clone().register_named("primary", searcher()),
        Err(PoolRouteError::DuplicateName(_))
    ));
    for name in ["", "../pool", "pool secret"] {
        assert!(matches!(
            router.clone().register_named(name, searcher()),
            Err(PoolRouteError::InvalidName)
        ));
    }
    assert!(matches!(
        router.clone().with_default_named("missing"),
        Err(PoolRouteError::MissingPool(_))
    ));
    assert!(matches!(
        router.route_entity::<first::Entity>("missing"),
        Err(PoolRouteError::MissingPool(_))
    ));
    assert!(matches!(
        PgPoolRouter::default().searcher::<first::Entity>(),
        Err(PoolRouteError::MissingEntity(_))
    ));
    let direct = PgPoolRouter::default()
        .register_entity::<first::Entity>(searcher())
        .register_entity::<second::Entity>(searcher());
    assert!(!Arc::ptr_eq(
        &direct.searcher::<first::Entity>().unwrap(),
        &direct.searcher::<second::Entity>().unwrap()
    ));
}