from django.test import TestCase from django.urls import reverse import seminar.models as m import seminar.views as v from seminar.utils import sync_skoly from unittest import expectedFailure class OrgSkolyAutocompleteTestCase(TestCase): @classmethod def setUpClass(cls): super().setUpClass() sync_skoly('https://mam.mff.cuni.cz/') # Správné školy podle toho, co orgové poslali: (prefix, ID školy) # NOTE: Pozor, jedná se o databázové indexy. Pokud se to někdy rozbije, bude potřeba je přepsat nebo předělat na IZO cls.spravna_data = [ ('gymnázium kolín', 53), ('kolín', 53), #('gasoš', 96), ('Rokycany', 96), #('gasoš Rokycany', 96), #('SPŠE Pardubice', 815), ('Jaroše', 164), #("Gymnázium, Brno, tř. Kpt. Jaroše", 164), ("Jírovcova", 157), ('České Budějovice', 157), ("Gymnázium, České Budějovice, Jírovcova 8", 157), #("první soukromé", 2), ("Gymnázium Elgartova", 147), ("Jihlava", 45), ('Milevsko', 223), ("Gymnázium Milevsko", 223), ("Gymnázium Žamberk", 257), ("Žamberk", 257), ("Mendelovo", 201), ("Omská", 1038), ("Omsk", 1038), ("machar", 15), ("J. S. Machar", 15), ("Brandýs", 15), ] # Následující aktuálně neumíme matchnout. Jsou v separátním # testu jako expected failure, kdyby / až začnou fungovat, tak # je odsud odeberme a výš odkomentujme. cls.failujici_data = [ ('gasoš', 96), ('gasoš Rokycany', 96), ('SPŠE Pardubice', 815), ("Gymnázium, Brno, tř. Kpt. Jaroše", 164), ("první soukromé", 2), ] def test_view_funguje(self): """Jen se pokusí udělat na ten view dotaz a kouká na odpověď""" resp = self.client.get(reverse('autocomplete_skola')) self.assertEqual(resp.status_code, 200) def test_skoly_vraceny(self): """Testuje, že pro každého orga je jeho škola ve výsledném QuerySetu""" for pfx, id in self.spravna_data: with self.subTest(prefix=pfx, spravne_id=id): spravna_skola = m.Skola.objects.get(id=id) # Zeptáme se view, co si myslí resp = self.client.get(reverse('autocomplete_skola')+'?q='+pfx).json() ids = [int(x['id']) for x in resp['results']] self.assertIn(spravna_skola.id, ids, f"Škola nenalezena v odpovědi") @expectedFailure def test_skoly_vraceny_failujici(self): """Orgové mají své školy v autocomplete (Expected Failure)""" for pfx, id in self.failujici_data: with self.subTest(prefix=pfx, spravne_id=id): spravna_skola = m.Skola.objects.get(id=id) # Zeptáme se view, co si myslí resp = self.client.get(reverse('autocomplete_skola')+'?q='+pfx).json() ids = [int(x['id']) for x in resp['results']] self.assertIn(spravna_skola.id, ids, f"Škola nenalezena v odpovědi") def test_skoly_pocet(self): """Testuje, že se pro dané prefixy nevrací moc škol""" limit = 20 for pfx, id in self.spravna_data: # Kopírování … with self.subTest(prefix=pfx, spravne_id=id): resp = self.client.get(reverse('autocomplete_skola')+'?q='+pfx).json() self.assertLessEqual(len(resp['results']), limit, f"Dotaz vrací moc škol")