generated from coulomb/repo-seed
CMIS layer into an honest CMIS 1.1
This commit is contained in:
145
tests/cmis/test_cmis_compliance_flags.py
Normal file
145
tests/cmis/test_cmis_compliance_flags.py
Normal file
@@ -0,0 +1,145 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from kontextual_engine import (
|
||||
Actor,
|
||||
ActorType,
|
||||
CMISAccessPoint,
|
||||
CMISAccessProfile,
|
||||
CMISAction,
|
||||
CMISBaseType,
|
||||
CMISCapability,
|
||||
CMISDomainMapper,
|
||||
Classification,
|
||||
KnowledgeAsset,
|
||||
LifecycleState,
|
||||
OperationContext,
|
||||
)
|
||||
|
||||
|
||||
EXPECTED_CAPABILITY_KEYS = {
|
||||
"capability_content_stream_updatability",
|
||||
"capability_changes",
|
||||
"capability_renditions",
|
||||
"capability_get_descendants",
|
||||
"capability_get_folder_tree",
|
||||
"capability_order_by",
|
||||
"capability_multifiling",
|
||||
"capability_unfiling",
|
||||
"capability_version_specific_filing",
|
||||
"capability_pwc_searchable",
|
||||
"capability_pwc_updatable",
|
||||
"capability_all_versions_searchable",
|
||||
"capability_query",
|
||||
"capability_join",
|
||||
"capability_acl",
|
||||
"capability_new_type_settable_attributes",
|
||||
}
|
||||
|
||||
|
||||
def _context() -> OperationContext:
|
||||
return OperationContext.create(
|
||||
Actor.create(ActorType.HUMAN, actor_id="actor-cmis-compliance"),
|
||||
correlation_id="corr-cmis-compliance",
|
||||
)
|
||||
|
||||
|
||||
def _mapper(profile: CMISAccessProfile | None = None) -> CMISDomainMapper:
|
||||
return CMISDomainMapper(
|
||||
CMISAccessPoint(
|
||||
access_point_id="cmis-compliance",
|
||||
repository_id="kontextual-compliance",
|
||||
profile=profile or CMISAccessProfile.readonly_browser(),
|
||||
base_path="/cmis/compliance/browser",
|
||||
metadata={"repository_name": "Kontextual Compliance Repository"},
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def test_repository_info_uses_complete_conservative_cmis_11_capability_flags() -> None:
|
||||
repository = _mapper().repository_info()
|
||||
capabilities = repository["capabilities"]
|
||||
|
||||
assert EXPECTED_CAPABILITY_KEYS <= set(capabilities)
|
||||
assert capabilities["capability_content_stream_updatability"] == "none"
|
||||
assert capabilities["capability_changes"] == "objectidsonly"
|
||||
assert capabilities["capability_renditions"] == "none"
|
||||
assert capabilities["capability_get_descendants"] is False
|
||||
assert capabilities["capability_get_folder_tree"] is False
|
||||
assert capabilities["capability_order_by"] == "none"
|
||||
assert capabilities["capability_multifiling"] is False
|
||||
assert capabilities["capability_unfiling"] is False
|
||||
assert capabilities["capability_version_specific_filing"] is False
|
||||
assert capabilities["capability_pwc_searchable"] is False
|
||||
assert capabilities["capability_pwc_updatable"] is False
|
||||
assert capabilities["capability_all_versions_searchable"] is False
|
||||
assert capabilities["capability_query"] == "metadataonly"
|
||||
assert capabilities["capability_join"] == "none"
|
||||
assert capabilities["capability_acl"] == "discover"
|
||||
assert set(capabilities["capability_new_type_settable_attributes"].values()) == {False}
|
||||
|
||||
|
||||
def test_authoring_profile_only_advertises_supported_content_write_semantics() -> None:
|
||||
repository = _mapper(CMISAccessProfile.governed_authoring()).repository_info()
|
||||
capabilities = repository["capabilities"]
|
||||
|
||||
assert capabilities["capability_content_stream_updatability"] == "anytime"
|
||||
assert capabilities["capability_multifiling"] is False
|
||||
assert capabilities["capability_renditions"] == "none"
|
||||
|
||||
|
||||
def test_repository_info_exposes_nonstandard_projection_feature_and_unsupported_catalog() -> None:
|
||||
repository = _mapper().repository_info()
|
||||
feature_ids = {feature["id"] for feature in repository["repository_features"]}
|
||||
unsupported = repository["unsupported_features"]
|
||||
|
||||
assert "urn:kontextual:cmis:feature:projection-parentage" in feature_ids
|
||||
assert unsupported["multifiling"]["status"] == "projection_only"
|
||||
assert unsupported["multifiling"]["standard_flag"] == "capability_multifiling"
|
||||
assert unsupported["get_descendants"]["standard_flag"] == "capability_get_descendants"
|
||||
assert unsupported["rendition_streams"]["standard_flag"] == "capability_renditions"
|
||||
assert repository["compliance"]["posture"] == "declared-browser-binding-subset"
|
||||
|
||||
|
||||
def test_type_definitions_do_not_claim_unimplemented_cmis_services() -> None:
|
||||
types = {definition["base_type_id"]: definition for definition in _mapper().type_definitions()}
|
||||
document = types[CMISBaseType.DOCUMENT.value]
|
||||
folder = types[CMISBaseType.FOLDER.value]
|
||||
relationship = types[CMISBaseType.RELATIONSHIP.value]
|
||||
policy = types[CMISBaseType.POLICY.value]
|
||||
|
||||
assert document["versionable"] is False
|
||||
assert document["controllable_acl"] is True
|
||||
assert document["queryable"] is True
|
||||
assert document["creatable"] is False
|
||||
assert "cmis:contentStreamLength" in document["property_definitions"]
|
||||
assert folder["controllable_acl"] is False
|
||||
assert folder["queryable"] is False
|
||||
assert relationship["creatable"] is False
|
||||
assert relationship["queryable"] is False
|
||||
assert policy["controllable_policy"] is False
|
||||
|
||||
|
||||
def test_profile_denies_unimplemented_mutations_even_when_related_capability_exists() -> None:
|
||||
profile = CMISAccessProfile(
|
||||
name="acl-manager-shape",
|
||||
capabilities=(CMISCapability.ACL,),
|
||||
allow_mutations=True,
|
||||
)
|
||||
decision = profile.decide_action(CMISAction.APPLY_ACL, _context())
|
||||
|
||||
assert decision.allowed is False
|
||||
assert decision.reason == "cmis_operation_not_implemented"
|
||||
|
||||
|
||||
def test_deleted_assets_are_not_exposed_as_live_cmis_objects() -> None:
|
||||
profile = CMISAccessProfile.readonly_browser()
|
||||
asset = KnowledgeAsset.create(
|
||||
"Deleted",
|
||||
Classification(asset_type="document", sensitivity="internal"),
|
||||
asset_id="asset-deleted",
|
||||
).transition_lifecycle(LifecycleState.DELETE_REQUESTED)
|
||||
|
||||
decision = profile.decide_asset_visibility(asset, _context())
|
||||
|
||||
assert decision.allowed is False
|
||||
assert decision.reason == "cmis_lifecycle_not_visible"
|
||||
Reference in New Issue
Block a user