mod parse;
use parse::Parse;
mod helpers;
use helpers::new_ds;
use surrealdb::dbs::Session;
use surrealdb::err::Error;
use surrealdb::sql::Value;
#[tokio::test]
async fn future_function_arguments() -> Result<(), Error> {
let sql = "
UPSERT future:test SET
a = 'test@surrealdb.com',
b = <future> { 'test@surrealdb.com' },
x = 'a-' + parse::email::user(a),
y = 'b-' + parse::email::user(b)
;
";
let dbs = new_ds().await?;
let ses = Session::owner().with_ns("test").with_db("test");
let res = &mut dbs.execute(sql, &ses, None).await?;
assert_eq!(res.len(), 1);
let tmp = res.remove(0).result?;
let val = Value::parse(
"[
{
a: 'test@surrealdb.com',
b: 'test@surrealdb.com',
id: future:test,
x: 'a-test',
y: 'b-test',
}
]",
);
assert_eq!(tmp, val);
Ok(())
}
#[tokio::test]
async fn future_disabled() -> Result<(), Error> {
let sql = "
OPTION FUTURES = false;
<future> { 123 };
";
let dbs = new_ds().await?;
let ses = Session::owner().with_ns("test").with_db("test");
let res = &mut dbs.execute(sql, &ses, None).await?;
assert_eq!(res.len(), 1);
let tmp = res.remove(0).result?;
let val = Value::parse("<future> { 123 }");
assert_eq!(tmp, val);
Ok(())
}
#[tokio::test]
#[ignore]
async fn concurrency() -> Result<(), Error> {
const MILLIS: usize = 50;
const TIMEOUT: usize = MILLIS * 19 / 10;
fn query(count: usize, millis: usize) -> String {
format!(
"SELECT foo FROM [[{}]] TIMEOUT {TIMEOUT}ms;",
(0..count)
.map(|i| format!("<future>{{[sleep({millis}ms), {{foo: {i}}}]}}"))
.collect::<Vec<_>>()
.join(", ")
)
}
async fn test_limit(limit: usize) -> Result<bool, Error> {
let sql = query(limit, MILLIS);
let dbs = new_ds().await?;
let ses = Session::owner().with_ns("test").with_db("test");
let res = dbs.execute(&sql, &ses, None).await;
if matches!(res, Err(Error::QueryTimedout)) {
Ok(false)
} else {
let res = res?;
assert_eq!(res.len(), 1);
let res = res.into_iter().next().unwrap();
let elapsed = res.time.as_millis() as usize;
Ok(elapsed < TIMEOUT)
}
}
assert!(test_limit(3).await?);
#[cfg(not(debug_assertions))]
assert!(!test_limit(64 + 1).await?);
Ok(())
}