"""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),
    )