policy(minor): add unittests for policy engine

This commit is contained in:
Langhammer, Jens 2019-10-14 16:08:24 +02:00
parent a691ee529c
commit 65a065c4ee
5 changed files with 70 additions and 4 deletions

View File

@ -21,6 +21,7 @@ exclude_lines =
def __str__ def __str__
def __repr__ def __repr__
if self\.debug if self\.debug
if TYPE_CHECKING
# Don't complain if tests don't hit defensive assertion code: # Don't complain if tests don't hit defensive assertion code:
raise AssertionError raise AssertionError

View File

@ -80,9 +80,9 @@ pylint:
- redis:latest - redis:latest
coverage: coverage:
script: script:
- coverage run manage.py test - coverage run --concurrency=multiprocessing manage.py test
- coverage combine
- coverage report - coverage report
- coverage html
stage: test stage: test
services: services:
- postgres:latest - postgres:latest

View File

@ -1,7 +1,7 @@
"""passbook policy engine""" """passbook policy engine"""
from multiprocessing import Pipe from multiprocessing import Pipe
from multiprocessing.connection import Connection from multiprocessing.connection import Connection
from typing import List, Tuple from typing import List, Optional, Tuple
from django.core.cache import cache from django.core.cache import cache
from django.http import HttpRequest from django.http import HttpRequest
@ -19,13 +19,14 @@ class PolicyProcessInfo:
process: PolicyProcess process: PolicyProcess
connection: Connection connection: Connection
result: PolicyResult result: Optional[PolicyResult]
policy: Policy policy: Policy
def __init__(self, process: PolicyProcess, connection: Connection, policy: Policy): def __init__(self, process: PolicyProcess, connection: Connection, policy: Policy):
self.process = process self.process = process
self.connection = connection self.connection = connection
self.policy = policy self.policy = policy
self.result = None
class PolicyEngine: class PolicyEngine:
"""Orchestrate policy checking, launch tasks and return result""" """Orchestrate policy checking, launch tasks and return result"""

View File

View File

@ -0,0 +1,64 @@
"""policy engine tests"""
from django.core.cache import cache
from django.test import TestCase
from passbook.core.models import DebugPolicy, Policy, User
from passbook.policies.engine import PolicyEngine
class PolicyTestEngine(TestCase):
"""PolicyEngine tests"""
def setUp(self):
cache.clear()
self.user = User.objects.create_user(
username="policyuser")
self.policy_false = DebugPolicy.objects.create(
result=False,
wait_min=0,
wait_max=1)
self.policy_true = DebugPolicy.objects.create(
result=True,
wait_min=0,
wait_max=1)
self.policy_negate = DebugPolicy.objects.create(
negate=True,
result=True,
wait_min=0,
wait_max=1)
self.policy_raises = Policy.objects.create(
name='raises')
def test_engine_empty(self):
"""Ensure empty policy list passes"""
engine = PolicyEngine([], self.user)
self.assertEqual(engine.build().passing, True)
def test_engine_without_user(self):
"""Ensure engine raises error if no user is set"""
with self.assertRaises(ValueError):
PolicyEngine([]).build()
def test_engine(self):
"""Ensure all policies passes (Mix of false and true -> false)"""
engine = PolicyEngine(DebugPolicy.objects.filter(negate__exact=False), self.user)
self.assertEqual(engine.build().passing, False)
def test_engine_negate(self):
"""Test negate flag"""
engine = PolicyEngine(DebugPolicy.objects.filter(negate__exact=True), self.user)
self.assertEqual(engine.build().passing, False)
def test_engine_policy_error(self):
"""Test negate flag"""
engine = PolicyEngine(Policy.objects.filter(name='raises'), self.user)
self.assertEqual(engine.build().passing, False)
def test_engine_cache(self):
"""Ensure empty policy list passes"""
engine = PolicyEngine(DebugPolicy.objects.filter(negate__exact=False), self.user)
self.assertEqual(len(cache.keys('policy_*')), 0)
self.assertEqual(engine.build().passing, False)
self.assertEqual(len(cache.keys('policy_*')), 2)
self.assertEqual(engine.build().passing, False)
self.assertEqual(len(cache.keys('policy_*')), 2)