First off, first forum style post
Awesome stuff!
Anyways, I'm trying to create a test to update a custom created user model using PUT. I was able to create a test to create a new user via DRF POST and edit other endpoints with PUT methods. Here is what I have for updating a current user:
class UserEditSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = [
"id",
"business_id",
"location",
"first_name",
"last_name",
"phone_number",
"email",
"password",
"active",
"created_at",
"updated_at",
"deleted_at"
]
def update(self, validated_data):
user = super(UserEditSerializer, self).update(validated_data)
user.save()
return user
class UserDetailApiView(APIView):
# add permission to check if User is authenticated
permission_classes = [permissions.IsAuthenticated]
def get_object(self, user_id):
'''
Helper method to get the object with given user_id, and user_id
'''
try:
return User.objects.get(pk = user_id)
except User.DoesNotExist:
return None
# 3. Retrieve
def get(self, request, user_id, *args, **kwargs):
'''
Retrieves the User with given user_id
'''
user_instance = self.get_object(user_id)
if not user_instance:
return Response(
{"res": "Object with User id does not exists"},
status=status.HTTP_400_BAD_REQUEST
)
serializer = UserEditSerializer(user_instance)
return Response(serializer.data, status=status.HTTP_200_OK)
# 4. Update
def put(self, request, user_id, *args, **kwargs):
'''
Updates the User with given user_id if exists
'''
user_instance = self.get_object(user_id)
if not user_instance:
return Response(
{"res": "Object with User id does not exists"},
status=status.HTTP_400_BAD_REQUEST
)
data = {
'first_name': request.data.get('first_name'),
'last_name': request.data.get('last_name'),
'phone_number': request.data.get('phone_number'),
'email': request.data.get('email'),
'password': request.data.get('password')
}
serializer = UserEditSerializer(instance = user_instance, data=data, partial = True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
test_views.py
# Tests editing an existing user's information with endpoint
# Uses UserDetailApiView
class UserPutTest(APITransactionTestCase):
reset_sequences = True
def setUp(self):
self.user = User.objects.create_user(
email='testuser@website.com',
password='123',
first_name='firstname',
last_name='lastname',
phone_number='19877654321'
)
self.client.force_authenticate(self.user)
def test_create_user(self):
"""
Ensure we can create a new User object.
"""
url = reverse('user_details', kwargs={'user_id': 1})
data = {
'phone_number': '1345698321'
}
response = self.client.put(url, data, format='json', follow=True)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(User.objects.count(), 1)
self.assertEqual(User.objects.get(email='name@website.com').phone_number, '1345698321')