I have this serializer class.
class CourseListSerializer(serializers.Serializer):
course_slug = serializers.CharField()
duration = serializers.FloatField()
class CourseAssignSerializer(serializers.Serializer):
first_name = serializers.CharField(max_length=255)
last_name = serializers.CharField(max_length=255)
email = serializers.EmailField(max_length=255)
username = serializers.CharField(max_length=255)
courses = CourseListSerializer(many=True)
class CourseAssignListSerializer(serializers.Serializer):
users = CourseAssignSerializer(many=True)
This is the viewset action
class UserViewSet(RetrieveModelMixin, ListModelMixin, UpdateModelMixin, GenericViewSet):
serializer_class = UserSerializer
queryset = User.objects.all()
lookup_field = "id"
authentication_classes = (
ARestAuthentication,
BRestAuthentication,
)
permission_classes = (permissions.IsAuthenticated | HasAPIKeyWithPermission,)
resource_label = "users.User"
@action(
methods=["put"],
detail=False,
serializer_class=CourseAssignListSerializer,
url_path="assign-course",
)
def assign_course(self, request: Request):
serializer = self.get_serializer_class()(
data=request.data, context={"request": request}
)
serializer.is_valid(raise_exception=True)
serializer.update(None, serializer.validated_data)
return Response(status=status.HTTP_200_OK, data=serializer.data)
Above serializers and viewset is working fine when I hit the endpoint using postman. But when I want to put it on the test it giving validation error. I am using the same data when test it on postman and the pytest
This is my test function
def test_UserViewSet_assign_course(user):
request = APIRequestFactory().put(
"/api/users/assign-course/",
data={
"users":[
{
"first_name": "Fikra",
"last_name": "Putra",
"email": "[email protected]",
"username": "fikra.test2",
"courses": [
{
"course_slug": "devsecops-professional",
"duration": 30,
"start_immediatelly": true
}
]
}
]
}
force_authenticate(request=request, user=user)
action = UserViewSet.as_view(
actions={"put": "assign_course"}, serializer_class=CourseAssignListSerializer
)
response: Response = action(request=request)
print(response.data)
assert response.status_code == 200
It giving me
{'users': [ErrorDetail(string='This field is required.', code='required')]}
But when I use empty data like:
data={users:[]}
the validation error not show which mean it is valid.
I assume I initialize the serializer wrongly in my test. But I don’t have a clue how to do it. I need help to make my pytest for this endpoint has same behaviour as when I hit the endpoint from postman