Home > Back-end >  Testing custom action on a viewset in Django Rest Framework
Testing custom action on a viewset in Django Rest Framework

Time:11-09

I have defined the following custome action for my ViewSet Agenda:

class AgendaViewSet(viewsets.ModelViewSet):
    """
    A simple viewset to retrieve all the Agendas
    """
    queryset = Agenda.objects.all()
    serializer_class = AgendaSerializer
    
    @action(detail=False, methods=['GET'])
    def get_user_agenda(self, request, pk=None):
        print('here1')
        id = request.GET.get("id_user")
        if not id:
            return Response("No id in the request.", status=400)
        id = int(id)
        user = User.objects.filter(pk=id)
        if not user:
            return Response("No existant user with the given id.", status=400)
        response = self.queryset.filter(UserRef__in=user)
        if not response:
            return Response("No existant Agenda.", status=400)
        serializer = AgendaSerializer(response, many=True)
        return Response(serializer.data)

Here, I'd like to unit-test my custom action named "get_user_agenda".

However, when I'm testing, the debug output("here1") doesn't show up, and it always returns 200 as a status_code.

Here's my test:

def test_GetUserAgenda(self):
    request_url = f'Agenda/get_user_agenda/'
    view = AgendaViewSet.as_view(actions={'get': 'retrieve'})
    request = self.factory.get(request_url, {'id_user': 15})
    response = view(request)
    self.assertEqual(response.status_code, 400)

Note that:

self.factory = APIRequestFactory()

Am I missing something?

Sincerely,

CodePudding user response:

You will have to use the method name of the custom action and not retrieve so:

view = AgendaViewSet.as_view(actions={'get': 'get_user_agenda'})

CodePudding user response:

You have to specify request url

@action(detail=False, methods=['GET'], url_path='get_user_agenda')
    def get_user_agenda(self, request, pk=None):

And in my opinion it would be better to use detail=True, and get pk from url. For example: 'Agenda/pk_here/get_user_agenda/'

  • Related