-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
286 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
name: Django Tests CI | ||
|
||
on: | ||
push: | ||
pull_request: | ||
workflow_dispatch: | ||
|
||
jobs: | ||
test: | ||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- uses: actions/checkout@v2 | ||
- name: Set up Python | ||
uses: actions/setup-python@v2 | ||
with: | ||
python-version: 3.10.12 | ||
- name: Install dependencies | ||
run: | | ||
pip install --upgrade pip | ||
pip install -r requirements.txt | ||
- name: Run tests | ||
run: | | ||
cd backend/server | ||
python manage.py test |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,212 @@ | ||
from django.test import TestCase | ||
from django.urls import reverse | ||
from rest_framework import status | ||
from rest_framework.test import APITestCase | ||
from app.models import Licitacao, Orgao, LicitacaoQuantidade, LicitacaoValoresMensal | ||
from app.serializers import LicitacaoSerializer, LicitacoesQuantidadeMensalSerializer | ||
from django.db.models import Sum, F | ||
from django.db.models.functions import Cast | ||
from django.db.models import FloatField | ||
from datetime import datetime | ||
|
||
# Create your tests here. | ||
class Tests(APITestCase): | ||
|
||
def setUp(self): | ||
for i in range(15): | ||
Orgao.objects.create(id=i+1, nome=f'Orgao Teste {i+1}') | ||
|
||
self.orgao = Orgao.objects.create(id=16, nome='Orgao Teste 16') | ||
|
||
for i in range(15): | ||
Licitacao.objects.create( | ||
tipo='Tipo Teste', | ||
data=(datetime.now()).strftime('%d/%m/%Y'), | ||
objeto=f'Objeto Teste {i+1}', | ||
idorgao=self.orgao, | ||
valores=[1000 * (i+1)] | ||
) | ||
# para os endpoints de quantidade mensal e anual | ||
LicitacaoQuantidade.objects.create(ano=2023, mes=1, total_licitacoes=5) | ||
LicitacaoQuantidade.objects.create(ano=2023, mes=2, total_licitacoes=10) | ||
LicitacaoQuantidade.objects.create(ano=2023, mes=3, total_licitacoes=15) | ||
LicitacaoQuantidade.objects.create(ano=2024, mes=1, total_licitacoes=0) | ||
# para os endpoints de valores mensais e anuais | ||
LicitacaoValoresMensal.objects.create(ano=2023, mes=1, valor_total=5000) | ||
LicitacaoValoresMensal.objects.create(ano=2023, mes=2, valor_total=10000) | ||
LicitacaoValoresMensal.objects.create(ano=2023, mes=3, valor_total=15000) | ||
LicitacaoValoresMensal.objects.create(ano=2024, mes=1, valor_total=0) | ||
|
||
# TESTE DO ENDPOINT NOME_ORGAOS_POR_ID | ||
def test_nome_orgaos_por_id_valido(self): | ||
# Faz uma requisição GET para a URL nome_orgaos_por_id com o ID do orgao criado | ||
response = self.client.get(reverse('nome_orgaos_por_id', args=[self.orgao.id])) | ||
# Verifica se o status da resposta é 200 OK | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
# Verifica se os dados retornados são os esperados | ||
self.assertEqual(response.data, {'id': self.orgao.id, 'nome': self.orgao.nome}) | ||
|
||
def test_nome_orgaos_por_id_invalido(self): | ||
# Faz uma requisição GET para a URL nome_orgaos_por_id com um ID inexistente | ||
response = self.client.get(reverse('nome_orgaos_por_id', args=[999])) | ||
# Verifica se o status da resposta é 404 Not Found | ||
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) | ||
# Verifica se a mensagem de erro está correta | ||
self.assertEqual(response.data, {'detail': 'Órgão com ID 999 não encontrado.'}) | ||
|
||
# TESTE DO ENDPOINT LISTAR_ORGAOS | ||
def test_listar_orgaos_paginacao(self): | ||
# Faz uma requisição GET para a URL lista_orgaos | ||
response = self.client.get(reverse('lista_orgaos')) | ||
# Verifica se o status da resposta é 200 OK | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
# Verifica se a página contém 10 itens (página de resultados paginados) | ||
self.assertEqual(len(response.data['results']), 10) | ||
|
||
def test_listar_orgaos_busca(self): | ||
# Faz uma requisição GET para a URL lista_orgaos com o parâmetro de busca 'Teste 1' | ||
response = self.client.get(reverse('lista_orgaos'), {'search': 'Teste 1'}) | ||
# Verifica se o status da resposta é 200 OK | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
# Verifica se pelo menos um dos resultados contém 'Teste 1' no nome | ||
self.assertTrue(any('Teste 1' in orgao['nome'] for orgao in response.data['results'])) | ||
|
||
# TESTE DO ENDPOINT LISTAR_LICITACOES | ||
def test_listar_licitacoes_paginacao(self): | ||
response = self.client.get(reverse('listar_licitacoes')) | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertEqual(len(response.data['results']), 10) | ||
|
||
def test_listar_licitacoes_filtro_search(self): | ||
response = self.client.get(reverse('listar_licitacoes'), {'search': 'Teste 1'}) | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
|
||
def test_listar_licitacoes_filtro_orgao(self): | ||
response = self.client.get(reverse('listar_licitacoes'), {'idorgao': self.orgao.id}) | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertTrue(all(licitacao['idorgao'] == self.orgao.id for licitacao in response.data['results'])) | ||
|
||
def test_listar_licitacoes_ordenar_por_valor(self): | ||
response = self.client.get(reverse('listar_licitacoes'), {'ordering': 'valores'}) | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
valores = [licitacao['valores'][0] for licitacao in response.data['results'] if licitacao['valores']] | ||
self.assertEqual(valores, sorted(valores)) | ||
|
||
# TESTE DO ENDPOINT LICITACAO_POR_ID | ||
def test_licitacao_por_id_valido(self): | ||
licitacao = Licitacao.objects.first() | ||
url = reverse('licitacao_por_id', args=[licitacao.id]) | ||
response = self.client.get(url) | ||
|
||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
|
||
serializer = LicitacaoSerializer(licitacao) | ||
self.assertEqual(response.data, serializer.data) | ||
|
||
def test_licitacao_por_id_invalido(self): | ||
url = reverse('licitacao_por_id', args=[999]) | ||
response = self.client.get(url) | ||
|
||
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) | ||
self.assertEqual(response.data, {'detail': 'Licitacao não encontrada'}) | ||
|
||
# TESTE DO ENDPOINT LISTAR_LICITACOES_QUANTIDADE_MENSAL | ||
def test_listar_licitacoes_quantidade_mensal(self): | ||
# Fazer uma requisição GET para o endpoint | ||
response = self.client.get(reverse('listar_licitacoes_quantidade_mensal')) | ||
# Verificar se o status da resposta é 200 OK | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
# Dados esperados | ||
expected_data = [ | ||
{'ano': 2023, 'mes': 1, 'total_licitacoes': 5}, | ||
{'ano': 2023, 'mes': 2, 'total_licitacoes': 10}, | ||
{'ano': 2023, 'mes': 3, 'total_licitacoes': 15}, | ||
{'ano': 2024, 'mes': 1, 'total_licitacoes': 0}, | ||
] | ||
# Verificar o conteúdo da resposta | ||
self.assertEqual(response.data, expected_data) | ||
|
||
def test_listar_licitacoes_quantidade_mensal_vazio(self): | ||
LicitacaoQuantidade.objects.all().delete() | ||
response = self.client.get(reverse('listar_licitacoes_quantidade_mensal')) | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertEqual(response.data, []) | ||
|
||
# TESTE DO ENDPOINT LISTAR_LICITACOES_QUANTIDADE_ANUAL | ||
def test_listar_licitacoes_quantidade_anual(self): | ||
# Fazer uma requisição GET para o endpoint | ||
response = self.client.get(reverse('listar_licitacoes_quantidade_anual')) | ||
# Verificar se o status da resposta é 200 OK | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
# Dados esperados | ||
expected_data = [ | ||
{'ano': 2023, 'total_licitacoes': 30}, | ||
{'ano': 2024, 'total_licitacoes': 0} | ||
] | ||
# Verificar o conteúdo da resposta | ||
self.assertEqual(response.data, expected_data) | ||
|
||
def test_listar_licitacoes_quantidade_anual_vazio(self): | ||
LicitacaoQuantidade.objects.all().delete() | ||
response = self.client.get(reverse('listar_licitacoes_quantidade_anual')) | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertEqual(response.data, []) | ||
|
||
# TESTE DO ENDPOINT LICITACOES_VALORES_MENSAIS | ||
def test_licitacoes_valores_mensais(self): | ||
response = self.client.get(reverse('licitacoes-valores-mensais')) | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertEqual(response.data, [ | ||
{'ano': 2023, 'mes': 1, 'valor_total': 5000}, | ||
{'ano': 2023, 'mes': 2, 'valor_total': 10000}, | ||
{'ano': 2023, 'mes': 3, 'valor_total': 15000}, | ||
{'ano': 2024, 'mes': 1, 'valor_total': 0} | ||
]) | ||
|
||
def test_licitacoes_valores_mensais_vazio(self): | ||
LicitacaoValoresMensal.objects.all().delete() | ||
response = self.client.get(reverse('licitacoes-valores-mensais')) | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertEqual(response.data, []) | ||
|
||
# TESTE DO ENDPOINT LICITACOES_VALORES_ANUAIS | ||
def test_licitacoes_valores_anuais(self): | ||
response = self.client.get(reverse('valores-anuais-list')) | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertEqual(response.data, [ | ||
{'ano': 2023, 'valor_total': 30000}, | ||
{'ano': 2024, 'valor_total': 0} | ||
]) | ||
|
||
def test_licitacoes_valores_anuais_vazio(self): | ||
LicitacaoValoresMensal.objects.all().delete() | ||
response = self.client.get(reverse('valores-anuais-list')) | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertEqual(response.data, []) | ||
|
||
# TESTE DO ENDPOINT LICITACAO_MAIOR_VALOR | ||
def test_licitacao_maior_valor(self): | ||
# Fazer uma requisição GET para o endpoint | ||
response = self.client.get(reverse('licitacao_maior_valor')) | ||
|
||
# Verificar se o status da resposta é 200 OK | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
|
||
# Verificar se a licitação retornada é a com maior valor somado | ||
licitacao_com_maior_valor = Licitacao.objects.annotate( | ||
total_valor=Sum(Cast(F('valores'), FloatField())) | ||
).order_by('-total_valor').first() | ||
|
||
serializer = LicitacaoSerializer(licitacao_com_maior_valor) | ||
self.assertEqual(response.data, serializer.data) | ||
|
||
def test_licitacao_maior_valor_sem_licitacoes(self): | ||
# Remover todas as licitações | ||
Licitacao.objects.all().delete() | ||
|
||
# Fazer uma requisição GET para o endpoint | ||
response = self.client.get(reverse('licitacao_maior_valor')) | ||
|
||
# Verificar se o status da resposta é 404 NOT FOUND | ||
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) | ||
|
||
# Verificar se a mensagem de erro está correta | ||
self.assertEqual(response.data, {'detail': 'Nenhuma licitação encontrada.'}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
apenas para a resolver o warning do test | ||
"C:\Users\thale\OneDrive\Área de Trabalho\unb\trabalho MDS\LicitaBSB-24.1\venv\Lib\site-packages\django\core\handlers\base.py:61: UserWarning: No directory at: C:\Users\thale\OneDrive\Área de Trabalho\unb\trabalho MDS\LicitaBSB-24.1\backend\server\static\" |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters