indico-plugins/vc_zoom/tests/operation_test.py
2024-01-02 20:51:21 +01:00

136 lines
4.6 KiB
Python

# This file is part of the Indico plugins.
# Copyright (C) 2020 - 2024 CERN and ENEA
#
# The Indico plugins are free software; you can redistribute
# them and/or modify them under the terms of the MIT License;
# see the LICENSE file for more details.
import pytest
from indico.core.plugins import plugin_engine
from indico.modules.vc.models.vc_rooms import VCRoom, VCRoomEventAssociation, VCRoomLinkType, VCRoomStatus
from indico_vc_zoom.plugin import ZoomPlugin
@pytest.fixture
def zoom_plugin(app):
"""Return a callable which lets you create dummy Zoom room occurrences."""
plugin = ZoomPlugin(plugin_engine, app)
plugin.settings.set('email_domains', 'megacorp.xyz')
return plugin
@pytest.fixture
def create_meeting(create_user, dummy_event, db, zoom_plugin):
def _create_meeting(name='New Room'):
user_joe = create_user(1, email='don.orange@megacorp.xyz')
vc_room = VCRoom(
type='zoom',
status=VCRoomStatus.created,
name=name,
created_by_id=0,
data={
'description': 'something something',
'password': '1234',
'host': user_joe.identifier,
'meeting_type': 'meeting',
'mute_host_video': False,
'mute_audio': False,
'mute_participant_video': False,
'waiting_room': False
}
)
VCRoomEventAssociation(linked_event=dummy_event, vc_room=vc_room, link_type=VCRoomLinkType.event, data={})
db.session.flush()
zoom_plugin.create_room(vc_room, dummy_event)
return vc_room
return _create_meeting
@pytest.fixture
def zoom_api(create_user, mocker):
"""Mock some Zoom API endpoints."""
api_create_meeting = mocker.patch('indico_vc_zoom.plugin.ZoomIndicoClient.create_meeting')
api_create_meeting.return_value = {
'id': '12345abc',
'join_url': 'https://example.com/kitties',
'start_url': 'https://example.com/puppies',
'password': '1234',
'host_id': 'don.orange@megacorp.xyz',
'topic': 'New Room',
'agenda': 'something something',
'settings': {
'host_video': True,
'mute_upon_entry': False,
'participant_video': True,
'waiting_room': False
}
}
api_update_meeting = mocker.patch('indico_vc_zoom.plugin.ZoomIndicoClient.update_meeting')
api_update_meeting.return_value = {}
create_user(1, email='don.orange@megacorp.xyz')
api_get_user = mocker.patch('indico_vc_zoom.plugin.ZoomIndicoClient.get_user')
api_get_user.return_value = {
'id': '7890abcd',
'email': 'don.orange@megacorp.xyz'
}
api_get_meeting = mocker.patch('indico_vc_zoom.plugin.ZoomIndicoClient.get_meeting')
api_get_meeting.return_value = api_create_meeting.return_value
return {
'create_meeting': api_create_meeting,
'get_meeting': api_get_meeting,
'update_meeting': api_update_meeting,
'get_user': api_get_user
}
def test_room_creation(create_meeting, zoom_api):
vc_room = create_meeting()
assert vc_room.data['url'] == 'https://example.com/kitties'
assert vc_room.data['host'] == 'User:1'
assert zoom_api['create_meeting'].called
def test_password_change(create_user, mocker, create_meeting, zoom_plugin, zoom_api):
create_user(2, email='joe.bidon@megacorp.xyz')
vc_room = create_meeting()
vc_room.data['password'] = '1337'
# simulate changes between calls of "GET meeting"
def _get_meeting(self, meeting_id):
result = {
'id': meeting_id,
'join_url': 'https://example.com/llamas' if _get_meeting.called else 'https://example.com/kitties',
'start_url': 'https://example.com/puppies',
'password': '1337' if _get_meeting.called else '1234',
'host_id': 'don.orange@megacorp.xyz',
'topic': 'New Room',
'agenda': 'something something',
'settings': {
'host_video': True,
'mute_upon_entry': False,
'participant_video': True,
'waiting_room': False
}
}
_get_meeting.called = True
return result
_get_meeting.called = False
mocker.patch('indico_vc_zoom.plugin.ZoomIndicoClient.get_meeting', _get_meeting)
zoom_plugin.update_room(vc_room, vc_room.events[0].event)
zoom_api['update_meeting'].assert_called_with('12345abc', {
'password': '1337'
})
assert vc_room.data['password'] == '1337'
assert vc_room.data['url'] == 'https://example.com/llamas'