Skip to content

Commit a8616ab

Browse files
committed
[tests] Added tests for multi-tenant admin
1 parent a77e765 commit a8616ab

File tree

2 files changed

+164
-19
lines changed

2 files changed

+164
-19
lines changed

openwisp_controller/config/tests/test_admin.py

Lines changed: 87 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -506,17 +506,64 @@ def test_template_vpn_fk_autocomplete_view(self):
506506
hidden=[data["vpn2"].name, data["vpn_inactive"].name],
507507
)
508508

509+
def test_org_admin_create_template_with_shared_vpn(self):
510+
vpn = self._create_vpn(organization=None)
511+
org = self._create_org()
512+
administrator = self._create_administrator(organizations=[org])
513+
path = reverse(f'admin:{self.app_label}_template_add')
514+
payload = {
515+
'organization': '',
516+
'name': 'Test',
517+
'type': 'vpn',
518+
'vpn': str(vpn.id),
519+
'backend': 'netjsonconfig.OpenWrt',
520+
'config': '',
521+
'default_values': '',
522+
'tags': '',
523+
}
524+
self.assertEqual(Template.objects.count(), 2)
525+
526+
with self.subTest('Should not allow creating shared template'):
527+
self._test_org_admin_create_shareable_object(
528+
path=path,
529+
payload=payload,
530+
model=Template,
531+
expected_count=2,
532+
user=administrator,
533+
)
534+
535+
with self.subTest('Should allow creating non-shared template'):
536+
payload['organization'] = str(org.pk)
537+
self._test_org_admin_create_shareable_object(
538+
path=path,
539+
payload=payload,
540+
model=Template,
541+
expected_count=3,
542+
user=administrator,
543+
raises_error=False,
544+
)
545+
546+
def test_org_admin_view_shared_template(self):
547+
vpn = self._create_vpn(organization=None)
548+
template = self._create_template(type='vpn', vpn=vpn)
549+
self._test_org_admin_view_shareable_object(
550+
path=reverse(f'admin:{self.app_label}_template_change', args=[template.pk]),
551+
)
552+
509553
def test_vpn_queryset(self):
510554
data = self._create_multitenancy_test_env(vpn=True)
511555
self._test_multitenant_admin(
512-
url=reverse(f"admin:{self.app_label}_vpn_changelist"),
513-
visible=[data["org1"].name, data["vpn1"].name],
556+
url=reverse(f'admin:{self.app_label}_vpn_changelist'),
557+
visible=[
558+
data['org1'].name,
559+
data['vpn1'].name,
560+
data['vpn_shared'].name,
561+
],
514562
hidden=[
515-
data["org2"].name,
516-
data["inactive"],
517-
data["vpn2"].name,
518-
data["vpn_shared"].name,
519-
data["vpn_inactive"].name,
563+
data['org2'].name,
564+
data['inactive'],
565+
data['vpn2'].name,
566+
data['vpn_inactive'].name,
520567
],
521568
)
522569

@@ -561,6 +608,39 @@ def test_recoverlist_operator_403(self):
561608
self._test_recoverlist_operator_403(self.app_label, "template")
562609
self._test_recoverlist_operator_403(self.app_label, "vpn")
563610

611+
def test_org_admin_create_shared_vpn(self):
612+
org = self._get_org()
613+
ca = self._create_ca(organization=org)
614+
self._test_org_admin_create_shareable_object(
615+
path=reverse(f'admin:{self.app_label}_vpn_add'),
616+
model=Vpn,
617+
payload={
618+
'organization': '',
619+
'name': 'Test',
620+
'host': 'vpn1.test.com',
621+
'key': 'vZFUV5FqYt4WW9nerc23BofQH51gHNNy',
622+
'backend': 'openwisp_controller.vpn_backends.OpenVPN',
623+
'ca': ca.pk,
624+
'config': {
625+
'openvpn': [
626+
{
627+
'server_bridge': '10.8.0.0 255.255.255.0',
628+
'name': 'tun0',
629+
'mode': 'server',
630+
'proto': 'udp',
631+
'dev': 'tun0',
632+
}
633+
]
634+
},
635+
},
636+
)
637+
638+
def test_org_admin_view_shared_vpn(self):
639+
vpn = self._create_vpn(organization=None)
640+
self._test_org_admin_view_shareable_object(
641+
path=reverse(f'admin:{self.app_label}_vpn_change', args=[vpn.pk]),
642+
)
643+
564644
def test_device_template_filter(self):
565645
org = self._get_org(org_name="test-org")
566646
t = self._create_template(name="test-template", organization=org)

openwisp_controller/pki/tests/test_admin.py

Lines changed: 77 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,16 @@ def _create_multitenancy_test_env(self, cert=False):
5757
def test_ca_queryset(self):
5858
data = self._create_multitenancy_test_env()
5959
self._test_multitenant_admin(
60-
url=reverse(f"admin:{self.app_label}_ca_changelist"),
61-
visible=[data["ca1"].name, data["org1"].name],
60+
url=reverse(f'admin:{self.app_label}_ca_changelist'),
61+
visible=[
62+
data['ca1'].name,
63+
data['org1'].name,
64+
data['ca_shared'].name,
65+
],
6266
hidden=[
63-
data["ca2"].name,
64-
data["org2"].name,
65-
data["ca_inactive"].name,
66-
data["ca_shared"].name,
67+
data['ca2'].name,
68+
data['org2'].name,
69+
data['ca_inactive'].name,
6770
],
6871
)
6972

@@ -76,16 +79,39 @@ def test_ca_organization_fk_autocomplete_view(self):
7679
administrator=True,
7780
)
7881

82+
def test_org_create_shared_ca(self):
83+
self._test_org_admin_create_shareable_object(
84+
path=reverse(f'admin:{self.app_label}_ca_add'),
85+
model=Ca,
86+
payload={
87+
'name': 'ca-shared',
88+
'organization': '',
89+
'key_length': 2048,
90+
'digest': 'sha256',
91+
'operation_type': 'new',
92+
'extensions': '',
93+
},
94+
)
95+
96+
def test_org_admin_view_shared_ca(self):
97+
ca = self._create_ca(organization=None)
98+
self._test_org_admin_view_shareable_object(
99+
path=reverse(f'admin:{self.app_label}_ca_change', args=[ca.pk]),
100+
)
101+
79102
def test_cert_queryset(self):
80103
data = self._create_multitenancy_test_env(cert=True)
81104
self._test_multitenant_admin(
82-
url=reverse(f"admin:{self.app_label}_cert_changelist"),
83-
visible=[data["cert1"].name, data["org1"].name],
105+
url=reverse(f'admin:{self.app_label}_cert_changelist'),
106+
visible=[
107+
data['cert1'].name,
108+
data['org1'].name,
109+
data['cert_shared'].name,
110+
],
84111
hidden=[
85-
data["cert2"].name,
86-
data["org2"].name,
87-
data["cert_inactive"].name,
88-
data["cert_shared"].name,
112+
data['cert2'].name,
113+
data['org2'].name,
114+
data['cert_inactive'].name,
89115
],
90116
)
91117

@@ -109,6 +135,45 @@ def test_cert_ca_fk_autocomplete_view(self):
109135
administrator=True,
110136
)
111137

138+
def test_org_admin_create_cert_with_shared_ca(self):
139+
org = self._get_org()
140+
administrator = self._create_administrator(organizations=[org])
141+
shared_ca = self._create_ca(organization=None)
142+
payload = {
143+
'name': 'Test',
144+
'organization': '',
145+
'ca': str(shared_ca.pk),
146+
'operation_type': 'new',
147+
'key_length': 2048,
148+
'digest': 'sha256',
149+
'extensions': '[]',
150+
}
151+
with self.subTest('Should not allow creating shared certificate'):
152+
self._test_org_admin_create_shareable_object(
153+
path=reverse(f'admin:{self.app_label}_cert_add'),
154+
model=Cert,
155+
payload=payload,
156+
user=administrator,
157+
)
158+
159+
with self.subTest('Should allow creating non-shared certificate'):
160+
payload['organization'] = str(org.pk)
161+
self._test_org_admin_create_shareable_object(
162+
path=reverse(f'admin:{self.app_label}_cert_add'),
163+
model=Cert,
164+
payload=payload,
165+
user=administrator,
166+
raises_error=False,
167+
expected_count=1,
168+
)
169+
170+
def test_org_admin_view_shared_cert(self):
171+
shared_ca = self._create_ca(organization=None)
172+
shared_cert = self._create_cert(ca=shared_ca, organization=None)
173+
self._test_org_admin_view_shareable_object(
174+
path=reverse(f'admin:{self.app_label}_cert_change', args=[shared_cert.pk]),
175+
)
176+
112177
def test_cert_changeform_200(self):
113178
org = self._create_org(name="test-org")
114179
self._create_operator(organizations=[org])

0 commit comments

Comments
 (0)