update tests for new werkzeug client (#3827)

Flask's client.open mirrors Werkzeug's for processing an existing
environ.

Always test with latest code for other Pallets projects. This will
be changed back once the new versions are released.
This commit is contained in:
David Lord 2020-11-04 18:00:21 -08:00 committed by GitHub
parent 373f0dd82e
commit 7a444c5dab
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 33 deletions

View file

@ -23,7 +23,6 @@ jobs:
- {name: '3.7', python: '3.7', os: ubuntu-latest, tox: py37} - {name: '3.7', python: '3.7', os: ubuntu-latest, tox: py37}
- {name: '3.6', python: '3.6', os: ubuntu-latest, tox: py36} - {name: '3.6', python: '3.6', os: ubuntu-latest, tox: py36}
- {name: 'PyPy', python: pypy3, os: ubuntu-latest, tox: pypy3} - {name: 'PyPy', python: pypy3, os: ubuntu-latest, tox: pypy3}
- {name: Version Range, python: '3.9', os: ubuntu-latest, tox: 'devel'}
- {name: Docs, python: '3.9', os: ubuntu-latest, tox: docs} - {name: Docs, python: '3.9', os: ubuntu-latest, tox: docs}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2

View file

@ -1,9 +1,11 @@
from contextlib import contextmanager from contextlib import contextmanager
from copy import copy
import werkzeug.test import werkzeug.test
from click.testing import CliRunner from click.testing import CliRunner
from werkzeug.test import Client from werkzeug.test import Client
from werkzeug.urls import url_parse from werkzeug.urls import url_parse
from werkzeug.wrappers import BaseRequest
from . import _request_ctx_stack from . import _request_ctx_stack
from .cli import ScriptInfo from .cli import ScriptInfo
@ -159,39 +161,45 @@ class FlaskClient(Client):
headers = resp.get_wsgi_headers(c.request.environ) headers = resp.get_wsgi_headers(c.request.environ)
self.cookie_jar.extract_wsgi(c.request.environ, headers) self.cookie_jar.extract_wsgi(c.request.environ, headers)
def open(self, *args, **kwargs): def open(
as_tuple = kwargs.pop("as_tuple", False) self, *args, as_tuple=False, buffered=False, follow_redirects=False, **kwargs
buffered = kwargs.pop("buffered", False) ):
follow_redirects = kwargs.pop("follow_redirects", False) # Same logic as super.open, but apply environ_base and preserve_context.
request = None
if ( def copy_environ(other):
not kwargs return {
and len(args) == 1 **self.environ_base,
and isinstance(args[0], (werkzeug.test.EnvironBuilder, dict)) **other,
): "flask._preserve_context": self.preserve_context,
environ = self.environ_base.copy() }
if isinstance(args[0], werkzeug.test.EnvironBuilder): if not kwargs and len(args) == 1:
environ.update(args[0].get_environ()) arg = args[0]
else:
environ.update(args[0])
environ["flask._preserve_context"] = self.preserve_context if isinstance(arg, werkzeug.test.EnvironBuilder):
else: builder = copy(arg)
kwargs.setdefault("environ_overrides", {})[ builder.environ_base = copy_environ(builder.environ_base or {})
"flask._preserve_context" request = builder.get_request()
] = self.preserve_context elif isinstance(arg, dict):
kwargs.setdefault("environ_base", self.environ_base) request = EnvironBuilder.from_environ(
arg, app=self.application, environ_base=copy_environ({})
).get_request()
elif isinstance(arg, BaseRequest):
request = copy(arg)
request.environ = copy_environ(request.environ)
if request is None:
kwargs["environ_base"] = copy_environ(kwargs.get("environ_base", {}))
builder = EnvironBuilder(self.application, *args, **kwargs) builder = EnvironBuilder(self.application, *args, **kwargs)
try: try:
environ = builder.get_environ() request = builder.get_request()
finally: finally:
builder.close() builder.close()
return Client.open( return super().open(
self, request,
environ,
as_tuple=as_tuple, as_tuple=as_tuple,
buffered=buffered, buffered=buffered,
follow_redirects=follow_redirects, follow_redirects=follow_redirects,

View file

@ -327,9 +327,9 @@ def test_modified_url_encoding(app, client):
def index(): def index():
return flask.request.args["foo"] return flask.request.args["foo"]
rv = client.get("/?foo=정상처리".encode("euc-kr")) rv = client.get("/", query_string={"foo": "정상처리"}, charset="euc-kr")
assert rv.status_code == 200 assert rv.status_code == 200
assert rv.data == "정상처리".encode() assert rv.get_data(as_text=True) == "정상처리"
def test_json_key_sorting(app, client): def test_json_key_sorting(app, client):

11
tox.ini
View file

@ -1,7 +1,6 @@
[tox] [tox]
envlist = envlist =
py{39,38,37,36,py3} py{39,38,37,36,py3}
py38-devel
style style
docs docs
skip_missing_interpreters = true skip_missing_interpreters = true
@ -10,11 +9,11 @@ skip_missing_interpreters = true
deps = deps =
-r requirements/tests.txt -r requirements/tests.txt
devel: https://github.com/pallets/werkzeug/archive/master.tar.gz https://github.com/pallets/werkzeug/archive/master.tar.gz
devel: https://github.com/pallets/markupsafe/archive/master.tar.gz https://github.com/pallets/markupsafe/archive/master.tar.gz
devel: https://github.com/pallets/jinja/archive/master.tar.gz https://github.com/pallets/jinja/archive/master.tar.gz
devel: https://github.com/pallets/itsdangerous/archive/master.tar.gz https://github.com/pallets/itsdangerous/archive/master.tar.gz
devel: https://github.com/pallets/click/archive/master.tar.gz https://github.com/pallets/click/archive/master.tar.gz
commands = commands =
pip install -q -e examples/tutorial[test] pip install -q -e examples/tutorial[test]