mirror of
				https://gitlab.com/animath/si/plateforme-corres2math.git
				synced 2025-11-04 07:02:15 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			232 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from django.contrib.auth.models import User
 | 
						|
from django.test import TestCase
 | 
						|
from django.urls import reverse
 | 
						|
from registration.models import StudentRegistration
 | 
						|
 | 
						|
from .models import Team
 | 
						|
 | 
						|
 | 
						|
class TestStudentParticipation(TestCase):
 | 
						|
    def setUp(self) -> None:
 | 
						|
        self.user = User.objects.create(
 | 
						|
            first_name="Toto",
 | 
						|
            last_name="Toto",
 | 
						|
            email="toto@example.com",
 | 
						|
            password="toto",
 | 
						|
        )
 | 
						|
        StudentRegistration.objects.create(
 | 
						|
            user=self.user,
 | 
						|
            student_class=12,
 | 
						|
            school="Earth",
 | 
						|
            give_contact_to_animath=True,
 | 
						|
            email_confirmed=True,
 | 
						|
        )
 | 
						|
        self.team = Team.objects.create(
 | 
						|
            name="Super team",
 | 
						|
            trigram="AAA",
 | 
						|
            access_code="azerty",
 | 
						|
            grant_animath_access_videos=True,
 | 
						|
        )
 | 
						|
        self.client.force_login(self.user)
 | 
						|
 | 
						|
        # TODO Remove these lines
 | 
						|
        str(self.team)
 | 
						|
        str(self.team.participation)
 | 
						|
 | 
						|
    def test_create_team(self):
 | 
						|
        """
 | 
						|
        Try to create a team.
 | 
						|
        """
 | 
						|
        response = self.client.get(reverse("participation:create_team"))
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
 | 
						|
        response = self.client.post(reverse("participation:create_team"), data=dict(
 | 
						|
            name="Test team",
 | 
						|
            trigram="123",
 | 
						|
            grant_animath_access_videos=False,
 | 
						|
        ))
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
 | 
						|
        response = self.client.post(reverse("participation:create_team"), data=dict(
 | 
						|
            name="Test team",
 | 
						|
            trigram="TES",
 | 
						|
            grant_animath_access_videos=False,
 | 
						|
        ))
 | 
						|
        self.assertTrue(Team.objects.filter(trigram="TES").exists())
 | 
						|
        team = Team.objects.get(trigram="TES")
 | 
						|
        self.assertRedirects(response, reverse("participation:team_detail", args=(team.pk,)), 302, 200)
 | 
						|
 | 
						|
        # Already in a team
 | 
						|
        response = self.client.post(reverse("participation:create_team"), data=dict(
 | 
						|
            name="Test team 2",
 | 
						|
            trigram="TET",
 | 
						|
            grant_animath_access_videos=False,
 | 
						|
        ))
 | 
						|
 | 
						|
    def test_join_team(self):
 | 
						|
        """
 | 
						|
        Try to join an existing team.
 | 
						|
        """
 | 
						|
        response = self.client.get(reverse("participation:join_team"))
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
 | 
						|
        team = Team.objects.create(name="Test", trigram="TES")
 | 
						|
 | 
						|
        response = self.client.post(reverse("participation:join_team"), data=dict(
 | 
						|
            access_code="éééééé",
 | 
						|
        ))
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
 | 
						|
        response = self.client.post(reverse("participation:join_team"), data=dict(
 | 
						|
            access_code=team.access_code,
 | 
						|
        ))
 | 
						|
        self.assertRedirects(response, reverse("participation:team_detail", args=(team.pk,)), 302, 200)
 | 
						|
        self.assertTrue(Team.objects.filter(trigram="TES").exists())
 | 
						|
 | 
						|
        # Already joined
 | 
						|
        response = self.client.post(reverse("participation:join_team"), data=dict(
 | 
						|
            access_code=team.access_code,
 | 
						|
        ))
 | 
						|
        self.assertEqual(response.status_code, 403)
 | 
						|
 | 
						|
    def test_no_myteam_redirect_noteam(self):
 | 
						|
        """
 | 
						|
        Test redirection.
 | 
						|
        """
 | 
						|
        response = self.client.get(reverse("participation:my_team_detail"))
 | 
						|
        self.assertTrue(response.status_code, 200)
 | 
						|
 | 
						|
    def test_team_detail(self):
 | 
						|
        """
 | 
						|
        Try to display the information of a team.
 | 
						|
        """
 | 
						|
        self.user.registration.team = self.team
 | 
						|
        self.user.registration.save()
 | 
						|
 | 
						|
        response = self.client.get(reverse("participation:my_team_detail"))
 | 
						|
        self.assertRedirects(response, reverse("participation:team_detail", args=(self.team.pk,)), 302, 200)
 | 
						|
 | 
						|
        response = self.client.get(reverse("participation:team_detail", args=(self.team.pk,)))
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
 | 
						|
    def test_update_team(self):
 | 
						|
        """
 | 
						|
        Try to update team information.
 | 
						|
        """
 | 
						|
        self.user.registration.team = self.team
 | 
						|
        self.user.registration.save()
 | 
						|
 | 
						|
        response = self.client.get(reverse("participation:update_team", args=(self.team.pk,)))
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
 | 
						|
        # Form is invalid
 | 
						|
        response = self.client.post(reverse("participation:update_team", args=(self.team.pk,)), data=dict(
 | 
						|
            name="Updated team name",
 | 
						|
            trigram="BBB",
 | 
						|
            grant_animath_access_videos=True,
 | 
						|
            problem=42,
 | 
						|
        ))
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
 | 
						|
        response = self.client.post(reverse("participation:update_team", args=(self.team.pk,)), data=dict(
 | 
						|
            name="Updated team name",
 | 
						|
            trigram="BBB",
 | 
						|
            grant_animath_access_videos=True,
 | 
						|
            problem=3,
 | 
						|
        ))
 | 
						|
        self.assertRedirects(response, reverse("participation:team_detail", args=(self.team.pk,)), 302, 200)
 | 
						|
        self.assertTrue(Team.objects.filter(trigram="BBB", participation__problem=3).exists())
 | 
						|
 | 
						|
    def test_no_myparticipation_redirect_nomyparticipation(self):
 | 
						|
        """
 | 
						|
        Ensure a permission denied when we search my team participation when we are in no team.
 | 
						|
        """
 | 
						|
        response = self.client.get(reverse("participation:my_participation_detail"))
 | 
						|
        self.assertEqual(response.status_code, 403)
 | 
						|
 | 
						|
    def test_participation_detail(self):
 | 
						|
        """
 | 
						|
        Try to display the detail of a team participation.
 | 
						|
        """
 | 
						|
        self.user.registration.team = self.team
 | 
						|
        self.user.registration.save()
 | 
						|
 | 
						|
        response = self.client.get(reverse("participation:my_participation_detail"))
 | 
						|
        self.assertRedirects(response,
 | 
						|
                             reverse("participation:participation_detail", args=(self.team.participation.pk,)),
 | 
						|
                             302, 403)
 | 
						|
 | 
						|
        self.team.participation.valid = True
 | 
						|
        self.team.participation.save()
 | 
						|
        response = self.client.get(reverse("participation:my_participation_detail"))
 | 
						|
        self.assertRedirects(response,
 | 
						|
                             reverse("participation:participation_detail", args=(self.team.participation.pk,)),
 | 
						|
                             302, 200)
 | 
						|
 | 
						|
        response = self.client.get(reverse("participation:participation_detail", args=(self.team.participation.pk,)))
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
 | 
						|
    def test_upload_video(self):
 | 
						|
        """
 | 
						|
        Try to send a solution video link.
 | 
						|
        """
 | 
						|
        self.user.registration.team = self.team
 | 
						|
        self.user.registration.save()
 | 
						|
 | 
						|
        self.team.participation.valid = True
 | 
						|
        self.team.participation.save()
 | 
						|
 | 
						|
        response = self.client.get(reverse("participation:upload_video", args=(self.team.participation.solution.pk,)))
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
 | 
						|
        response = self.client.post(reverse("participation:upload_video", args=(self.team.participation.solution.pk,)),
 | 
						|
                                    data=dict(link="https://youtube.com/watch?v=73nsrixx7eI"))
 | 
						|
        self.assertRedirects(response,
 | 
						|
                             reverse("participation:participation_detail", args=(self.team.participation.id,)),
 | 
						|
                             302, 200)
 | 
						|
        self.team.participation.refresh_from_db()
 | 
						|
        self.assertEqual(self.team.participation.solution.platform, "youtube")
 | 
						|
        self.assertEqual(self.team.participation.solution.youtube_code, "73nsrixx7eI")
 | 
						|
 | 
						|
        response = self.client.get(reverse("participation:participation_detail", args=(self.team.participation.pk,)))
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
 | 
						|
 | 
						|
class TestAdminForbidden(TestCase):
 | 
						|
    def setUp(self) -> None:
 | 
						|
        self.user = User.objects.create_superuser(
 | 
						|
            username="admin@example.com",
 | 
						|
            email="admin@example.com",
 | 
						|
            password="admin",
 | 
						|
        )
 | 
						|
        self.client.force_login(self.user)
 | 
						|
 | 
						|
    def test_create_team_forbidden(self):
 | 
						|
        """
 | 
						|
        Ensure that an admin can't create a team.
 | 
						|
        """
 | 
						|
        response = self.client.post(reverse("participation:create_team"), data=dict(
 | 
						|
            name="Test team",
 | 
						|
            trigram="TES",
 | 
						|
            grant_animath_access_videos=False,
 | 
						|
        ))
 | 
						|
        self.assertEqual(response.status_code, 403)
 | 
						|
 | 
						|
    def test_join_team_forbidden(self):
 | 
						|
        """
 | 
						|
        Ensure that an admin can't join a team.
 | 
						|
        """
 | 
						|
        team = Team.objects.create(name="Test", trigram="TES")
 | 
						|
 | 
						|
        response = self.client.post(reverse("participation:join_team"), data=dict(
 | 
						|
            access_code=team.access_code,
 | 
						|
        ))
 | 
						|
        self.assertTrue(response.status_code, 403)
 | 
						|
 | 
						|
    def test_my_team_forbidden(self):
 | 
						|
        """
 | 
						|
        Ensure that an admin can't access to "My team".
 | 
						|
        """
 | 
						|
        response = self.client.get(reverse("participation:my_team_detail"))
 | 
						|
        self.assertEqual(response.status_code, 403)
 |