mod common;
use ankurah::{policy::DEFAULT_CONTEXT as c, Model, Node, PermissiveAgent};
use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Model, Debug, Serialize, Deserialize)]
pub struct Task {
pub name: String,
pub status: String,
pub created: String,
}
#[tokio::test]
async fn test_undefined_column_in_where() -> Result<()> {
let (_container, storage_engine) = common::create_postgres_container().await?;
let node = Node::new_durable(Arc::new(storage_engine), PermissiveAgent::new());
node.system.create().await?;
let ctx = node.context_async(c).await;
let results = ctx.fetch::<TaskView>("status = 'active'").await?;
assert!(results.is_empty(), "Expected empty results for query on non-existent column");
Ok(())
}
#[tokio::test]
async fn test_undefined_column_in_order_by() -> Result<()> {
let (_container, storage_engine) = common::create_postgres_container().await?;
let node = Node::new_durable(Arc::new(storage_engine), PermissiveAgent::new());
node.system.create().await?;
let ctx = node.context_async(c).await;
let results = ctx.fetch::<TaskView>("name = 'nonexistent' ORDER BY created DESC").await?;
assert!(results.is_empty(), "Expected empty results for query with ORDER BY on non-existent column");
Ok(())
}
#[tokio::test]
async fn test_undefined_columns_where_and_order_by() -> Result<()> {
let (_container, storage_engine) = common::create_postgres_container().await?;
let node = Node::new_durable(Arc::new(storage_engine), PermissiveAgent::new());
node.system.create().await?;
let ctx = node.context_async(c).await;
let results = ctx.fetch::<TaskView>("status = 'pending' OR status = 'active' ORDER BY created DESC").await?;
assert!(results.is_empty(), "Expected empty results");
Ok(())
}
#[tokio::test]
async fn test_columns_exist_after_write() -> Result<()> {
let (_container, storage_engine) = common::create_postgres_container().await?;
let node = Node::new_durable(Arc::new(storage_engine), PermissiveAgent::new());
node.system.create().await?;
let ctx = node.context_async(c).await;
let trx = ctx.begin();
let _task = trx.create(&Task { name: "Test task".to_owned(), status: "pending".to_owned(), created: "2024-01-01".to_owned() }).await?;
trx.commit().await?;
let results = ctx.fetch::<TaskView>("status = 'pending' ORDER BY created DESC").await?;
assert_eq!(results.len(), 1);
assert_eq!(results[0].name().unwrap(), "Test task");
Ok(())
}
#[tokio::test]
async fn test_cache_refresh_after_column_creation() -> Result<()> {
let (_container, storage_engine) = common::create_postgres_container().await?;
let node = Node::new_durable(Arc::new(storage_engine), PermissiveAgent::new());
node.system.create().await?;
let ctx = node.context_async(c).await;
let results = ctx.fetch::<TaskView>("status = 'pending'").await?;
assert!(results.is_empty(), "Expected empty before write");
let trx = ctx.begin();
trx.create(&Task { name: "Task 1".to_owned(), status: "pending".to_owned(), created: "2024-01-01".to_owned() }).await?;
trx.commit().await?;
let results = ctx.fetch::<TaskView>("status = 'pending'").await?;
assert_eq!(results.len(), 1, "Should find the task after column was created");
Ok(())
}