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;
}
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())
}