diff --git a/rest_framework-stubs/test.pyi b/rest_framework-stubs/test.pyi index 271696dbd..cf4ad19cf 100644 --- a/rest_framework-stubs/test.pyi +++ b/rest_framework-stubs/test.pyi @@ -12,6 +12,7 @@ from django.test import testcases from django.test.client import Client as DjangoClient from django.test.client import ClientHandler from django.test.client import RequestFactory as DjangoRequestFactory +from django_stubs_ext import StrOrPromise from rest_framework.authtoken.models import Token from rest_framework.request import Request from rest_framework.response import _MonkeyPatchedResponse @@ -58,29 +59,55 @@ class APIRequestFactory(DjangoRequestFactory): renderer_classes: Any def __init__(self, enforce_csrf_checks: bool = ..., **defaults: Any) -> None: ... def request(self, **kwargs: Any) -> Request: ... # type: ignore[override] - def get(self, path: str, data: _GetDataType = ..., **extra: Any) -> Request: ... # type: ignore[override] + def get(self, path: StrOrPromise, data: _GetDataType = ..., **extra: Any) -> Request: ... # type: ignore[override] def post( # type: ignore[override] - self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., **extra: Any + self, + path: StrOrPromise, + data: Any | None = ..., + format: str | None = ..., + content_type: str | None = ..., + **extra: Any, ) -> Request: ... def put( # type: ignore[override] - self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., **extra: Any + self, + path: StrOrPromise, + data: Any | None = ..., + format: str | None = ..., + content_type: str | None = ..., + **extra: Any, ) -> Request: ... def patch( # type: ignore[override] - self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., **extra: Any + self, + path: StrOrPromise, + data: Any | None = ..., + format: str | None = ..., + content_type: str | None = ..., + **extra: Any, ) -> Request: ... def delete( # type: ignore[override] - self, path: str, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., **extra: Any + self, + path: StrOrPromise, + data: Any | None = ..., + format: str | None = ..., + content_type: str | None = ..., + **extra: Any, ) -> Request: ... def options( # type: ignore[override] self, - path: str, + path: StrOrPromise, data: dict[str, str] | str | None = ..., format: str | None = ..., content_type: Any | None = ..., **extra: Any, ) -> Request: ... def generic( # type: ignore[override] - self, method: str, path: str, data: str = ..., content_type: str = ..., secure: bool = ..., **extra: Any + self, + method: str, + path: StrOrPromise, + data: str = ..., + content_type: str = ..., + secure: bool = ..., + **extra: Any, ) -> Request: ... class ForceAuthClientHandler(ClientHandler): @@ -93,10 +120,12 @@ class APIClient(APIRequestFactory, DjangoClient): self, user: AnonymousUser | AbstractBaseUser | None = ..., token: Token | None = ... ) -> None: ... def request(self, **kwargs: Any) -> _MonkeyPatchedResponse: ... # type: ignore[override] - def get(self, path: str, data: _GetDataType = ..., follow: bool = ..., **extra: Any) -> _MonkeyPatchedResponse: ... # type: ignore[override] + def get( # type: ignore[override] + self, path: StrOrPromise, data: _GetDataType = ..., follow: bool = ..., **extra: Any + ) -> _MonkeyPatchedResponse: ... def post( # type: ignore[override] self, - path: str, + path: StrOrPromise, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., @@ -105,7 +134,7 @@ class APIClient(APIRequestFactory, DjangoClient): ) -> _MonkeyPatchedResponse: ... def put( # type: ignore[override] self, - path: str, + path: StrOrPromise, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., @@ -114,7 +143,7 @@ class APIClient(APIRequestFactory, DjangoClient): ) -> _MonkeyPatchedResponse: ... def patch( # type: ignore[override] self, - path: str, + path: StrOrPromise, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., @@ -123,7 +152,7 @@ class APIClient(APIRequestFactory, DjangoClient): ) -> _MonkeyPatchedResponse: ... def delete( # type: ignore[override] self, - path: str, + path: StrOrPromise, data: Any | None = ..., format: str | None = ..., content_type: str | None = ..., @@ -132,7 +161,7 @@ class APIClient(APIRequestFactory, DjangoClient): ) -> _MonkeyPatchedResponse: ... def options( # type: ignore[override] self, - path: str, + path: StrOrPromise, data: dict[str, str] | str = ..., format: str | None = ..., content_type: Any | None = ..., diff --git a/tests/typecheck/test_test.yml b/tests/typecheck/test_test.yml index 304559904..bef46a151 100644 --- a/tests/typecheck/test_test.yml +++ b/tests/typecheck/test_test.yml @@ -25,3 +25,30 @@ reveal_type(self.client) # N: Revealed type is "django.test.client.Client" response = self.client.get('/', format="json") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + +- case: test_requestfactory_http_verbs + main: | + from django.urls import reverse_lazy + from rest_framework import test, status + + url = reverse_lazy("api:example") + request_factory = test.APIRequestFactory() + request_factory.get(url) + request_factory.post(url) + request_factory.put(url) + request_factory.patch(url) + request_factory.delete(url) + request_factory.generic("get", url) + +- case: test_apiclient_http_verbs + main: | + from django.urls import reverse_lazy + from rest_framework import test, status + + url = reverse_lazy("api:example") + client = test.APIClient() + client.get(url) + client.post(url) + client.put(url) + client.patch(url) + client.delete(url)