datasources-postgres 0.1.6

Postgres datasource provider
Documentation
use super::command::PostgresCommand;
use super::connection::PostgresConnection;
use super::isolate;
use datasources::Connection;
use datasources_code_generators::SqlGenerateDriver;
use datasources_tests::{
    add_extra_contact, apply_sql, as_contacts_view, contact_lookup_ids, contact_schema,
    contact_with, contacts_parity, contacts_service_of, expect_contacts_view,     seed_contacts_sql,
    statements_of, SEED_CONTACT_COUNT,
};
use std::sync::Arc;

fn verbose() -> bool {
    matches!(std::env::var("VERBOSE").as_deref(), Ok("1") | Ok("true"))
}

fn register_sql() {
    datasources_tests::register_contact_dialect(
        "postgres",
        SqlGenerateDriver {
            quote_left: crate::PostgresDriver::QUOTE_LEFT,
            quote_right: crate::PostgresDriver::QUOTE_RIGHT,
            type_converter: crate::PostgresDriver::types(),
            default_value_converter: crate::PostgresDriver::defaults(),
            statement_renderer: crate::PostgresDriver::statement_text_renderer(),
        },
    );
}

#[tokio::test]
async fn matches_enriched_contacts_service_to_flat_mapper() {
    register_sql();
    let isolated = isolate::create().await;
    let conn = Arc::new(PostgresConnection::new(Some(isolated.url.clone()), None));
    conn.open().await.unwrap();
    let command = PostgresCommand::new(conn.clone());
    let mut sql = statements_of(&contact_schema("postgres"));
    sql.extend(seed_contacts_sql(SEED_CONTACT_COUNT, r#"'\x'"#));
    apply_sql(&command, &sql).await.unwrap();

    let (eager, enriched) = contacts_parity(conn.clone(), verbose(), super::converters::field)
        .await
        .unwrap();
    expect_contacts_view(&eager, SEED_CONTACT_COUNT);
    expect_contacts_view(&enriched, SEED_CONTACT_COUNT);
    let mapped = contact_with(&eager, 2, 1);
    assert!(!mapped.contact_source_name.is_empty());
    assert!(!mapped.contact_type_name.is_empty());
    assert_eq!(mapped.addresses.len(), 2);
    assert_eq!(as_contacts_view(&enriched), as_contacts_view(&eager));

    let ids = contact_lookup_ids(conn.clone()).await.unwrap();
    let extra = add_extra_contact(
        &contacts_service_of(conn.clone(), None, super::converters::field),
        &ids,
    )
    .await
    .unwrap();
    assert_eq!(extra["FirstName"], datasources::Value::from("Extra"));
    assert!(extra["Addresses"].wire_text().contains("Line1=9 Extra"));
    assert!(extra["Addresses"]
        .wire_text()
        .contains(&format!("Contact={}", extra["Id"].wire_text())));
    assert!(extra["Phones"].wire_text().contains("Number=555-extra"));
    assert!(extra["Addresses"].wire_text().contains("Name=Home")
        || extra["Addresses"].wire_text().contains("Name%3DHome"));
    assert!(extra["Phones"].wire_text().contains("Name=Mobile")
        || extra["Phones"].wire_text().contains("Name%3DMobile"));

    conn.close().await.ok();
    isolated.drop().await;
}