feat(poll): expose the scheduling provider
This commit is contained in:
@@ -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__":
|
||||
|
||||
Reference in New Issue
Block a user