Skip to content

Commit 7ad6c89

Browse files
committed
Complete type stubs for assertTemplateUsed / assertTemplateNotUsed
mypy 1.20 (python/mypy#20350) changes how it types the return value of functions that return `None`: previously it used `Any` (suppressing downstream errors), now it propagates the actual `None` type. This means the existing `-> None` annotation on `assertTemplateUsed` / `assertTemplateNotUsed` causes type errors when these functions are used as context managers. This adds `@overload` signatures to distinguish the two calling conventions, matching the pattern already used by `assertNumQueries` in this file: * `response` is `HttpResponseBase`: direct assertion, returns `None` * `response` is a `str` (shorthand for `template_name`): returns context manager * `response` is `None` (`template_name` passed by keyword): returns context manager
1 parent 587b65f commit 7ad6c89

File tree

1 file changed

+52
-1
lines changed

1 file changed

+52
-1
lines changed

pytest_django/asserts.py

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,18 +112,69 @@ def assertFormSetError(
112112
msg_prefix: str = ...,
113113
) -> None: ...
114114

115+
# with assertTemplateUsed("template.html"): ... # noqa: ERA001
116+
@overload
117+
def assertTemplateUsed(
118+
response: str,
119+
template_name: None = ...,
120+
msg_prefix: str = ...,
121+
count: int | None = ...,
122+
) -> AbstractContextManager[None]: ...
123+
124+
# with assertTemplateUsed(template_name="template.html"): ... # noqa: ERA001
125+
@overload
126+
def assertTemplateUsed(
127+
response: None = ...,
128+
template_name: str | None = ...,
129+
msg_prefix: str = ...,
130+
count: int | None = ...,
131+
) -> AbstractContextManager[None]: ...
132+
133+
# assertTemplateUsed(response, "template.html") # noqa: ERA001
134+
@overload
135+
def assertTemplateUsed(
136+
response: HttpResponseBase,
137+
template_name: str | None = ...,
138+
msg_prefix: str = ...,
139+
count: int | None = ...,
140+
) -> None: ...
141+
115142
def assertTemplateUsed(
116143
response: HttpResponseBase | str | None = ...,
117144
template_name: str | None = ...,
118145
msg_prefix: str = ...,
119146
count: int | None = ...,
147+
): ...
148+
149+
# with assertTemplateNotUsed("template.html"): ... # noqa: ERA001
150+
@overload
151+
def assertTemplateNotUsed(
152+
response: str,
153+
template_name: None = ...,
154+
msg_prefix: str = ...,
155+
) -> AbstractContextManager[None]: ...
156+
157+
# with assertTemplateNotUsed(template_name="template.html"): ... # noqa: ERA001
158+
@overload
159+
def assertTemplateNotUsed(
160+
response: None = ...,
161+
template_name: str | None = ...,
162+
msg_prefix: str = ...,
163+
) -> AbstractContextManager[None]: ...
164+
165+
# assertTemplateNotUsed(response, "template.html") # noqa: ERA001
166+
@overload
167+
def assertTemplateNotUsed(
168+
response: HttpResponseBase,
169+
template_name: str | None = ...,
170+
msg_prefix: str = ...,
120171
) -> None: ...
121172

122173
def assertTemplateNotUsed(
123174
response: HttpResponseBase | str | None = ...,
124175
template_name: str | None = ...,
125176
msg_prefix: str = ...,
126-
) -> None: ...
177+
): ...
127178

128179
def assertRaisesMessage(
129180
expected_exception: type[Exception],

0 commit comments

Comments
 (0)