diff options
Diffstat (limited to '')
| -rw-r--r-- | tests/forms/test_forms.py (renamed from tests/test_forms.py) | 69 |
1 files changed, 44 insertions, 25 deletions
diff --git a/tests/test_forms.py b/tests/forms/test_forms.py index fc16858..6fe1849 100644 --- a/tests/test_forms.py +++ b/tests/forms/test_forms.py @@ -2,19 +2,25 @@ # # SPDX-License-Identifier: BSD-3-Clause -from unittest.mock import patch +from unittest.mock import Mock import pytest from flask import Flask from werkzeug.datastructures import MultiDict -from webmentions_ssg.forms import EndpointForm +from webmentions_ssg.forms import AdminActionForm, EndpointForm, LoginForm 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.fixture(autouse=True) +def public_urls(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr( + "webmentions_ssg.forms.validators.is_public_url", Mock(return_value=True) + ) + + @pytest.mark.parametrize( ("form_data", "invalid_field", "expected_error"), [ @@ -37,12 +43,6 @@ VALID_TARGET = "https://dennisfink.me/blog/example/" 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.", @@ -60,31 +60,18 @@ VALID_TARGET = "https://dennisfink.me/blog/example/" "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, +def test_endpoint_form_rejects_invalid_field_syntax( + app: Flask, form_data: dict[str, str], invalid_field: str, expected_error: str ) -> 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] + 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( @@ -94,3 +81,35 @@ def test_endpoint_form_accepts_valid_data(app: Flask) -> None: assert form.validate() assert form.errors == {} + + +@pytest.mark.parametrize( + ("form_data", "invalid_field"), + [ + pytest.param({"password": "secret"}, "username", id="username-required"), + pytest.param({"username": "admin"}, "password", id="password-required"), + ], +) +def test_login_form_requires_credentials( + app: Flask, form_data: dict[str, str], invalid_field: str +) -> None: + with app.test_request_context("/login", method="POST"): + form = LoginForm(formdata=MultiDict(form_data), meta={"csrf": False}) + + assert not form.validate() + assert "This field is required." in form.errors[invalid_field] + + +def test_login_form_accepts_credentials(app: Flask) -> None: + with app.test_request_context("/login", method="POST"): + form = LoginForm( + formdata=MultiDict({"username": "admin", "password": "secret"}), + meta={"csrf": False}, + ) + assert form.validate() + + +def test_admin_action_form_accepts_submission(app: Flask) -> None: + with app.test_request_context(method="POST"): + form = AdminActionForm(meta={"csrf": False}) + assert form.validate() |
