Files
crochet/conftest.py
T
pablo e76b4b7a9c
CI / test (push) Successful in 1m2s
CI / build (push) Successful in 22s
feat: added SPA support and speed up tests
2026-09-16 16:16:34 +02:00

65 lines
3.0 KiB
Python

import tempfile
import pytest
from django.core.cache import cache
from django.core.management import call_command
from django.test import override_settings
@pytest.fixture(scope='session', autouse=True)
def fast_password_hasher():
"""PBKDF2PasswordHasher (por defecto, ver AUTH_PASSWORD_VALIDATORS) es
deliberadamente lento -es justo lo que lo hace seguro en producción-,
pero eso mismo hace bastante caro cada create_user()/check_password()/
login de los tests: con cientos de ellos (y los de rate limiting, que
encima repiten el login 10-11 veces seguidas) esto es la mayor parte
del tiempo de toda la suite. MD5PasswordHasher no vale para producción,
pero aquí no protege nada real -las contraseñas son literales fijos
como 'a-very-uncommon-pw-1'-, así que no hay ninguna pérdida de
seguridad en usarlo solo para tests."""
with override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.MD5PasswordHasher']):
yield
@pytest.fixture(autouse=True)
def clear_ratelimit_cache():
"""django-ratelimit (ver LOGIN_RATE/REGISTER_RATE/PASSWORD_RESET_RATE en
crochet/views.py) cuenta peticiones en el cache framework de Django, que
-a diferencia de la base de datos- no se resetea solo entre tests; sin
esto, tests de distintos módulos que llaman a la misma vista (login,
registro...) irían sumando al mismo contador y algún test acabaría
recibiendo un 403 por límite alcanzado en vez del resultado que espera,
según en qué orden se ejecuten."""
cache.clear()
yield
@pytest.fixture(scope='session', autouse=True)
def collected_static_files():
"""{% static %} (usado en pattern.html/pattern_detail.html) necesita el
manifest que genera collectstatic cuando STORAGES['staticfiles'] es
CompressedManifestStaticFilesStorage (ver base.py); sin esto,
cualquier test que renderice una de esas plantillas falla con
"Missing staticfiles manifest entry". Se recopila a un directorio
temporal (no al STATIC_ROOT real del proyecto) para no depender de ―ni
tocar― lo que ya haya en config/static/."""
with tempfile.TemporaryDirectory() as static_root:
with override_settings(STATIC_ROOT=static_root):
call_command('collectstatic', interactive=False, verbosity=0)
yield
@pytest.fixture(scope='session', autouse=True)
def isolated_media_root():
"""Los tests que suben imágenes (PatternImage, portada de Pattern...)
escriben de verdad en MEDIA_ROOT; sin aislarlo, se acumulan en la
carpeta media/ real del proyecto de una ejecución a otra, y como
cover_image.py guarda cada variante con un nombre fijo (thumbnail.jpg,
large.jpg) dentro de una carpeta por mes, esas sobras podían chocar con
los nombres que espera un test concreto (ver
PatternCoverImageUploadViewTests) y hacerlo fallar según lo que hubiera
quedado de ejecuciones anteriores."""
with tempfile.TemporaryDirectory() as media_root:
with override_settings(MEDIA_ROOT=media_root):
yield