Projetos-de-Extensao / PBE_24.2_8001_III_EVE-Plus

https://projetos-de-extensao.github.io/PBE_24.2_8001_III_EVE-Plus/
MIT License
4 stars 0 forks source link

Desenvolvimento dos models #13

Open JoGabTasca opened 4 weeks ago

JoGabTasca commented 4 weeks ago
JoGabTasca commented 4 weeks ago

Problema no API Root esta aparecendo somete 1 path

jonh-carvalho commented 2 weeks ago

Para personalizar os métodos do CRUD

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.

ConviteViewSet

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)

FeedbackViewSet

  1. Associar o feedback ao membro logado: Utilize o usuário logado.
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)

Explicação

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

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 essas implementações

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.

Passos para criar os testes

  1. Configurar o ambiente de testes: Crie um arquivo tests.py na sua aplicação Django, caso ainda não exista.
  2. Criar testes para ConviteViewSet: Testar a criação de convites e verificar o limite de convites mensais.
  3. Criar testes para FeedbackViewSet: Testar a criação de feedbacks e verificar a associação com o membro logado.

Exemplo de 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)

Executando os testes

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.