use cratestack_core::ExtensionKind;
#[cfg(any(feature = "rate_limit", feature = "pgvector"))]
use super::feature_enabled;
use super::{first_missing_extension, required_feature};
fn parse(source: &str) -> cratestack_core::Schema {
cratestack_parser::parse_schema(source).expect("schema should parse")
}
#[test]
fn no_declared_extensions_has_no_missing_feature() {
let schema = parse(
r#"
model Widget {
id Int @id
}
"#,
);
assert!(schema.declared_extensions.is_empty());
assert_eq!(first_missing_extension(&schema), None);
}
#[test]
#[cfg(not(any(feature = "rate_limit", feature = "pgvector")))]
fn declared_extension_without_its_feature_is_flagged() {
let schema = parse(
r#"
extension rate_limit {
}
model Widget {
id Int @id
}
"#,
);
assert_eq!(
first_missing_extension(&schema),
Some(ExtensionKind::RateLimit)
);
let schema = parse(
r#"
extension pgvector {
}
model Widget {
id Int @id
}
"#,
);
assert_eq!(
first_missing_extension(&schema),
Some(ExtensionKind::Pgvector)
);
}
#[test]
#[cfg(not(any(feature = "rate_limit", feature = "pgvector")))]
fn missing_extension_is_reported_in_declared_extensions_stable_order() {
let schema = parse(
r#"
extension pgvector {
}
extension rate_limit {
}
model Widget {
id Int @id
}
"#,
);
assert_eq!(
first_missing_extension(&schema),
Some(ExtensionKind::RateLimit)
);
}
#[test]
fn required_feature_names_every_extension_kind() {
for kind in ExtensionKind::ALL {
let (feature, tracking_issue) = required_feature(kind);
assert!(!feature.is_empty());
assert!(tracking_issue > 0);
}
}
#[test]
#[cfg(feature = "rate_limit")]
fn rate_limit_feature_enabled_is_reflected() {
assert!(feature_enabled(ExtensionKind::RateLimit));
let schema = parse(
r#"
extension rate_limit {
}
model Widget {
id Int @id
}
"#,
);
assert_eq!(first_missing_extension(&schema), None);
}
#[test]
#[cfg(feature = "pgvector")]
fn pgvector_feature_enabled_is_reflected() {
assert!(feature_enabled(ExtensionKind::Pgvector));
let schema = parse(
r#"
extension pgvector {
}
model Widget {
id Int @id
}
"#,
);
assert_eq!(first_missing_extension(&schema), None);
}