Skip to content

Commit

Permalink
api(search): Filtra busca por nome do professor (#167)
Browse files Browse the repository at this point in the history
* api(search): Adiciona testes para a busca por nome de professor
- Testes para casos de busca com nome completo, nome parcial e sobrenome.

* api(search):Adiciona filtro de busca por professor
- Apenas as turmas que possuem o professor buscado serão retornadas

* api(search): Reduz complexidade cognitiva da view de busca
- Foram adicionadas funções para reduzir a complexidade da view de busca

* api(searh): Reduz a quantidade de argumetos da função get_serialized_data
  • Loading branch information
GabrielCastelo-31 authored Dec 21, 2023
1 parent ffc8dc2 commit 3455261
Show file tree
Hide file tree
Showing 4 changed files with 308 additions and 29 deletions.
15 changes: 14 additions & 1 deletion api/api/serializers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from rest_framework.serializers import ModelSerializer
from rest_framework import serializers
from api.models import Department, Discipline, Class, Schedule
import utils.db_handler as dbh


class DepartmentSerializer(ModelSerializer):
Expand All @@ -23,12 +25,23 @@ class Meta:


class DisciplineSerializer(DisciplineSerializerSchedule):
classes = ClassSerializer(many=True)
classes = serializers.SerializerMethodField()

def get_classes(self, discipline: Discipline):
teacher_name = self.context.get('teacher_name')
classes = discipline.classes.all() if hasattr(
discipline, 'classes') else Class.objects.none()
if teacher_name:
classes = dbh.filter_classes_by_teacher(
name=teacher_name, classes=classes)

return ClassSerializer(classes, many=True).data


class ClassSerializerSchedule(ClassSerializer):
discipline = DisciplineSerializerSchedule()


class ScheduleSerializer(ModelSerializer):
class Meta:
model = Schedule
Expand Down
231 changes: 226 additions & 5 deletions api/api/tests/test_search_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from api.views.views import ERROR_MESSAGE, ERROR_MESSAGE_SEARCH_LENGTH
import json


class TestSearchAPI(APITestCase):
def setUp(self) -> None:
self.department = get_or_create_department(
Expand All @@ -15,6 +16,12 @@ def setUp(self) -> None:
days=['Quarta-Feira 10:00 às 11:50', 'Sexta-Feira 10:00 às 11:50'], _class="1", special_dates=[], discipline=self.discipline_1)
self._class_2 = create_class(teachers=['VINICIUS RISPOLI'], classroom='S1', schedule='24M34', days=[
'Segunda-Feira 10:00 às 11:50', 'Quarta-Feira 10:00 às 11:50'], _class="1", special_dates=[], discipline=self.discipline_2)
self._class_3 = create_class(teachers=['RICARDO RAMOS FRAGELLI'], classroom='MOCAP', schedule='235M34',
days=['Segunda-Feira 10:00 às 11:50', 'Terça-Feira 10:00 às 11:50', 'Quinta-Feira 10:00 às 11:50'], _class="1", special_dates=[], discipline=self.discipline_2)
self._class_4 = create_class(teachers=['VINICIUS CARVALHO RISPOLI'], classroom='S1', schedule='35M34', days=[
'Terça-Feira 10:00 às 11:50', 'Quinta-Feira 10:00 às 11:50'], _class="1", special_dates=[], discipline=self.discipline_2)
self._class_5 = create_class(teachers=['RICARDO JUNIOR'], classroom='S1', schedule='35M34', days=[
'Terça-Feira 10:00 às 11:50', 'Quinta-Feira 10:00 às 11:50'], _class="1", special_dates=[], discipline=self.discipline_1)

def test_with_incomplete_correct_search(self):
"""
Expand Down Expand Up @@ -174,9 +181,12 @@ def test_with_only_spaces(self):
- Status code (400 BAD REQUEST)
"""

response_1 = self.client.get('/courses/?search= &year=2023&period=2')
response_2 = self.client.get('/courses/?search=calculo&year= &period=2')
response_3 = self.client.get('/courses/?search=calculo&year=2023&period= ')
response_1 = self.client.get(
'/courses/?search= &year=2023&period=2')
response_2 = self.client.get(
'/courses/?search=calculo&year= &period=2')
response_3 = self.client.get(
'/courses/?search=calculo&year=2023&period= ')
content_1 = json.loads(response_1.content)
content_2 = json.loads(response_2.content)
content_3 = json.loads(response_3.content)
Expand All @@ -192,7 +202,7 @@ def test_with_only_spaces(self):
self.assertEqual(response_3.status_code, 400)
self.assertEqual(len(content_3), 1)
self.assertEqual(content_3['errors'], ERROR_MESSAGE)

def test_with_insufficient_search_length(self):
"""
Testa a busca por disciplinas com menos de 4 caracteres no parâmetro de busca
Expand All @@ -205,4 +215,215 @@ def test_with_insufficient_search_length(self):

self.assertEqual(response_1.status_code, 400)
self.assertEqual(len(content_1), 1)
self.assertEqual(content_1['errors'], ERROR_MESSAGE_SEARCH_LENGTH)
self.assertEqual(content_1['errors'], ERROR_MESSAGE_SEARCH_LENGTH)

def test_correct_search_with_teacher_full_name(self):
"""
Testa a busca por disciplinas com nome completo de professor
Testes:
- Status code (200 OK)
- Quantidade de disciplinas retornadas
- Quantidade de turmas retornadas em cada disciplina
- Código do departamento
- Nome da disciplina
- Professores da disciplina
"""
response_for_disciplines = self.client.get(
'/courses/?search=Ricardo Ramos Fragelli&year=2023&period=2')
content = json.loads(response_for_disciplines.content)

self.assertEqual(response_for_disciplines.status_code, 200)
self.assertEqual(len(content), 1)

# Testes da disciplina retornada
self.assertEqual(content[0]['department']
['code'], self.department.code)
self.assertEqual(content[0]['name'], self.discipline_2.name)

# Verifica a quantidade de turmas retornadas
self.assertEqual(len(content[0]['classes']), 1)

# Teste da 1ª turma do professor Ricardo
self.assertEqual(content[0]['classes'][0]
['teachers'], self._class_3.teachers)

def test_correct_search_with_teacher_first_name_and_last_name(self):
"""
Testa a busca por disciplinas com primeiro nome e sobrenome de professor
Testes:
- Status code (200 OK)
- Quantidade de disciplinas retornadas
- Quantidade de turmas retornadas em cada disciplina
- Código do departamento
- Nome da disciplina
- Professores da disciplina
"""
response_for_disciplines = self.client.get(
'/courses/?search=Ricardo Fragelli&year=2023&period=2')
content = json.loads(response_for_disciplines.content)

# Teste da resposta da API
self.assertEqual(response_for_disciplines.status_code, 200)
self.assertEqual(len(content), 2)

# Verifica a quantidade de turmas retornadas em cada disciplina
self.assertEqual(len(content[0]['classes']), 1)
self.assertEqual(len(content[1]['classes']), 1)

# Testes da 1ª disciplina do professor Ricardo
self.assertEqual(content[0]['department']
['code'], self.department.code)
self.assertEqual(content[0]['name'], self.discipline_1.name)
self.assertEqual(content[0]['classes'][0]
['teachers'], self._class_1.teachers)

# Testes da 2ª disciplina do professor Ricardo
self.assertEqual(content[1]['department']
['code'], self.department.code)
self.assertEqual(content[1]['name'], self.discipline_2.name)
self.assertEqual(content[1]['classes'][0]
['teachers'], self._class_3.teachers)

def test_correct_search_with_teacher_first_name_with_one_discipline(self):
"""
Testa a busca por disciplinas com primeiro nome de professor que leciona apenas uma disciplina
Testes:
- Status code (200 OK)
- Quantidade de disciplinas retornadas
- Quantidade de turmas retornadas em cada disciplina
- Código do departamento
- Nome da disciplina
- Professores da disciplina
"""
response_for_disciplines = self.client.get(
'/courses/?search=vinicius&year=2023&period=2')
content = json.loads(response_for_disciplines.content)

# Teste da resposta da API
self.assertEqual(response_for_disciplines.status_code, 200)
self.assertEqual(len(content), 1)

# Testes da disciplina retornada
self.assertEqual(content[0]['department']
['code'], self.department.code)
self.assertEqual(content[0]['name'], self.discipline_2.name)

# Verifica a quantidade de turmas retornadas
self.assertEqual(len(content[0]['classes']), 2)

# Teste da 1ª turma do professor Vinicius
self.assertEqual(content[0]['classes'][0]
['teachers'], self._class_2.teachers)

# Teste da 2ª turma do professor Vinicius
self.assertEqual(content[0]['classes'][1]
['teachers'], self._class_4.teachers)

def test_correct_search_with_teacher_first_name_with_more_than_one_discipline(self):
"""
Testa a busca por disciplinas com primeiro nome de professor que leciona mais de uma disciplina
Testes:
- Status code (200 OK)
- Quantidade de disciplinas retornadas
- Quantidade de turmas retornadas em cada disciplina
- Código do departamento
- Nome da disciplina
- Professores da disciplina
"""
response_for_disciplines = self.client.get(
'/courses/?search=ricardo&year=2023&period=2')
content = json.loads(response_for_disciplines.content)

# Testes da resposta da API
self.assertEqual(response_for_disciplines.status_code, 200)
self.assertEqual(len(content), 2)

# Verifica a quantidade de turmas retornadas em cada disciplina
self.assertEqual(len(content[0]['classes']), 2)
self.assertEqual(len(content[1]['classes']), 1)

# Testes da 1ª disciplina do professor Ricardo
self.assertEqual(content[0]['department']
['code'], self.department.code)
self.assertEqual(content[0]['name'], self.discipline_1.name)
self.assertEqual(content[0]['classes'][0]
['teachers'], self._class_1.teachers)

# Testes da 2ª disciplina do professor Ricardo
self.assertEqual(content[1]['department']
['code'], self.department.code)
self.assertEqual(content[1]['name'], self.discipline_2.name)
self.assertEqual(content[1]['classes'][0]
['teachers'], self._class_3.teachers)

def test_correct_search_with_teacher_last_name_with_one_discipline(self):
"""
Testa a busca por disciplinas com sobrenome de professor que leciona apenas uma disciplina
Testes:
- Status code (200 OK)
- Quantidade de disciplinas retornadas
- Quantidade de turmas retornadas em cada disciplina
- Código do departamento
- Nome da disciplina
- Professores da disciplina
"""
response_for_disciplines = self.client.get(
'/courses/?search=rispoli&year=2023&period=2')
content = json.loads(response_for_disciplines.content)

# Teste da resposta da API
self.assertEqual(response_for_disciplines.status_code, 200)
self.assertEqual(len(content), 1)

# Testes da disciplina retornada
self.assertEqual(content[0]['department']
['code'], self.department.code)
self.assertEqual(content[0]['name'], self.discipline_2.name)

# Verifica a quantidade de turmas retornadas
self.assertEqual(len(content[0]['classes']), 2)

# Teste da 1ª turma do professor Vinicius
self.assertEqual(content[0]['classes'][0]
['teachers'], self._class_2.teachers)

# Teste da 2ª turma do professor Vinicius
self.assertEqual(content[0]['classes'][1]
['teachers'], self._class_4.teachers)

def test_correct_search_with_teacher_last_name_with_more_than_one_discipline(self):
"""
Testa a busca por disciplinas com sobrenome de professor que leciona mais de uma disciplina
Testes:
- Status code (200 OK)
- Quantidade de disciplinas retornadas
- Quantidade de turmas retornadas em cada disciplina
- Código do departamento
- Nome da disciplina
- Professores da disciplina
"""
response_for_disciplines = self.client.get(
'/courses/?search=fragelli&year=2023&period=2')
content = json.loads(response_for_disciplines.content)

# Testes da resposta da API
self.assertEqual(response_for_disciplines.status_code, 200)
self.assertEqual(len(content), 2)

# Verifica a quantidade de turmas retornadas em cada disciplina
self.assertEqual(len(content[0]['classes']), 1)
self.assertEqual(len(content[1]['classes']), 1)

# Testes da 1ª disciplina do professor Fragelli
self.assertEqual(content[0]['department']
['code'], self.department.code)
self.assertEqual(content[0]['name'], self.discipline_1.name)
self.assertEqual(content[0]['classes'][0]
['teachers'], self._class_1.teachers)

# Testes da 2ª disciplina do professor Fragelli
self.assertEqual(content[1]['department']
['code'], self.department.code)
self.assertEqual(content[1]['name'], self.discipline_2.name)
self.assertEqual(content[1]['classes'][0]
['teachers'], self._class_3.teachers)
Loading

0 comments on commit 3455261

Please sign in to comment.