mirror of
				https://github.com/ae-utbm/sith.git
				synced 2025-11-04 02:53:06 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			193 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import json
 | 
						|
 | 
						|
from django.conf import settings
 | 
						|
from django.test import TestCase
 | 
						|
from django.test.testcases import call_command
 | 
						|
from django.urls import reverse
 | 
						|
from model_bakery import baker
 | 
						|
from model_bakery.recipe import Recipe
 | 
						|
 | 
						|
from core.baker_recipes import subscriber_user
 | 
						|
from core.models import Group, User
 | 
						|
from pedagogy.models import UV
 | 
						|
 | 
						|
 | 
						|
class TestUVSearch(TestCase):
 | 
						|
    """Test UV guide rights for view and API."""
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def setUpTestData(cls):
 | 
						|
        cls.root = User.objects.get(username="root")
 | 
						|
        cls.url = reverse("api:fetch_uvs")
 | 
						|
        uv_recipe = Recipe(UV, author=cls.root)
 | 
						|
        uvs = [
 | 
						|
            uv_recipe.prepare(
 | 
						|
                code="AP4A",
 | 
						|
                credit_type="CS",
 | 
						|
                semester="AUTUMN",
 | 
						|
                department="GI",
 | 
						|
                manager="francky",
 | 
						|
                title=(
 | 
						|
                    "Programmation Orientée Objet: "
 | 
						|
                    "Concepts fondamentaux et mise en pratique avec le langage C++"
 | 
						|
                ),
 | 
						|
            ),
 | 
						|
            uv_recipe.prepare(
 | 
						|
                code="MT01",
 | 
						|
                credit_type="CS",
 | 
						|
                semester="AUTUMN",
 | 
						|
                department="TC",
 | 
						|
                manager="ben",
 | 
						|
                title="Intégration1. Algèbre linéaire - Fonctions de deux variables",
 | 
						|
            ),
 | 
						|
            uv_recipe.prepare(
 | 
						|
                code="PHYS11", credit_type="CS", semester="AUTUMN", department="TC"
 | 
						|
            ),
 | 
						|
            uv_recipe.prepare(
 | 
						|
                code="TNEV",
 | 
						|
                credit_type="TM",
 | 
						|
                semester="SPRING",
 | 
						|
                department="TC",
 | 
						|
                manager="moss",
 | 
						|
                title="tnetennba",
 | 
						|
            ),
 | 
						|
            uv_recipe.prepare(
 | 
						|
                code="MT10", credit_type="TM", semester="AUTUMN", department="IMSI"
 | 
						|
            ),
 | 
						|
            uv_recipe.prepare(
 | 
						|
                code="DA50",
 | 
						|
                credit_type="TM",
 | 
						|
                semester="AUTUMN_AND_SPRING",
 | 
						|
                department="GI",
 | 
						|
                manager="francky",
 | 
						|
            ),
 | 
						|
        ]
 | 
						|
        UV.objects.bulk_create(uvs)
 | 
						|
        call_command("update_index")
 | 
						|
 | 
						|
    def test_permissions(self):
 | 
						|
        # Test with anonymous user
 | 
						|
        response = self.client.get(self.url)
 | 
						|
        assert response.status_code == 401
 | 
						|
 | 
						|
        # Test with not subscribed user
 | 
						|
        self.client.force_login(baker.make(User))
 | 
						|
        response = self.client.get(self.url)
 | 
						|
        assert response.status_code == 403
 | 
						|
 | 
						|
        for user in (
 | 
						|
            self.root,
 | 
						|
            subscriber_user.make(),
 | 
						|
            baker.make(
 | 
						|
                User,
 | 
						|
                groups=[Group.objects.get(pk=settings.SITH_GROUP_PEDAGOGY_ADMIN_ID)],
 | 
						|
            ),
 | 
						|
        ):
 | 
						|
            # users that have right
 | 
						|
            with self.subTest():
 | 
						|
                self.client.force_login(user)
 | 
						|
                response = self.client.get(self.url)
 | 
						|
                assert response.status_code == 200
 | 
						|
 | 
						|
    def test_format(self):
 | 
						|
        """Test that the return data format is correct"""
 | 
						|
        self.client.force_login(self.root)
 | 
						|
        res = self.client.get(self.url + "?search=PA00")
 | 
						|
        uv = UV.objects.get(code="PA00")
 | 
						|
        assert res.status_code == 200
 | 
						|
        assert json.loads(res.content) == {
 | 
						|
            "count": 1,
 | 
						|
            "next": None,
 | 
						|
            "previous": None,
 | 
						|
            "results": [
 | 
						|
                {
 | 
						|
                    "id": uv.id,
 | 
						|
                    "title": uv.title,
 | 
						|
                    "code": uv.code,
 | 
						|
                    "credit_type": uv.credit_type,
 | 
						|
                    "semester": uv.semester,
 | 
						|
                    "department": uv.department,
 | 
						|
                }
 | 
						|
            ],
 | 
						|
        }
 | 
						|
 | 
						|
    def test_search_by_text(self):
 | 
						|
        self.client.force_login(self.root)
 | 
						|
        for query, expected in (
 | 
						|
            # UV code search case insensitive
 | 
						|
            ("m", {"MT01", "MT10"}),
 | 
						|
            ("M", {"MT01", "MT10"}),
 | 
						|
            ("mt", {"MT01", "MT10"}),
 | 
						|
            ("MT", {"MT01", "MT10"}),
 | 
						|
            ("algèbre", {"MT01"}),  # Title search case insensitive
 | 
						|
            # Manager search
 | 
						|
            ("moss", {"TNEV"}),
 | 
						|
            ("francky", {"DA50", "AP4A"}),
 | 
						|
        ):
 | 
						|
            res = self.client.get(self.url + f"?search={query}")
 | 
						|
            assert res.status_code == 200
 | 
						|
            assert {uv["code"] for uv in json.loads(res.content)["results"]} == expected
 | 
						|
 | 
						|
    def test_search_by_credit_type(self):
 | 
						|
        self.client.force_login(self.root)
 | 
						|
        res = self.client.get(self.url + "?credit_type=CS")
 | 
						|
        assert res.status_code == 200
 | 
						|
        codes = [uv["code"] for uv in json.loads(res.content)["results"]]
 | 
						|
        assert codes == ["AP4A", "MT01", "PHYS11"]
 | 
						|
        res = self.client.get(self.url + "?credit_type=CS&credit_type=OM")
 | 
						|
        assert res.status_code == 200
 | 
						|
        codes = {uv["code"] for uv in json.loads(res.content)["results"]}
 | 
						|
        assert codes == {"AP4A", "MT01", "PHYS11", "PA00"}
 | 
						|
 | 
						|
    def test_search_by_semester(self):
 | 
						|
        self.client.force_login(self.root)
 | 
						|
        res = self.client.get(self.url + "?semester=SPRING")
 | 
						|
        assert res.status_code == 200
 | 
						|
        codes = {uv["code"] for uv in json.loads(res.content)["results"]}
 | 
						|
        assert codes == {"DA50", "TNEV", "PA00"}
 | 
						|
 | 
						|
    def test_search_multiple_filters(self):
 | 
						|
        self.client.force_login(self.root)
 | 
						|
        res = self.client.get(
 | 
						|
            self.url + "?semester=AUTUMN&credit_type=CS&department=TC"
 | 
						|
        )
 | 
						|
        assert res.status_code == 200
 | 
						|
        codes = {uv["code"] for uv in json.loads(res.content)["results"]}
 | 
						|
        assert codes == {"MT01", "PHYS11"}
 | 
						|
 | 
						|
    def test_search_fails(self):
 | 
						|
        self.client.force_login(self.root)
 | 
						|
        res = self.client.get(self.url + "?credit_type=CS&search=DA")
 | 
						|
        assert res.status_code == 200
 | 
						|
        assert json.loads(res.content)["results"] == []
 | 
						|
 | 
						|
    def test_search_pa00_fail(self):
 | 
						|
        self.client.force_login(self.root)
 | 
						|
        # Search with UV code
 | 
						|
        response = self.client.get(reverse("pedagogy:guide"), {"search": "IFC"})
 | 
						|
        self.assertNotContains(response, text="PA00")
 | 
						|
 | 
						|
        # Search with first letter of UV code
 | 
						|
        response = self.client.get(reverse("pedagogy:guide"), {"search": "I"})
 | 
						|
        self.assertNotContains(response, text="PA00")
 | 
						|
 | 
						|
        # Search with UV manager
 | 
						|
        response = self.client.get(reverse("pedagogy:guide"), {"search": "GILLES"})
 | 
						|
        self.assertNotContains(response, text="PA00")
 | 
						|
 | 
						|
        # Search with department
 | 
						|
        response = self.client.get(reverse("pedagogy:guide"), {"department": "TC"})
 | 
						|
        self.assertNotContains(response, text="PA00")
 | 
						|
 | 
						|
        # Search with semester
 | 
						|
        response = self.client.get(reverse("pedagogy:guide"), {"semester": "CLOSED"})
 | 
						|
        self.assertNotContains(response, text="PA00")
 | 
						|
 | 
						|
        # Search with language
 | 
						|
        response = self.client.get(reverse("pedagogy:guide"), {"language": "EN"})
 | 
						|
        self.assertNotContains(response, text="PA00")
 | 
						|
 | 
						|
        # Search with credit type
 | 
						|
        response = self.client.get(reverse("pedagogy:guide"), {"credit_type": "TM"})
 | 
						|
        self.assertNotContains(response, text="PA00")
 |