#30121 closed Bug (fixed)
assertURLEqual() should coerce URLs built with reverse_lazy()
| Reported by: | Jon Dufresne | Owned by: | nobody |
|---|---|---|---|
| Component: | Testing framework | Version: | 2.2 |
| Severity: | Release blocker | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Calling assertRedirects() now uses the new assertURLEqual(). If a URL is built with reverse_lazy(), assertRedirects() now results in the exception:
Traceback (most recent call last):
... # My project calls assertRedirects()
File "django/django/test/testcases.py", line 383, in assertRedirects
msg_prefix + "Response redirected to '%s', expected '%s'" % (url, expected_url)
File "django/django/test/testcases.py", line 404, in assertURLEqual
normalize(url1), normalize(url2),
File "django/django/test/testcases.py", line 399, in normalize
scheme, netloc, path, params, query, fragment = urlparse(url)
File "/usr/lib64/python3.7/urllib/parse.py", line 367, in urlparse
url, scheme, _coerce_result = _coerce_args(url, scheme)
File "/usr/lib64/python3.7/urllib/parse.py", line 123, in _coerce_args
return _decode_args(args) + (_encode_result,)
File "/usr/lib64/python3.7/urllib/parse.py", line 107, in _decode_args
return tuple(x.decode(encoding, errors) if x else '' for x in args)
File "/usr/lib64/python3.7/urllib/parse.py", line 107, in <genexpr>
return tuple(x.decode(encoding, errors) if x else '' for x in args)
AttributeError: '__proxy__' object has no attribute 'decode'
This does not happen with Django 2.1. Bisected to commit 24959e48d949a20be969f649ece3576dbc7ce422. A reverse_lazy() URL may be used as a class or module attribute to be reused by multiple tests methods.
To solve this, the inner function in assertURLequal() can coerce the url argument using str().
https://github.com/django/django/blob/2.2a1/django/test/testcases.py#L394-L398
PR