blob: 20af5176e1e30ff039a844222e914efe5f460690 [file] [log] [blame]
from shutil import rmtree
from tempfile import gettempdir
import pytest
from platformdirs import user_cache_dir
from requests_cache.backends import FileCache, FileDict
from requests_cache.serializers import SERIALIZERS, SerializerPipeline
from tests.integration.base_cache_test import BaseCacheTest
from tests.integration.base_storage_test import CACHE_NAME, BaseStorageTest
FILE_SERIALIZERS = SERIALIZERS.copy()
FILE_SERIALIZERS.pop('dict')
class TestFileDict(BaseStorageTest):
storage_class = FileDict
picklable = True
@classmethod
def teardown_class(cls):
rmtree(CACHE_NAME, ignore_errors=True)
def init_cache(self, index=0, clear=True, **kwargs):
cache = FileDict(f'{CACHE_NAME}_{index}', serializer='pickle', use_temp=True, **kwargs)
if clear:
cache.clear()
return cache
def test_use_cache_dir(self):
relative_path = FileDict(CACHE_NAME).cache_dir
cache_dir_path = FileDict(CACHE_NAME, use_cache_dir=True).cache_dir
assert not str(relative_path).startswith(user_cache_dir())
assert str(cache_dir_path).startswith(user_cache_dir())
def test_use_temp(self):
relative_path = FileDict(CACHE_NAME).cache_dir
temp_path = FileDict(CACHE_NAME, use_temp=True).cache_dir
assert not str(relative_path).startswith(gettempdir())
assert str(temp_path).startswith(gettempdir())
def test_load_previous_binary_file(self):
"""If we init a new cache and load a file previously saved in binary mode, the cache should
handle this and open future files in binary mode for the rest of the session.
"""
cache = self.init_cache()
cache['foo'] = 'bar'
cache = self.init_cache(clear=False)
assert cache['foo'] == 'bar'
assert cache.is_binary is True
class TestFileCache(BaseCacheTest):
backend_class = FileCache
init_kwargs = {'use_temp': True}
@pytest.mark.parametrize('serializer_name', FILE_SERIALIZERS.keys())
def test_paths(self, serializer_name):
if not isinstance(FILE_SERIALIZERS[serializer_name], SerializerPipeline):
pytest.skip(f'Dependencies not installed for {serializer_name}')
session = self.init_session(serializer=serializer_name)
num_files = 20
for i in range(num_files):
session.cache.responses[f'key_{i}'] = {f'value_{i}': i}
expected_extension = serializer_name.replace('pickle', 'pkl')
assert len(list(session.cache.paths())) == num_files
for path in session.cache.paths():
assert path.is_file()
assert path.suffix == f'.{expected_extension}'
# Redirects db should be in the same directory as response files
assert session.cache.redirects.db_path.parent == session.cache.responses.cache_dir