basiliq 0.1.2

REST API server exposing a Postgres database using JSON:API
use super::*;

#[basiliq_test]
async fn self_rel_once(pool: sqlx::PgPool) {
    let mut conn = pool.acquire().await.unwrap();
    sqlx::query(
        r#"
		CREATE TABLE person(
			id			UUID PRIMARY KEY,
			name		TEXT NOT NULL,
			mom			UUID REFERENCES person(id) ON DELETE CASCADE	
		);
	"#,
    )
    .execute(&mut *conn)
    .await
    .unwrap();

    let raw_table = BasiliqDbScannedTable::scan_db(&mut *conn).await.unwrap();
    let builder = BasiliqStoreBuilder::new(raw_table);
    assert_eq!(builder.tables().len(), 1);
    let person_table = builder
        .get_table(&BasiliqStoreTableIdentifier::new("public", "person"))
        .unwrap();
    let person_table_self_rel = person_table.relationships().get("public__person").unwrap();

    assert_eq!(person_table_self_rel.ftable().table(), "person");
    assert_eq!(person_table_self_rel.ftable().schema(), "public");
    assert_eq!(person_table_self_rel.lfield_name(), "mom");
    assert_eq!(person_table_self_rel.ffield_name(), "id");
    assert_eq!(
        matches!(
            person_table_self_rel.type_(),
            BasiliqStoreRelationshipType::ManyToOne(_)
        ),
        true
    );
}

#[basiliq_test]
async fn self_rel_multi(pool: sqlx::PgPool) {
    let mut conn = pool.acquire().await.unwrap();
    let valid_keys = &["dad", "mom"];
    sqlx::query(
        r#"
		CREATE TABLE person(
			id			UUID PRIMARY KEY,
			name		TEXT NOT NULL,
			mom			UUID REFERENCES person(id) ON DELETE CASCADE,
			dad			UUID REFERENCES person(id) ON DELETE CASCADE	
		);
	"#,
    )
    .execute(&mut *conn)
    .await
    .unwrap();

    let raw_table = BasiliqDbScannedTable::scan_db(&mut *conn).await.unwrap();
    let builder = BasiliqStoreBuilder::new(raw_table);
    assert_eq!(builder.tables().len(), 1);
    let person_table = builder
        .get_table(&BasiliqStoreTableIdentifier::new("public", "person"))
        .unwrap();
    let person_table_self_rel_mom = person_table.relationships().get("public__person").unwrap();

    assert_eq!(person_table_self_rel_mom.ftable().table(), "person");
    assert_eq!(person_table_self_rel_mom.ftable().schema(), "public");
    assert_eq!(
        valid_keys.contains(&person_table_self_rel_mom.lfield_name().as_str()),
        true
    );
    assert_eq!(person_table_self_rel_mom.ffield_name(), "id");
    assert_eq!(
        matches!(
            person_table_self_rel_mom.type_(),
            BasiliqStoreRelationshipType::ManyToOne(_)
        ),
        true
    );

    let person_table_self_dad = person_table
        .relationships()
        .get("public__person_0")
        .unwrap();

    assert_eq!(person_table_self_dad.ftable().table(), "person");
    assert_eq!(person_table_self_dad.ftable().schema(), "public");
    assert_eq!(
        valid_keys.contains(&person_table_self_dad.lfield_name().as_str()),
        true
    );
    assert_eq!(person_table_self_dad.ffield_name(), "id");
    assert_eq!(
        matches!(
            person_table_self_dad.type_(),
            BasiliqStoreRelationshipType::ManyToOne(_)
        ),
        true
    );
}