django-journal/tests/test_main.py

97 lines
3.4 KiB
Python

from django.contrib.auth.models import Group, User
from django.db import transaction
from django.test import TestCase
from django.utils.encoding import force_text
from django_journal.actions import export_as_csv_generator
from django_journal.journal import error_record, record
from django_journal.models import Journal, Tag
class JournalTestCase(TestCase):
def setUp(self):
self.users = []
self.groups = []
with transaction.atomic():
for i in range(20):
self.users.append(User.objects.create(username='user%s' % i))
for i in range(20):
self.groups.append(Group.objects.create(name='group%s' % i))
for i in range(20):
record('login', '{user} logged in', user=self.users[i])
for i in range(20):
record(
'group-changed',
'{user1} gave group {group} to {user2}',
user1=self.users[i],
group=self.groups[i],
user2=self.users[(i + 1) % 20],
)
for i in range(20):
record('logout', '{user} logged out', user=self.users[i])
def test_login(self):
for i, event in zip(range(20), Journal.objects.for_tag('login').order_by('id')):
self.assertEqual(force_text(event), f'user{i} logged in')
def test_groups(self):
for i, event in zip(range(40), Journal.objects.for_tag('group-changed').order_by('id')):
self.assertEqual(
force_text(event), 'user{0} gave group group{0} to user{1}'.format(i, (i + 1) % 20)
)
def test_logout(self):
for i, event in zip(range(20), Journal.objects.for_tag('logout').order_by('id')):
self.assertEqual(force_text(event), f'user{i} logged out')
def test_export_as_csv(self):
qs = Journal.objects.all()
l = list(export_as_csv_generator(qs))
self.assertEquals(
set(l[0]),
{
'time',
'tag',
'message',
'group',
'group__id',
'user',
'user__id',
'user1',
'user1__id',
'user2',
'user2__id',
},
)
l = list(export_as_csv_generator(qs[:5]))
self.assertEquals(set(l[0]), {'time', 'tag', 'message', 'user', 'user__id'})
for user in self.users:
user.delete()
qs = Journal.objects.all()
l = list(export_as_csv_generator(qs))
self.assertEquals(l[1]['user'], '<deleted>')
def test_error_record(db):
error_record('error', 'error message')
journal = Journal.objects.first()
assert journal.tag.name == 'error'
assert journal.message == 'error message'
# specifying None as database use the defaut one
error_record('error', 'error message', using=None)
assert Journal.objects.count() == 2
def test_error_record_with_db_obj(db):
tag = Tag.objects.create(name='some-tag')
journal = error_record('error', 'error message', someobj=tag)
objdata = journal.objectdata_set.first()
assert objdata.object_id == tag.pk
# If journal is not deleted test_export_as_csv crashes
# probably some db rollback not done since error_record
# uses a different db router
# to be investigated
journal.delete()