diff options
author | Jordan Cook <jordan.cook.git@proton.me> | 2022-10-28 12:18:14 -0500 |
---|---|---|
committer | Jordan Cook <jordan.cook.git@proton.me> | 2022-10-28 15:05:13 -0500 |
commit | 03a97079839a5683b202e3ea3f66e8ce54eedab4 (patch) | |
tree | 33540bb5443d9667b1b82df52e561e0f5437adb9 /tests | |
parent | eae13531f0d2806068229d04621b6ec7e1fc406e (diff) | |
download | requests-cache-03a97079839a5683b202e3ea3f66e8ce54eedab4.tar.gz |
Omit invalid responses and set response.cache_key in SQLiteCache.sorted()
Diffstat (limited to 'tests')
-rw-r--r-- | tests/integration/test_sqlite.py | 34 | ||||
-rw-r--r-- | tests/unit/test_session.py | 2 |
2 files changed, 31 insertions, 5 deletions
diff --git a/tests/integration/test_sqlite.py b/tests/integration/test_sqlite.py index 580948b..7e31634 100644 --- a/tests/integration/test_sqlite.py +++ b/tests/integration/test_sqlite.py @@ -1,4 +1,5 @@ import os +import pickle from datetime import datetime, timedelta from os.path import join from tempfile import NamedTemporaryFile, gettempdir @@ -8,9 +9,9 @@ from unittest.mock import patch import pytest from platformdirs import user_cache_dir -from requests_cache.backends.base import BaseCache -from requests_cache.backends.sqlite import MEMORY_URI, SQLiteCache, SQLiteDict -from requests_cache.models.response import CachedResponse +from requests_cache.backends import BaseCache, SQLiteCache, SQLiteDict +from requests_cache.backends.sqlite import MEMORY_URI +from requests_cache.models import CachedResponse from tests.integration.base_cache_test import BaseCacheTest from tests.integration.base_storage_test import CACHE_NAME, BaseStorageTest @@ -60,7 +61,7 @@ class TestSQLiteDict(BaseStorageTest): assert len(cache) == 0 def test_use_memory__uri(self): - self.init_cache(':memory:').db_path == ':memory:' + assert self.init_cache(':memory:').db_path == ':memory:' def test_non_dir_parent_exists(self): """Expect a custom error message if a parent path already exists but isn't a directory""" @@ -219,6 +220,30 @@ class TestSQLiteDict(BaseStorageTest): assert prev_item is None or prev_item.expires < item.expires assert item.status_code % 2 == 0 + def test_sorted__error(self): + """sorted() should handle deserialization errors and not return invalid responses""" + + class BadSerializer: + def loads(self, value): + response = pickle.loads(value) + if response.cache_key == 'key_42': + raise pickle.PickleError() + return response + + def dumps(self, value): + return pickle.dumps(value) + + cache = self.init_cache(serializer=BadSerializer()) + + for i in range(100): + response = CachedResponse(status_code=i) + response.cache_key = f'key_{i}' + cache[f'key_{i}'] = response + + # Items should only include unexpired (even numbered) items, and still be in sorted order + items = list(cache.sorted()) + assert len(items) == 99 + @pytest.mark.parametrize( 'db_path, use_temp', [ @@ -300,4 +325,5 @@ class TestSQLiteCache(BaseCacheTest): prev_item = None for i, item in enumerate(items): assert prev_item is None or prev_item.expires < item.expires + assert item.cache_key assert not item.is_expired diff --git a/tests/unit/test_session.py b/tests/unit/test_session.py index 116b74f..e7495cc 100644 --- a/tests/unit/test_session.py +++ b/tests/unit/test_session.py @@ -17,7 +17,7 @@ from requests.structures import CaseInsensitiveDict from requests_cache import ALL_METHODS, CachedSession from requests_cache._utils import get_placeholder_class -from requests_cache.backends import BACKEND_CLASSES, BaseCache, SQLiteDict +from requests_cache.backends import BACKEND_CLASSES, BaseCache from requests_cache.backends.base import DESERIALIZE_ERRORS from requests_cache.policy.expiration import DO_NOT_CACHE, EXPIRE_IMMEDIATELY, NEVER_EXPIRE from tests.conftest import ( |