use grafeo_engine::GrafeoDB;
#[test]
fn show_graph_types_respects_schema() {
let db = GrafeoDB::new_in_memory();
let session = db.session();
session
.execute("CREATE SCHEMA IF NOT EXISTS my_schema")
.unwrap();
session
.execute(
"CREATE GRAPH TYPE IF NOT EXISTS social_network (
NODE TYPE Person (name STRING NOT NULL, age INTEGER),
EDGE TYPE KNOWS (since INTEGER)
)",
)
.unwrap();
let result = session.execute("SHOW GRAPH TYPES").unwrap();
assert_eq!(
result.rows().len(),
1,
"default schema should see 1 graph type"
);
session
.execute("CREATE SCHEMA IF NOT EXISTS my_schema2")
.unwrap();
session.execute("SESSION SET SCHEMA my_schema2").unwrap();
let result = session.execute("SHOW GRAPH TYPES").unwrap();
assert_eq!(
result.rows().len(),
0,
"my_schema2 should see 0 graph types (issue #167)"
);
}
#[test]
fn show_node_types_respects_schema() {
let db = GrafeoDB::new_in_memory();
let session = db.session();
session.execute("CREATE SCHEMA IF NOT EXISTS s1").unwrap();
session.execute("SESSION SET SCHEMA s1").unwrap();
session
.execute("CREATE NODE TYPE Person (name STRING NOT NULL)")
.unwrap();
let result = session.execute("SHOW NODE TYPES").unwrap();
assert_eq!(result.rows().len(), 1);
session.execute("SESSION RESET SCHEMA").unwrap();
let result = session.execute("SHOW NODE TYPES").unwrap();
assert_eq!(
result.rows().len(),
0,
"default schema should not see s1 types"
);
}
#[test]
fn show_edge_types_respects_schema() {
let db = GrafeoDB::new_in_memory();
let session = db.session();
session.execute("CREATE SCHEMA IF NOT EXISTS s1").unwrap();
session.execute("SESSION SET SCHEMA s1").unwrap();
session
.execute("CREATE EDGE TYPE KNOWS (since INTEGER)")
.unwrap();
let result = session.execute("SHOW EDGE TYPES").unwrap();
assert_eq!(result.rows().len(), 1);
session.execute("SESSION RESET SCHEMA").unwrap();
let result = session.execute("SHOW EDGE TYPES").unwrap();
assert_eq!(
result.rows().len(),
0,
"default schema should not see s1 edge types"
);
}
#[test]
fn types_isolated_between_schemas() {
let db = GrafeoDB::new_in_memory();
let session = db.session();
session
.execute("CREATE SCHEMA IF NOT EXISTS alpha")
.unwrap();
session.execute("CREATE SCHEMA IF NOT EXISTS beta").unwrap();
session.execute("SESSION SET SCHEMA alpha").unwrap();
session
.execute("CREATE NODE TYPE Item (color STRING)")
.unwrap();
session.execute("SESSION SET SCHEMA beta").unwrap();
session
.execute("CREATE NODE TYPE Item (weight FLOAT64)")
.unwrap();
session.execute("SESSION SET SCHEMA alpha").unwrap();
let result = session.execute("SHOW NODE TYPES").unwrap();
assert_eq!(result.rows().len(), 1);
session.execute("SESSION SET SCHEMA beta").unwrap();
let result = session.execute("SHOW NODE TYPES").unwrap();
assert_eq!(result.rows().len(), 1);
session.execute("SESSION RESET SCHEMA").unwrap();
let result = session.execute("SHOW NODE TYPES").unwrap();
assert_eq!(result.rows().len(), 0);
}
#[test]
fn default_schema_types_hidden_in_named_schema() {
let db = GrafeoDB::new_in_memory();
let session = db.session();
session
.execute("CREATE NODE TYPE GlobalType (value STRING)")
.unwrap();
let result = session.execute("SHOW NODE TYPES").unwrap();
assert_eq!(result.rows().len(), 1);
session
.execute("CREATE SCHEMA IF NOT EXISTS isolated")
.unwrap();
session.execute("SESSION SET SCHEMA isolated").unwrap();
let result = session.execute("SHOW NODE TYPES").unwrap();
assert_eq!(
result.rows().len(),
0,
"named schema should not see default types"
);
}
#[test]
fn drop_type_respects_schema() {
let db = GrafeoDB::new_in_memory();
let session = db.session();
session.execute("CREATE SCHEMA IF NOT EXISTS s1").unwrap();
session.execute("SESSION SET SCHEMA s1").unwrap();
session
.execute("CREATE NODE TYPE Temp (val STRING)")
.unwrap();
let result = session.execute("SHOW NODE TYPES").unwrap();
assert_eq!(result.rows().len(), 1);
session.execute("DROP NODE TYPE Temp").unwrap();
let result = session.execute("SHOW NODE TYPES").unwrap();
assert_eq!(result.rows().len(), 0);
}
#[test]
fn drop_schema_blocks_when_types_exist() {
let db = GrafeoDB::new_in_memory();
let session = db.session();
session
.execute("CREATE SCHEMA IF NOT EXISTS blocker")
.unwrap();
session.execute("SESSION SET SCHEMA blocker").unwrap();
session
.execute("CREATE NODE TYPE Pinned (val STRING)")
.unwrap();
session.execute("SESSION RESET SCHEMA").unwrap();
let result = session.execute("DROP SCHEMA blocker");
assert!(result.is_err(), "DROP SCHEMA should fail when types exist");
}
#[test]
fn alter_type_respects_schema() {
let db = GrafeoDB::new_in_memory();
let session = db.session();
session.execute("CREATE SCHEMA IF NOT EXISTS s1").unwrap();
session.execute("SESSION SET SCHEMA s1").unwrap();
session
.execute("CREATE NODE TYPE Mutable (name STRING)")
.unwrap();
session
.execute("ALTER NODE TYPE Mutable ADD PROPERTY extra STRING")
.unwrap();
let result = session.execute("SHOW NODE TYPES").unwrap();
assert_eq!(result.rows().len(), 1);
session.execute("SESSION RESET SCHEMA").unwrap();
let result = session.execute("SHOW NODE TYPES").unwrap();
assert_eq!(
result.rows().len(),
0,
"altered schema type should not leak to default"
);
}
#[test]
fn create_graph_typed_respects_schema() {
let db = GrafeoDB::new_in_memory();
let session = db.session();
session.execute("CREATE SCHEMA IF NOT EXISTS s1").unwrap();
session.execute("SESSION SET SCHEMA s1").unwrap();
session
.execute("CREATE EDGE TYPE KNOWS (since INTEGER)")
.expect("pre-declare KNOWS edge type");
session
.execute(
"CREATE GRAPH TYPE social_network (
NODE TYPE Person (name STRING NOT NULL),
EDGE TYPE KNOWS
)",
)
.unwrap();
let result = session.execute("CREATE GRAPH IF NOT EXISTS my_social TYPED social_network");
assert!(
result.is_ok(),
"CREATE GRAPH TYPED should succeed when type is in current schema: {result:?}"
);
}
#[test]
fn create_graph_typed_wrong_schema_fails() {
let db = GrafeoDB::new_in_memory();
let session = db.session();
session.execute("CREATE SCHEMA IF NOT EXISTS s1").unwrap();
session.execute("SESSION SET SCHEMA s1").unwrap();
session
.execute("CREATE GRAPH TYPE org_type (NODE TYPE Dept (name STRING))")
.unwrap();
session.execute("CREATE SCHEMA IF NOT EXISTS s2").unwrap();
session.execute("SESSION SET SCHEMA s2").unwrap();
let result = session.execute("CREATE GRAPH IF NOT EXISTS g TYPED org_type");
assert!(
result.is_err(),
"CREATE GRAPH TYPED with unqualified name from wrong schema must fail"
);
}
#[test]
fn cross_schema_typed_graph() {
let db = GrafeoDB::new_in_memory();
let session = db.session();
session.execute("CREATE SCHEMA IF NOT EXISTS s1").unwrap();
session.execute("SESSION SET SCHEMA s1").unwrap();
session
.execute(
"CREATE GRAPH TYPE social_network (
NODE TYPE Person (name STRING NOT NULL),
EDGE TYPE KNOWS (since INTEGER)
)",
)
.unwrap();
session.execute("CREATE SCHEMA IF NOT EXISTS s2").unwrap();
session.execute("SESSION SET SCHEMA s2").unwrap();
let result = session.execute("CREATE GRAPH IF NOT EXISTS my_social TYPED s1.social_network");
assert!(
result.is_ok(),
"CREATE GRAPH TYPED with qualified schema.type should succeed: {result:?}"
);
}
#[test]
fn qualified_type_not_found() {
let db = GrafeoDB::new_in_memory();
let session = db.session();
let result = session.execute("CREATE GRAPH g TYPED nonexistent.some_type");
assert!(
result.is_err(),
"Qualified reference to nonexistent schema/type must fail"
);
}
#[test]
fn unqualified_type_no_schema_set() {
let db = GrafeoDB::new_in_memory();
let session = db.session();
session
.execute(
"CREATE GRAPH TYPE flat_type (
NODE TYPE Item (value INTEGER)
)",
)
.unwrap();
let result = session.execute("CREATE GRAPH g TYPED flat_type");
assert!(
result.is_ok(),
"Unqualified TYPED with no session schema should resolve in default namespace: {result:?}"
);
}