#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