Add Voting provider assurance contract

This commit is contained in:
2026-08-04 14:01:05 +02:00
parent bca3e46293
commit 2b5c14385d
2 changed files with 262 additions and 2 deletions
+66 -1
View File
@@ -1,8 +1,16 @@
from __future__ import annotations
from datetime import UTC, datetime, timedelta
import unittest
from govoplan_core.core.voting import VotingResult
from govoplan_core.core.voting import (
VOTING_CERTIFICATION_CERTIFIED,
VOTING_CERTIFICATION_IN_EVALUATION,
VotingCapabilityError,
VotingProviderAssuranceDeclaration,
VotingResult,
require_voting_provider_assurance,
)
def result_with_evidence(*evidence):
@@ -23,7 +31,64 @@ def result_with_evidence(*evidence):
)
class FakeProvider:
def __init__(self, declaration: VotingProviderAssuranceDeclaration) -> None:
self.declaration = declaration
def assurance_declaration(self) -> VotingProviderAssuranceDeclaration:
return self.declaration
def finalize_ballot(self, session, principal, *, request):
raise NotImplementedError
class VotingContractTests(unittest.TestCase):
def test_external_certification_requires_current_evidence_backed_claim(self) -> None:
now = datetime.now(UTC)
declaration = VotingProviderAssuranceDeclaration(
provider_id="certified_provider",
implementation_ref="certified-provider/adapter@1",
supported_assurance_profiles=("external_certified",),
certification_state=VOTING_CERTIFICATION_CERTIFIED,
protocol_ref="vendor:certified-ballot",
protocol_version="3.0",
certification_authority="Independent authority",
certification_reference="certificate-2026-1",
certification_evidence_ref="evidence://certificate-2026-1",
certification_valid_from=now - timedelta(days=1),
certification_valid_until=now + timedelta(days=1),
)
selected = require_voting_provider_assurance(
FakeProvider(declaration),
provider_id="certified_provider",
assurance_profile="external_certified",
at=now,
)
self.assertEqual("certificate-2026-1", selected.certification_reference)
self.assertEqual(
(now - timedelta(days=1)).isoformat(),
selected.to_dict()["certification_valid_from"],
)
def test_external_certification_rejects_evaluation_only_provider(self) -> None:
declaration = VotingProviderAssuranceDeclaration(
provider_id="candidate_provider",
implementation_ref="candidate-provider/adapter@1",
supported_assurance_profiles=("external_certified",),
certification_state=VOTING_CERTIFICATION_IN_EVALUATION,
protocol_ref="vendor:candidate-ballot",
protocol_version="1.0",
)
with self.assertRaisesRegex(VotingCapabilityError, "currently valid"):
require_voting_provider_assurance(
FakeProvider(declaration),
provider_id="candidate_provider",
assurance_profile="external_certified",
)
def test_accepts_sanitized_provider_evidence(self) -> None:
value = result_with_evidence(
{