- Replace no-network-testing.patch with the upstream solution

2402-dev_server.patch from gh#pallets/werkzeug#2402.
- Add moved_root.patch to make test test_exclude_patterns with
  different PYTHONPATH.

OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-Werkzeug?expand=0&rev=64
This commit is contained in:
Matej Cepl 2022-04-28 21:40:28 +00:00 committed by Git OBS Bridge
parent 3111f3adce
commit 080d8db090
5 changed files with 215 additions and 57 deletions

165
2402-dev_server.patch Normal file
View File

@ -0,0 +1,165 @@
From 9d83ed43027b6538efde5b708395fed36700d970 Mon Sep 17 00:00:00 2001
From: David Lord <davidism@gmail.com>
Date: Mon, 25 Apr 2022 11:08:09 -0700
Subject: [PATCH] mark test that use the dev_server
---
setup.cfg | 2 ++
tests/middleware/test_http_proxy.py | 1 +
tests/test_debug.py | 1 +
tests/test_serving.py | 15 +++++++++++++++
4 files changed, 19 insertions(+)
--- a/setup.cfg
+++ b/setup.cfg
@@ -44,6 +44,8 @@ where = src
testpaths = tests
filterwarnings =
error
+markers =
+ dev_server: tests that start the dev server
[coverage:run]
branch = True
--- a/tests/middleware/test_http_proxy.py
+++ b/tests/middleware/test_http_proxy.py
@@ -6,6 +6,7 @@ from werkzeug.wrappers import Response
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
+@pytest.mark.dev_server
def test_http_proxy(standard_app):
app = ProxyMiddleware(
Response("ROOT"),
--- a/tests/test_debug.py
+++ b/tests/test_debug.py
@@ -247,6 +247,7 @@ def test_get_machine_id():
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
@pytest.mark.parametrize("crash", (True, False))
+@pytest.mark.dev_server
def test_basic(dev_server, crash):
c = dev_server(use_debugger=True)
r = c.request("/crash" if crash else "")
--- a/tests/test_serving.py
+++ b/tests/test_serving.py
@@ -35,6 +35,7 @@ from werkzeug.test import stream_encode_
),
],
)
+@pytest.mark.dev_server
def test_server(tmp_path, dev_server, kwargs: dict):
if kwargs.get("hostname") == "unix":
kwargs["hostname"] = f"unix://{tmp_path / 'test.sock'}"
@@ -46,6 +47,7 @@ def test_server(tmp_path, dev_server, kw
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
+@pytest.mark.dev_server
def test_untrusted_host(standard_app):
r = standard_app.request(
"http://missing.test:1337/index.html#ignore",
@@ -59,6 +61,7 @@ def test_untrusted_host(standard_app):
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
+@pytest.mark.dev_server
def test_double_slash_path(standard_app):
r = standard_app.request("//double-slash")
assert "double-slash" not in r.json["HTTP_HOST"]
@@ -66,6 +69,7 @@ def test_double_slash_path(standard_app)
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
+@pytest.mark.dev_server
def test_500_error(standard_app):
r = standard_app.request("/crash")
assert r.status == 500
@@ -73,6 +77,7 @@ def test_500_error(standard_app):
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
+@pytest.mark.dev_server
def test_ssl_dev_cert(tmp_path, dev_server):
client = dev_server(ssl_context=make_ssl_devcert(tmp_path))
r = client.request()
@@ -80,6 +85,7 @@ def test_ssl_dev_cert(tmp_path, dev_serv
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
+@pytest.mark.dev_server
def test_ssl_object(dev_server):
client = dev_server(ssl_context="custom")
r = client.request()
@@ -91,6 +97,7 @@ def test_ssl_object(dev_server):
@pytest.mark.skipif(
os.name == "nt" and "CI" in os.environ, reason="unreliable on Windows during CI"
)
+@pytest.mark.dev_server
def test_reloader_sys_path(tmp_path, dev_server, reloader_type):
"""This tests the general behavior of the reloader. It also tests
that fixing an import error triggers a reload, not just Python
@@ -129,6 +136,7 @@ def test_exclude_patterns(find):
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
+@pytest.mark.dev_server
def test_wrong_protocol(standard_app):
"""An HTTPS request to an HTTP server doesn't show a traceback.
https://github.com/pallets/werkzeug/pull/838
@@ -142,6 +150,7 @@ def test_wrong_protocol(standard_app):
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
+@pytest.mark.dev_server
def test_content_type_and_length(standard_app):
r = standard_app.request()
assert "CONTENT_TYPE" not in r.json
@@ -159,6 +168,7 @@ def test_port_is_int():
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
@pytest.mark.parametrize("send_length", [False, True])
+@pytest.mark.dev_server
def test_chunked_request(monkeypatch, dev_server, send_length):
stream, length, boundary = stream_encode_multipart(
{
@@ -200,6 +210,7 @@ def test_chunked_request(monkeypatch, de
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
+@pytest.mark.dev_server
def test_multiple_headers_concatenated(standard_app):
"""A header key can be sent multiple times. The server will join all
the values with commas.
@@ -224,6 +235,7 @@ def test_multiple_headers_concatenated(s
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
+@pytest.mark.dev_server
def test_multiline_header_folding(standard_app):
"""A header value can be split over multiple lines with a leading
tab. The server will remove the newlines and preserve the tabs.
@@ -242,6 +254,7 @@ def test_multiline_header_folding(standa
@pytest.mark.parametrize("endpoint", ["", "crash"])
+@pytest.mark.dev_server
def test_streaming_close_response(dev_server, endpoint):
"""When using HTTP/1.0, chunked encoding is not supported. Fall
back to Connection: close, but this allows no reliable way to
@@ -252,6 +265,7 @@ def test_streaming_close_response(dev_se
assert r.data == "".join(str(x) + "\n" for x in range(5)).encode()
+@pytest.mark.dev_server
def test_streaming_chunked_response(dev_server):
"""When using HTTP/1.1, use Transfer-Encoding: chunked for streamed
responses, since it can distinguish the end of the response without
@@ -265,6 +279,7 @@ def test_streaming_chunked_response(dev_
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
+@pytest.mark.dev_server
def test_streaming_chunked_truncation(dev_server):
"""When using HTTP/1.1, chunked encoding allows the client to detect
content truncated by a prematurely closed connection.

34
moved_root.patch Normal file
View File

@ -0,0 +1,34 @@
---
tests/test_serving.py | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
--- a/tests/test_serving.py
+++ b/tests/test_serving.py
@@ -10,6 +10,7 @@ from pathlib import Path
import pytest
+import werkzeug
from werkzeug import run_simple
from werkzeug._reloader import _find_stat_paths
from werkzeug._reloader import _find_watchdog_paths
@@ -127,12 +128,15 @@ def test_windows_get_args_for_reloading(
@pytest.mark.parametrize("find", [_find_stat_paths, _find_watchdog_paths])
def test_exclude_patterns(find):
- # Imported paths under sys.prefix will be included by default.
+ # Dont use sys.prefix, we may have redefined PYTHONPATH and
+ # libraries elsewhere.
+ cur_prefix = str(Path(werkzeug.__file__).parents[1])
+ # Imported paths under cur_prefix will be included by default.
paths = find(set(), set())
- assert any(p.startswith(sys.prefix) for p in paths)
+ assert any(p.startswith(cur_prefix) for p in paths)
# Those paths should be excluded due to the pattern.
- paths = find(set(), {f"{sys.prefix}*"})
- assert not any(p.startswith(sys.prefix) for p in paths)
+ paths = find(set(), {f"{str(cur_prefix)}*"})
+ assert not any(p.startswith(cur_prefix) for p in paths)
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")

View File

@ -1,53 +0,0 @@
---
pytest.ini | 3 +++
tests/test_serving.py | 5 +++++
2 files changed, 8 insertions(+)
--- /dev/null
+++ b/pytest.ini
@@ -0,0 +1,3 @@
+[pytest]
+markers =
+ network: tests requiring network connection
--- a/tests/test_serving.py
+++ b/tests/test_serving.py
@@ -118,6 +118,7 @@ def test_windows_get_args_for_reloading(
assert rv == argv
+@pytest.mark.network
@pytest.mark.parametrize("find", [_find_stat_paths, _find_watchdog_paths])
def test_exclude_patterns(find):
# Imported paths under sys.prefix will be included by default.
@@ -157,6 +158,7 @@ def test_port_is_int():
run_simple("127.0.0.1", "5000", None)
+@pytest.mark.network
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
@pytest.mark.parametrize("send_length", [False, True])
def test_chunked_request(monkeypatch, dev_server, send_length):
@@ -241,6 +243,7 @@ def test_multiline_header_folding(standa
assert data["HTTP_XYZ"] == "first\tsecond\tthird"
+@pytest.mark.network
@pytest.mark.parametrize("endpoint", ["", "crash"])
def test_streaming_close_response(dev_server, endpoint):
"""When using HTTP/1.0, chunked encoding is not supported. Fall
@@ -252,6 +255,7 @@ def test_streaming_close_response(dev_se
assert r.data == "".join(str(x) + "\n" for x in range(5)).encode()
+@pytest.mark.network
def test_streaming_chunked_response(dev_server):
"""When using HTTP/1.1, use Transfer-Encoding: chunked for streamed
responses, since it can distinguish the end of the response without
@@ -264,6 +268,7 @@ def test_streaming_chunked_response(dev_
assert r.data == "".join(str(x) + "\n" for x in range(5)).encode()
+@pytest.mark.network
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
def test_streaming_chunked_truncation(dev_server):
"""When using HTTP/1.1, chunked encoding allows the client to detect

View File

@ -1,3 +1,11 @@
-------------------------------------------------------------------
Thu Apr 28 16:25:37 UTC 2022 - Matej Cepl <mcepl@suse.com>
- Replace no-network-testing.patch with the upstream solution
2402-dev_server.patch from gh#pallets/werkzeug#2402.
- Add moved_root.patch to make test test_exclude_patterns with
different PYTHONPATH.
-------------------------------------------------------------------
Tue Apr 19 18:54:06 UTC 2022 - Matej Cepl <mcepl@suse.com>

View File

@ -27,9 +27,13 @@ License: BSD-3-Clause
Group: Development/Languages/Python
URL: https://werkzeug.palletsprojects.com
Source: https://files.pythonhosted.org/packages/source/W/Werkzeug/Werkzeug-%{version}.tar.gz
# PATCH-FIX-UPSTREAM no-network-testing.patch gh#pallets/werkzeug#2393 mcepl@suse.com
# mark tests which require network access
Patch0: no-network-testing.patch
# PATCH-FIX-UPSTREAM 2402-dev_server.patch gh#pallets/werkzeug#2393 mcepl@suse.com
# upstream solution to mark tests which require development server
# from https://github.com/pallets/werkzeug/pull/2402
Patch0: 2402-dev_server.patch
# PATCH-FIX-UPSTREAM moved_root.patch bsc#[0-9]+ mcepl@suse.com
# this patch makes things totally awesome
Patch1: moved_root.patch
BuildRequires: %{python_module cryptography}
BuildRequires: %{python_module ephemeral-port-reserve}
BuildRequires: %{python_module hypothesis}
@ -83,7 +87,7 @@ sed -i "1d" examples/manage-{i18nurls,simplewiki,shorty,couchy,cupoftee,webpylik
export LANG=en_US.UTF-8
export PYTHONDONTWRITEBYTECODE=1
# workaround pytest 6.2 (like https://github.com/pallets/werkzeug/commit/16718f461d016b88b6457d3ef63816b7df1f0d1f, but shorter)
%pytest -k 'not (network or test_reloader_sys_path or test_chunked_encoding or test_basic or test_server or test_ssl or test_http_proxy or test_500_error or test_untrusted_host or test_double_slash_path or test_wrong_protocol or test_content_type_and_length or test_multiple_headers_concatenated or test_multiline_header_folding)'
%pytest -k 'not (dev_server or test_reloader_sys_path or test_chunked_encoding or test_basic or test_server or test_ssl or test_http_proxy or test_500_error or test_untrusted_host or test_double_slash_path or test_wrong_protocol or test_content_type_and_length or test_multiple_headers_concatenated or test_multiline_header_folding)'
%files %{python_files}
%license LICENSE.rst