| 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 |