feat(scheduling): expose invitation delivery capability
This commit is contained in:
@@ -1548,6 +1548,102 @@ class SchedulingServiceTests(unittest.TestCase):
|
||||
serialized = repr({"payload": notification.payload, "metadata": notification.metadata_})
|
||||
self.assertTrue(all(token not in serialized for token in tokens))
|
||||
|
||||
def test_send_without_delivery_provider_preserves_existing_invitation(self) -> None:
|
||||
request, _automatic_tokens = create_scheduling_request(
|
||||
self.session,
|
||||
tenant_id="tenant-1",
|
||||
user_id="user-1",
|
||||
payload=self._payload().model_copy(
|
||||
update={"calendar": SchedulingCalendarPreferences()}
|
||||
),
|
||||
)
|
||||
participant = request.participants[0]
|
||||
token = self._issue_copy(request, participant)
|
||||
invitation_id = participant.poll_invitation_id
|
||||
|
||||
with (
|
||||
patch(
|
||||
"govoplan_scheduling.backend.service.notification_dispatch_provider",
|
||||
return_value=None,
|
||||
),
|
||||
self.assertRaisesRegex(
|
||||
SchedulingError,
|
||||
"Notification delivery is unavailable; copy the link instead",
|
||||
),
|
||||
):
|
||||
issue_scheduling_participant_invitation(
|
||||
self.session,
|
||||
tenant_id=request.tenant_id,
|
||||
request_id=request.id,
|
||||
participant_id=participant.id,
|
||||
action="send",
|
||||
)
|
||||
|
||||
self.assertEqual(participant.poll_invitation_id, invitation_id)
|
||||
invitation = self.session.query(PollInvitation).filter(
|
||||
PollInvitation.id == invitation_id
|
||||
).one()
|
||||
self.assertIsNone(invitation.revoked_at)
|
||||
self.assertEqual(
|
||||
get_public_scheduling_participation(
|
||||
self.session,
|
||||
request_id=request.id,
|
||||
token=token,
|
||||
payload=SchedulingPublicParticipationAccessRequest(),
|
||||
client_address="127.0.0.1",
|
||||
)["request_id"],
|
||||
request.id,
|
||||
)
|
||||
|
||||
def test_send_without_delivery_target_preserves_existing_invitation(self) -> None:
|
||||
request, _automatic_tokens = create_scheduling_request(
|
||||
self.session,
|
||||
tenant_id="tenant-1",
|
||||
user_id="user-1",
|
||||
payload=self._payload().model_copy(
|
||||
update={"calendar": SchedulingCalendarPreferences()}
|
||||
),
|
||||
)
|
||||
participant = request.participants[0]
|
||||
token = self._issue_copy(request, participant)
|
||||
invitation_id = participant.poll_invitation_id
|
||||
participant.email = None
|
||||
self.session.flush()
|
||||
|
||||
with (
|
||||
patch(
|
||||
"govoplan_scheduling.backend.service.notification_dispatch_provider",
|
||||
return_value=object(),
|
||||
),
|
||||
self.assertRaisesRegex(
|
||||
SchedulingError,
|
||||
"Participant has no deliverable email address or account",
|
||||
),
|
||||
):
|
||||
issue_scheduling_participant_invitation(
|
||||
self.session,
|
||||
tenant_id=request.tenant_id,
|
||||
request_id=request.id,
|
||||
participant_id=participant.id,
|
||||
action="send",
|
||||
)
|
||||
|
||||
self.assertEqual(participant.poll_invitation_id, invitation_id)
|
||||
invitation = self.session.query(PollInvitation).filter(
|
||||
PollInvitation.id == invitation_id
|
||||
).one()
|
||||
self.assertIsNone(invitation.revoked_at)
|
||||
self.assertEqual(
|
||||
get_public_scheduling_participation(
|
||||
self.session,
|
||||
request_id=request.id,
|
||||
token=token,
|
||||
payload=SchedulingPublicParticipationAccessRequest(),
|
||||
client_address="127.0.0.1",
|
||||
)["request_id"],
|
||||
request.id,
|
||||
)
|
||||
|
||||
def test_invitation_router_rotates_revokes_and_enforces_management_policy(self) -> None:
|
||||
request, automatic_tokens = create_scheduling_request(
|
||||
self.session,
|
||||
|
||||
Reference in New Issue
Block a user