Skip to content

Instantly share code, notes, and snippets.

@ivangeorgiev
Created April 29, 2023 12:54
Show Gist options
  • Save ivangeorgiev/592aa63d177f6ede0c3bb7f6e115ca68 to your computer and use it in GitHub Desktop.
Save ivangeorgiev/592aa63d177f6ede0c3bb7f6e115ca68 to your computer and use it in GitHub Desktop.
pytest assertion helper
from operator import itemgetter
import pytest
from django.urls import reverse
from django.contrib.auth.models import User
from rest_framework import status
def assert_response_userlist_equals(response, users):
__tracebackhide__ = True
result = response.json()
assert isinstance(
result, list), f'Result is of type {type(result)}. Expected <list>'
assert len(users) == len(
result
), f'Result contains {len(result)} item(s). Expected {len(users)} item(s)'
expected_items = [{
'username': u.username,
'email': u.email,
'is_staff': u.is_staff,
'url': f'http://testserver/users/{u.id}/',
} for u in users]
expected_items.sort(key=itemgetter('url'))
result.sort(key=itemgetter('url'))
assert result == expected_items
@pytest.fixture
def given_user_1():
user = User.objects.create(username='user1')
yield user
user.delete()
@pytest.fixture
def given_user_2():
user = User.objects.create(username='user2')
yield user
user.delete()
@pytest.fixture
def given_user_model_is_empty():
User.objects.all().delete()
@pytest.fixture
def given_user_model_has_two_users(request):
request.getfixturevalue('given_user_model_is_empty')
return [
request.getfixturevalue('given_user_1'),
request.getfixturevalue('given_user_2')
]
@pytest.mark.django_db
def test_should_return_list_of_users(client, request):
given_users = request.getfixturevalue('given_user_model_has_two_users')
# When get user-list endpoint is executed
url = reverse('user-list')
response = client.get(url)
# Then request is successfull
assert response.status_code == status.HTTP_200_OK
# And response matches expected
assert_response_userlist_equals(response, given_users)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment