Skip to content

Commit 577b2c8

Browse files
committed
Add navlet tests
1 parent a8aa73d commit 577b2c8

File tree

1 file changed

+99
-2
lines changed

1 file changed

+99
-2
lines changed

tests/integration/web/navlets_test.py

Lines changed: 99 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
from unittest.mock import patch
1+
from unittest.mock import Mock, patch
22

33
import pytest
44
from django.test.client import RequestFactory
55
from django.urls import reverse
66

77
from nav.models.profiles import Account, AccountDashboard, AccountNavlet
8-
from nav.web.navlets import add_navlet, modify_navlet
8+
from nav.web.navlets import add_navlet, modify_navlet, Navlet
99

1010

1111
class TestAddUserNavletView:
@@ -103,6 +103,103 @@ def test_given_non_existing_navlet_then_return_error(self, client):
103103
assert b"This widget no longer exists" in response.content
104104

105105

106+
class TestNavletPost:
107+
"""Tests for the Navlet.post method."""
108+
109+
def test_when_no_form_supplied_it_should_return_400(self, admin_account, dashboard):
110+
request = RequestFactory().post('/fake-url')
111+
navlet = Navlet()
112+
navlet.request = request
113+
navlet.account_navlet = AccountNavlet(
114+
account=admin_account,
115+
dashboard=dashboard,
116+
navlet='nav.web.navlets.alert.AlertWidget',
117+
preferences={},
118+
)
119+
120+
response = navlet.post(request)
121+
assert response.status_code == 400
122+
assert b'No form supplied' in response.content
123+
124+
def test_given_valid_form_it_should_save_preferences(
125+
self, admin_account, dashboard
126+
):
127+
request = RequestFactory().post('/fake-url')
128+
navlet = Navlet()
129+
navlet.request = request
130+
navlet.account_navlet = AccountNavlet(
131+
account=admin_account,
132+
dashboard=dashboard,
133+
navlet='nav.web.navlets.alert.AlertWidget',
134+
preferences={},
135+
)
136+
137+
# Mock valid form
138+
mock_form = Mock()
139+
mock_form.is_valid.return_value = True
140+
mock_form.cleaned_data = {'test_pref': 'test_value'}
141+
142+
with patch.object(navlet, 'get') as mock_get:
143+
mock_get.return_value = Mock()
144+
navlet.post(request, form=mock_form)
145+
146+
assert navlet.account_navlet.preferences['test_pref'] == 'test_value'
147+
148+
def test_given_invalid_form_it_should_call_handle_error_response(
149+
self, admin_account, dashboard
150+
):
151+
request = RequestFactory().post('/fake-url')
152+
navlet = Navlet()
153+
navlet.request = request
154+
navlet.account_navlet = AccountNavlet(
155+
account=admin_account,
156+
dashboard=dashboard,
157+
navlet='nav.web.navlets.alert.AlertWidget',
158+
preferences={},
159+
)
160+
161+
# Mock invalid form
162+
mock_form = Mock()
163+
mock_form.is_valid.return_value = False
164+
165+
with patch.object(navlet, 'handle_error_response') as mock_handle_error:
166+
mock_handle_error.return_value = Mock()
167+
navlet.post(request, form=mock_form)
168+
mock_handle_error.assert_called_once()
169+
170+
171+
class TestNavletHandleErrorResponse:
172+
"""Tests for the Navlet.handle_error_response method."""
173+
174+
def test_should_render_form_errors_in_context(self):
175+
request = RequestFactory().post('/fake-url')
176+
navlet = Navlet()
177+
178+
# Mock form with errors
179+
mock_form = Mock()
180+
mock_form.errors = {
181+
'field1': ['Error message 1'],
182+
'field2': ['Error message 2'],
183+
}
184+
185+
with (
186+
patch('nav.web.navlets.render') as mock_render,
187+
patch.object(navlet, 'get_context_data') as mock_context,
188+
patch.object(navlet, 'get_template_names') as mock_template,
189+
):
190+
mock_render.return_value = Mock()
191+
mock_context.return_value = {}
192+
mock_template.return_value = 'test_template.html'
193+
194+
navlet.handle_error_response(request, mock_form)
195+
196+
# Verify render was called with errors flattened into context
197+
context = mock_render.call_args[0][2]
198+
assert 'errors' in context
199+
assert 'Error message 1' in context['errors']
200+
assert 'Error message 2' in context['errors']
201+
202+
106203
def _get_dashboard_url(dashboard: AccountDashboard):
107204
return reverse('add-user-navlet', args=[dashboard.id])
108205

0 commit comments

Comments
 (0)