From 5b39f70aa14cac635b6084170e9d0bd3f548b911 Mon Sep 17 00:00:00 2001 From: Dennis Fink Date: Mon, 10 Aug 2026 20:00:28 +0200 Subject: test: simplify mocks and localize test fixtures Replace shared HTTPX and DNS fixtures with targeted unittest.mock patches close to the tests that need them. Keep conftest focused on application and client setup, while moving receiver-specific helpers into the receiver test module. --- tests/test_views.py | 72 +++++++++++++++++++++++------------------------------ 1 file changed, 31 insertions(+), 41 deletions(-) (limited to 'tests/test_views.py') diff --git a/tests/test_views.py b/tests/test_views.py index 70ed732..06e546c 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -1,7 +1,6 @@ import uuid -from types import ModuleType +from unittest.mock import Mock, call, patch -import pytest import sqlalchemy as sa from flask import Flask from flask.testing import FlaskClient @@ -18,6 +17,10 @@ def test_endpoint_only_accepts_post( assert response.status_code == 405 +@patch( + "webmentions_ssg.forms.validators.ensure_public_url", + new=lambda url: None, +) def test_endpoint_returns_form_errors( client: FlaskClient, ) -> None: @@ -37,21 +40,16 @@ def test_endpoint_returns_form_errors( assert "target" in errors +@patch( + "webmentions_ssg.forms.validators.ensure_public_url", + new=lambda url: None, +) +@patch("webmentions_ssg.views.verify_webmention") def test_endpoint_creates_webmention( + verify_webmention: Mock, app: Flask, client: FlaskClient, - views_module: ModuleType, - monkeypatch: pytest.MonkeyPatch, - public_dns: None, ) -> None: - queued: list[uuid.UUID] = [] - - monkeypatch.setattr( - views_module, - "verify_webmention", - queued.append, - ) - source = "https://source.example/post" target = "https://dennisfink.me/blog/example/" @@ -77,28 +75,22 @@ def test_endpoint_creates_webmention( identifier = webmention.uuid assert response.headers["Location"].endswith(str(identifier)) - - assert queued == [identifier] + verify_webmention.assert_called_once_with(identifier) +@patch( + "webmentions_ssg.forms.validators.ensure_public_url", + new=lambda url: None, +) +@patch("webmentions_ssg.views.verify_webmention") def test_endpoint_is_idempotent( + verify_webmention: Mock, app: Flask, client: FlaskClient, - views_module: ModuleType, - monkeypatch: pytest.MonkeyPatch, - public_dns: None, ) -> None: - queued: list[uuid.UUID] = [] - - monkeypatch.setattr( - views_module, - "verify_webmention", - queued.append, - ) - data = { - "source": ("https://source.example/post"), - "target": ("https://dennisfink.me/blog/example/"), + "source": "https://source.example/post", + "target": "https://dennisfink.me/blog/example/", } first_response = client.post( @@ -112,7 +104,6 @@ def test_endpoint_is_idempotent( assert first_response.status_code == 201 assert second_response.status_code == 201 - assert first_response.headers["Location"] == second_response.headers["Location"] with app.app_context(): @@ -129,25 +120,22 @@ def test_endpoint_is_idempotent( identifier = webmention.uuid - assert queued == [ - identifier, - identifier, + assert verify_webmention.call_args_list == [ + call(identifier), + call(identifier), ] +@patch( + "webmentions_ssg.forms.validators.ensure_public_url", + new=lambda url: None, +) +@patch("webmentions_ssg.views.verify_webmention") def test_resending_resets_failure_state( + verify_webmention: Mock, app: Flask, client: FlaskClient, - views_module: ModuleType, - monkeypatch: pytest.MonkeyPatch, - public_dns: None, ) -> None: - monkeypatch.setattr( - views_module, - "verify_webmention", - lambda identifier: None, - ) - source = "https://source.example/post" target = "https://dennisfink.me/blog/example/" @@ -184,3 +172,5 @@ def test_resending_resets_failure_state( assert webmention is not None assert webmention.status == "received" assert webmention.failure_reason is None + + verify_webmention.assert_called_once_with(identifier) -- cgit v1.3.1