I'm trying to write tests for a UserViewSet:
users.models.py
class User(AbstractUser):
users.serializers.py
class UserSerializer(serializers.ModelSerializer):
email = serializers.EmailField(
write_only=True,
required=True,
min_length=8,
validators=[UniqueValidator(queryset=User.objects.all())]
)
username = serializers.CharField(
max_length=32,
required=True,
validators=[UniqueValidator(queryset=User.objects.all())]
)
class Meta:
model = User
fields = (
'id',
'first_name',
'last_name',
'username',
'password',
'email',
)
extra_kwargs = {
'password': {'write_only': True, 'min_length':8,'required':True},
}
users.views.py
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = serializers.UserSerializer
permission_classes = [permissions.IsAuthenticated]
users.tests.py
def setup_user(username='test_user', email='test_user@test.com',password='test_password'):
test_user = User.objects.create_user(username=username, email=email,password=password)
test_user.save()
return test_user
class UserTest(APITestCase):
def setUp(self):
self.test_user = setup_user()
self.test_user2 = setup_user(username='test_user2', email='test_user2@test.com',password='test_password2')
# test the /users/ endpoint
def test_authenticated_user_can_get_users_list(self):
self.client.force_authenticate(user=self.test_user)
response = self.client.get(reverse('users-list'), format='json')
self.assertEqual(response.status_code,status.HTTP_200_OK)
def test_authenticated_user_can_get_users_detail(self):
self.client.force_authenticate(user=self.test_user)
user_detail_url = reverse('users-detail', args=(1,))
print(user_detail_url)
response = self.client.get(user_detail_url, format='json')
print(response)
The first test runs fine and returns a HTTP_200_OK status code as I expect. However the response for the detail view returns a HTTP_404_NOT_FOUND which I don't understand since everything seems to work fine outside of this test:
If I run python manage.py runserver
and check the /api/users/:id/ endpoint everything works as expected and the corresponding user is correctly serialized. Same if I use requests and request any user details:
r = requests.get('{}/users/2/'.format(api_root), headers={'Authorization': 'Token {}'.format(get_token())})
(and yeah I'm using Token Authentication) I see all the fields I expect to see in r.json():
id, first_name, last_name and username
thanks for your help!
Aucun commentaire:
Enregistrer un commentaire