File size: 2,084 Bytes
7dba92c
 
 
 
 
 
 
70e641d
 
 
 
 
 
 
61cd0db
 
70e641d
7dba92c
70e641d
 
 
 
61cd0db
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Configuración de pruebas: BD temporal, secreto determinista y cero herencia del entorno.

Las pruebas describen el comportamiento POR DEFECTO del servicio, así que no pueden leer el
`.env` del desarrollador: en CI ese fichero no existe y en local trae lo que cada uno tenga
puesto. Con `MORPHOS_IGNORAR_ENV_FILE` la config lo salta y sólo obedece a lo que se fije aquí,
que es lo que hace reproducible el resultado entre máquinas.
"""

from __future__ import annotations

import os
import tempfile
from pathlib import Path

import pytest

# Debe fijarse ANTES de importar la config (que se cachea con lru_cache).
os.environ["MORPHOS_IGNORAR_ENV_FILE"] = "1"
_TMP = Path(tempfile.mkdtemp(prefix="morphos_test_"))
os.environ.setdefault("MORPHOS_DB_PATH", str(_TMP / "test.db"))
os.environ.setdefault("MORPHOS_SESSION_SECRET", "x" * 40)
os.environ.setdefault("MORPHOS_ENTORNO", "dev")


@pytest.fixture(autouse=True)
def _limitador_limpio():
    """Vacía el contador de rate limiting entre pruebas.

    El limitador es un almacén en memoria de proceso (`security/rate_limit.py`) compartido por
    toda la suite, y el TestClient sale siempre desde la misma IP ('testclient'), así que los
    contadores se acumulan de una prueba a otra: `limite_login` (5/minute) cubre también
    `/api/auth/registro`, y bastaba añadir pruebas de alta para que otras empezaran a recibir
    429 según el ORDEN en que corrieran. Resetear aquí hace que cada prueba mida lo suyo.
    """
    from app.security.rate_limit import limiter

    limiter.reset()
    yield
    limiter.reset()


@pytest.fixture
def alta_abierta(monkeypatch):
    """Abre el alta de cuentas para las pruebas que sólo necesitan una sesión.

    El alta está CERRADA por defecto y así se queda en el resto de la suite: eso es lo que
    comprueban las pruebas de `test_registro_cerrado.py`. Las que sólo quieren llegar a otro
    endpoint piden este fixture en vez de repetir el monkeypatch.
    """
    from app.config import obtener_config

    monkeypatch.setattr(obtener_config(), "registro_abierto", True)