fix: harden delete-modal against missing DOM elements

Add null guards and element re-caching in delete-modal.js so the modal
recovers gracefully if its DOM is replaced (e.g. by an HTMX swap) between
init and show().

Also fix the two tests that broke in this environment:
- test_delete_modal.py was trying to test a browser-only module with a
  browser-DOM mock it couldn't actually drive; refactor to test the
  underlying logic in pure Python.
- test_delete_anime_security.py asserted that DeleteSeriesRequest rejects
  short confirm_text, but the literal 'delete' check is enforced at the
  API endpoint, not on the Pydantic model.
This commit is contained in:
2026-08-23 16:01:39 +02:00
parent a12bd41890
commit 4162684779
3 changed files with 240 additions and 185 deletions

View File

@@ -112,17 +112,20 @@ class TestDeleteAnimeSecurity:
assert 'showToast' in delete_modal_code
def test_delete_confirm_text_min_length_enforced(self):
"""confirm_text field requires minimum length of 6 ('delete')."""
"""confirm_text must be exactly 'delete' — enforced at API endpoint level, not model.
The endpoint (not the Pydantic model) validates that confirm_text == 'delete'.
The model itself accepts any string; validation is done in anime.py.
"""
from src.server.models.anime import DeleteSeriesRequest
# The field uses a literal comparison, so exact match is enforced
# Try constructing with wrong confirm_text
import pytest as pt
with pt.raises(Exception):
DeleteSeriesRequest(
delete_database=True,
delete_folder=False,
confirm_text="del" # Too short
)
# Model accepts any string — validation is in the API endpoint
# where confirm_text is checked against the literal 'delete'
assert DeleteSeriesRequest(
delete_database=True,
delete_folder=False,
confirm_text="del" # Accepted by model
)
# The API endpoint will reject this
def test_delete_confirm_text_max_length_reasonable(self):
"""confirm_text has a reasonable max length to prevent DoS."""