Skip to content

Commit 9088448

Browse files
committed
[tests] Replace failing tests with selenium tests
As now templates are being loaded via js, normal tests were failing. For these failing tests, added relevant selenium tests. Modified `get-relevant_templates` to allow fetching templates during device creation by superuser and org users. Signed-off-by: DragnEmperor <dragnemperor@gmail.com>
1 parent 4192f49 commit 9088448

5 files changed

Lines changed: 146 additions & 152 deletions

File tree

openwisp_controller/config/static/config/js/relevant_templates.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,10 @@ django.jQuery(function ($) {
9595
selectedTemplates;
9696

9797
// Hide templates if no organization or backend is selected
98-
if (orgID.length === 0 || (!isDeviceGroup() && backend.length === 0)) {
98+
if (
99+
(orgID && orgID.length === 0) ||
100+
(!isDeviceGroup() && backend.length === 0)
101+
) {
99102
resetTemplateOptions();
100103
updateTemplateHelpText();
101104
return;
@@ -212,8 +215,10 @@ django.jQuery(function ($) {
212215
if (selectedTemplates === undefined) {
213216
if (!isDeviceGroup()) {
214217
$(
215-
`.has_original .field-templates .sortedm2m-container input[type="hidden"]`,
216-
).attr("name", templatesFieldName());
218+
`#config-0 .field-templates .sortedm2m-container input[type="hidden"]`,
219+
)
220+
.first()
221+
.attr("name", templatesFieldName());
217222
// set the initial value of the hidden input field
218223
// to the selected templates
219224
django._owcInitialValues[templatesFieldName()] =

openwisp_controller/config/tests/test_admin.py

Lines changed: 0 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -479,15 +479,6 @@ def test_device_organization_fk_autocomplete_view(self):
479479
hidden=[data['org2'].name, data['inactive'].name],
480480
)
481481

482-
def test_device_templates_m2m_queryset(self):
483-
data = self._create_multitenancy_test_env()
484-
t_shared = self._create_template(name='t-shared', organization=None)
485-
self._test_multitenant_admin(
486-
url=reverse(f'admin:{self.app_label}_device_add'),
487-
visible=[str(data['t1']), str(t_shared)],
488-
hidden=[str(data['t2']), str(data['t3_inactive'])],
489-
)
490-
491482
def test_template_queryset(self):
492483
data = self._create_multitenancy_test_env()
493484
self._test_multitenant_admin(
@@ -796,56 +787,6 @@ def test_template_not_contains_default_templates_js(self):
796787
response = self.client.get(path)
797788
self.assertNotContains(response, '// enable default templates')
798789

799-
def test_configuration_templates_removed(self):
800-
def _update_template(templates):
801-
params.update(
802-
{
803-
'config-0-templates': ','.join(
804-
[str(template.pk) for template in templates]
805-
)
806-
}
807-
)
808-
response = self.client.post(path, data=params, follow=True)
809-
self.assertEqual(response.status_code, 200)
810-
for template in templates:
811-
self.assertContains(
812-
response, f'class="sortedm2m" checked> {template.name}'
813-
)
814-
return response
815-
816-
template = self._create_template()
817-
818-
# Add a new device
819-
path = reverse(f'admin:{self.app_label}_device_add')
820-
params = self._get_device_params(org=self._get_org())
821-
response = self.client.post(path, data=params, follow=True)
822-
self.assertEqual(response.status_code, 200)
823-
824-
config = Device.objects.get(name=params['name']).config
825-
path = reverse(f'admin:{self.app_label}_device_change', args=[config.device_id])
826-
params.update(
827-
{
828-
'config-0-id': str(config.pk),
829-
'config-0-device': str(config.device_id),
830-
'config-INITIAL_FORMS': 1,
831-
'_continue': True,
832-
}
833-
)
834-
835-
# Add template to the device
836-
_update_template(templates=[template])
837-
config.refresh_from_db()
838-
self.assertEqual(config.templates.count(), 1)
839-
self.assertEqual(config.status, 'modified')
840-
config.set_status_applied()
841-
self.assertEqual(config.status, 'applied')
842-
843-
# Remove template from the device
844-
_update_template(templates=[])
845-
config.refresh_from_db()
846-
self.assertEqual(config.templates.count(), 0)
847-
self.assertEqual(config.status, 'modified')
848-
849790
def test_vpn_not_contains_default_templates_js(self):
850791
vpn = self._create_vpn()
851792
path = reverse(f'admin:{self.app_label}_vpn_change', args=[vpn.pk])
@@ -1626,89 +1567,6 @@ def test_add_vpn(self):
16261567
response, 'value="openwisp_controller.vpn_backends.OpenVpn" selected'
16271568
)
16281569

1629-
def test_vpn_clients_deleted(self):
1630-
def _update_template(templates):
1631-
params.update(
1632-
{
1633-
'config-0-templates': ','.join(
1634-
[str(template.pk) for template in templates]
1635-
)
1636-
}
1637-
)
1638-
response = self.client.post(path, data=params, follow=True)
1639-
self.assertEqual(response.status_code, 200)
1640-
for template in templates:
1641-
self.assertContains(
1642-
response, f'class="sortedm2m" checked> {template.name}'
1643-
)
1644-
return response
1645-
1646-
vpn = self._create_vpn()
1647-
template = self._create_template()
1648-
vpn_template = self._create_template(
1649-
name='vpn-test',
1650-
type='vpn',
1651-
vpn=vpn,
1652-
auto_cert=True,
1653-
)
1654-
cert_query = Cert.objects.exclude(pk=vpn.cert_id)
1655-
valid_cert_query = cert_query.filter(revoked=False)
1656-
revoked_cert_query = cert_query.filter(revoked=True)
1657-
1658-
# Add a new device
1659-
path = reverse(f'admin:{self.app_label}_device_add')
1660-
params = self._get_device_params(org=self._get_org())
1661-
response = self.client.post(path, data=params, follow=True)
1662-
self.assertEqual(response.status_code, 200)
1663-
1664-
config = Device.objects.get(name=params['name']).config
1665-
self.assertEqual(config.vpnclient_set.count(), 0)
1666-
self.assertEqual(config.templates.count(), 0)
1667-
1668-
path = reverse(f'admin:{self.app_label}_device_change', args=[config.device_id])
1669-
params.update(
1670-
{
1671-
'config-0-id': str(config.pk),
1672-
'config-0-device': str(config.device_id),
1673-
'config-INITIAL_FORMS': 1,
1674-
'_continue': True,
1675-
}
1676-
)
1677-
1678-
with self.subTest('Adding only VpnClient template'):
1679-
# Adding VpnClient template to the device
1680-
_update_template(templates=[vpn_template])
1681-
1682-
self.assertEqual(config.templates.count(), 1)
1683-
self.assertEqual(config.vpnclient_set.count(), 1)
1684-
self.assertEqual(cert_query.count(), 1)
1685-
self.assertEqual(valid_cert_query.count(), 1)
1686-
1687-
# Remove VpnClient template from the device
1688-
_update_template(templates=[])
1689-
1690-
self.assertEqual(config.templates.count(), 0)
1691-
self.assertEqual(config.vpnclient_set.count(), 0)
1692-
# Removing VPN template marks the related certificate as revoked
1693-
self.assertEqual(revoked_cert_query.count(), 1)
1694-
self.assertEqual(valid_cert_query.count(), 0)
1695-
1696-
with self.subTest('Add VpnClient template along with another template'):
1697-
# Adding templates to the device
1698-
_update_template(templates=[template, vpn_template])
1699-
1700-
self.assertEqual(config.templates.count(), 2)
1701-
self.assertEqual(config.vpnclient_set.count(), 1)
1702-
self.assertEqual(valid_cert_query.count(), 1)
1703-
1704-
# Remove VpnClient template from the device
1705-
_update_template(templates=[template])
1706-
1707-
self.assertEqual(config.templates.count(), 1)
1708-
self.assertEqual(config.vpnclient_set.count(), 0)
1709-
self.assertEqual(valid_cert_query.count(), 0)
1710-
self.assertEqual(revoked_cert_query.count(), 2)
1711-
17121570
def test_ip_not_in_add_device(self):
17131571
path = reverse(f'admin:{self.app_label}_device_add')
17141572
response = self.client.get(path)

openwisp_controller/config/tests/test_selenium.py

Lines changed: 110 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,46 @@
1414

1515
from openwisp_utils.tests import SeleniumTestMixin
1616

17-
from .utils import CreateConfigTemplateMixin, TestWireguardVpnMixin
17+
from .utils import CreateConfigTemplateMixin, TestVpnX509Mixin, TestWireguardVpnMixin
1818

1919
Device = load_model('config', 'Device')
20+
Cert = load_model('django_x509', 'Cert')
2021

2122

2223
@tag('selenium_tests')
2324
class TestDeviceAdmin(
2425
SeleniumTestMixin,
2526
CreateConfigTemplateMixin,
27+
TestVpnX509Mixin,
2628
StaticLiveServerTestCase,
2729
):
30+
# helper function for adding/removing templates
31+
def _update_template(self, device_id, templates, is_enabled=False):
32+
self.open(
33+
reverse('admin:config_device_change', args=[device_id]) + '#config-group'
34+
)
35+
self.wait_for_presence(By.CSS_SELECTOR, 'input[name="config-0-templates"]')
36+
37+
# if not is_enabled:
38+
self.hide_loading_overlay()
39+
for template in templates:
40+
template_element = self.find_element(
41+
By.XPATH, f'//*[@value="{template.id}"][@type="checkbox"]'
42+
)
43+
# if enabled by default, assert that the checkbox is selected and enabled
44+
if is_enabled:
45+
self.assertEqual(template_element.is_enabled(), True)
46+
self.assertEqual(template_element.is_selected(), True)
47+
# enable/disable the checkbox
48+
template_element.click()
49+
50+
# Hide user tools because it covers the save button
51+
self.web_driver.execute_script(
52+
'document.querySelector("#ow-user-tools").style.display="none"'
53+
)
54+
self.find_element(by=By.NAME, value='_save').click()
55+
self.wait_for_presence(By.CSS_SELECTOR, '.messagelist .success', timeout=5)
56+
2857
def test_create_new_device(self):
2958
required_template = self._create_template(name='Required', required=True)
3059
default_template = self._create_template(name='Default', default=True)
@@ -86,7 +115,7 @@ def test_create_new_device(self):
86115
'document.querySelector("#ow-user-tools").style.display="none"'
87116
)
88117
self.find_element(by=By.NAME, value='_save').click()
89-
self.wait_for_presence(By.CSS_SELECTOR, '.messagelist .success')
118+
self.wait_for_presence(By.CSS_SELECTOR, '.messagelist .success', timeout=5)
90119
self.assertEqual(
91120
self.find_elements(by=By.CLASS_NAME, value='success')[0].text,
92121
'The Device “11:22:33:44:55:66” was added successfully.',
@@ -296,6 +325,85 @@ def test_force_delete_multiple_devices_with_deactivating_config(self):
296325
delete_confirm.click()
297326
self.assertEqual(Device.objects.count(), 0)
298327

328+
def test_add_remove_templates(self):
329+
template = self._create_template(organization=self._get_org())
330+
config = self._create_config(organization=self._get_org())
331+
device = config.device
332+
self.login()
333+
# some times the url fetching in js gives unauthorized error
334+
# so we add a wait to allow login to complete
335+
time.sleep(2)
336+
337+
with self.subTest('Template should be added'):
338+
self._update_template(device.id, templates=[template])
339+
config.refresh_from_db()
340+
self.assertEqual(config.templates.count(), 1)
341+
self.assertEqual(config.status, 'modified')
342+
config.set_status_applied()
343+
self.assertEqual(config.status, 'applied')
344+
345+
with self.subTest('Template should be removed'):
346+
self._update_template(device.id, templates=[template], is_enabled=True)
347+
config.refresh_from_db()
348+
self.assertEqual(config.templates.count(), 0)
349+
self.assertEqual(config.status, 'modified')
350+
351+
def test_vpn_clients_deleted(self):
352+
vpn = self._create_vpn()
353+
template = self._create_template()
354+
vpn_template = self._create_template(
355+
name='vpn-test',
356+
type='vpn',
357+
vpn=vpn,
358+
auto_cert=True,
359+
)
360+
cert_query = Cert.objects.exclude(pk=vpn.cert_id)
361+
valid_cert_query = cert_query.filter(revoked=False)
362+
revoked_cert_query = cert_query.filter(revoked=True)
363+
364+
config = self._create_config(organization=self._get_org())
365+
device = config.device
366+
self.assertEqual(config.vpnclient_set.count(), 0)
367+
self.assertEqual(config.templates.count(), 0)
368+
self.login()
369+
# some times the url fetching in js gives unauthorized error
370+
# so we add a wait to allow login to complete
371+
time.sleep(2)
372+
373+
with self.subTest('Adding only VpnClient template'):
374+
# Adding VpnClient template to the device
375+
self._update_template(device.id, [vpn_template])
376+
config.refresh_from_db()
377+
self.assertEqual(config.templates.count(), 1)
378+
self.assertEqual(config.vpnclient_set.count(), 1)
379+
self.assertEqual(cert_query.count(), 1)
380+
self.assertEqual(valid_cert_query.count(), 1)
381+
382+
# Remove VpnClient template from the device
383+
self._update_template(device.id, [vpn_template], is_enabled=True)
384+
config.refresh_from_db()
385+
self.assertEqual(config.templates.count(), 0)
386+
self.assertEqual(config.vpnclient_set.count(), 0)
387+
# Removing VPN template marks the related certificate as revoked
388+
self.assertEqual(revoked_cert_query.count(), 1)
389+
self.assertEqual(valid_cert_query.count(), 0)
390+
391+
with self.subTest('Add VpnClient template along with another template'):
392+
# Adding templates to the device
393+
self._update_template(device.id, [template, vpn_template])
394+
config.refresh_from_db()
395+
self.assertEqual(config.templates.count(), 2)
396+
self.assertEqual(config.vpnclient_set.count(), 1)
397+
self.assertEqual(valid_cert_query.count(), 1)
398+
399+
# Remove VpnClient template from the device
400+
self._update_template(device.id, [vpn_template], is_enabled=True)
401+
config.refresh_from_db()
402+
self.assertEqual(config.templates.count(), 1)
403+
self.assertEqual(config.vpnclient_set.count(), 0)
404+
self.assertEqual(valid_cert_query.count(), 0)
405+
self.assertEqual(revoked_cert_query.count(), 2)
406+
299407

300408
@tag('selenium_tests')
301409
class TestDeviceAdminUnsavedChanges(

openwisp_controller/config/tests/test_views.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ def test_get_relevant_templates_without_backend_filter(self):
107107
'required': t4.required,
108108
'default': t4.default,
109109
'name': t4.name,
110+
'selected': False,
110111
}
111112
},
112113
)
@@ -144,6 +145,7 @@ def test_get_relevant_templates_with_backend_filtering(self):
144145
'required': t1.required,
145146
'default': t1.default,
146147
'name': t1.name,
148+
'selected': False,
147149
}
148150
},
149151
)
@@ -163,6 +165,7 @@ def test_get_relevant_templates_with_backend_filtering(self):
163165
'required': t2.required,
164166
'default': t2.default,
165167
'name': t2.name,
168+
'selected': False,
166169
}
167170
},
168171
)

0 commit comments

Comments
 (0)