import os import pytest import django import json from asgiref.sync import sync_to_async from channels.testing import WebsocketCommunicator from channels.layers import get_channel_layer from channels.db import database_sync_to_async # 确保导入 from api.consumers import ClassroomConsumer from api.models import Students # 设置 Django 设置模块 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Rollcall_applet.settings') django.setup() @pytest.mark.django_db @database_sync_to_async def create_student(sid, name, score): return Students.objects.create(sid=sid, name=name, score=score) @pytest.mark.django_db @database_sync_to_async def get_student(sid): return Students.objects.get(sid=sid) @pytest.mark.django_db @database_sync_to_async def update_student_score(sid, new_score): student = Students.objects.get(sid=sid) student.score = new_score student.save() @pytest.mark.django_db @pytest.mark.asyncio async def test_pick_student(): # 创建一些学生 await create_student("1", "Student 1", 10) await create_student("2", "Student 2", 0) await create_student("3", "Student 3", -5) consumer = ClassroomConsumer() await consumer.connect() chosen_student = await consumer.pick_student() assert chosen_student is not None assert chosen_student.sid in ["1", "2", "3"] @pytest.mark.django_db @pytest.mark.asyncio async def test_exemption_card_used(): # 创建一个学生 student = await create_student("1", "Student 1", 10) consumer = ClassroomConsumer() await consumer.connect() # 模拟接收豁免卡使用信息 await consumer.receive(text_data=json.dumps({ 'action': 'use_exemption_card', 'studentId': student.sid, 'newScore': 20, 'studentName': student.name, })) updated_student = await get_student(student.sid) assert updated_student.score == 20 @pytest.mark.django_db @pytest.mark.asyncio async def test_send_student_message(): student = await create_student("2", "Student 2", 0) consumer = ClassroomConsumer() await consumer.connect() # 发送学生消息 await consumer.send_student_message(student) # 验证消息发送到学生组 channel_layer = get_channel_layer() message = await channel_layer.receive(consumer.student_group) assert message['type'] == 'student_message' assert message['message']['name'] == student.name assert message['message']['student_id'] == student.sid @pytest.mark.django_db @pytest.mark.asyncio async def test_update_student_score(): student = await create_student("3", "Student 3", -5) consumer = ClassroomConsumer() await consumer.connect() await update_student_score(student.sid, 30) updated_student = await get_student(student.sid) assert updated_student.score == 30