import hashlib import hmac import json import tempfile from django.core.files.uploadedfile import SimpleUploadedFile from django.test import override_settings from django.urls import reverse from django.utils import timezone from dj_language.models import Language from rest_framework import status from rest_framework.test import APITestCase from apps.account.models import ProfessorUser, StudentUser from apps.course.models import ( Course, CourseCategory, CourseLiveSession, LiveSessionUser, ) @override_settings( PLUGNMEET_API_SECRET='test-secret', MEDIA_ROOT=tempfile.gettempdir(), ) class PlugNMeetWebhookLiveSessionTests(APITestCase): def setUp(self): Language.objects.update_or_create( id=69, defaults={ 'name': 'English', 'code': 'en', 'status': True, 'countries': ['US'], }, ) self.professor = ProfessorUser.objects.create( email='webhook-prof@example.com', fullname='Webhook Professor', experience_years=8, ) self.student = StudentUser.objects.create( email='webhook-student@example.com', fullname='Webhook Student', ) self.category = CourseCategory.objects.create( name='Webhook Category', slug='webhook-category', ) thumbnail = SimpleUploadedFile( 'thumb.jpg', b'filecontent', content_type='image/jpeg', ) self.course = Course.objects.create( title='Webhook Course', slug='webhook-course', category=self.category, professor=self.professor, thumbnail=thumbnail, video_type=Course.VedioTypeChoices.YOUTUBE_LINK, video_link='https://example.com/video', is_online=True, online_link='https://example.com/live', level=Course.LevelChoices.BEGINNER, duration=10, lessons_count=1, description='Description', short_description='Short', status=Course.StatusChoices.ONGOING, is_free=True, ) self.session = CourseLiveSession.objects.create( course=self.course, room_id='room-16-1781160705', subject='Webhook Course Live Session', started_at=timezone.now(), ) LiveSessionUser.objects.create( session=self.session, user=self.student, role='participant', entered_at=timezone.now(), is_online=True, ) def _post_webhook(self, payload: dict): body = json.dumps(payload, ensure_ascii=False).encode('utf-8') signature = hmac.new( b'test-secret', body, hashlib.sha256, ).hexdigest() url = reverse('plugnmeet-webhook') return self.client.post( url, data=body, content_type='application/webhook+json', HTTP_HASH_TOKEN=signature, ) def test_room_finished_with_room_name_closes_live_session(self): response = self._post_webhook( { 'event': 'room_finished', 'room': { 'name': self.session.room_id, }, } ) self.assertEqual(response.status_code, status.HTTP_200_OK) self.session.refresh_from_db() self.assertIsNotNone(self.session.ended_at) self.assertFalse( LiveSessionUser.objects.get(session=self.session, user=self.student).is_online ) def test_session_ended_event_closes_live_session(self): second_session = CourseLiveSession.objects.create( course=self.course, room_id='room-16-1781160999', subject='Second Live Session', started_at=timezone.now(), ) response = self._post_webhook( { 'event': 'session_ended', 'room': { 'name': second_session.room_id, }, } ) self.assertEqual(response.status_code, status.HTTP_200_OK) second_session.refresh_from_db() self.assertIsNotNone(second_session.ended_at)