From d311574d82d36bb9a6919198c00b410fdb3fd02b Mon Sep 17 00:00:00 2001 From: Marius Gedminas Date: Tue, 2 Jul 2019 15:08:58 +0300 Subject: [PATCH 1/2] Fix missing HTTP status handling in .reload() Fixes #75. Also adds `tox -e coverage-report` and makes it report paths in src/ rather than .tox/py*/lib/python*/site-packages. --- .coveragerc | 6 ++ .gitignore | 1 + CHANGES.rst | 4 +- src/zope/testbrowser/browser.py | 8 +- src/zope/testbrowser/fixed-bugs.txt | 2 +- src/zope/testbrowser/tests/test_browser.py | 90 +++++++++++++++++++++- tox.ini | 21 +++++ 7 files changed, 122 insertions(+), 10 deletions(-) diff --git a/.coveragerc b/.coveragerc index 0fa417c..d99efb5 100644 --- a/.coveragerc +++ b/.coveragerc @@ -4,3 +4,9 @@ source = zope.testbrowser [report] precision = 2 + +[paths] +source = + src/ + .tox/*/lib/python*/site-packages/ + .tox/pypy*/site-packages/ diff --git a/.gitignore b/.gitignore index b0208e0..00ea937 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ parts dist docs/_build tags +.coverage.* diff --git a/CHANGES.rst b/CHANGES.rst index 49f6a8d..47119fe 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,7 +5,9 @@ CHANGES 5.3.4 (unreleased) ------------------ -- Nothing changed yet. +- Fix a bug where browser.reload() would not follow redirects or raise + exceptions for bad HTTP statuses. See `issue 75 + `_. 5.3.3 (2019-07-02) diff --git a/src/zope/testbrowser/browser.py b/src/zope/testbrowser/browser.py index e7f87a2..7926e79 100644 --- a/src/zope/testbrowser/browser.py +++ b/src/zope/testbrowser/browser.py @@ -192,10 +192,10 @@ def reload(self): if self._response is None: raise BrowserStateError("no URL has yet been .open()ed") - req = self._response.request - with self._preparedRequest(self.url): - resp = self.testapp.request(req) - self._setResponse(resp) + def make_request(args): + return self.testapp.request(self._response.request) + + self._processRequest(self.url, make_request) def goBack(self, count=1): """See zope.testbrowser.interfaces.IBrowser""" diff --git a/src/zope/testbrowser/fixed-bugs.txt b/src/zope/testbrowser/fixed-bugs.txt index c6907d6..ec0e75a 100644 --- a/src/zope/testbrowser/fixed-bugs.txt +++ b/src/zope/testbrowser/fixed-bugs.txt @@ -111,7 +111,7 @@ The problem is that e.g. a simple 403 status raises an exception. This is how it works with a simple open(): - >>> browser.handleErrors=False + >>> browser.handleErrors = False >>> browser.open('http://localhost/set_status.html') >>> print(browser.contents) diff --git a/src/zope/testbrowser/tests/test_browser.py b/src/zope/testbrowser/tests/test_browser.py index 9508e69..a590c51 100644 --- a/src/zope/testbrowser/tests/test_browser.py +++ b/src/zope/testbrowser/tests/test_browser.py @@ -240,10 +240,88 @@ def test_accept_language_header_non_us(): """ +def test_redirect_after_reload(): + r""" + When browser is redirected after a page reload, reload() will follow it + + >>> app = YetAnotherTestApp() + >>> browser = Browser(wsgi_app=app) + >>> html = (b'''\ + ... + ... Please wait, generating the thing + ... + ... ''') + >>> content_type = ('Content-Type', 'text/html; charset=UTF-8') + >>> app.add_response(html, headers=[content_type]) + + >>> redirect = ('Location', 'http://localhost/the_thing') + >>> app.add_response(b"Moved", headers=[redirect], + ... status=302, reason='Found') + >>> app.add_response(b"The Thing", headers=[content_type]) + + Start conversation + + >>> browser.open("http://localhost/") + + After reload, expect the browser to be redirected + + >>> browser.reload() + >>> browser.url + 'http://localhost/the_thing' + >>> browser.contents + 'The Thing' + + """ + + +def test_error_after_reload(): + r""" + When browser is redirected after a page reload, reload() will check + for bad HTTP status codes + + >>> app = YetAnotherTestApp() + >>> browser = Browser(wsgi_app=app) + >>> browser.handleErrors = False + >>> html = (b'''\ + ... + ... Please wait, generating the thing + ... + ... ''') + >>> content_type = ('Content-Type', 'text/html; charset=UTF-8') + >>> app.add_response(html, headers=[content_type]) + + >>> app.add_response(b"These are not the droids you're looking for", + ... status=403, reason='Forbidden') + + Start conversation + + >>> browser.open("http://localhost/") + + After reload, expect the error to be raised + + XXX: I expected + + ## >>> browser.reload() + ## Traceback (most recent call last): + ## ... + ## HTTPError: HTTP Error 403: Forbidden + + which is what the tests in fixed-bugs.txt get, but what I actually get + instead is + + Traceback (most recent call last): + ... + webtest.app.AppError: Bad response: 403 Forbidden + (not 200 OK or 3xx redirect for http://localhost/) + These are not the droids you're looking for + + """ + + def test_reload_after_redirect(): """ When browser is redirected after form submit, reload() will not resubmit - oroginal form data. + original form data. >>> app = YetAnotherTestApp() >>> browser = Browser(wsgi_app=app) @@ -1259,12 +1337,16 @@ def test_additional_hidden_element_with_by_label_search(): def test_suite(): - suite = unittest.TestSuite() - suite.addTests([ + optionflags = ( + doctest.NORMALIZE_WHITESPACE + | doctest.ELLIPSIS + | doctest.IGNORE_EXCEPTION_DETAIL + ) + suite = unittest.TestSuite([ unittest.defaultTestLoader.loadTestsFromName(__name__), doctest.DocTestSuite( checker=zope.testbrowser.tests.helper.checker, - optionflags=doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS), + optionflags=optionflags), ]) return suite diff --git a/tox.ini b/tox.ini index 572fcba..91b1009 100644 --- a/tox.ini +++ b/tox.ini @@ -16,6 +16,27 @@ deps = coverage commands = coverage run -m zope.testrunner --test-path=src {posargs:-vc} +setenv = + COVERAGE_FILE=.coverage.{envname} + +[testenv:coverage-report] +basepython = python3.6 +deps = coverage +skip_install = true +commands = + coverage erase + coverage combine + coverage report -m +setenv = + COVERAGE_FILE=.coverage +parallel_show_output = true +depends = + py27, + py35, + py36, + py37, + pypy, + pypy3, [testenv:docs] basepython = From 8f07706edae5daff4a58f2f87db8febb1dd47eb4 Mon Sep 17 00:00:00 2001 From: Marius Gedminas Date: Tue, 2 Jul 2019 15:13:27 +0300 Subject: [PATCH 2/2] Ha ha actually assert the exception is raised in test --- src/zope/testbrowser/tests/test_browser.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zope/testbrowser/tests/test_browser.py b/src/zope/testbrowser/tests/test_browser.py index a590c51..c29744e 100644 --- a/src/zope/testbrowser/tests/test_browser.py +++ b/src/zope/testbrowser/tests/test_browser.py @@ -309,6 +309,7 @@ def test_error_after_reload(): which is what the tests in fixed-bugs.txt get, but what I actually get instead is + >>> browser.reload() Traceback (most recent call last): ... webtest.app.AppError: Bad response: 403 Forbidden