use crate::model::{DataModel, ResourceType, ValueType};
pub(crate) fn builtin_data_models() -> Vec<DataModel> {
["knora-api", "standoff", "salsah-gui"]
.into_iter()
.map(|name| DataModel {
name: name.to_string(),
iri: format!("http://api.knora.org/ontology/{name}/v2"),
label: None,
last_modified: None,
is_builtin: true,
})
.collect()
}
pub(crate) fn builtin_resource_types() -> Vec<ResourceType> {
[
("Region", "Region"),
("AudioSegment", "Audio Annotation"),
("VideoSegment", "Video Annotation"),
("LinkObj", "Link Object"),
]
.into_iter()
.map(|(name, label)| ResourceType {
name: name.to_string(),
iri: format!("http://api.knora.org/ontology/knora-api/v2#{name}"),
label: Some(label.to_string()),
is_builtin: true,
})
.collect()
}
pub(crate) fn builtin_field_value_type(local: &str) -> Option<ValueType> {
match local {
"hasStillImageFileValue" => Some(ValueType::StillImage),
"hasMovingImageFileValue" => Some(ValueType::MovingImage),
"hasAudioFileValue" => Some(ValueType::Audio),
"hasDocumentFileValue" => Some(ValueType::Document),
"hasArchiveFileValue" => Some(ValueType::Archive),
"hasTextFileValue" => Some(ValueType::Other("text-file".to_string())),
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::client::http::data_model_name_from_iri;
#[test]
fn builtin_data_models_returns_three_entries() {
let builtins = builtin_data_models();
assert_eq!(builtins.len(), 3, "expected exactly 3 built-in data-models");
}
#[test]
fn all_builtins_have_is_builtin_true() {
for dm in builtin_data_models() {
assert!(
dm.is_builtin,
"built-in data-model '{}' must have is_builtin == true",
dm.name
);
}
}
#[test]
fn all_builtins_have_no_label_or_last_modified() {
for dm in builtin_data_models() {
assert!(
dm.label.is_none(),
"built-in data-model '{}' must have label == None",
dm.name
);
assert!(
dm.last_modified.is_none(),
"built-in data-model '{}' must have last_modified == None",
dm.name
);
}
}
#[test]
fn builtin_name_matches_iri_derived_name() {
for dm in builtin_data_models() {
let derived = data_model_name_from_iri(&dm.iri);
assert_eq!(
derived, dm.name,
"built-in data-model IRI '{}' derives name '{}', but stored name is '{}' — IRI and name have drifted",
dm.iri, derived, dm.name
);
}
}
#[test]
fn builtin_names_are_expected_set() {
let builtins = builtin_data_models();
let names: Vec<&str> = builtins.iter().map(|dm| dm.name.as_str()).collect();
assert!(names.contains(&"knora-api"), "knora-api must be a built-in");
assert!(names.contains(&"standoff"), "standoff must be a built-in");
assert!(
names.contains(&"salsah-gui"),
"salsah-gui must be a built-in"
);
}
#[test]
fn builtin_resource_types_returns_four_entries() {
let builtins = builtin_resource_types();
assert_eq!(
builtins.len(),
4,
"expected exactly 4 built-in resource-types"
);
}
#[test]
fn all_builtin_resource_types_have_is_builtin_true() {
for rt in builtin_resource_types() {
assert!(
rt.is_builtin,
"built-in resource-type '{}' must have is_builtin == true",
rt.name
);
}
}
#[test]
fn builtin_resource_type_names_are_expected_set() {
let builtins = builtin_resource_types();
let names: Vec<&str> = builtins.iter().map(|rt| rt.name.as_str()).collect();
assert!(names.contains(&"Region"), "Region must be a built-in");
assert!(
names.contains(&"AudioSegment"),
"AudioSegment must be a built-in"
);
assert!(
names.contains(&"VideoSegment"),
"VideoSegment must be a built-in"
);
assert!(names.contains(&"LinkObj"), "LinkObj must be a built-in");
}
#[test]
fn builtin_resource_types_excludes_annotation() {
let builtins = builtin_resource_types();
let names: Vec<&str> = builtins.iter().map(|rt| rt.name.as_str()).collect();
assert!(
!names.contains(&"Annotation"),
"Annotation must NOT be included — it is deprecated in modern DaSCH tooling"
);
}
#[test]
fn has_text_file_value_maps_to_other_text_file() {
assert_eq!(
builtin_field_value_type("hasTextFileValue"),
Some(ValueType::Other("text-file".to_string())),
"hasTextFileValue must map to Other(\"text-file\") to align with the resolved-node path"
);
}
#[test]
fn builtin_field_value_type_spot_checks() {
assert_eq!(
builtin_field_value_type("hasStillImageFileValue"),
Some(ValueType::StillImage)
);
assert_eq!(
builtin_field_value_type("hasAudioFileValue"),
Some(ValueType::Audio)
);
assert_eq!(builtin_field_value_type("unknown"), None);
}
#[test]
fn builtin_resource_type_name_matches_iri_fragment() {
for rt in builtin_resource_types() {
let derived = rt.iri.rsplit(['#', '/', ':']).next().unwrap_or("");
assert_eq!(
derived, rt.name,
"built-in resource-type IRI '{}' derives fragment '{}', but stored name is '{}' — IRI and name have drifted",
rt.iri, derived, rt.name
);
}
}
}