Release Connectors v0.1.22 with service-desk federation
Module Package Release / publish-packages (push) Successful in 12s
Module Package Release / publish-packages (push) Successful in 12s
This commit is contained in:
@@ -7,9 +7,13 @@ from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
from govoplan_connectors.backend.db.models import (
|
||||
ConnectorConfiguration,
|
||||
ConnectorKnowledgeObject,
|
||||
ConnectorKnowledgeProfile,
|
||||
ConnectorKnowledgeSyncRun,
|
||||
ConnectorServiceDeskObject,
|
||||
ConnectorServiceDeskProfile,
|
||||
ConnectorServiceDeskSyncRun,
|
||||
ConnectorSanctionsAcquisitionRun,
|
||||
ConnectorSanctionsSnapshot,
|
||||
ConnectorTabularSource,
|
||||
@@ -18,9 +22,11 @@ from govoplan_connectors.backend.manifest import manifest
|
||||
from govoplan_connectors.backend.provider_state import (
|
||||
KNOWLEDGE_PROVIDER_ID,
|
||||
SANCTIONS_PROVIDER_ID,
|
||||
SERVICE_DESK_PROVIDER_ID,
|
||||
TABULAR_PROVIDER_ID,
|
||||
knowledge_provider_states,
|
||||
sanctions_provider_states,
|
||||
service_desk_provider_states,
|
||||
tabular_provider_states,
|
||||
)
|
||||
from govoplan_core.core.provider_governance import ExternalProviderStateContext
|
||||
@@ -109,7 +115,12 @@ class ConnectorsProviderStateTests(unittest.TestCase):
|
||||
self.assertNotIn("secret-source-name", rendered)
|
||||
self.assertNotIn("source.example.test", rendered)
|
||||
self.assertEqual(
|
||||
{TABULAR_PROVIDER_ID, SANCTIONS_PROVIDER_ID, KNOWLEDGE_PROVIDER_ID},
|
||||
{
|
||||
TABULAR_PROVIDER_ID,
|
||||
SANCTIONS_PROVIDER_ID,
|
||||
KNOWLEDGE_PROVIDER_ID,
|
||||
SERVICE_DESK_PROVIDER_ID,
|
||||
},
|
||||
{item.provider_id for item in manifest.external_provider_state_providers},
|
||||
)
|
||||
|
||||
@@ -172,6 +183,95 @@ class ConnectorsProviderStateTests(unittest.TestCase):
|
||||
self.assertNotIn("group:secret-acl", rendered)
|
||||
self.assertNotIn("configuration-secret", rendered)
|
||||
|
||||
def test_service_desk_state_reports_recovery_without_ticket_or_acl_data(self) -> None:
|
||||
now = datetime.now(UTC)
|
||||
configuration = ConnectorConfiguration(
|
||||
id="configuration-secret",
|
||||
tenant_id="tenant-1",
|
||||
definition_id="definition-1",
|
||||
name="Secret service desk",
|
||||
status="active",
|
||||
base_definition_revision=1,
|
||||
local_overrides={},
|
||||
protected_paths=[],
|
||||
effective_configuration={},
|
||||
effective_hash="configuration-hash",
|
||||
resource_revision=3,
|
||||
ambiguity_policy="manual_review",
|
||||
)
|
||||
profile = ConnectorServiceDeskProfile(
|
||||
id="service-desk-profile-1",
|
||||
tenant_id="tenant-1",
|
||||
configuration_id="configuration-secret",
|
||||
status="active",
|
||||
integration_mode="synchronize",
|
||||
product="znuny",
|
||||
product_version="7.1.4",
|
||||
desired_maturity="synchronize",
|
||||
discovered_maturity="synchronize",
|
||||
source_authority_mode="governed_sync",
|
||||
default_visibility="restricted",
|
||||
default_acl_tokens=["group:secret-acl"],
|
||||
routes={"secret": "route"},
|
||||
queue_mappings=[{"secret": "queue"}],
|
||||
dynamic_field_mappings=[{"secret": "field"}],
|
||||
capabilities=["read", "search", "synchronize", "publish"],
|
||||
discovered_configuration_revision=3,
|
||||
discovered_configuration_hash="configuration-hash",
|
||||
health_status="healthy",
|
||||
discovered_at=now,
|
||||
)
|
||||
ticket = ConnectorServiceDeskObject(
|
||||
id="service-desk-object-1",
|
||||
tenant_id="tenant-1",
|
||||
profile_id=profile.id,
|
||||
object_type="ticket",
|
||||
external_id="42",
|
||||
external_ticket_number="secret-number",
|
||||
title="Secret ticket title",
|
||||
status="active",
|
||||
source_revision="2026-08-22T10:00:00Z",
|
||||
content_hash="e" * 64,
|
||||
visibility="restricted",
|
||||
acl_tokens=["group:secret-acl"],
|
||||
mapped_data={"secret": "ticket content"},
|
||||
provenance={"secret": "provider evidence"},
|
||||
observed_at=now,
|
||||
)
|
||||
run = ConnectorServiceDeskSyncRun(
|
||||
id="service-desk-run-1",
|
||||
tenant_id="tenant-1",
|
||||
profile_id=profile.id,
|
||||
mode="update",
|
||||
idempotency_key="secret-key",
|
||||
request_hash="f" * 64,
|
||||
status="outcome_unknown",
|
||||
started_at=now,
|
||||
finished_at=now,
|
||||
)
|
||||
self.session.add_all((configuration, profile, ticket, run))
|
||||
self.session.commit()
|
||||
|
||||
state = service_desk_provider_states(
|
||||
ExternalProviderStateContext(session=self.session, tenant_id="tenant-1")
|
||||
)[0]
|
||||
|
||||
self.assertEqual(SERVICE_DESK_PROVIDER_ID, state.provider_id)
|
||||
self.assertTrue(state.metrics["discovery_current"])
|
||||
self.assertEqual("pending", state.conflict)
|
||||
self.assertEqual("attention", state.recovery)
|
||||
rendered = str(state.to_dict())
|
||||
for secret in (
|
||||
"configuration-secret",
|
||||
"secret-number",
|
||||
"Secret ticket title",
|
||||
"group:secret-acl",
|
||||
"ticket content",
|
||||
"provider evidence",
|
||||
"secret-key",
|
||||
):
|
||||
self.assertNotIn(secret, rendered)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user