diff --git a/e2e/utils.py b/e2e/utils.py index 76ae1aec0..64d46e84a 100644 --- a/e2e/utils.py +++ b/e2e/utils.py @@ -58,7 +58,9 @@ class SeleniumTestCase(StaticLiveServerTestCase): ) def tearDown(self): - self.driver.save_screenshot(f"selenium_screenshots/{self.__class__.__name__}_{time()}.png") + self.driver.save_screenshot( + f"selenium_screenshots/{self.__class__.__name__}_{time()}.png" + ) for line in self.driver.get_log("browser"): self.logger.warning( line["message"], source=line["source"], level=line["level"] diff --git a/passbook/admin/tests.py b/passbook/admin/tests.py index efc8ee6b3..a7017775a 100644 --- a/passbook/admin/tests.py +++ b/passbook/admin/tests.py @@ -1,12 +1,15 @@ """admin tests""" +from importlib import import_module from typing import Callable +from django.forms import ModelForm from django.shortcuts import reverse from django.test import Client, TestCase from django.urls.exceptions import NoReverseMatch from passbook.admin.urls import urlpatterns from passbook.core.models import User +from passbook.lib.utils.reflection import get_apps class TestAdmin(TestCase): @@ -34,4 +37,28 @@ def generic_view_tester(view_name: str) -> Callable: for url in urlpatterns: method_name = url.name.replace("-", "_") - setattr(TestAdmin, f"test_{method_name}", generic_view_tester(url.name)) + setattr(TestAdmin, f"test_view_{method_name}", generic_view_tester(url.name)) + + +def generic_form_tester(form: ModelForm) -> Callable: + """Test a form""" + + def tester(self: TestAdmin): + form_inst = form() + self.assertFalse(form_inst.is_valid()) + + return tester + + +# Load the forms module from every app, so we have all forms loaded +for app in get_apps(): + module = app.__module__.replace(".apps", ".forms") + try: + import_module(module) + except ImportError: + pass + +for form_class in ModelForm.__subclasses__(): + setattr( + TestAdmin, f"test_form_{form_class.__name__}", generic_form_tester(form_class) + ) diff --git a/passbook/api/v2/urls.py b/passbook/api/v2/urls.py index a84f98ca9..3035c7bf9 100644 --- a/passbook/api/v2/urls.py +++ b/passbook/api/v2/urls.py @@ -4,7 +4,6 @@ from django.urls import path from drf_yasg import openapi from drf_yasg.views import get_schema_view from rest_framework import routers -from structlog import get_logger from passbook.api.permissions import CustomObjectPermissions from passbook.audit.api import EventViewSet @@ -16,7 +15,6 @@ from passbook.core.api.providers import ProviderViewSet from passbook.core.api.sources import SourceViewSet from passbook.core.api.users import UserViewSet from passbook.flows.api import FlowStageBindingViewSet, FlowViewSet, StageViewSet -from passbook.lib.utils.reflection import get_apps from passbook.policies.api import PolicyBindingViewSet, PolicyViewSet from passbook.policies.dummy.api import DummyPolicyViewSet from passbook.policies.expiry.api import PasswordExpiryPolicyViewSet @@ -48,15 +46,8 @@ from passbook.stages.user_login.api import UserLoginStageViewSet from passbook.stages.user_logout.api import UserLogoutStageViewSet from passbook.stages.user_write.api import UserWriteStageViewSet -LOGGER = get_logger() router = routers.DefaultRouter() -for _passbook_app in get_apps(): - if hasattr(_passbook_app, "api_mountpoint"): - for prefix, viewset in _passbook_app.api_mountpoint: - router.register(prefix, viewset) - LOGGER.debug("Mounted API URLs", app_name=_passbook_app.name) - router.register("core/applications", ApplicationViewSet) router.register("core/groups", GroupViewSet) router.register("core/users", UserViewSet)