1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
from unittest.mock import patch
import pytest
from flask import Flask
from werkzeug.datastructures import MultiDict
from webmentions_ssg.forms import EndpointForm
VALID_SOURCE = "https://source.example/post"
VALID_TARGET = "https://dennisfink.me/blog/example/"
@patch("webmentions_ssg.forms.validators.is_public_url", new=lambda url: True)
@pytest.mark.parametrize(
("form_data", "invalid_field", "expected_error"),
[
pytest.param(
{"target": VALID_TARGET},
"source",
"This field is required.",
id="source-required",
),
pytest.param(
{"source": "not a URL", "target": VALID_TARGET},
"source",
"Invalid URL.",
id="source-url",
),
pytest.param(
{"source": "ftp://source.example/post", "target": VALID_TARGET},
"source",
"source must begin with http or https",
id="source-scheme",
),
pytest.param(
{"source": VALID_TARGET, "target": VALID_TARGET},
"source",
None,
id="source-not-equal-to-target",
),
pytest.param(
{"source": VALID_SOURCE},
"target",
"This field is required.",
id="target-required",
),
pytest.param(
{"source": VALID_SOURCE, "target": "not a URL"},
"target",
"Invalid URL.",
id="target-url",
),
pytest.param(
{"source": VALID_SOURCE, "target": "ftp://dennisfink.me/blog/example/"},
"target",
"target must begin with http or https",
id="target-scheme",
),
pytest.param(
{"source": VALID_SOURCE, "target": "https://example.com/post"},
"target",
None,
id="target-allowed-hostname",
),
],
)
def test_endpoint_form_rejects_invalid_data(
app: Flask,
form_data: dict[str, str],
invalid_field: str,
expected_error: str | None,
) -> None:
with app.test_request_context("/endpoint", method="POST"):
form = EndpointForm(formdata=MultiDict(form_data), meta={"csrf": False})
assert not form.validate()
assert invalid_field in form.errors
if expected_error is not None:
assert expected_error in form.errors[invalid_field]
@patch("webmentions_ssg.forms.validators.is_public_url", new=lambda url: True)
def test_endpoint_form_accepts_valid_data(app: Flask) -> None:
with app.test_request_context("/endpoint", method="POST"):
form = EndpointForm(
formdata=MultiDict({"source": VALID_SOURCE, "target": VALID_TARGET}),
meta={"csrf": False},
)
assert form.validate()
assert form.errors == {}
|