Django Тестирование клиентского POST-запроса, получение 403 ошибки
Я пытаюсь впервые протестировать некоторые клиентские запросы, и мне удалось успешно отправить POST-запрос для регистрации нового пользователя. Однако, когда я пытаюсь войти в систему, я получаю ошибку 403, и я не уверен, что является причиной этого... может быть, я что-то упустил в тесте? Я успешно могу войти в систему на моем развернутом приложении.
Сообщение об ошибке:
======================================================================
FAIL: test_user_login_POST (jwt_auth.tests.TestUsers)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/jz/Development/BetterCred/jwt_auth/tests.py", line 32, in test_user_login_POST
self.assertEqual(response.status_code, 202)
AssertionError: 403 != 202
----------------------------------------------------------------------
Ran 3 tests in 1.416s
Тест:
def setUp(self):
User.objects.create(
username = 'JohnnyBoy',
password = 'pass123!',
email = "email@gmail.com",
first_name = "John",
last_name = "Smith",
)
def test_user_login_POST(self):
req_url = reverse('user-login')
login_details = {
'username': 'JohnnyBoy',
'password': 'pass123!'
}
response = self.client.post(req_url, login_details, content_type="application/json")
print(response)
self.assertEqual(response.status_code, 202)
View (я добавил код=404, чтобы проверить, попадает ли мой тест в эту точку, но похоже, что нет):
class LoginView(APIView):
# POST - Login a user and return a token
def post(self, request):
username = request.data.get('username')
password = request.data.get('password')
try:
user_to_login = User.objects.get(username = username)
except User.DoesNotExist:
raise PermissionDenied('Invalid credentials.', code = 404)
if not User.check_password(user_to_login, password):
raise PermissionDenied('Invalid credentials.', code = 404)
exp_time = datetime.now() + timedelta(weeks = 1)
token = jwt.encode(
{
'sub': user_to_login.id,
'exp': int(exp_time.strftime('%s')),
},
settings.SECRET_KEY,
'HS256'
)
return Response(
{
'message': f'Welcome back {user_to_login.first_name}!',
'token': token,
},
status.HTTP_202_ACCEPTED
)
Буду признателен за любые предложения или советы!
Вы не можете просто request.data.get
получить json
POST
запрос. Вы должны сначала обработать данные.
Изменение:
username = request.data.get('username')
password = request.data.get('password')
К этому:
import json
from django.http import JsonResponse
(...)
try:
json_data = json.loads(request.body)
except json.JSONDecodeError:
return JsonResponse({"error": "Content is not JSON serializable"}, status=400)
username = json_data.get('username')
password = json_data.get('password')
После дальнейшего чтения документации по тестированию Django я узнал, что я не могу просто установить пароль пользователя, которого я создал для тестирования, напрямую, используя 'password': 'pass123!', а вместо этого должен использовать .set_password(), поскольку пароль должен храниться в правильно хэшированном формате.
Ниже приведен фрагмент соответствующей документации Django для тех, кто столкнется с подобной проблемой в будущем!:
Помните, что если вы хотите, чтобы у вашего тестового пользователя был пароль, вы не можете установить пароль пользователя путем непосредственной установки атрибута password - вы должны использовать функцию set_password(), чтобы сохранить правильно хэшированный пароль. В качестве альтернативы вы можете использовать вспомогательный метод create_user() для создания нового пользователя с правильно хэшированным паролем.