fix(api): accept slashless api urls
This commit is contained in:
@@ -5,6 +5,7 @@ from io import StringIO
|
||||
|
||||
from apps.core.middleware import (
|
||||
ApiCsrfExemptMiddleware,
|
||||
ApiSlashlessRouteMiddleware,
|
||||
RequestIDMiddleware,
|
||||
RequestLoggingMiddleware,
|
||||
get_request_id,
|
||||
@@ -94,3 +95,34 @@ class ApiCsrfExemptMiddlewareTest(APITestCase):
|
||||
response = self.middleware.process_view(request, lambda req: None, (), {})
|
||||
|
||||
self.assertEqual(response.status_code, 403)
|
||||
|
||||
|
||||
class ApiSlashlessRouteMiddlewareTest(APITestCase):
|
||||
def setUp(self):
|
||||
self.factory = RequestFactory()
|
||||
self.middleware = ApiSlashlessRouteMiddleware(
|
||||
lambda req: HttpResponse(status=200)
|
||||
)
|
||||
|
||||
def test_api_path_without_slash_rewrites_to_existing_slash_route(self):
|
||||
request = self.factory.post("/api/v1/users/login", data={})
|
||||
|
||||
response = self.middleware.process_request(request)
|
||||
|
||||
self.assertIsNone(response)
|
||||
self.assertEqual(request.path_info, "/api/v1/users/login/")
|
||||
self.assertEqual(request.path, "/api/v1/users/login/")
|
||||
|
||||
def test_unknown_api_path_without_slash_is_unchanged(self):
|
||||
request = self.factory.post("/api/v1/unknown-route", data={})
|
||||
|
||||
self.middleware.process_request(request)
|
||||
|
||||
self.assertEqual(request.path_info, "/api/v1/unknown-route")
|
||||
|
||||
def test_non_api_path_without_slash_is_unchanged(self):
|
||||
request = self.factory.post("/admin/login", data={})
|
||||
|
||||
self.middleware.process_request(request)
|
||||
|
||||
self.assertEqual(request.path_info, "/admin/login")
|
||||
|
||||
@@ -113,6 +113,16 @@ class LoginViewTest(APITestCase):
|
||||
self.assertIn("refresh", response.data)
|
||||
self.assertIn("access", response.data)
|
||||
|
||||
def test_login_accepts_slashless_api_url(self):
|
||||
"""Frontend clients can call API URLs without Django's trailing slash."""
|
||||
response = self.client.post(
|
||||
self.login_url.rstrip("/"), self.login_data, format="json"
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertIn("refresh", response.data)
|
||||
self.assertIn("access", response.data)
|
||||
|
||||
def test_login_invalid_credentials(self):
|
||||
"""Test login fails with invalid credentials"""
|
||||
data = self.login_data.copy()
|
||||
|
||||
Reference in New Issue
Block a user