Skip to content

Commit 55d5946

Browse files
committed
[fix] fix test environment pollution in TestAdminMedia #405
The test_object_notification_setting_configured test case was modifying UserAdmin.Media without proper restoration, causing pollution in the test environment. Added a try...finally block to ensure UserAdmin.Media is restored to its original state. Closes #405
1 parent d5b5bb9 commit 55d5946

1 file changed

Lines changed: 53 additions & 29 deletions

File tree

openwisp_notifications/tests/test_admin.py

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import copy
12
import uuid
23
from unittest.mock import patch
34

45
from django.contrib.admin.sites import AdminSite
56
from django.contrib.auth import get_user_model
67
from django.core.cache import cache
7-
from django.forms.widgets import Media, MediaOrderConflictWarning
8+
from django.forms.widgets import MediaOrderConflictWarning
89
from django.test import TestCase, override_settings, tag
910
from django.urls import reverse
1011

@@ -311,38 +312,61 @@ def test_object_notification_setting_empty(self):
311312
OPENWISP_NOTIFICATIONS_IGNORE_ENABLED_ADMIN=["openwisp_users.admin.UserAdmin"],
312313
)
313314
def test_object_notification_setting_configured(self):
314-
_add_object_notification_widget()
315-
response = self.client.get(
316-
reverse(f"admin:{self.users_app_label}_user_change", args=(self.admin.pk,))
317-
)
318-
self.assertContains(
319-
response,
320-
'src="/static/openwisp-notifications/js/object-notifications.js"',
321-
1,
322-
)
323315

324-
# If a ModelAdmin already has a Media class
325-
with self.assertWarns(MediaOrderConflictWarning):
316+
original_media = getattr(UserAdmin, "Media", None)
317+
if original_media:
318+
original_js = copy.deepcopy(getattr(original_media, "js", None))
319+
original_css = copy.deepcopy(getattr(original_media, "css", None))
320+
else:
321+
original_js = None
322+
original_css = None
323+
try:
326324
_add_object_notification_widget()
327325
response = self.client.get(
328326
reverse(
329327
f"admin:{self.users_app_label}_user_change", args=(self.admin.pk,)
330328
)
331329
)
332-
333-
# If a ModelAdmin has list instances of js and css
334-
UserAdmin.Media.css = {"all": list()}
335-
UserAdmin.Media.js = list()
336-
_add_object_notification_widget()
337-
response = self.client.get(
338-
reverse(f"admin:{self.users_app_label}_user_change", args=(self.admin.pk,))
339-
)
340-
341-
# If ModelAdmin has empty attributes
342-
UserAdmin.Media.js = []
343-
UserAdmin.Media.css = {}
344-
_add_object_notification_widget()
345-
response = self.client.get(
346-
reverse(f"admin:{self.users_app_label}_user_change", args=(self.admin.pk,))
347-
)
348-
UserAdmin.Media = Media()
330+
self.assertContains(
331+
response,
332+
'src="/static/openwisp-notifications/js/object-notifications.js"',
333+
1,
334+
)
335+
with self.assertWarns(MediaOrderConflictWarning):
336+
_add_object_notification_widget()
337+
response = self.client.get(
338+
reverse(
339+
f"admin:{self.users_app_label}_user_change",
340+
args=(self.admin.pk,),
341+
)
342+
)
343+
UserAdmin.Media.css = {"all": list()}
344+
UserAdmin.Media.js = list()
345+
_add_object_notification_widget()
346+
response = self.client.get(
347+
reverse(
348+
f"admin:{self.users_app_label}_user_change", args=(self.admin.pk,)
349+
)
350+
)
351+
UserAdmin.Media.js = []
352+
UserAdmin.Media.css = {}
353+
_add_object_notification_widget()
354+
response = self.client.get(
355+
reverse(
356+
f"admin:{self.users_app_label}_user_change", args=(self.admin.pk,)
357+
)
358+
)
359+
finally:
360+
if original_media is not None:
361+
UserAdmin.Media = original_media
362+
if original_js is not None:
363+
UserAdmin.Media.js = original_js
364+
elif hasattr(UserAdmin.Media, "js"):
365+
del UserAdmin.Media.js
366+
367+
if original_css is not None:
368+
UserAdmin.Media.css = original_css
369+
elif hasattr(UserAdmin.Media, "css"):
370+
del UserAdmin.Media.css
371+
elif hasattr(UserAdmin, "Media"):
372+
delattr(UserAdmin, "Media")

0 commit comments

Comments
 (0)