Created
April 29, 2023 12:54
-
-
Save ivangeorgiev/592aa63d177f6ede0c3bb7f6e115ca68 to your computer and use it in GitHub Desktop.
pytest assertion helper
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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