#29098: Allow assertRedirects to handle regex matches.
-------------------------------------+-------------------------------------
Reporter: Dan J | Owner: nobody
Strohl |
Type: | Status: new
Cleanup/optimization |
Component: Testing | Version: 1.11
framework |
Severity: Normal | Keywords: unittest redirect
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
or, perhaps, allow it to use the patterns from the url's file. Either
way, the issue is that I have a view that gets a request, looks at it, and
redirects it to a url such as /labs/12345/running, or /labs/4567/start.
this is a similar pattern to what is recommended and used in the admin, so
I don't think I am doing something weird here, but I may not know what the
redirect url will look like before I send the request (if I am sending
something like /labs/new, and it returns /labs/12345 for example).
as a hack, I did this:
{{{
#!div style="font-size: 80%"
Code highlighting:
{{{#!python
def fix_response_for_test(response, re_pattern, replace, count=0,
flags=0):
if hasattr(response, 'redirect_chain'):
url, status_code = response.redirect_chain[-1]
tmp_replaced = re.search(re_pattern, url, flags=flags)
new_url = re.sub(re_pattern, replace, url, count=count,
flags=flags)
# print('redirect - new: %s' % new_url)
response.redirect_chain[-1] = (new_url, status_code)
else:
# Not a followed redirect
url = response.url
scheme, netloc, path, query, fragment = urlsplit(url)
# Prepend the request path to handle relative path redirects.
if not path.startswith('/'):
url = urljoin(response.request['PATH_INFO'], url)
tmp_replaced = re.search(re_pattern, url, flags=flags)
new_url = re.sub(re_pattern, replace, url, count=count,
flags=flags)
# print('no redirected - new: %s' % new_url)
response['Location'] = new_url
return tmp_replaced.group(0)
}}}
}}}
and is run like this:
{{{
#!div style="font-size: 80%"
Code highlighting:
{{{#!python
session_id = fix_response_for_test(response, UUID_REGEX, '<uuid>')
redirect_url = '/lab/<uuid>/error/'
with self.subTest('%s - response url' % name):
self.assertRedirects(response, redirect_url,
fetch_redirect_response=False, msg_prefix=tmp_msg)
test_session = Sessions.objects.get(session_id=session_id)
# do more testing on the session object to make sure it was
created correctly.
}}}
}}}
The returning the pulled content is nice, but probably not required as I
COULD simply build two tests, one to check the redirect, and another to
test the actual session object.
If I had my druthers, I would love to see something like:
{{{
#!div style="font-size: 80%"
Code highlighting:
{{{#!python
args_obj=None
self.assertRedirects(response, r'/labs/(?P<foobar>.+)/(.+)',
get_args=args_obj)
# assuming this passes the assertion, args_obj then would ==
# args_obj = {
# 'args': ['list of un-named items'],
# 'kwargs': {dict of kwargs}
}}}
}}}
This coudl also be approached by adding the ability to get this kind of
thing directly from the response object, along the lines of:
{{{
#!div style="font-size: 80%"
Code highlighting:
{{{#!python
(assuming the request was '/labs/12344/test_page
> my_response.seed_url()
' '//labs//(?P<foobar>.+)//(.+)' # which could then be matched in a
redirect url match.
> my_response.url_params(1)
'test_page'
> my_response.url_params('foobar')
'12344'
}}}
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/29098>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/050.34efc0ad438354ebf1af22af2ed6a1e2%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.