mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
Cleanup and unit tests.
This commit is contained in:
@@ -97,11 +97,6 @@
|
||||
hide-details
|
||||
/>
|
||||
</confirm-dialog>
|
||||
<v-dialog v-model="showDNSdetail"
|
||||
persistent
|
||||
max-width="800px">
|
||||
<dns-detail @close="showDNSdetail = false" :domain="selectedDomain" />
|
||||
</v-dialog>
|
||||
<v-dialog v-model="showAliasForm"
|
||||
persistent
|
||||
max-width="800px">
|
||||
@@ -130,7 +125,6 @@ import { bus } from '@/main'
|
||||
import domainApi from '@/api/domains'
|
||||
import AdministratorList from './AdministratorList'
|
||||
import ConfirmDialog from '@/components/layout/ConfirmDialog'
|
||||
import DNSDetail from '@/components/domains/DNSDetail'
|
||||
import DNSStatusChip from './DNSStatusChip'
|
||||
import DomainAliasForm from '@/components/domains/DomainAliasForm'
|
||||
import MenuItems from '@/components/tools/MenuItems'
|
||||
@@ -139,7 +133,6 @@ export default {
|
||||
components: {
|
||||
AdministratorList,
|
||||
ConfirmDialog,
|
||||
'dns-detail': DNSDetail,
|
||||
'dns-status-chip': DNSStatusChip,
|
||||
DomainAliasForm,
|
||||
MenuItems
|
||||
@@ -168,7 +161,6 @@ export default {
|
||||
showAdminList: false,
|
||||
showConfirmDialog: false,
|
||||
showAliasForm: false,
|
||||
showDNSdetail: false,
|
||||
search: '',
|
||||
selected: [],
|
||||
expanded: [],
|
||||
@@ -226,10 +218,6 @@ export default {
|
||||
this.$set(this.aliases, item.name, resp.data)
|
||||
})
|
||||
},
|
||||
openDNSDetail (domain) {
|
||||
this.selectedDomain = domain
|
||||
this.showDNSdetail = true
|
||||
},
|
||||
openAdminList (domain) {
|
||||
this.selectedDomain = domain
|
||||
this.showAdminList = true
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
"""Core API related tests."""
|
||||
|
||||
import copy
|
||||
from unittest import mock
|
||||
|
||||
from django.urls import reverse
|
||||
|
||||
from modoboa.core import models
|
||||
from modoboa.lib.tests import ModoAPITestCase
|
||||
|
||||
CORE_SETTINGS = {
|
||||
@@ -106,3 +108,66 @@ class ParametersAPITestCase(ModoAPITestCase):
|
||||
})
|
||||
resp = self.client.put(url, data, format="json")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
|
||||
|
||||
class AccountViewSetTestCase(ModoAPITestCase):
|
||||
|
||||
def test_me(self):
|
||||
url = reverse("v2:account-me")
|
||||
resp = self.client.get(url)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
me = resp.json()
|
||||
self.assertEqual(me["pk"], 1)
|
||||
|
||||
@mock.patch("django_otp.match_token")
|
||||
def test_tfa_verify_code(self, match_mock):
|
||||
user = models.User.objects.get(username="admin")
|
||||
user.totpdevice_set.create(name="Device")
|
||||
user.tfa_enabled = True
|
||||
user.save()
|
||||
|
||||
url = reverse("v2:account-tfa-verify-code")
|
||||
match_mock.side_effect = [user.totpdevice_set.first()]
|
||||
data = {"code": "1234"}
|
||||
resp = self.client.post(url, data, format="json")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn("access", resp.json())
|
||||
|
||||
|
||||
class AuthenticationTestCase(ModoAPITestCase):
|
||||
|
||||
@mock.patch("django_otp.match_token")
|
||||
def test_2fa(self, match_mock):
|
||||
url = reverse("v2:token_obtain_pair")
|
||||
me_url = reverse("v2:account-me")
|
||||
data = {
|
||||
"username": "admin",
|
||||
"password": "password"
|
||||
}
|
||||
resp = self.client.post(url, data, format="json")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
|
||||
self.client.credentials(
|
||||
HTTP_AUTHORIZATION="Bearer {}".format(resp.json()["access"]))
|
||||
resp = self.client.get(me_url)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
|
||||
# Now we enable 2FA
|
||||
user = models.User.objects.get(username="admin")
|
||||
user.totpdevice_set.create(name="Device")
|
||||
user.tfa_enabled = True
|
||||
user.save()
|
||||
resp = self.client.get(me_url)
|
||||
self.assertEqual(resp.status_code, 418)
|
||||
|
||||
# Verify code
|
||||
url = reverse("v2:account-tfa-verify-code")
|
||||
match_mock.side_effect = [user.totpdevice_set.first()]
|
||||
data = {"code": "1234"}
|
||||
resp = self.client.post(url, data, format="json")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
|
||||
self.client.credentials(
|
||||
HTTP_AUTHORIZATION="Bearer {}".format(resp.json()["access"]))
|
||||
resp = self.client.get(me_url)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
|
||||
@@ -188,7 +188,7 @@ MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
|
||||
|
||||
REST_FRAMEWORK = {
|
||||
'DEFAULT_AUTHENTICATION_CLASSES': (
|
||||
'rest_framework_simplejwt.authentication.JWTAuthentication',
|
||||
'modoboa.core.drf_authentication.JWTAuthenticationWith2FA',
|
||||
'rest_framework.authentication.TokenAuthentication',
|
||||
'rest_framework.authentication.SessionAuthentication',
|
||||
),
|
||||
|
||||
@@ -89,17 +89,6 @@ class Registry(object):
|
||||
})
|
||||
return result
|
||||
|
||||
def get_fields(self, level, for_app=None):
|
||||
"""Return fields to include in serializer."""
|
||||
result = []
|
||||
for app, fields in list(self._registry2[level].items()):
|
||||
if app and for_app != app:
|
||||
continue
|
||||
for section, sconfig in list(fields["structure"].items()):
|
||||
for name, config in list(sconfig["params"].items()):
|
||||
result.append(("{}-{}".format(app, name), config["field"]))
|
||||
return result
|
||||
|
||||
def get_serializer_class(self, level, app):
|
||||
"""Return serializer class for given level and app."""
|
||||
if app not in self._registry2[level]:
|
||||
@@ -169,7 +158,7 @@ class Registry(object):
|
||||
registry = Registry()
|
||||
|
||||
|
||||
class Manager(object):
|
||||
class Manager:
|
||||
"""A manager for parameters."""
|
||||
|
||||
def __init__(self, level, parameters):
|
||||
|
||||
@@ -184,6 +184,7 @@ MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
|
||||
|
||||
REST_FRAMEWORK = {
|
||||
'DEFAULT_AUTHENTICATION_CLASSES': (
|
||||
'modoboa.core.drf_authentication.JWTAuthenticationWith2FA',
|
||||
'rest_framework.authentication.TokenAuthentication',
|
||||
'rest_framework.authentication.SessionAuthentication',
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user