From a6b36750da68ff17391a488ab5f5052876926c27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20I=C3=9Fbr=C3=BCcker?= Date: Sat, 11 Oct 2025 10:32:31 +0200 Subject: [PATCH] Fix missing tags causing errors in import with Postgres (#1203) * Handle missing tags in importer * Make all tests run with Postgres again --- bookmarks/services/importer.py | 3 ++- bookmarks/tests/test_feeds.py | 10 ++++++++-- bookmarks/tests/test_queries.py | 12 ++++++++++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/bookmarks/services/importer.py b/bookmarks/services/importer.py index 280ac0a..05460f3 100644 --- a/bookmarks/services/importer.py +++ b/bookmarks/services/importer.py @@ -45,8 +45,9 @@ class TagCache: result = [] for tag_name in tag_names: tag = self.get(tag_name) + # Tag may not have been created if tag name exceeded maximum length # Prevent returning duplicates - if not (tag in result): + if tag and not (tag in result): result.append(tag) return result diff --git a/bookmarks/tests/test_feeds.py b/bookmarks/tests/test_feeds.py index fc20b42..4b02745 100644 --- a/bookmarks/tests/test_feeds.py +++ b/bookmarks/tests/test_feeds.py @@ -1,13 +1,15 @@ import datetime import email +import unittest import urllib.parse +from django.conf import settings from django.test import TestCase from django.urls import reverse -from bookmarks.tests.helpers import BookmarkFactoryMixin -from bookmarks.models import FeedToken, User from bookmarks.feeds import sanitize +from bookmarks.models import FeedToken, User +from bookmarks.tests.helpers import BookmarkFactoryMixin def rfc2822_date(date): @@ -343,6 +345,10 @@ class FeedsTestCase(TestCase, BookmarkFactoryMixin): self.assertEqual(response.status_code, 200) self.assertContains(response, "", count=5) + @unittest.skipIf( + settings.LD_DB_ENGINE == "postgres", + "Postgres does not allow NUL in text columns", + ) def test_strip_control_characters(self): self.setup_bookmark( title="test\n\r\t\0\x08title", description="test\n\r\t\0\x08description" diff --git a/bookmarks/tests/test_queries.py b/bookmarks/tests/test_queries.py index b3bb889..df57d19 100644 --- a/bookmarks/tests/test_queries.py +++ b/bookmarks/tests/test_queries.py @@ -1199,7 +1199,11 @@ class QueriesBasicTestCase(TestCase, BookmarkFactoryMixin): sorted_bookmarks = sorted(bookmarks, key=lambda b: b.resolved_title.lower()) query = queries.query_bookmarks(self.user, self.profile, search) - self.assertEqual(list(query), sorted_bookmarks) + + # Use resolved title for comparison as Postgres returns bookmarks with same resolved title in random order + expected_effective_titles = [b.resolved_title for b in sorted_bookmarks] + actual_effective_titles = [b.resolved_title for b in query] + self.assertEqual(expected_effective_titles, actual_effective_titles) def test_sort_by_title_desc(self): search = BookmarkSearch(sort=BookmarkSearch.SORT_TITLE_DESC) @@ -1210,7 +1214,11 @@ class QueriesBasicTestCase(TestCase, BookmarkFactoryMixin): ) query = queries.query_bookmarks(self.user, self.profile, search) - self.assertEqual(list(query), sorted_bookmarks) + + # Use resolved title for comparison as Postgres returns bookmarks with same resolved title in random order + expected_effective_titles = [b.resolved_title for b in sorted_bookmarks] + actual_effective_titles = [b.resolved_title for b in query] + self.assertEqual(expected_effective_titles, actual_effective_titles) def test_query_bookmarks_filter_modified_since(self): # Create bookmarks with different modification dates