11import importlib
22from io import StringIO
3+ from unittest .mock import patch
34
45import pytest
56from django .contrib .admin import site
1112from rest_framework .authtoken .admin import TokenAdmin
1213from rest_framework .authtoken .management .commands .drf_create_token import \
1314 Command as AuthTokenCommand
14- from rest_framework .authtoken .models import Token
15+ from rest_framework .authtoken .models import Token , TokenProxy
1516from rest_framework .authtoken .serializers import AuthTokenSerializer
1617from rest_framework .exceptions import ValidationError
1718
@@ -36,6 +37,29 @@ def test_model_admin_displayed_fields(self):
3637 token_admin = TokenAdmin (self .token , self .site )
3738 assert token_admin .get_fields (mock_request ) == ('user' ,)
3839
40+ @patch ('django.contrib.admin.site.register' ) # avoid duplicate registrations
41+ def test_model_admin__username_field (self , mock_register ):
42+ import rest_framework .authtoken .admin as authtoken_admin_m
43+
44+ class EmailUser (User ):
45+ USERNAME_FIELD = 'email'
46+ username = None
47+
48+ for user_model in (User , EmailUser ):
49+ with (
50+ self .subTest (user_model = user_model ),
51+ patch ('django.contrib.auth.get_user_model' , return_value = user_model ) as get_user_model
52+ ):
53+ importlib .reload (authtoken_admin_m ) # reload after patching
54+ assert get_user_model .call_count == 1
55+
56+ mock_request = object ()
57+ token_admin = authtoken_admin_m .TokenAdmin (TokenProxy , self .site )
58+ assert token_admin .get_search_fields (mock_request ) == (f'user__{ user_model .USERNAME_FIELD } ' ,)
59+ assert token_admin .get_ordering (mock_request ) == (f'user__{ user_model .USERNAME_FIELD } ' ,)
60+
61+ importlib .reload (authtoken_admin_m ) # restore after testing
62+
3963 def test_token_string_representation (self ):
4064 assert str (self .token ) == 'test token'
4165
0 commit comments