typedb-test 0.1.0

Test fixture for TypeDB, using googletest StaticFixture.
Documentation
const SCHEMA: &str = include_str!("schema.tql");
const DATA: &str = include_str!("data.tql");
const FUNCTIONS: &str = include_str!("functions.tql");

use std::time::Instant;

use futures::StreamExt;
use tokio::time::sleep;
use typedb_driver::{
    TransactionType,
    answer::{self, ConceptRow},
};

use super::*;

#[tokio::test]
#[gtest]
async fn test_models(database: &&TypeDBFixture) {
    let tx = database
        .transaction(DEFAULT_DATABASE_NAME, TransactionType::Schema)
        .await
        .unwrap();

    tx.query(SCHEMA).await.unwrap();
    tx.query(FUNCTIONS).await.unwrap();
    tx.commit().await.unwrap();

    let tx = database
        .transaction(DEFAULT_DATABASE_NAME, TransactionType::Write)
        .await
        .unwrap();

    tx.query(DATA).await.unwrap();
    tx.commit().await.unwrap();

    test_has_permission(database).await;
    // doesn't work. not my test.
    // test_list_permissions(database).await;
}

async fn test_has_permission(database: &&TypeDBFixture) {
    let email = "douglas.schmidt@vaticle.com";
    let path = "root/engineering/typedb-studio/src/README.md";
    let operation = "edit file";
    let query = format!(
        r#"
    match
        $p isa person, has email "{email}";
        $f isa file, has path "{path}";
        $o isa operation, has name "{operation}";
        let $permission = has_permission($p, $f, $o); # TODO: This used to have a validity true check
    "#
    );

    let start_time = Instant::now();
    let tx = database
        .transaction(DEFAULT_DATABASE_NAME, TransactionType::Read)
        .await
        .unwrap();
    let answers = tx.query(query.as_str()).await.unwrap();
    let answers = answers
        .into_rows()
        .map(|a| a.ok())
        .collect::<Vec<_>>()
        .await;
    let time_taken = start_time.elapsed();
    assert_eq!(1, answers.iter().flatten().collect::<Vec<_>>().len());
    println!("Completed successfully in: {} ms", time_taken.as_millis())
}

async fn test_list_permissions(database: &&TypeDBFixture) {
    let email = "douglas.schmidt@vaticle.com";
    let query = format!(
        r#"
    match
        $p isa person, has email "{email}";
        let $ac in list_permissions($p); #, has validity $v;
        $ac isa access (object: $o, action: $a);
        # $o isa object, has id $id;
        # $a isa action, has name $n;
    "#
    );

    let start_time = Instant::now();
    let answers = database
        .transaction(DEFAULT_DATABASE_NAME, TransactionType::Read)
        .await
        .unwrap()
        .query(query.as_str())
        .await
        .unwrap();
    let answers = answers
        .into_rows()
        .map(|a| a.ok())
        .collect::<Vec<_>>()
        .await;
    dbg!(&answers);
    let time_taken = start_time.elapsed();
    assert_eq!(67, answers.len());
    println!("Completed successfully in: {} ms", time_taken.as_millis())
}