Test LogEntry.actor field

This commit is contained in:
Alieh Rymašeŭski 2020-10-05 14:33:27 +03:00
parent f647966210
commit 5d2bc88b2d

View file

@ -1,15 +1,19 @@
import datetime import datetime
import itertools
import json import json
import django import django
import mock import mock
from dateutil.tz import gettz from dateutil.tz import gettz
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser, User from django.contrib.auth.models import AnonymousUser, User
from django.contrib.contenttypes.models import ContentType
from django.db.models.signals import pre_save from django.db.models.signals import pre_save
from django.test import RequestFactory, TestCase from django.test import RequestFactory, TestCase
from django.utils import dateformat, formats, timezone from django.utils import dateformat, formats, timezone
from auditlog.context import set_actor
from auditlog.middleware import AuditlogMiddleware from auditlog.middleware import AuditlogMiddleware
from auditlog.models import LogEntry from auditlog.models import LogEntry
from auditlog.registry import auditlog from auditlog.registry import auditlog
@ -34,7 +38,11 @@ from auditlog_tests.models import (
class SimpleModelTest(TestCase): class SimpleModelTest(TestCase):
def setUp(self): def setUp(self):
self.obj = SimpleModel.objects.create(text="I am not difficult.") self.obj = self.make_object()
super().setUp()
def make_object(self):
return SimpleModel.objects.create(text="I am not difficult.")
def test_create(self): def test_create(self):
"""Creation is logged correctly.""" """Creation is logged correctly."""
@ -45,7 +53,9 @@ class SimpleModelTest(TestCase):
self.assertEqual(obj.history.count(), 1, msg="There is one log entry") self.assertEqual(obj.history.count(), 1, msg="There is one log entry")
history = obj.history.get() history = obj.history.get()
self.check_create_log_entry(obj, history)
def check_create_log_entry(self, obj, history):
self.assertEqual( self.assertEqual(
history.action, LogEntry.Action.CREATE, msg="Action is 'CREATE'" history.action, LogEntry.Action.CREATE, msg="Action is 'CREATE'"
) )
@ -57,8 +67,7 @@ class SimpleModelTest(TestCase):
obj = self.obj obj = self.obj
# Change something # Change something
obj.boolean = True self.update(obj)
obj.save()
# Check for log entries # Check for log entries
self.assertEqual( self.assertEqual(
@ -68,7 +77,13 @@ class SimpleModelTest(TestCase):
) )
history = obj.history.get(action=LogEntry.Action.UPDATE) history = obj.history.get(action=LogEntry.Action.UPDATE)
self.check_update_log_entry(obj, history)
def update(self, obj):
obj.boolean = True
obj.save()
def check_update_log_entry(self, obj, history):
self.assertJSONEqual( self.assertJSONEqual(
history.changes, history.changes,
'{"boolean": ["False", "True"]}', '{"boolean": ["False", "True"]}',
@ -79,39 +94,104 @@ class SimpleModelTest(TestCase):
"""Deletion is logged correctly.""" """Deletion is logged correctly."""
# Get the object to work with # Get the object to work with
obj = self.obj obj = self.obj
content_type = ContentType.objects.get_for_model(obj.__class__)
history = obj.history.latest() pk = obj.pk
# Delete the object # Delete the object
obj.delete() self.delete(obj)
# Check for log entries # Check for log entries
self.assertEqual( qs = LogEntry.objects.filter(content_type=content_type, object_pk=pk)
LogEntry.objects.filter( self.assertEqual(qs.count(), 1, msg="There is one log entry for 'DELETE'")
content_type=history.content_type,
object_pk=history.object_pk, history = qs.get()
action=LogEntry.Action.DELETE, self.check_delete_log_entry(obj, history)
).count(),
1, def delete(self, obj):
msg="There is one log entry for 'DELETE'", obj.delete()
)
def check_delete_log_entry(self, obj, history):
pass
def test_recreate(self): def test_recreate(self):
SimpleModel.objects.all().delete() self.obj.delete()
self.setUp() self.setUp()
self.test_create() self.test_create()
class AltPrimaryKeyModelTest(SimpleModelTest): class NoActorMixin:
def check_create_log_entry(self, obj, log_entry):
super().check_create_log_entry(obj, log_entry)
self.assertIsNone(log_entry.actor)
def check_update_log_entry(self, obj, log_entry):
super().check_update_log_entry(obj, log_entry)
self.assertIsNone(log_entry.actor)
def check_delete_log_entry(self, obj, log_entry):
super().check_delete_log_entry(obj, log_entry)
self.assertIsNone(log_entry.actor)
class WithActorMixin:
sequence = itertools.count()
def setUp(self): def setUp(self):
self.obj = AltPrimaryKeyModel.objects.create( username = "actor_{}".format(next(self.sequence))
self.user = get_user_model().objects.create(
username=username,
email="{}@example.com".format(username),
password="secret",
)
super().setUp()
def tearDown(self):
self.user.delete()
super().tearDown()
def make_object(self):
with set_actor(self.user):
return super().make_object()
def check_create_log_entry(self, obj, log_entry):
super().check_create_log_entry(obj, log_entry)
self.assertEqual(log_entry.actor, self.user)
def update(self, obj):
with set_actor(self.user):
return super().update(obj)
def check_update_log_entry(self, obj, log_entry):
super().check_update_log_entry(obj, log_entry)
self.assertEqual(log_entry.actor, self.user)
def delete(self, obj):
with set_actor(self.user):
return super().delete(obj)
def check_delete_log_entry(self, obj, log_entry):
super().check_delete_log_entry(obj, log_entry)
self.assertEqual(log_entry.actor, self.user)
class AltPrimaryKeyModelBase(SimpleModelTest):
def make_object(self):
return AltPrimaryKeyModel.objects.create(
key=str(datetime.datetime.now()), text="I am strange." key=str(datetime.datetime.now()), text="I am strange."
) )
class UUIDPrimaryKeyModelModelTest(SimpleModelTest): class AltPrimaryKeyModelTest(NoActorMixin, AltPrimaryKeyModelBase):
def setUp(self): pass
self.obj = UUIDPrimaryKeyModel.objects.create(text="I am strange.")
class AltPrimaryKeyModelWithActorTest(WithActorMixin, AltPrimaryKeyModelBase):
pass
class UUIDPrimaryKeyModelModelBase(SimpleModelTest):
def make_object(self):
return UUIDPrimaryKeyModel.objects.create(text="I am strange.")
def test_get_for_object(self): def test_get_for_object(self):
self.obj.boolean = True self.obj.boolean = True
@ -129,9 +209,27 @@ class UUIDPrimaryKeyModelModelTest(SimpleModelTest):
) )
class ProxyModelTest(SimpleModelTest): class UUIDPrimaryKeyModelModelTest(NoActorMixin, UUIDPrimaryKeyModelModelBase):
def setUp(self): pass
self.obj = ProxyModel.objects.create(text="I am not what you think.")
class UUIDPrimaryKeyModelModelWithActorTest(
WithActorMixin, UUIDPrimaryKeyModelModelBase
):
pass
class ProxyModelBase(SimpleModelTest):
def make_object(self):
return ProxyModel.objects.create(text="I am not what you think.")
class ProxyModelTest(NoActorMixin, ProxyModelBase):
pass
class ProxyModelWithActorTest(WithActorMixin, ProxyModelBase):
pass
class ManyRelatedModelTest(TestCase): class ManyRelatedModelTest(TestCase):