2 changed files with 156 additions and 4 deletions
@ -0,0 +1,139 @@ |
|||
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) |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue