From 65bda8c969e4a14ee7d095b540f3d736de95c2a9 Mon Sep 17 00:00:00 2001 From: Mel <97147377+MelissaAutumn@users.noreply.github.com> Date: Fri, 10 May 2024 10:15:23 -0700 Subject: [PATCH] Additional zoom account fixes (#401) * Remove Zoom as a meeting link provider if they disconnect their zoom account * Hide the video link text field if they want zoom meeting links generated --- backend/src/appointment/routes/zoom.py | 8 ++- backend/test/factory/schedule_factory.py | 3 +- backend/test/integration/test_zoom.py | 62 ++++++++++++++++++++ frontend/src/components/ScheduleCreation.vue | 1 + 4 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 backend/test/integration/test_zoom.py diff --git a/backend/src/appointment/routes/zoom.py b/backend/src/appointment/routes/zoom.py index f9e448a2d..6dd2c9d23 100644 --- a/backend/src/appointment/routes/zoom.py +++ b/backend/src/appointment/routes/zoom.py @@ -7,7 +7,7 @@ from ..controller.apis.zoom_client import ZoomClient from ..controller.auth import sign_url -from ..database import repo, schemas +from ..database import repo, schemas, models from ..database.models import Subscriber, ExternalConnectionType from ..dependencies.auth import get_subscriber from ..dependencies.database import get_db @@ -85,6 +85,12 @@ def disconnect_account( if zoom_connection: repo.external_connection.delete_by_type(db, subscriber.id, zoom_connection.type, zoom_connection.type_id) + schedules = repo.schedule.get_by_subscriber(db, subscriber.id) + for schedule in schedules: + if schedule.meeting_link_provider == models.MeetingLinkProviderType.zoom: + schedule.meeting_link_provider = models.MeetingLinkProviderType.none + db.add(schedule) + db.commit() else: return False diff --git a/backend/test/factory/schedule_factory.py b/backend/test/factory/schedule_factory.py index d6c7bf870..c53579133 100644 --- a/backend/test/factory/schedule_factory.py +++ b/backend/test/factory/schedule_factory.py @@ -22,6 +22,7 @@ def _make_schedule(calendar_id=FAKER_RANDOM_VALUE, farthest_booking=FAKER_RANDOM_VALUE, weekdays=[1,2,3,4,5], slot_duration=FAKER_RANDOM_VALUE, + meeting_link_provider=models.MeetingLinkProviderType.none, ): with with_db() as db: return repo.schedule.create(db, schemas.ScheduleBase( @@ -39,7 +40,7 @@ def _make_schedule(calendar_id=FAKER_RANDOM_VALUE, farthest_booking=farthest_booking if factory_has_value(farthest_booking) else fake.pyint(15, 60), weekdays=weekdays, slot_duration=slot_duration if factory_has_value(slot_duration) else fake.pyint(15, 60), - meeting_link_provider=models.MeetingLinkProviderType.none, + meeting_link_provider=meeting_link_provider, calendar_id=calendar_id if factory_has_value(calendar_id) else make_caldav_calendar(connected=True).id )) diff --git a/backend/test/integration/test_zoom.py b/backend/test/integration/test_zoom.py new file mode 100644 index 000000000..d73bb0fe4 --- /dev/null +++ b/backend/test/integration/test_zoom.py @@ -0,0 +1,62 @@ + +from appointment.database import models +from defines import auth_headers, TEST_USER_ID + + +class TestZoom: + def test_zoom_disconnect_without_connection(self, with_client): + response = with_client.post( + "/zoom/disconnect", + headers=auth_headers) + assert response.status_code == 200 + assert response.json() is False + + def test_zoom_disconnect_with_connection(self, with_client, make_external_connections): + make_external_connections(TEST_USER_ID, type=models.ExternalConnectionType.zoom) + + response = with_client.post( + "/zoom/disconnect", + headers=auth_headers) + assert response.status_code == 200 + assert response.json() is True + + def test_zoom_disconnect_updates_schedule(self, with_db, with_client, make_schedule, make_external_connections): + make_external_connections(TEST_USER_ID, type=models.ExternalConnectionType.zoom) + schedule = make_schedule(meeting_link_provider=models.MeetingLinkProviderType.zoom) + + assert schedule.meeting_link_provider == models.MeetingLinkProviderType.zoom + + response = with_client.post( + "/zoom/disconnect", + headers=auth_headers) + assert response.status_code == 200 + assert response.json() is True + + # Refresh the schedule now that the zoom account is gone, + # and our meeting link provider should be none + with with_db() as db: + db.add(schedule) + db.refresh(schedule) + + assert schedule.meeting_link_provider == models.MeetingLinkProviderType.none + + def test_zoom_disconnect_does_not_update_schedule_for_other_types(self, with_db, with_client, make_schedule, + make_external_connections): + make_external_connections(TEST_USER_ID, type=models.ExternalConnectionType.zoom) + schedule = make_schedule(meeting_link_provider=models.MeetingLinkProviderType.google_meet) + + assert schedule.meeting_link_provider == models.MeetingLinkProviderType.google_meet + + response = with_client.post( + "/zoom/disconnect", + headers=auth_headers) + assert response.status_code == 200 + assert response.json() is True + + # Refresh the schedule now that the zoom account is gone, + # and our meeting link provider should still be google meet + with with_db() as db: + db.add(schedule) + db.refresh(schedule) + + assert schedule.meeting_link_provider == models.MeetingLinkProviderType.google_meet diff --git a/frontend/src/components/ScheduleCreation.vue b/frontend/src/components/ScheduleCreation.vue index 763c70bf9..7a3aa0311 100644 --- a/frontend/src/components/ScheduleCreation.vue +++ b/frontend/src/components/ScheduleCreation.vue @@ -243,6 +243,7 @@