Skip to content

Commit fff4fec

Browse files
authored
Merge pull request #356 from adityashirsatrao007/test/355-log-entry-admin
test: add unit tests for LogEntrytAdmin.get_search_results
2 parents 13a8ec6 + 397083b commit fff4fec

File tree

1 file changed

+142
-0
lines changed

1 file changed

+142
-0
lines changed
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
from unittest.mock import patch
2+
from django.contrib import admin
3+
from django.contrib.admin.sites import AdminSite
4+
from django.contrib.contenttypes.models import ContentType
5+
from django.test import RequestFactory
6+
from django.test import tag
7+
8+
from common.admin import LogEntrytAdmin
9+
from common.utils.helpers import USER_MODEL
10+
from tests.base_test_classes import BaseTestCase
11+
12+
# manage.py test tests.common.test_log_entry_admin --keepdb
13+
14+
15+
@tag('TestCase')
16+
class TestLogEntrytAdmin(BaseTestCase):
17+
"""Test LogEntrytAdmin.get_search_results method"""
18+
19+
@classmethod
20+
def setUpTestData(cls):
21+
super().setUpTestData()
22+
cls.user = USER_MODEL.objects.first()
23+
cls.content_type = ContentType.objects.get_for_model(USER_MODEL)
24+
25+
def setUp(self):
26+
print("Run Test Method:", self._testMethodName)
27+
self.model_admin = LogEntrytAdmin(admin.models.LogEntry, AdminSite())
28+
self.factory = RequestFactory()
29+
30+
def test_get_search_results_with_id_prefix_uppercase(self):
31+
"""Test searching with 'ID123' format returns matching object."""
32+
request = self.factory.get('/')
33+
queryset = admin.models.LogEntry.objects.all()
34+
35+
# Create a log entry to search for
36+
log_entry = admin.models.LogEntry.objects.create(
37+
user=self.user,
38+
content_type=self.content_type,
39+
object_id='42',
40+
action_flag=admin.models.CHANGE,
41+
)
42+
43+
results, use_distinct = self.model_admin.get_search_results(
44+
request, queryset, f'ID{log_entry.id}'
45+
)
46+
47+
self.assertTrue(use_distinct)
48+
self.assertIn(log_entry, results)
49+
50+
def test_get_search_results_with_id_prefix_lowercase(self):
51+
"""Test searching with 'id123' format returns matching object."""
52+
request = self.factory.get('/')
53+
queryset = admin.models.LogEntry.objects.all()
54+
55+
log_entry = admin.models.LogEntry.objects.create(
56+
user=self.user,
57+
content_type=self.content_type,
58+
object_id='99',
59+
action_flag=admin.models.ADDITION,
60+
)
61+
62+
results, use_distinct = self.model_admin.get_search_results(
63+
request, queryset, f'id{log_entry.id}'
64+
)
65+
66+
self.assertTrue(use_distinct)
67+
self.assertIn(log_entry, results)
68+
69+
def test_get_search_results_with_object_id(self):
70+
"""Test searching with 'ID' prefix returns entries by object_id."""
71+
request = self.factory.get('/')
72+
queryset = admin.models.LogEntry.objects.all()
73+
74+
object_id = '12345'
75+
log_entry = admin.models.LogEntry.objects.create(
76+
user=self.user,
77+
content_type=self.content_type,
78+
object_id=object_id,
79+
action_flag=admin.models.DELETION,
80+
)
81+
82+
results, use_distinct = self.model_admin.get_search_results(
83+
request, queryset, f'ID{object_id}'
84+
)
85+
86+
self.assertTrue(use_distinct)
87+
self.assertIn(log_entry, results)
88+
89+
def test_get_search_results_with_change_message(self):
90+
"""Test searching by change_message content."""
91+
request = self.factory.get('/')
92+
93+
log_entry = admin.models.LogEntry.objects.create(
94+
user=self.user,
95+
content_type=self.content_type,
96+
object_id='1',
97+
action_flag=admin.models.CHANGE,
98+
change_message='Updated the email field',
99+
)
100+
queryset = admin.models.LogEntry.objects.filter(id=log_entry.id)
101+
102+
results, use_distinct = self.model_admin.get_search_results(
103+
request, queryset, 'email'
104+
)
105+
106+
self.assertTrue(use_distinct)
107+
self.assertIn(log_entry, results)
108+
109+
def test_get_search_results_empty_term(self):
110+
"""Test that empty search term calls parent method."""
111+
request = self.factory.get('/')
112+
queryset = admin.models.LogEntry.objects.all()
113+
114+
with patch.object(
115+
admin.ModelAdmin,
116+
'get_search_results',
117+
return_value=(queryset, False)
118+
) as mock_parent:
119+
results, use_distinct = self.model_admin.get_search_results(
120+
request, queryset, ''
121+
)
122+
mock_parent.assert_called_once_with(request, queryset, '')
123+
124+
def test_get_search_results_no_match_in_change_message(self):
125+
"""Test that non-matching change_message returns empty results."""
126+
request = self.factory.get('/')
127+
128+
log_entry = admin.models.LogEntry.objects.create(
129+
user=self.user,
130+
content_type=self.content_type,
131+
object_id='1',
132+
action_flag=admin.models.CHANGE,
133+
change_message='Updated the name field',
134+
)
135+
queryset = admin.models.LogEntry.objects.filter(id=log_entry.id)
136+
137+
results, use_distinct = self.model_admin.get_search_results(
138+
request, queryset, 'nonexistent_text'
139+
)
140+
141+
self.assertTrue(use_distinct)
142+
self.assertEqual(list(results), [])

0 commit comments

Comments
 (0)