policies: change .form() and .serializer() to properties, add tests

This commit is contained in:
Jens Langhammer
2020-09-29 10:32:41 +02:00
parent 5da4ff4ff1
commit 9724ded194
42 changed files with 188 additions and 7 deletions

View File

@ -31,6 +31,7 @@ class DummyPolicy(Policy):
return DummyPolicySerializer
@property
def form(self) -> Type[ModelForm]:
from passbook.policies.dummy.forms import DummyPolicyForm

View File

@ -50,7 +50,7 @@ class PolicyEngine:
def __init__(
self, pbm: PolicyBindingModel, user: User, request: HttpRequest = None
):
if not isinstance(pbm, PolicyBindingModel):
if not isinstance(pbm, PolicyBindingModel): # pragma: no cover
raise ValueError(f"{pbm} is not instance of PolicyBindingModel")
self.__pbm = pbm
self.request = PolicyRequest(user)

View File

@ -28,6 +28,7 @@ class PasswordExpiryPolicy(Policy):
return PasswordExpiryPolicySerializer
@property
def form(self) -> Type[ModelForm]:
from passbook.policies.expiry.forms import PasswordExpiryPolicyForm

View File

@ -22,6 +22,7 @@ class ExpressionPolicy(Policy):
return ExpressionPolicySerializer
@property
def form(self) -> Type[ModelForm]:
from passbook.policies.expression.forms import ExpressionPolicyForm

View File

@ -24,6 +24,7 @@ class GroupMembershipPolicy(Policy):
return GroupMembershipPolicySerializer
@property
def form(self) -> Type[ModelForm]:
from passbook.policies.group_membership.forms import GroupMembershipPolicyForm

View File

@ -34,6 +34,7 @@ class HaveIBeenPwendPolicy(Policy):
return HaveIBeenPwendPolicySerializer
@property
def form(self) -> Type[ModelForm]:
from passbook.policies.hibp.forms import HaveIBeenPwnedPolicyForm

View File

@ -83,14 +83,15 @@ class Policy(SerializerModel, CreatedUpdatedModel):
objects = InheritanceAutoManager()
@property
def form(self) -> Type[ModelForm]:
"""Return Form class used to edit this object"""
raise NotImplementedError
def __str__(self):
return f"Policy {self.name}"
return f"{self.__class__.__name__} {self.name}"
def passes(self, request: PolicyRequest) -> PolicyResult:
def passes(self, request: PolicyRequest) -> PolicyResult: # pragma: no cover
"""Check if user instance passes this policy"""
raise PolicyException()

View File

@ -37,6 +37,7 @@ class PasswordPolicy(Policy):
return PasswordPolicySerializer
@property
def form(self) -> Type[ModelForm]:
from passbook.policies.password.forms import PasswordPolicyForm

View File

@ -29,6 +29,7 @@ class ReputationPolicy(Policy):
return ReputationPolicySerializer
@property
def form(self) -> Type[ModelForm]:
from passbook.policies.reputation.forms import ReputationPolicyForm

View File

View File

@ -0,0 +1,30 @@
"""flow model tests"""
from typing import Callable, Type
from django.forms import ModelForm
from django.test import TestCase
from passbook.lib.utils.reflection import all_subclasses
from passbook.policies.models import Policy
class TestPolicyProperties(TestCase):
"""Generic model properties tests"""
def policy_tester_factory(model: Type[Policy]) -> Callable:
"""Test a form"""
def tester(self: TestPolicyProperties):
model_inst = model()
self.assertTrue(issubclass(model_inst.form, ModelForm))
return tester
for policy_type in all_subclasses(Policy):
setattr(
TestPolicyProperties,
f"test_policy_{policy_type.__name__}",
policy_tester_factory(policy_type),
)