Skip to content

Commit

Permalink
fixes #13: separa os testes em múltiplos arquivos
Browse files Browse the repository at this point in the history
  • Loading branch information
augusto-herrmann committed Jun 9, 2021
1 parent 2ac2c4b commit 9080687
Show file tree
Hide file tree
Showing 7 changed files with 606 additions and 571 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@ jobs:
- name: Run docker-compose
run: docker-compose up -d
- name: run tests
run: docker exec api-pgd_web_1 /bin/bash -c "pytest test_api.py"
run: docker exec api-pgd_web_1 /bin/bash -c "pytest tests/"
Empty file added tests/__init__.py
Empty file.
258 changes: 258 additions & 0 deletions tests/atividade_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
"""
Testes relacionados à atividade.
"""

import itertools
from datetime import datetime

from requests import Session

from fastapi import status

import pytest

# grupos de campos opcionais e obrigatórios a testar

fields_atividade = {
"optional": (
["nome_grupo_atividade"],
["parametros_complexidade"],
["entrega_esperada"],
["qtde_entregas_efetivas"],
["data_avaliacao"],
["justificativa"],
["tempo_presencial_executado"],
["tempo_teletrabalho_executado"],
),
"mandatory": (
["nome_atividade"],
["faixa_complexidade"],
["tempo_presencial_estimado"],
["tempo_presencial_programado"],
["tempo_teletrabalho_estimado"],
["tempo_teletrabalho_programado"],
["qtde_entregas"],
)
}

atividades_dict = {
"2": {
"nome_grupo_atividade": "string",
"nome_atividade": "string",
"faixa_complexidade": "string",
"parametros_complexidade": "string",
"tempo_presencial_estimado": 0.0,
"tempo_presencial_programado": 0.0,
"tempo_presencial_executado": None,
"tempo_teletrabalho_estimado": 0.0,
"tempo_teletrabalho_programado": 0.0,
"tempo_teletrabalho_executado": None,
"entrega_esperada": "string",
"qtde_entregas": 0,
"qtde_entregas_efetivas": 0,
"avaliacao": 0,
"data_avaliacao": "2021-01-15",
"justificativa": "string"
},
"3": {
"nome_grupo_atividade": "string",
"nome_atividade": "string",
"faixa_complexidade": "string",
"parametros_complexidade": "string",
"tempo_presencial_estimado": 0.0,
"tempo_presencial_programado": 0.0,
"tempo_presencial_executado": None,
"tempo_teletrabalho_estimado": 0.0,
"tempo_teletrabalho_programado": 0.0,
"tempo_teletrabalho_executado": None,
"entrega_esperada": "string",
"qtde_entregas": 0,
"qtde_entregas_efetivas": 0,
"avaliacao": 0,
"data_avaliacao": "2021-01-15",
"justificativa": "string"
}
}

@pytest.mark.parametrize("omitted_fields",
enumerate(fields_atividade["optional"]))
def test_create_atvidades_omit_optional_fields(input_pt: dict,
omitted_fields: list,
header_usr_1: dict,
truncate_pt,
client: Session):
"""Tenta criar um plano de trabalho, mas em cada atividade os
campos opcionais são omitidos.
"""
offset, field_list = omitted_fields
for field in field_list:
for atividade in input_pt["atividades"]:
del atividade[field]

input_pt["cod_plano"] = 557 + offset
response = client.put(f"/plano_trabalho/{input_pt['cod_plano']}",
json=input_pt,
headers=header_usr_1)
print(response.json())
assert response.status_code == status.HTTP_200_OK

@pytest.mark.parametrize("missing_fields",
enumerate(fields_atividade["mandatory"]))
def test_create_atividades_missing_mandatory_fields(input_pt: dict,
missing_fields: list,
header_usr_1: dict,
truncate_pt,
client: Session):
"""Tenta criar um plano de trabalho, mas em cada atividade os
campos obrigatórios são omitidos.
"""
offset, field_list = missing_fields
for field in field_list:
for atividade in input_pt["atividades"]:
del atividade[field]

input_pt["cod_plano"] = 1800 + offset # precisa ser um novo plano
response = client.put(f"/plano_trabalho/{input_pt['cod_plano']}",
json=input_pt,
headers=header_usr_1)
assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY

@pytest.mark.parametrize("verb, missing_fields",
itertools.product( # todas as combinações entre
("put", "patch"), # verb
fields_atividade["mandatory"] # missing_fields
))
def test_update_atividades_missing_mandatory_fields(verb: str,
truncate_pt,
example_pt,
input_pt: dict,
missing_fields: list,
header_usr_1: dict,
client: Session):
"""Tenta atualizar as atividades de um plano de trabalho faltando
campos obrigatórios.
Para usar o verbo PUT é necessário passar a representação completa
do recurso. Por isso, os campos obrigatórios não podem estar
faltando. Para realizar uma atualização parcial, use o método PATCH.
Já com o verbo PATCH, os campos omitidos são interpretados como sem
alteração. Por isso, é permitido omitir os campos obrigatórios.
"""
for field in missing_fields:
for atividade in input_pt["atividades"]:
del atividade[field]

input_pt["cod_plano"] = 555 # precisa ser um plano existente
call = getattr(client, verb) # put ou patch
response = call(f"/plano_trabalho/{input_pt['cod_plano']}",
json=input_pt,
headers=header_usr_1)
if verb == "put":
assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY
elif verb == "patch":
assert response.status_code == status.HTTP_200_OK

def test_substitute_atividades_list(truncate_pt,
example_pt,
input_pt: dict,
header_usr_1: dict,
client: Session):
"Substitui a lista de atividades existentes por uma nova lista."
input_pt["atividades"].pop() # remove a última atividade

response = client.put(f"/plano_trabalho/{input_pt['cod_plano']}",
json=input_pt,
headers=header_usr_1)

assert response.status_code == status.HTTP_200_OK
assert response.json() == input_pt

def test_append_atividades_list(truncate_pt,
example_pt,
input_pt: dict,
header_usr_1: dict,
client: Session):
"Acrescenta uma nova atividade à lista de atividades existentes."
nova_atividade = {
"id_atividade": "4",
"nome_grupo_atividade": "string",
"nome_atividade": "string",
"faixa_complexidade": "string",
"parametros_complexidade": "string",
"tempo_presencial_estimado": 0.0,
"tempo_presencial_programado": 0.0,
"tempo_presencial_executado": None,
"tempo_teletrabalho_estimado": 0.0,
"tempo_teletrabalho_programado": 0.0,
"tempo_teletrabalho_executado": None,
"entrega_esperada": "string",
"qtde_entregas": 0,
"qtde_entregas_efetivas": 0,
"avaliacao": 0,
"data_avaliacao": "2021-02-15",
"justificativa": "string"
}

patch_input = {
"cod_plano": input_pt["cod_plano"],
"atividades": [nova_atividade]
}

response = client.patch(f"/plano_trabalho/{input_pt['cod_plano']}",
json=patch_input,
headers=header_usr_1)

input_pt["atividades"].append(nova_atividade)

assert response.status_code == status.HTTP_200_OK
assert response.json() == input_pt

@pytest.mark.parametrize("verb, data_avaliacao",
itertools.product(
("put", "patch"),
(
"2021-01-11", # < data_fim do plano
"2021-03-01"
)
)
)
def test_modify_atividade(truncate_pt,
example_pt,
verb: str,
data_avaliacao: str,
input_pt: dict,
header_usr_1: dict,
client: Session):
"Modifica uma atividade existente com put e patch."
atividade = input_pt["atividades"][-1] # pega a última atividade
atividade["data_avaliacao"] = data_avaliacao

if verb == "put":
response = client.put(f"/plano_trabalho/{input_pt['cod_plano']}",
json=input_pt,
headers=header_usr_1)
elif verb == "patch":
atividade_patch = {
"cod_plano": input_pt["cod_plano"],
"atividades": [
{
"id_atividade": "3",
"data_avaliacao": data_avaliacao
}
]
}
response = client.patch(f"/plano_trabalho/{input_pt['cod_plano']}",
json=atividade_patch,
headers=header_usr_1)

if datetime.fromisoformat(data_avaliacao) < datetime.fromisoformat(
input_pt["data_fim"]):
assert response.status_code == status.HTTP_422_UNPROCESSABLE_ENTITY
detail_msg = "Data de avaliação da atividade deve ser maior ou igual" \
" que a Data Fim do Plano de Trabalho."
assert response.json().get("detail")[0]["msg"] == detail_msg
else:
assert response.status_code == status.HTTP_200_OK
assert response.json() == input_pt

Loading

0 comments on commit 9080687

Please sign in to comment.