feat(poll): expose the scheduling provider

This commit is contained in:
2026-07-20 17:34:03 +02:00
parent e7f3b1d7bf
commit f4d5cac40d
3 changed files with 308 additions and 2 deletions

View File

@@ -1,11 +1,14 @@
from __future__ import annotations
import unittest
from datetime import datetime, timezone
from sqlalchemy import create_engine
from sqlalchemy.orm import Session, sessionmaker
from govoplan_core.db.base import Base
from govoplan_core.core.poll import PollResponseRef, PollResponseSubmissionProvider, PollSchedulingProvider
from govoplan_poll.backend.capabilities import SqlPollSchedulingProvider
from govoplan_poll.backend.db.models import Poll, PollInvitation, PollOption, PollResponse
from govoplan_poll.backend.schemas import (
PollAnswerInput,
@@ -43,6 +46,15 @@ class PollServiceTests(unittest.TestCase):
)
self.engine.dispose()
def test_response_projection_and_submission_extension_are_backward_compatible(self) -> None:
submitted_at = datetime(2026, 7, 20, tzinfo=timezone.utc)
legacy_ref = PollResponseRef(None, submitted_at)
provider = SqlPollSchedulingProvider()
self.assertIsNone(legacy_ref.respondent_id)
self.assertIsInstance(provider, PollSchedulingProvider)
self.assertIsInstance(provider, PollResponseSubmissionProvider)
def test_single_choice_response_can_update_existing_respondent(self) -> None:
poll = create_poll(
self.session,
@@ -66,13 +78,24 @@ class PollServiceTests(unittest.TestCase):
self.session,
tenant_id="tenant-1",
poll_id=poll.id,
payload=PollSubmitResponseRequest(respondent_id="person-1", answers=[PollAnswerInput(option_key="b")]),
payload=PollSubmitResponseRequest(
respondent_id="person-1",
answers=[PollAnswerInput(option_key="b")],
metadata={"invitation_id": 42},
),
)
summary = poll_result_summary_by_id(self.session, tenant_id="tenant-1", poll_id=poll.id)
self.assertEqual(first.id, second.id)
self.assertEqual(summary["response_count"], 1)
self.assertEqual(summary["leading_option_ids"], [second.answers[0]["option_id"]])
response_ref = SqlPollSchedulingProvider().list_responses(
self.session,
tenant_id="tenant-1",
poll_id=poll.id,
)[0]
self.assertIsNone(response_ref.invitation_id)
self.assertEqual(response_ref.respondent_id, "person-1")
def test_anonymous_response_requires_poll_policy(self) -> None:
poll = create_poll(
@@ -267,13 +290,24 @@ class PollServiceTests(unittest.TestCase):
response = submit_poll_response_with_token(
self.session,
token=token,
payload=PollSubmitResponseRequest(answers=[PollAnswerInput(option_key="yes")]),
payload=PollSubmitResponseRequest(
answers=[PollAnswerInput(option_key="yes")],
metadata={"invitation_id": "forged-invitation", "client_note": "kept"},
),
)
self.assertEqual(response.respondent_id, f"invitation:{invitation.id}")
self.assertEqual(response.respondent_label, "External participant")
self.assertEqual(response.metadata_["invitation_id"], invitation.id)
self.assertEqual(response.metadata_["client_note"], "kept")
self.assertIsNotNone(invitation.last_used_at)
response_ref = SqlPollSchedulingProvider().list_responses(
self.session,
tenant_id="tenant-1",
poll_id=poll.id,
)[0]
self.assertEqual(response_ref.invitation_id, invitation.id)
self.assertEqual(response_ref.respondent_id, f"invitation:{invitation.id}")
if __name__ == "__main__":