mirror of
https://github.com/sissbruecker/linkding.git
synced 2025-08-08 19:28:29 +02:00
Load bookmark thumbnails after import (#724)
* Update thumbnails after import * Safer way to download thumbnails * small test improvements * add missing tests --------- Co-authored-by: Sascha Ißbrücker <sascha.issbruecker@gmail.com>
This commit is contained in:

committed by
GitHub

parent
87cd4061cb
commit
b4376a9ff1
@@ -13,9 +13,20 @@ mock_image_data = b"mock_image"
|
||||
|
||||
|
||||
class MockStreamingResponse:
|
||||
def __init__(self, data=mock_image_data, content_type="image/png"):
|
||||
def __init__(
|
||||
self,
|
||||
url,
|
||||
data=mock_image_data,
|
||||
content_type="image/png",
|
||||
content_length=None,
|
||||
status_code=200,
|
||||
):
|
||||
self.url = url
|
||||
self.chunks = [data]
|
||||
self.headers = {"Content-Type": content_type}
|
||||
self.status_code = status_code
|
||||
if not content_length:
|
||||
content_length = len(data)
|
||||
self.headers = {"Content-Type": content_type, "Content-Length": content_length}
|
||||
|
||||
def iter_content(self, **kwargs):
|
||||
return self.chunks
|
||||
@@ -47,19 +58,29 @@ class PreviewImageLoaderTestCase(TestCase):
|
||||
self.settings_override.disable()
|
||||
self.mock_load_website_metadata_patcher.stop()
|
||||
|
||||
def create_mock_response(self, icon_data=mock_image_data, content_type="image/png"):
|
||||
def create_mock_response(
|
||||
self,
|
||||
url="https://example.com/image.png",
|
||||
icon_data=mock_image_data,
|
||||
content_type="image/png",
|
||||
content_length=len(mock_image_data),
|
||||
status_code=200,
|
||||
):
|
||||
mock_response = mock.Mock()
|
||||
mock_response.raw = io.BytesIO(icon_data)
|
||||
return MockStreamingResponse(icon_data, content_type)
|
||||
return MockStreamingResponse(
|
||||
url, icon_data, content_type, content_length, status_code
|
||||
)
|
||||
|
||||
def get_image_path(self, filename):
|
||||
return Path(os.path.join(settings.LD_PREVIEW_FOLDER, filename))
|
||||
|
||||
def image_exists(self, filename):
|
||||
return self.get_image_path(filename).exists()
|
||||
def assertImageExists(self, filename, data):
|
||||
self.assertTrue(self.get_image_path(filename).exists())
|
||||
self.assertEqual(self.get_image_path(filename).read_bytes(), data)
|
||||
|
||||
def get_image_data(self, filename):
|
||||
return self.get_image_path(filename).read_bytes()
|
||||
def assertNoImageExists(self):
|
||||
self.assertFalse(os.listdir(settings.LD_PREVIEW_FOLDER))
|
||||
|
||||
def test_load_preview_image(self):
|
||||
with mock.patch("requests.get") as mock_get:
|
||||
@@ -67,8 +88,8 @@ class PreviewImageLoaderTestCase(TestCase):
|
||||
|
||||
file = preview_image_loader.load_preview_image("https://example.com")
|
||||
|
||||
self.assertTrue(self.image_exists(file))
|
||||
self.assertEqual(mock_image_data, self.get_image_data(file))
|
||||
self.assertIsNotNone(file)
|
||||
self.assertImageExists(file, mock_image_data)
|
||||
|
||||
def test_load_preview_image_returns_none_if_no_preview_image_detected(self):
|
||||
with mock.patch("requests.get") as mock_get:
|
||||
@@ -78,6 +99,80 @@ class PreviewImageLoaderTestCase(TestCase):
|
||||
file = preview_image_loader.load_preview_image("https://example.com")
|
||||
|
||||
self.assertIsNone(file)
|
||||
self.assertNoImageExists()
|
||||
|
||||
def test_load_preview_image_returns_none_for_invalid_status_code(self):
|
||||
invalid_status_codes = [199, 300, 400, 500]
|
||||
|
||||
for status_code in invalid_status_codes:
|
||||
with mock.patch("requests.get") as mock_get:
|
||||
mock_get.return_value = self.create_mock_response(
|
||||
status_code=status_code
|
||||
)
|
||||
|
||||
file = preview_image_loader.load_preview_image("https://example.com")
|
||||
|
||||
self.assertIsNone(file)
|
||||
self.assertNoImageExists()
|
||||
|
||||
def test_load_preview_image_returns_none_if_content_length_exceeds_limit(self):
|
||||
# exceeds max size
|
||||
with mock.patch("requests.get") as mock_get:
|
||||
mock_get.return_value = self.create_mock_response(
|
||||
content_length=settings.LD_PREVIEW_MAX_SIZE + 1
|
||||
)
|
||||
|
||||
file = preview_image_loader.load_preview_image("https://example.com")
|
||||
|
||||
self.assertIsNone(file)
|
||||
self.assertNoImageExists()
|
||||
|
||||
# equals max size
|
||||
with mock.patch("requests.get") as mock_get:
|
||||
mock_get.return_value = self.create_mock_response(
|
||||
content_length=settings.LD_PREVIEW_MAX_SIZE
|
||||
)
|
||||
|
||||
file = preview_image_loader.load_preview_image("https://example.com")
|
||||
|
||||
self.assertIsNotNone(file)
|
||||
self.assertImageExists(file, mock_image_data)
|
||||
|
||||
def test_load_preview_image_returns_none_for_invalid_content_type(self):
|
||||
invalid_content_types = ["text/html", "application/json"]
|
||||
|
||||
for content_type in invalid_content_types:
|
||||
with mock.patch("requests.get") as mock_get:
|
||||
mock_get.return_value = self.create_mock_response(
|
||||
content_type=content_type
|
||||
)
|
||||
|
||||
file = preview_image_loader.load_preview_image("https://example.com")
|
||||
|
||||
self.assertIsNone(file)
|
||||
self.assertNoImageExists()
|
||||
|
||||
valid_content_types = ["image/png", "image/jpeg", "image/gif"]
|
||||
|
||||
for content_type in valid_content_types:
|
||||
with mock.patch("requests.get") as mock_get:
|
||||
mock_get.return_value = self.create_mock_response(
|
||||
content_type=content_type
|
||||
)
|
||||
|
||||
file = preview_image_loader.load_preview_image("https://example.com")
|
||||
|
||||
self.assertIsNotNone(file)
|
||||
self.assertImageExists(file, mock_image_data)
|
||||
|
||||
def test_load_preview_image_returns_none_if_download_exceeds_content_length(self):
|
||||
with mock.patch("requests.get") as mock_get:
|
||||
mock_get.return_value = self.create_mock_response(content_length=1)
|
||||
|
||||
file = preview_image_loader.load_preview_image("https://example.com")
|
||||
|
||||
self.assertIsNone(file)
|
||||
self.assertNoImageExists()
|
||||
|
||||
def test_load_preview_image_creates_folder_if_not_exists(self):
|
||||
with mock.patch("requests.get") as mock_get:
|
||||
@@ -95,14 +190,16 @@ class PreviewImageLoaderTestCase(TestCase):
|
||||
def test_guess_file_extension(self):
|
||||
with mock.patch("requests.get") as mock_get:
|
||||
mock_get.return_value = self.create_mock_response(content_type="image/png")
|
||||
|
||||
file = preview_image_loader.load_preview_image("https://example.com")
|
||||
|
||||
self.assertTrue(self.image_exists(file))
|
||||
self.assertImageExists(file, mock_image_data)
|
||||
self.assertEqual("png", file.split(".")[-1])
|
||||
|
||||
with mock.patch("requests.get") as mock_get:
|
||||
mock_get.return_value = self.create_mock_response(content_type="image/jpeg")
|
||||
|
||||
file = preview_image_loader.load_preview_image("https://example.com")
|
||||
|
||||
self.assertTrue(self.image_exists(file))
|
||||
self.assertImageExists(file, mock_image_data)
|
||||
self.assertEqual("jpg", file.split(".")[-1])
|
||||
|
Reference in New Issue
Block a user