[Django] #35481: assertTemplateUsed false positive

8 views
Skip to first unread message

Django

unread,
May 26, 2024, 3:24:32 PM5/26/24
to django-...@googlegroups.com
#35481: assertTemplateUsed false positive
---------------------------------------------+------------------------
Reporter: Shiva Kumar | Owner: nobody
Type: Bug | Status: new
Component: Testing framework | Version: dev
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
---------------------------------------------+------------------------
assertTemplateUsed can be used
[https://docs.djangoproject.com/en/dev/topics/testing/tools/#django.test.SimpleTestCase.assertTemplateUsed
both as a function and as a context manager].
When used as a function, both `request` and `template_name` should be
passed. When used as a context manager, only `template_name` needs to be
passed.

Consider a test case,
{{{
def test_template_used(self):
resp = self.client.get("/home/")
self.assertEqual(resp.status_code, 200)
self.assertTemplateUsed("home.html")
}}}
In this case, the last statement returns a context manager object,
resulting in no assertion checks, and the test case passes. The test case
passed even if the wrong `template_name` is provided.

This scenario arises solely because `assertTemplateUsed` assumes that
[https://github.com/django/django/blob/main/django/test/testcases.py#L750-L751
when only `template_name` is provided, it must have been used as a context
manager].

Had there been a keyword-only argument restriction, this scenario wouldn't
have arisen.

This bug is applicable to `assertTemplateNotUsed` as well.

If the bug is deemed valid, please assign the ticket to me.
--
Ticket URL: <https://code.djangoproject.com/ticket/35481>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
May 27, 2024, 10:27:05 AM5/27/24
to django-...@googlegroups.com
#35481: assertTemplateUsed false positive
-----------------------------------+--------------------------------------
Reporter: Shiva Kumar | Owner: nobody
Type: Bug | Status: closed
Component: Testing framework | Version: dev
Severity: Normal | Resolution: invalid
Keywords: | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-----------------------------------+--------------------------------------
Changes (by Natalia Bidart):

* resolution: => invalid
* status: new => closed

Comment:

Hello Shiva Kumar,

Thank you for your report, and helping make Django better.

Django's testing framework, like many parts of the framework, relies
heavily on the dynamic nature of Python. This dynamic nature means that
functions can often be used in multiple ways, as you pointed out. While
Django provides a lot of built-in validations and utilities, it cannot
cover every possible misuse case. Enforcing stricter checks or keyword-
only arguments could reduce some flexibility and introduce backward
compatibility issues.

In my opinion, the docs are clear about the correct usage of
`assertTemplateUsed`. It says:

> response must be a response instance returned by the test client.

Given the above, I'll close the ticket accordingly, but if you disagree,
you can consider starting a new conversation on the
[https://forum.djangoproject.com/c/internals/5 Django Forum], where you'll
reach a wider audience.
--
Ticket URL: <https://code.djangoproject.com/ticket/35481#comment:1>
Reply all
Reply to author
Forward
0 new messages