Add tests for validate_schema_map
(#391) r=rnewman
* Add tests for `validate_schema_map` * Update test to ensure we get the right error out
This commit is contained in:
parent
8adb6d97fd
commit
b24db01744
1 changed files with 182 additions and 0 deletions
182
db/src/schema.rs
182
db/src/schema.rs
|
@ -250,3 +250,185 @@ impl SchemaTypeChecking for Schema {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
use self::edn::NamespacedKeyword;
|
||||
use errors::Error;
|
||||
|
||||
fn add_attribute(schema: &mut Schema,
|
||||
ident: NamespacedKeyword,
|
||||
entid: Entid,
|
||||
attribute: Attribute) {
|
||||
|
||||
schema.entid_map.insert(entid, ident.clone());
|
||||
schema.ident_map.insert(ident.clone(), entid);
|
||||
|
||||
schema.schema_map.insert(entid, attribute);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn validate_schema_map_success() {
|
||||
let mut schema = Schema::default();
|
||||
// attribute that is not an index has no uniqueness
|
||||
add_attribute(&mut schema, NamespacedKeyword::new("foo", "bar"), 97, Attribute {
|
||||
index: false,
|
||||
value_type: ValueType::Boolean,
|
||||
fulltext: false,
|
||||
unique: None,
|
||||
multival: false,
|
||||
component: false,
|
||||
});
|
||||
// attribute is unique by value and an index
|
||||
add_attribute(&mut schema, NamespacedKeyword::new("foo", "baz"), 98, Attribute {
|
||||
index: true,
|
||||
value_type: ValueType::Long,
|
||||
fulltext: false,
|
||||
unique: Some(attribute::Unique::Value),
|
||||
multival: false,
|
||||
component: false,
|
||||
});
|
||||
// attribue is unique by identity and an index
|
||||
add_attribute(&mut schema, NamespacedKeyword::new("foo", "bat"), 99, Attribute {
|
||||
index: true,
|
||||
value_type: ValueType::Ref,
|
||||
fulltext: false,
|
||||
unique: Some(attribute::Unique::Identity),
|
||||
multival: false,
|
||||
component: false,
|
||||
});
|
||||
// attribute is a components and a `Ref`
|
||||
add_attribute(&mut schema, NamespacedKeyword::new("foo", "bak"), 100, Attribute {
|
||||
index: false,
|
||||
value_type: ValueType::Ref,
|
||||
fulltext: false,
|
||||
unique: None,
|
||||
multival: false,
|
||||
component: true,
|
||||
});
|
||||
// fulltext attribute is a string and an index
|
||||
add_attribute(&mut schema, NamespacedKeyword::new("foo", "bap"), 101, Attribute {
|
||||
index: true,
|
||||
value_type: ValueType::String,
|
||||
fulltext: true,
|
||||
unique: None,
|
||||
multival: false,
|
||||
component: false,
|
||||
});
|
||||
|
||||
assert!(validate_schema_map(&schema.entid_map, &schema.schema_map).is_ok());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn invalid_schema_unique_value_not_index() {
|
||||
let mut schema = Schema::default();
|
||||
// attribute unique by value but not index
|
||||
let ident = NamespacedKeyword::new("foo", "bar");
|
||||
add_attribute(&mut schema, ident , 99, Attribute {
|
||||
index: false,
|
||||
value_type: ValueType::Boolean,
|
||||
fulltext: false,
|
||||
unique: Some(attribute::Unique::Value),
|
||||
multival: false,
|
||||
component: false,
|
||||
});
|
||||
|
||||
let err = validate_schema_map(&schema.entid_map, &schema.schema_map).err();
|
||||
assert!(err.is_some());
|
||||
|
||||
match err.unwrap() {
|
||||
Error(ErrorKind::BadSchemaAssertion(message), _) => { assert_eq!(message, ":db/unique :db/unique_value without :db/index true for entid: :foo/bar"); },
|
||||
x => panic!("expected Bad Schema Assertion error, got {:?}", x),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn invalid_schema_unique_identity_not_index() {
|
||||
let mut schema = Schema::default();
|
||||
// attribute is unique by identity but not index
|
||||
add_attribute(&mut schema, NamespacedKeyword::new("foo", "bar"), 99, Attribute {
|
||||
index: false,
|
||||
value_type: ValueType::Long,
|
||||
fulltext: false,
|
||||
unique: Some(attribute::Unique::Identity),
|
||||
multival: false,
|
||||
component: false,
|
||||
});
|
||||
|
||||
let err = validate_schema_map(&schema.entid_map, &schema.schema_map).err();
|
||||
assert!(err.is_some());
|
||||
|
||||
match err.unwrap() {
|
||||
Error(ErrorKind::BadSchemaAssertion(message), _) => { assert_eq!(message, ":db/unique :db/unique_identity without :db/index true for entid: :foo/bar"); },
|
||||
x => panic!("expected Bad Schema Assertion error, got {:?}", x),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn invalid_schema_component_not_ref() {
|
||||
let mut schema = Schema::default();
|
||||
// attribute that is a component is not a `Ref`
|
||||
add_attribute(&mut schema, NamespacedKeyword::new("foo", "bar"), 99, Attribute {
|
||||
index: false,
|
||||
value_type: ValueType::Boolean,
|
||||
fulltext: false,
|
||||
unique: None,
|
||||
multival: false,
|
||||
component: true,
|
||||
});
|
||||
|
||||
let err = validate_schema_map(&schema.entid_map, &schema.schema_map).err();
|
||||
assert!(err.is_some());
|
||||
|
||||
match err.unwrap() {
|
||||
Error(ErrorKind::BadSchemaAssertion(message), _) => { assert_eq!(message, ":db/isComponent true without :db/valueType :db.type/ref for entid: :foo/bar"); },
|
||||
x => panic!("expected Bad Schema Assertion error, got {:?}", x),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn invalid_schema_fulltext_not_index() {
|
||||
let mut schema = Schema::default();
|
||||
// attribute that is fulltext is not an index
|
||||
add_attribute(&mut schema, NamespacedKeyword::new("foo", "bar"), 99, Attribute {
|
||||
index: false,
|
||||
value_type: ValueType::String,
|
||||
fulltext: true,
|
||||
unique: None,
|
||||
multival: false,
|
||||
component: false,
|
||||
});
|
||||
|
||||
let err = validate_schema_map(&schema.entid_map, &schema.schema_map).err();
|
||||
assert!(err.is_some());
|
||||
|
||||
match err.unwrap() {
|
||||
Error(ErrorKind::BadSchemaAssertion(message), _) => { assert_eq!(message, ":db/fulltext true without :db/index true for entid: :foo/bar"); },
|
||||
x => panic!("expected Bad Schema Assertion error, got {:?}", x),
|
||||
}
|
||||
}
|
||||
|
||||
fn invalid_schema_fulltext_index_not_string() {
|
||||
let mut schema = Schema::default();
|
||||
// attribute that is fulltext and not a `String`
|
||||
add_attribute(&mut schema, NamespacedKeyword::new("foo", "bar"), 99, Attribute {
|
||||
index: true,
|
||||
value_type: ValueType::Long,
|
||||
fulltext: true,
|
||||
unique: None,
|
||||
multival: false,
|
||||
component: false,
|
||||
});
|
||||
|
||||
let err = validate_schema_map(&schema.entid_map, &schema.schema_map).err();
|
||||
assert!(err.is_some());
|
||||
|
||||
match err.unwrap() {
|
||||
Error(ErrorKind::BadSchemaAssertion(message), _) => { assert_eq!(message, ":db/fulltext true without :db/valueType :db.type/string for entid: :foo/bar"); },
|
||||
x => panic!("expected Bad Schema Assertion error, got {:?}", x),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue