From edb9198a590edebb14d3e15b4536e5ebbe5ae832 Mon Sep 17 00:00:00 2001 From: leo <260626284+cameledev@users.noreply.github.com> Date: Mon, 20 Jul 2026 16:33:53 +0200 Subject: [PATCH] wip --- .../service/test_recording_events.py | 20 +++++++++ .../tests/services/test_livekit_events.py | 45 +++++++++++++++++-- .../core/tests/test_models_recording.py | 2 + 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/src/backend/core/tests/recording/service/test_recording_events.py b/src/backend/core/tests/recording/service/test_recording_events.py index f878117f..91e562b9 100644 --- a/src/backend/core/tests/recording/service/test_recording_events.py +++ b/src/backend/core/tests/recording/service/test_recording_events.py @@ -9,6 +9,7 @@ from unittest import mock import pytest from core.factories import RecordingFactory +from core.models import RecordingStatusChoices from core.recording.services.recording_events import ( RecordingEventsError, RecordingEventsService, @@ -70,3 +71,22 @@ def test_handle_limit_reached_error(mock_notify, mode, notification_type, servic mock_notify.assert_called_once_with( room_name=str(recording.room.id), notification_data={"type": notification_type} ) + + +@pytest.mark.parametrize( + ("handler_name", "expected_status"), + ( + ("handle_aborted", RecordingStatusChoices.ABORTED), + ("handle_failed", RecordingStatusChoices.FAILED), + ), +) +def test_handle_unsuccessful_egress(handler_name, expected_status, service): + """Test unsuccessful egress handlers persist a final, unsuccessful status.""" + + recording = RecordingFactory(status="active") + getattr(service, handler_name)(recording) + + recording.refresh_from_db() + assert recording.status == expected_status + assert RecordingStatusChoices.is_final(recording.status) + assert RecordingStatusChoices.is_unsuccessful(recording.status) diff --git a/src/backend/core/tests/services/test_livekit_events.py b/src/backend/core/tests/services/test_livekit_events.py index 56d0e0e5..8891175d 100644 --- a/src/backend/core/tests/services/test_livekit_events.py +++ b/src/backend/core/tests/services/test_livekit_events.py @@ -101,7 +101,6 @@ def test_handle_egress_ended_success( ( (EgressStatus.EGRESS_ACTIVE, "started"), (EgressStatus.EGRESS_ENDING, "saving"), - (EgressStatus.EGRESS_ABORTED, "aborted"), ), ) @mock.patch("core.utils.update_room_metadata") @@ -126,6 +125,7 @@ def test_handle_egress_updated_success( "egress_status", ( EgressStatus.EGRESS_FAILED, + EgressStatus.EGRESS_ABORTED, EgressStatus.EGRESS_LIMIT_REACHED, ), ) @@ -420,8 +420,6 @@ def test_handle_egress_ended_does_not_finalize_when_webhooks_enabled( # noqa: P EgressStatus.EGRESS_STARTING, EgressStatus.EGRESS_ACTIVE, EgressStatus.EGRESS_ENDING, - EgressStatus.EGRESS_FAILED, - EgressStatus.EGRESS_ABORTED, ], ) @mock.patch("core.utils.update_room_metadata") @@ -442,6 +440,47 @@ def test_handle_egress_ended_does_not_save_on_wrong_status( assert recording.status == "active" +@pytest.mark.parametrize( + ("egress_status", "expected_status"), + ( + (EgressStatus.EGRESS_ABORTED, "aborted"), + (EgressStatus.EGRESS_FAILED, "failed"), + ), +) +@mock.patch( + "core.recording.services.recording_events.notification_service." + "notify_external_services" +) +@mock.patch("core.utils.update_room_metadata") +def test_handle_egress_ended_marks_unsuccessful_egress( # noqa: PLR0913 + mock_update_room_metadata, + mock_notify_external_services, + egress_status, + expected_status, + service, + settings, +): # pylint: disable=too-many-arguments,too-many-positional-arguments + """An aborted/failed egress moves an active recording to its terminal + unsuccessful status, and never notifies external services.""" + + settings.RECORDING_STORAGE_EVENT_ENABLE = False + + recording = RecordingFactory(worker_id="worker-1", status="active") + mock_data = mock.MagicMock() + mock_data.egress_info.egress_id = recording.worker_id + mock_data.egress_info.status = egress_status + + service._handle_egress_ended(mock_data) + + mock_notify_external_services.assert_not_called() + mock_update_room_metadata.assert_called_once_with( + str(recording.room.id), {}, ["recording_mode", "recording_status"] + ) + + recording.refresh_from_db() + assert recording.status == expected_status + + @pytest.mark.parametrize( "status", ["failed_to_start", "aborted", "failed_to_stop", "saved", "initiated"] ) diff --git a/src/backend/core/tests/test_models_recording.py b/src/backend/core/tests/test_models_recording.py index 4b6ec38d..212e4cce 100644 --- a/src/backend/core/tests/test_models_recording.py +++ b/src/backend/core/tests/test_models_recording.py @@ -160,6 +160,7 @@ def test_models_recording_is_savable_normal(): RecordingStatusChoices.FAILED_TO_STOP, RecordingStatusChoices.FAILED_TO_START, RecordingStatusChoices.ABORTED, + RecordingStatusChoices.FAILED, ], ) def test_models_recording_is_savable_error(status): @@ -282,6 +283,7 @@ def test_models_recording_is_saved_false_initiated(): RecordingStatusChoices.FAILED_TO_STOP, RecordingStatusChoices.FAILED_TO_START, RecordingStatusChoices.ABORTED, + RecordingStatusChoices.FAILED, ], ) def test_models_recording_is_saved_false_error_states(status):