use task_graph_mcp::db::Database;
fn setup_db() -> Database {
Database::open_in_memory().expect("Failed to create in-memory database")
}
#[test]
fn get_schema_returns_all_tables() {
let db = setup_db();
let schema = db.get_schema(false).expect("Failed to get schema");
assert!(!schema.sqlite_version.is_empty());
assert!(
!schema.tables.is_empty(),
"Schema should have at least one table"
);
let tasks_table = schema.tables.iter().find(|t| t.name == "tasks");
assert!(tasks_table.is_some(), "Schema should include 'tasks' table");
let tasks_table = tasks_table.unwrap();
assert!(
!tasks_table.columns.is_empty(),
"tasks table should have columns"
);
let column_names: Vec<&str> = tasks_table
.columns
.iter()
.map(|c| c.name.as_str())
.collect();
assert!(
column_names.contains(&"id"),
"tasks table should have 'id' column"
);
assert!(
column_names.contains(&"title"),
"tasks table should have 'title' column"
);
assert!(
column_names.contains(&"status"),
"tasks table should have 'status' column"
);
}
#[test]
fn get_schema_includes_column_details() {
let db = setup_db();
let schema = db.get_schema(false).expect("Failed to get schema");
let tasks_table = schema.tables.iter().find(|t| t.name == "tasks").unwrap();
let id_column = tasks_table.columns.iter().find(|c| c.name == "id").unwrap();
assert!(id_column.primary_key, "id column should be primary key");
assert!(
!id_column.data_type.is_empty(),
"id column should have a data type"
);
}
#[test]
fn get_schema_includes_foreign_keys() {
let db = setup_db();
let schema = db.get_schema(false).expect("Failed to get schema");
let deps_table = schema.tables.iter().find(|t| t.name == "dependencies");
assert!(
deps_table.is_some(),
"Schema should include 'dependencies' table"
);
let deps_table = deps_table.unwrap();
assert!(
!deps_table.foreign_keys.is_empty(),
"dependencies table should have foreign keys"
);
}
#[test]
fn get_schema_with_sql_includes_create_statements() {
let db = setup_db();
let schema = db.get_schema(true).expect("Failed to get schema with SQL");
let has_sql = schema.tables.iter().any(|t| t.sql.is_some());
assert!(
has_sql,
"Schema with include_sql=true should have SQL statements"
);
}
#[test]
fn get_schema_without_sql_excludes_create_statements() {
let db = setup_db();
let schema = db.get_schema(false).expect("Failed to get schema");
let has_sql = schema.tables.iter().any(|t| t.sql.is_some());
assert!(
!has_sql,
"Schema with include_sql=false should not have SQL statements"
);
}
#[test]
fn get_table_names_returns_only_names() {
let db = setup_db();
let names = db.get_table_names().expect("Failed to get table names");
assert!(!names.is_empty(), "Should have at least one table name");
assert!(
names.contains(&"tasks".to_string()),
"Should include 'tasks' table"
);
assert!(
names.contains(&"workers".to_string()),
"Should include 'workers' table"
);
assert!(
names.contains(&"dependencies".to_string()),
"Should include 'dependencies' table"
);
}
#[test]
fn get_schema_excludes_internal_tables() {
let db = setup_db();
let schema = db.get_schema(false).expect("Failed to get schema");
let has_sqlite_internal = schema.tables.iter().any(|t| t.name.starts_with("sqlite_"));
assert!(
!has_sqlite_internal,
"Schema should not include sqlite_ internal tables"
);
let has_refinery = schema
.tables
.iter()
.any(|t| t.name.starts_with("refinery_"));
assert!(
!has_refinery,
"Schema should not include refinery_ migration tables"
);
}