from app import rate_limit def _origem_unica() -> str: """Cada teste usa uma chave própria — evita que o dict em memória do módulo (compartilhado entre testes) vaze estado de um teste pro outro.""" import uuid return f"teste-{uuid.uuid4()}" def test_nao_bloqueado_sem_nenhuma_falha(): assert rate_limit.bloqueado(_origem_unica()) is False def test_nao_bloqueado_abaixo_do_limite(): origem = _origem_unica() agora = 1_000_000.0 for _ in range(rate_limit.MAX_TENTATIVAS - 1): rate_limit.registrar_falha(origem, agora=agora) assert rate_limit.bloqueado(origem, agora=agora) is False def test_bloqueado_ao_atingir_o_limite(): origem = _origem_unica() agora = 1_000_000.0 for _ in range(rate_limit.MAX_TENTATIVAS): rate_limit.registrar_falha(origem, agora=agora) assert rate_limit.bloqueado(origem, agora=agora) is True def test_falhas_fora_da_janela_nao_contam(): origem = _origem_unica() agora = 1_000_000.0 fora_da_janela = agora - rate_limit.JANELA_SEGUNDOS - 1 for _ in range(rate_limit.MAX_TENTATIVAS): rate_limit.registrar_falha(origem, agora=fora_da_janela) assert rate_limit.bloqueado(origem, agora=agora) is False def test_limpar_reseta_o_historico(): origem = _origem_unica() agora = 1_000_000.0 for _ in range(rate_limit.MAX_TENTATIVAS): rate_limit.registrar_falha(origem, agora=agora) assert rate_limit.bloqueado(origem, agora=agora) is True rate_limit.limpar(origem) assert rate_limit.bloqueado(origem, agora=agora) is False def test_origens_diferentes_nao_se_afetam(): origem_a, origem_b = _origem_unica(), _origem_unica() agora = 1_000_000.0 for _ in range(rate_limit.MAX_TENTATIVAS): rate_limit.registrar_falha(origem_a, agora=agora) assert rate_limit.bloqueado(origem_a, agora=agora) is True assert rate_limit.bloqueado(origem_b, agora=agora) is False