"""
El guardia de red es la única garantía automática de que la suite no consume
cuota real de una propiedad real. Si estos tests fallan, deja de haberla.
"""

import socket

import pytest


def test_resolving_an_external_host_fails():
    with pytest.raises(RuntimeError, match='no salen a la red'):
        socket.getaddrinfo('searchconsole.googleapis.com', 443)


def test_connecting_to_an_external_address_fails():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        with pytest.raises(RuntimeError, match='no salen a la red'):
            sock.connect(('142.250.0.1', 443))
    finally:
        sock.close()


@pytest.mark.parametrize('host', ['localhost', '127.0.0.1', 'db', 'redis'])
def test_the_guard_does_not_cut_off_the_local_services(host):
    """
    El guardia no puede romper el acceso a la base de datos ni a la cola.

    Se comprueba el comportamiento y no la función interna: hay un paquete
    llamado `tests` publicado por una dependencia que se impone sobre el
    nuestro al importar, así que importar `tests.conftest` no trae lo esperado.
    """
    try:
        socket.getaddrinfo(host, 80)
    except RuntimeError:
        pytest.fail(f'El guardia bloqueó "{host}", que debe seguir alcanzable')
    except socket.gaierror:
        # No resuelve en este entorno, pero el guardia lo dejó pasar, que es lo
        # que se está verificando.
        pass


def test_the_error_message_says_what_to_do():
    """Un corte sin salida deja al desarrollador adivinando."""
    with pytest.raises(RuntimeError) as excinfo:
        socket.getaddrinfo('ejemplo.com', 80)

    assert 'tests/fixtures/' in str(excinfo.value)
