relay-knowledge 1.1.17

Graph-database-based knowledge graph project.
Documentation
use super::*;
use crate::domain::{SoftwareEntityKind, SoftwarePredicate};

#[test]
fn software_vocabulary_is_a_valid_bounded_rdf_owl_schema() {
    let schema = &SOFTWARE_ONTOLOGY_SCHEMA;

    schema.validate().expect("software ontology schema");
    assert_eq!(schema.version, SOFTWARE_ONTOLOGY_VERSION);
    assert_eq!(schema.namespace_iri, SOFTWARE_ONTOLOGY_NAMESPACE);
    assert_eq!(schema.classes.len(), 21);
    assert_eq!(schema.object_properties.len(), 15);
}

#[test]
fn enum_discriminants_remain_aligned_with_the_versioned_catalog() {
    let entity_kinds = [
        SoftwareEntityKind::Domain,
        SoftwareEntityKind::SoftwareSystem,
        SoftwareEntityKind::Component,
        SoftwareEntityKind::Api,
        SoftwareEntityKind::Resource,
        SoftwareEntityKind::Configuration,
        SoftwareEntityKind::BuildDefinition,
        SoftwareEntityKind::DeploymentUnit,
        SoftwareEntityKind::RuntimeService,
        SoftwareEntityKind::TestCase,
        SoftwareEntityKind::ReleaseArtifact,
        SoftwareEntityKind::PackageComponent,
        SoftwareEntityKind::Sdk,
        SoftwareEntityKind::DocumentationUnit,
        SoftwareEntityKind::Pipeline,
        SoftwareEntityKind::BuildJob,
        SoftwareEntityKind::RepositorySnapshot,
        SoftwareEntityKind::FileRevision,
        SoftwareEntityKind::BuildRun,
        SoftwareEntityKind::DeploymentRevision,
        SoftwareEntityKind::RuntimeObservation,
    ];
    for (kind, definition) in entity_kinds.into_iter().zip(SOFTWARE_CLASSES) {
        assert_eq!(kind.as_str(), definition.id);
        assert_eq!(kind.rdf_local_name(), definition.rdf_local_name);
        assert_eq!(SoftwareEntityKind::parse(definition.id), Some(kind));
        assert_eq!(
            kind.is_occurrence_kind(),
            definition.identity == OntologyClassIdentity::Occurrence
        );
    }

    let predicates = [
        SoftwarePredicate::Contains,
        SoftwarePredicate::ProvidesApi,
        SoftwarePredicate::ConsumesApi,
        SoftwarePredicate::DependsOn,
        SoftwarePredicate::Configures,
        SoftwarePredicate::Builds,
        SoftwarePredicate::Produces,
        SoftwarePredicate::Packages,
        SoftwarePredicate::Deploys,
        SoftwarePredicate::RunsAs,
        SoftwarePredicate::Tests,
        SoftwarePredicate::Documents,
        SoftwarePredicate::DerivedFrom,
        SoftwarePredicate::ObservedAs,
        SoftwarePredicate::Supersedes,
    ];
    for (predicate, definition) in predicates.into_iter().zip(SOFTWARE_PROPERTIES) {
        assert_eq!(predicate.as_str(), definition.id);
        assert_eq!(predicate.rdf_local_name(), definition.rdf_local_name);
        assert_eq!(SoftwarePredicate::parse(definition.id), Some(predicate));
    }
}

#[test]
fn executable_shapes_preserve_pair_specific_and_same_class_rules() {
    let schema = &SOFTWARE_ONTOLOGY_SCHEMA;

    assert!(schema.allows_relation("contains", "domain", "software_system"));
    assert!(!schema.allows_relation("contains", "domain", "component"));
    assert!(schema.allows_relation("supersedes", "deployment_revision", "deployment_revision"));
    assert!(!schema.allows_relation("supersedes", "deployment_revision", "release_artifact"));
    assert!(schema.allows_subject("documents", "documentation_unit"));
    assert!(!schema.allows_relation("documents", "documentation_unit", "documentation_unit"));
    assert!(!schema.allows_relation("derived_from", "missing-a", "missing-b"));
    assert!(!schema.allows_relation("supersedes", "missing", "missing"));
}