#[test_log::test(tokio::test)]
async fn select_with_version() {
let (permit, db) = new_db().await;
db.use_ns(NS).use_db(Ulid::new().to_string()).await.unwrap();
drop(permit);
let _ = db.query("CREATE user:john SET name = 'John v1'").await.unwrap().check().unwrap();
let create_ts = chrono::Utc::now();
let _ = db.query("UPDATE user:john SET name = 'John v2'").await.unwrap().check().unwrap();
let mut response = db.query("SELECT * FROM user").await.unwrap().check().unwrap();
let Some(name): Option<String> = response.take("name").unwrap() else {
panic!("query returned no record");
};
assert_eq!(name, "John v2");
let version = create_ts.to_rfc3339();
let mut response = db
.query(format!("SELECT * FROM user VERSION d'{}'", version))
.await
.unwrap()
.check()
.unwrap();
let Some(name): Option<String> = response.take("name").unwrap() else {
panic!("query returned no record");
};
assert_eq!(name, "John v1");
let mut response = db
.query(format!("SELECT name FROM user VERSION d'{}'", version))
.await
.unwrap()
.check()
.unwrap();
let Some(name): Option<String> = response.take("name").unwrap() else {
panic!("query returned no record");
};
assert_eq!(name, "John v1");
let mut response = db
.query(format!("SELECT name FROM user:john VERSION d'{}'", version))
.await
.unwrap()
.check()
.unwrap();
let Some(name): Option<String> = response.take("name").unwrap() else {
panic!("query returned no record");
};
assert_eq!(name, "John v1");
}
#[test_log::test(tokio::test)]
async fn create_with_version() {
let (permit, db) = new_db().await;
db.use_ns(NS).use_db(Ulid::new().to_string()).await.unwrap();
drop(permit);
let _ = db
.query("CREATE user:john SET name = 'John' VERSION d'2024-08-19T08:00:00Z'")
.await
.unwrap()
.check()
.unwrap();
let mut response = db.query("SELECT * FROM user:john").await.unwrap().check().unwrap();
let Some(name): Option<String> = response.take("name").unwrap() else {
panic!("query returned no record");
};
assert_eq!(name, "John");
let mut response = db
.query("SELECT * FROM user:john VERSION d'2024-08-19T08:00:00Z'")
.await
.unwrap()
.check()
.unwrap();
let Some(name): Option<String> = response.take("name").unwrap() else {
panic!("query returned no record");
};
assert_eq!(name, "John");
let mut response = db
.query("SELECT * FROM user:john VERSION d'2024-08-19T07:00:00Z'")
.await
.unwrap()
.check()
.unwrap();
let response: Option<String> = response.take("name").unwrap();
assert!(response.is_none());
}
#[test_log::test(tokio::test)]
async fn insert_with_version() {
let (permit, db) = new_db().await;
db.use_ns(NS).use_db(Ulid::new().to_string()).await.unwrap();
drop(permit);
let _ = db
.query("INSERT INTO user { id: user:john, name: 'John' } VERSION d'2024-08-19T08:00:00Z'")
.await
.unwrap()
.check()
.unwrap();
let mut response = db.query("SELECT * FROM user:john").await.unwrap().check().unwrap();
let Some(name): Option<String> = response.take("name").unwrap() else {
panic!("query returned no record");
};
assert_eq!(name, "John");
let mut response = db
.query("SELECT * FROM user:john VERSION d'2024-08-19T08:00:00Z'")
.await
.unwrap()
.check()
.unwrap();
let Some(name): Option<String> = response.take("name").unwrap() else {
panic!("query returned no record");
};
assert_eq!(name, "John");
let mut response = db
.query("SELECT * FROM user:john VERSION d'2024-08-19T07:00:00Z'")
.await
.unwrap()
.check()
.unwrap();
let response: Option<String> = response.take("name").unwrap();
assert!(response.is_none());
}
#[test_log::test(tokio::test)]
async fn info_for_db_with_versioned_tables() {
let (permit, db) = new_db().await;
db.use_ns(NS).use_db(Ulid::new().to_string()).await.unwrap();
drop(permit);
let ts_before_create = chrono::Utc::now().to_rfc3339();
let _ = db.query("DEFINE TABLE person").await.unwrap().check().unwrap();
let ts_after_create = chrono::Utc::now().to_rfc3339();
let q = format!("INFO FOR DB VERSION d'{}'", ts_before_create);
let mut response = db.query(q).await.unwrap().check().unwrap();
let info = response.take::<Value>(0).unwrap().to_string();
assert!(info.contains("tables: { }"));
let q = format!("INFO FOR DB VERSION d'{}'", ts_after_create);
let mut response = db.query(q).await.unwrap().check().unwrap();
let info = response.take::<Value>(0).unwrap().to_string();
assert!(info.contains(
"tables: { person: 'DEFINE TABLE person TYPE ANY SCHEMALESS PERMISSIONS NONE' }"
));
}
#[test_log::test(tokio::test)]
async fn info_for_table_with_versioned_fields() {
let (permit, db) = new_db().await;
db.use_ns(NS).use_db(Ulid::new().to_string()).await.unwrap();
drop(permit);
let _ = db.query("DEFINE TABLE person").await.unwrap().check().unwrap();
let ts_before_field = chrono::Utc::now().to_rfc3339();
let _ = db
.query("DEFINE FIELD firstName ON TABLE person TYPE string")
.await
.unwrap()
.check()
.unwrap();
let ts_after_field = chrono::Utc::now().to_rfc3339();
let q = format!("INFO FOR TABLE person VERSION d'{}'", ts_before_field);
let mut response = db.query(q).await.unwrap().check().unwrap();
let info = response.take::<Value>(0).unwrap().to_string();
assert!(info.contains("fields: { }"));
let q = format!("INFO FOR TABLE person VERSION d'{}'", ts_after_field);
let mut response = db.query(q).await.unwrap().check().unwrap();
let info = response.take::<Value>(0).unwrap().to_string();
assert!(info.contains(
"fields: { firstName: 'DEFINE FIELD firstName ON person TYPE string PERMISSIONS FULL' }"
));
}