Open JoGabTasca opened 4 weeks ago
Problema no API Root esta aparecendo somete 1 path
Aatendendo às regras de negócio definidas nos métodos do seu modelo, você pode sobrescrever os métodos perform_create , perform_update
e perform_destroy
nas suas ViewSets. Vou mostrar como você pode fazer isso para as suas ViewSets.
1. Verificar o limite de convites mensais ao criar um convite: Utilize o método
enviar_convite do modelo Member
2. Adicionar o remetente do convite: Utilize o usuário logado.
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from .models import Feedback, Convite, Member
from .serializers import ConviteSerializer, FeedbackSerializer
class ConviteViewSet(viewsets.ModelViewSet):
queryset = Convite.objects.all()
serializer_class = ConviteSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
def perform_create(self, serializer):
user = self.request.user
member = Member.objects.get(user=user)
email_destinatario = self.request.data['userDestinatario']
# Verifica e envia convite utilizando o método do modelo
convite = member.enviar_convite(email_destinatario)
serializer.save(userRemetente=member, userDestinatario=email_destinatario, link=convite.link, status=convite.status, data_envio=convite.data_envio)
class FeedbackViewSet(viewsets.ModelViewSet):
queryset = Feedback.objects.all()
serializer_class = FeedbackSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
def perform_create(self, serializer):
user = self.request.user
try:
member = Member.objects.get(user=user)
except Member.DoesNotExist:
member = Member.objects.create(user=user)
serializer.save(member=member)
class FeedbackViewSet(viewsets.ModelViewSet):
queryset = Feedback.objects.all()
serializer_class = FeedbackSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
def perform_create(self, serializer):
user = self.request.user
try:
member = Member.objects.get(user=user)
except Member.DoesNotExist:
member = Member.objects.create(user=user)
serializer.save(member=member)
perform_create
, recuperamos o usuário logado e o membro associado.
enviar_convite do modelo Member para verificar o limite de convites e criar o convite.
enviar_convite
FeedbackViewSet:
No método perform_create, recuperamos o usuário logado e o membro associado.
Se o membro não existir, criamos um novo membro.
Salvamos o feedback associando-o ao membro.
Essas personalizações garantem que as regras de negócio definidas nos métodos do modelo sejam respeitadas ao criar novos convites e feedbacks.
Para testar as implementações das suas ViewSets e garantir que as regras de negócio estão sendo respeitadas, você pode criar testes unitários utilizando o framework de testes do Django, django.test
. Vou mostrar como você pode criar testes para as suas ViewSets ConviteViewSet
e FeedbackViewSet
.
tests.py
na sua aplicação Django, caso ainda não exista.ConviteViewSet
: Testar a criação de convites e verificar o limite de convites mensais.FeedbackViewSet
: Testar a criação de feedbacks e verificar a associação com o membro logado.tests.py
from django.contrib.auth.models import User
from django.test import TestCase
from rest_framework.test import APIClient
from rest_framework import status
from .models import Member, Convite, Feedback
class ConviteViewSetTest(TestCase):
def setUp(self):
self.client = APIClient()
self.user = User.objects.create_user(username='testuser', password='testpass')
self.member = Member.objects.create(user=self.user)
self.client.force_authenticate(user=self.user)
def test_create_convite(self):
response = self.client.post('/convites/', {'userDestinatario': 'destinatario@example.com'})
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Convite.objects.count(), 1)
self.assertEqual(Convite.objects.first().userRemetente, self.member)
def test_limite_convites_mensais(self):
for _ in range(5):
self.member.enviar_convite('destinatario@example.com')
response = self.client.post('/convites/', {'userDestinatario': 'destinatario@example.com'})
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn('Limite de convites mensais atingido.', str(response.data))
class FeedbackViewSetTest(TestCase):
def setUp(self):
self.client = APIClient()
self.user = User.objects.create_user(username='testuser', password='testpass')
self.member = Member.objects.create(user=self.user)
self.client.force_authenticate(user=self.user)
def test_create_feedback(self):
response = self.client.post('/feedbacks/', {'feedback': 'Ótimo trabalho!', 'tipo': 'positivo'})
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Feedback.objects.count(), 1)
self.assertEqual(Feedback.objects.first().member, self.member)
Configuração do ambiente de testes:
setUp
: Método que configura o ambiente de testes, criando um usuário, um membro e autenticando o cliente de testes.Testes para ConviteViewSet
:
test_create_convite
: Testa a criação de um convite e verifica se o convite foi criado corretamente e associado ao membro logado.test_limite_convites_mensais
: Testa o limite de convites mensais, criando 5 convites e tentando criar um sexto, verificando se a exceção é levantada corretamente.Testes para FeedbackViewSet
:
test_create_feedback
: Testa a criação de um feedback e verifica se o feedback foi criado corretamente e associado ao membro logado.Para executar os testes, utilize o comando:
python manage.py test
Isso executará todos os testes definidos no seu projeto e exibirá os resultados, indicando se os testes passaram ou falharam.