diff --git a/src/dailyai/services/daily_transport_service.py b/src/dailyai/services/daily_transport_service.py index e3dd5abde..828067353 100644 --- a/src/dailyai/services/daily_transport_service.py +++ b/src/dailyai/services/daily_transport_service.py @@ -2,14 +2,13 @@ import asyncio import inspect import itertools import logging -import sys import threading import time import types from functools import partial from queue import Queue, Empty -from typing import AsyncGenerator, Iterable +from typing import AsyncGenerator from dailyai.queue_frame import ( AudioQueueFrame, diff --git a/src/dailyai/tests/test_ai_services.py b/src/dailyai/tests/test_ai_services.py index 28423515b..88a1b50a0 100644 --- a/src/dailyai/tests/test_ai_services.py +++ b/src/dailyai/tests/test_ai_services.py @@ -1,4 +1,3 @@ -from re import A import unittest from typing import AsyncGenerator, Generator diff --git a/src/dailyai/tests/test_daily_transport_service.py b/src/dailyai/tests/test_daily_transport_service.py new file mode 100644 index 000000000..47ad6ac37 --- /dev/null +++ b/src/dailyai/tests/test_daily_transport_service.py @@ -0,0 +1,76 @@ +import asyncio +import unittest + +from unittest.mock import MagicMock, patch + +from dailyai.queue_frame import AudioQueueFrame, ImageQueueFrame + + +class TestDailyTransport(unittest.IsolatedAsyncioTestCase): + + async def test_event_handler(self): + from dailyai.services.daily_transport_service import DailyTransportService + + transport = DailyTransportService("mock.daily.co/mock", "token", "bot") + + was_called = False + + @transport.event_handler("on_first_other_participant_joined") + def test_event_handler(transport): + nonlocal was_called + was_called = True + + transport.on_first_other_participant_joined() + + self.assertTrue(was_called) + + async def test_event_handler_async(self): + from dailyai.services.daily_transport_service import DailyTransportService + + transport = DailyTransportService("mock.daily.co/mock", "token", "bot") + + event = asyncio.Event() + + @transport.event_handler("on_first_other_participant_joined") + async def test_event_handler(transport): + nonlocal event + await asyncio.sleep(0.1) + event.set() + + transport.on_first_other_participant_joined() + + await asyncio.wait_for(event.wait(), timeout=1) + self.assertTrue(event.is_set()) + + @patch("dailyai.services.daily_transport_service.CallClient") + @patch("dailyai.services.daily_transport_service.Daily") + async def test_run_with_camera_and_mic(self, daily_mock, callclient_mock): + from dailyai.services.daily_transport_service import DailyTransportService + transport = DailyTransportService("https://mock.daily.co/mock", "token", "bot", 0.01) + transport.mic_enabled = True + transport.camera_enabled = True + + mic = MagicMock() + camera = MagicMock() + daily_mock.create_microphone_device.return_value = mic + daily_mock.create_camera_device.return_value = camera + + async def send_audio_frame(): + await transport.send_queue.put(AudioQueueFrame(bytes([0] * 3300))) + + async def send_video_frame(): + await transport.send_queue.put(ImageQueueFrame(None, b"test")) + + await asyncio.gather(transport.run(), send_audio_frame(), send_video_frame()) + + daily_mock.init.assert_called_once_with() + daily_mock.create_microphone_device.assert_called_once() + daily_mock.create_camera_device.assert_called_once() + + callclient_mock.return_value.set_user_name.assert_called_once_with("bot") + callclient_mock.return_value.join.assert_called_once_with( + "https://mock.daily.co/mock", "token", completion=transport.call_joined + ) + + camera.write_frame.assert_called_with(b"test") + mic.write_frames.assert_called()