File size: 3,752 Bytes
fea1bd1 |
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# -*- coding: utf-8 -*-
"""
Testes para o IntelligentCache (cache.py).
"""
import pytest
import time
from unittest.mock import patch
from superezio_enterprise.cache import IntelligentCache
from superezio_enterprise.config import EnterpriseConfig
@pytest.fixture
def mock_config():
"""Fornece uma configuração mockada para isolar os testes do cache."""
return EnterpriseConfig(
cache_max_items=3, # Tamanho pequeno para facilitar testes de evicção
cache_ttl_seconds=10, # TTL curto para testes de expiração
caching_enabled=True # Garante que o cache esteja habilitado
)
@pytest.fixture
def cache_instance(mock_config):
"""Fornece uma instância limpa do IntelligentCache para cada teste."""
# Como IntelligentCache é um singleton, precisamos garantir um estado limpo
# para cada teste, aplicando a configuração mockada.
with patch('superezio_enterprise.cache.CONFIG', mock_config):
instance = IntelligentCache()
instance.max_size = mock_config.cache_max_items
instance.default_ttl = mock_config.cache_ttl_seconds
instance.clear() # Garante que o cache está vazio no início do teste
yield instance
instance.clear() # Limpa após o teste
def test_cache_singleton(cache_instance):
"""Testa se o IntelligentCache segue o padrão singleton."""
instance1 = cache_instance
instance2 = IntelligentCache()
assert instance1 is instance2
def test_set_and_get(cache_instance):
"""Testa a funcionalidade básica de adicionar e recuperar um item."""
cache_instance.set("key1", "value1")
assert cache_instance.get("key1") == "value1"
def test_get_nonexistent_key(cache_instance):
"""Testa a recuperação de uma chave que não existe."""
assert cache_instance.get("nonexistent") is None
def test_cache_expiration(cache_instance):
"""Testa se um item do cache expira após o seu TTL."""
cache_instance.set("key_exp", "value_exp", ttl=0.02)
time.sleep(0.05)
assert cache_instance.get("key_exp") is None
def test_lru_eviction(cache_instance):
"""Testa se a política de evicção LRU remove o item menos usado."""
cache_instance.set("key1", "value1")
time.sleep(0.01)
cache_instance.set("key2", "value2")
time.sleep(0.01)
cache_instance.set("key3", "value3") # Cache está cheio (tamanho 3)
# Acessa key1 para torná-lo o mais recentemente usado
cache_instance.get("key1")
time.sleep(0.01)
# Adiciona um novo item, o que deve causar a evicção de key2 (o menos usado)
cache_instance.set("key4", "value4")
assert cache_instance.get("key1") == "value1"
assert cache_instance.get("key2") is None # Deve ter sido removido
assert cache_instance.get("key3") is not None
assert cache_instance.get("key4") is not None
def test_clear_cache(cache_instance):
"""Testa se o método clear remove todos os itens."""
cache_instance.set("key1", "value1")
cache_instance.set("key2", "value2")
cache_instance.clear()
assert cache_instance.get("key1") is None
assert cache_instance.get("key2") is None
assert len(cache_instance._cache) == 0
assert len(cache_instance._access_times) == 0
def test_cache_disabled(mock_config):
"""Testa se as operações do cache são ignoradas quando ele está desabilitado."""
mock_config.caching_enabled = False
with patch('superezio_enterprise.cache.CONFIG', mock_config):
cache_instance = IntelligentCache()
cache_instance.clear()
cache_instance.set("key1", "value1")
assert cache_instance.get("key1") is None
assert len(cache_instance._cache) == 0
cache_instance.clear() # Apenas para garantir que não falha
|