"""
Lectura del agente de usuario.

La regla que se prueba acá es la que no se ve: cuando la cadena no se reconoce,
la respuesta es «no sé» y no un nombre plausible. Quien mira la lista de
sesiones usa ese dato para decidir si cerrar una sesión, y un nombre inventado
lo lleva a cerrar la equivocada o a dejar abierta la del intruso.
"""

import pytest

from apps.accounts.services import describe_user_agent

CASES = [
    (
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
        'Chrome/128.0.0.0 Safari/537.36',
        ('Chrome', 'Windows'),
    ),
    (
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
        'Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0',
        ('Edge', 'Windows'),
    ),
    (
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like '
        'Gecko) Version/17.0 Safari/605.1.15',
        ('Safari', 'macOS'),
    ),
    (
        'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, '
        'like Gecko) Version/17.0 Mobile/15E148 Safari/604.1',
        ('Safari', 'iOS'),
    ),
    (
        'Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) '
        'Chrome/128.0.0.0 Mobile Safari/537.36',
        ('Chrome', 'Android'),
    ),
    (
        'Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0',
        ('Firefox', 'Linux'),
    ),
]


@pytest.mark.parametrize(('string', 'expected'), CASES)
def test_it_recognizes_the_usual_browsers(string, expected):
    """
    Edge y Opera se anuncian también como Chrome, y Android menciona Linux.

    Por eso el orden de las coincidencias es parte del comportamiento: leerlas
    en otro orden devolvería «Chrome en Linux» para un Edge en un teléfono.
    """
    assert describe_user_agent(string) == expected


@pytest.mark.parametrize('string', ['', None, 'curl/8.7.1', 'algo-que-nadie-declara/1.0'])
def test_what_is_not_recognized_is_left_without_a_name(string):
    assert describe_user_agent(string) == (None, None)
