Skip to content

Commit 00ef044

Browse files
authored
Fix tests for background task behaviour in Wagtail 6.4 (#255)
In Wagtail 6.4 (wagtail/wagtail#12787), updating the search index and reference index after a database update are now handled as background tasks through the django-tasks library. In the default configuration, this happens at the end of the current transaction (if any), and since unit tests are typically wrapped in a transaction, we can no longer count on the results of database updates within tests being immediately visible in search and object usage queries. To ensure that these tasks are executed, we trigger the oncommit hooks via `self.captureOnCommitCallbacks(execute=True)`.
1 parent 7e3277a commit 00ef044

File tree

3 files changed

+32
-25
lines changed

3 files changed

+32
-25
lines changed

tests/test_api.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@
1414
class ApiTestBase(TestCase):
1515
@classmethod
1616
def setUpTestData(cls):
17-
cls.a_space_odyssey = create_video("2001: A Space Odyssey")
18-
cls.tng = create_video("Star Trek: The Next Generation")
19-
cls.pink_floyd_time = create_audio("Pink Floyd: Time")
17+
with cls.captureOnCommitCallbacks(execute=True):
18+
cls.a_space_odyssey = create_video("2001: A Space Odyssey")
19+
cls.tng = create_video("Star Trek: The Next Generation")
20+
cls.pink_floyd_time = create_audio("Pink Floyd: Time")
2021

2122
def tearDown(self) -> None:
2223
for item in Media.objects.all():

tests/test_models.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,17 @@ def test_duration_display_as_tenths(self):
111111
class TestMediaQuerySet(TestCase):
112112
def test_search_method(self):
113113
# Make a test media
114-
media = Media.objects.create(title="Test media file", duration=100)
114+
with self.captureOnCommitCallbacks(execute=True):
115+
media = Media.objects.create(title="Test media file", duration=100)
115116

116117
# Search for it
117118
results = Media.objects.search("Test")
118119
self.assertEqual(list(results), [media])
119120

120121
def test_operators(self):
121-
aaa_media = Media.objects.create(title="AAA Test media", duration=100)
122-
zzz_media = Media.objects.create(title="ZZZ Test media", duration=100)
122+
with self.captureOnCommitCallbacks(execute=True):
123+
aaa_media = Media.objects.create(title="AAA Test media", duration=100)
124+
zzz_media = Media.objects.create(title="ZZZ Test media", duration=100)
123125

124126
results = Media.objects.search("aaa test", operator="and")
125127
self.assertEqual(list(results), [aaa_media])
@@ -129,8 +131,9 @@ def test_operators(self):
129131
self.assertEqual(sorted_results, [aaa_media, zzz_media])
130132

131133
def test_custom_ordering(self):
132-
aaa_media = Media.objects.create(title="AAA Test media", duration=100)
133-
zzz_media = Media.objects.create(title="ZZZ Test media", duration=100)
134+
with self.captureOnCommitCallbacks(execute=True):
135+
aaa_media = Media.objects.create(title="AAA Test media", duration=100)
136+
zzz_media = Media.objects.create(title="ZZZ Test media", duration=100)
134137

135138
results = Media.objects.order_by("title").search(
136139
"Test", order_by_relevance=False

tests/test_views.py

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -723,15 +723,16 @@ def filter_media(media, request):
723723
self.assertEqual(response.context["media_files"][0], media)
724724

725725
def test_construct_queryset_hook_search(self):
726-
media = models.Media.objects.create(
727-
title="Test media shown",
728-
duration=100,
729-
type="audio",
730-
uploaded_by_user=self.user,
731-
)
732-
models.Media.objects.create(
733-
title="Test media not shown", duration=100, type="audio"
734-
)
726+
with self.captureOnCommitCallbacks(execute=True):
727+
media = models.Media.objects.create(
728+
title="Test media shown",
729+
duration=100,
730+
type="audio",
731+
uploaded_by_user=self.user,
732+
)
733+
models.Media.objects.create(
734+
title="Test media not shown", duration=100, type="audio"
735+
)
735736

736737
def filter_media(media, request):
737738
return media.filter(uploaded_by_user=self.user)
@@ -1100,19 +1101,21 @@ def test_unused_media_usage_count(self):
11001101
def test_used_media_usage_count(self):
11011102
media = models.Media.objects.get(id=1)
11021103
page = EventPage.objects.get(id=3)
1103-
event_page_related_link = EventPageRelatedMedia()
1104-
event_page_related_link.page = page
1105-
event_page_related_link.link_media = media
1106-
event_page_related_link.save()
1104+
with self.captureOnCommitCallbacks(execute=True):
1105+
event_page_related_link = EventPageRelatedMedia()
1106+
event_page_related_link.page = page
1107+
event_page_related_link.link_media = media
1108+
event_page_related_link.save()
11071109
self.assertEqual(media.get_usage().count(), 1)
11081110

11091111
def test_usage_count_appears(self):
11101112
media = models.Media.objects.get(id=1)
11111113
page = EventPage.objects.get(id=3)
1112-
event_page_related_link = EventPageRelatedMedia()
1113-
event_page_related_link.page = page
1114-
event_page_related_link.link_media = media
1115-
event_page_related_link.save()
1114+
with self.captureOnCommitCallbacks(execute=True):
1115+
event_page_related_link = EventPageRelatedMedia()
1116+
event_page_related_link.page = page
1117+
event_page_related_link.link_media = media
1118+
event_page_related_link.save()
11161119
response = self.client.get(reverse("wagtailmedia:edit", args=(1,)))
11171120
self.assertContains(response, "Used 1 time")
11181121

0 commit comments

Comments
 (0)