from unittest.mock import patch import pytest from redis import StrictRedis from requests_cache.backends import RedisCache, RedisDict, RedisHashDict from tests.conftest import fail_if_no_connection, httpbin from tests.integration.base_cache_test import BaseCacheTest from tests.integration.base_storage_test import BaseStorageTest @pytest.fixture(scope='module', autouse=True) @fail_if_no_connection() def ensure_connection(): """Fail all tests in this module if Redis is not running""" from redis import Redis Redis().info() class TestRedisDict(BaseStorageTest): storage_class = RedisDict num_instances = 1 # Only supports a single instance, since it stores items under top-level keys @patch('requests_cache.backends.redis.StrictRedis') def test_connection_kwargs(self, mock_redis): """A spot check to make sure optional connection kwargs get passed to connection""" RedisCache('test', username='user', password='pass', invalid_kwarg='???') mock_redis.assert_called_with(username='user', password='pass') class TestRedisHashDict(TestRedisDict): storage_class = RedisHashDict num_instances: int = 10 # Supports multiple instances, since this stores items under hash keys picklable = True init_kwargs = {'serializer': 'pickle'} class TestRedisCache(BaseCacheTest): backend_class = RedisCache @patch.object(StrictRedis, 'setex') def test_ttl(self, mock_setex): session = self.init_session(expire_after=60) session.get(httpbin('get')) call_args = mock_setex.mock_calls[0][1] assert call_args[1] == 3660 # Should be expiration + default offset @patch.object(StrictRedis, 'setex') def test_ttl__offset(self, mock_setex): session = self.init_session(expire_after=60, ttl_offset=500) session.get(httpbin('get')) call_args = mock_setex.mock_calls[0][1] assert call_args[1] == 560 # Should be expiration + custom offset @patch.object(StrictRedis, 'setex') @patch.object(StrictRedis, 'set') def test_ttl__disabled(self, mock_set, mock_setex): session = self.init_session(expire_after=60, ttl=False) session.get(httpbin('get')) mock_setex.assert_not_called() mock_set.assert_called()