# Unit test konova app

* adds unit test for konova app models
* drops unused/unnecessary code fragments
* updates translation
This commit is contained in:
2023-09-08 12:47:50 +02:00
parent 42cb138276
commit e443c5f8be
11 changed files with 255 additions and 85 deletions

View File

@@ -14,6 +14,12 @@ from user.models import UserActionLogEntry, User
class RemoveForm(BaseForm):
""" DEPRECATED
NOT USED IN ANY PLACE.
CAN BE DELETED AT SOME POINT.
"""
check = forms.BooleanField(
label=_("Confirm"),
label_suffix=_(""),

View File

@@ -23,13 +23,9 @@ from django.core.exceptions import ObjectDoesNotExist
from django.http import HttpRequest
from django.utils.timezone import now
from django.db import models, transaction
from compensation.settings import COMPENSATION_IDENTIFIER_TEMPLATE, COMPENSATION_IDENTIFIER_LENGTH, \
ECO_ACCOUNT_IDENTIFIER_TEMPLATE, ECO_ACCOUNT_IDENTIFIER_LENGTH
from ema.settings import EMA_IDENTIFIER_LENGTH, EMA_IDENTIFIER_TEMPLATE
from intervention.settings import INTERVENTION_IDENTIFIER_LENGTH, INTERVENTION_IDENTIFIER_TEMPLATE
from konova.utils import generators
from konova.utils.generators import generate_random_string
from konova.utils.message_templates import CHECKED_RECORDED_RESET, GEOMETRY_CONFLICT_WITH_TEMPLATE
from konova.utils.message_templates import GEOMETRY_CONFLICT_WITH_TEMPLATE
class UuidModel(models.Model):
@@ -298,27 +294,6 @@ class RecordableObjectMixin(models.Model):
return action
def unrecord(self, performing_user, request: HttpRequest = None):
""" Unrecords a dataset
Args:
performing_user (User): The user which performed the editing action
request (HttpRequest): The used request for this action
Returns:
"""
action = None
if self.recorded:
action = self.set_unrecorded(performing_user)
self.log.add(action)
if request:
messages.info(
request,
CHECKED_RECORDED_RESET
)
return action
@abstractmethod
def is_ready_for_publish(self) -> bool:
""" Check for all needed publishing-constraints on the data
@@ -353,7 +328,7 @@ class CheckableObjectMixin(models.Model):
abstract = True
def set_unchecked(self) -> None:
""" Perform unrecording
""" Perform unchecking
Args:
@@ -363,7 +338,7 @@ class CheckableObjectMixin(models.Model):
if not self.checked:
# Nothing to do
return
# Do not .delete() the checked attribute! Just set it to None, since a delete() would kill it out of the
# Do not .delete() the checked attribute! Just set it to None, since a delete() would remove it from the
# log history, which is not what we want!
self.checked = None
self.save()

View File

@@ -290,7 +290,7 @@ class BaseTestCase(TestCase):
])
return codes
def create_dummy_team(self):
def create_dummy_team(self, name: str = None):
""" Creates a dummy team
Returns:
@@ -299,8 +299,11 @@ class BaseTestCase(TestCase):
if self.superuser is None:
self.create_users()
if not name:
name = "Testteam"
team = Team.objects.get_or_create(
name="Testteam",
name=name,
description="Testdescription",
)[0]
team.users.add(self.superuser)

View File

@@ -0,0 +1,182 @@
"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 08.09.23
"""
from django.test import RequestFactory
from intervention.forms.modals.share import ShareModalForm
from konova.models import DeadlineType
from konova.settings import ZB_GROUP
from konova.tests.test_views import BaseTestCase
from konova.utils.user_checks import is_default_group_only
from user.models import UserAction
class DeadlineTestCase(BaseTestCase):
def setUp(self) -> None:
super().setUp()
def test_str(self):
self.assertEqual(str(self.finished_deadline), self.finished_deadline.type)
def test_type_humanized_property(self):
self.assertEqual(self.finished_deadline.type_humanized, DeadlineType.FINISHED.label)
class BaseObjectTestCase(BaseTestCase):
def test_add_log_entry(self):
self.assertEqual(self.intervention.log.count(), 0)
self.intervention.add_log_entry(UserAction.EDITED, self.user, "TEST")
self.assertEqual(self.intervention.log.count(), 1)
last_log = self.intervention.log.first()
self.assertEqual(last_log.user, self.user)
self.assertEqual(last_log.comment, "TEST")
self.assertEqual(last_log.action, UserAction.EDITED)
def test_generate_new_identifier(self):
old_identifier = self.intervention.identifier
new_identifier = self.intervention.generate_new_identifier()
self.assertNotEqual(old_identifier, new_identifier)
class RecordableObjectMixinTestCase(BaseTestCase):
def test_set_recorded_and_set_unrecorded(self):
""" Tests set_unrecorded() as well
Returns:
"""
self.intervention.set_recorded(self.user)
self.assertIsNotNone(self.intervention.recorded)
self.assertEqual(self.intervention.recorded.user, self.user)
self.assertEqual(self.intervention.recorded.action, UserAction.RECORDED)
self.intervention.set_unrecorded(self.user)
self.assertIsNone(self.intervention.recorded)
last_log = self.intervention.log.first()
self.assertEqual(last_log.action, UserAction.UNRECORDED)
self.assertEqual(last_log.user, self.user)
class CheckableObjectMixinTestCase(BaseTestCase):
def test_set_unchecked_and_set_checked(self):
self.intervention.set_checked(self.user)
self.assertIsNotNone(self.intervention.checked)
self.assertEqual(self.intervention.checked.action, UserAction.CHECKED)
self.assertEqual(self.intervention.checked.user, self.user)
checked_action = self.intervention.checked
self.intervention.set_unchecked()
self.assertIsNone(self.intervention.checked)
# There is no explicit UNCHECKED UserAction since unchecking does never happen manually but only as an
# automatic consequence of editing an already checked entry. Therefore the last log entry in this case would
# be the checking of the entry
last_log = self.intervention.log.first()
self.assertEqual(last_log.action, UserAction.CHECKED)
self.assertEqual(last_log.user, self.user)
self.assertEqual(last_log, checked_action)
def test_get_last_checked_action(self):
self.intervention.set_checked(self.user)
action = self.intervention.checked
self.intervention.mark_as_edited(self.user)
last_log = self.intervention.log.first()
self.assertNotEqual(last_log, action)
last_check_action = self.intervention.get_last_checked_action()
self.assertEqual(action, last_check_action)
class ShareableObjectMixinTestCase(BaseTestCase):
def test_share_with_and_is_shared_with(self):
self.assertFalse(self.intervention.is_shared_with(self.user))
self.assertNotIn(self.user, self.intervention.shared_users)
self.intervention.share_with_user(self.user)
self.assertTrue(self.intervention.is_shared_with(self.user))
self.assertIn(self.user, self.intervention.shared_users)
self.assertTrue(self.intervention.is_only_shared_with(self.user))
self.assertFalse(self.intervention.is_only_shared_with(self.superuser))
self.assertNotIn(self.superuser, self.intervention.shared_users)
self.intervention.share_with_user(self.superuser)
self.assertFalse(self.intervention.is_only_shared_with(self.user))
self.assertIn(self.superuser, self.intervention.shared_users)
self.intervention.share_with_user_list([])
self.assertNotIn(self.superuser, self.intervention.shared_users)
self.assertNotIn(self.user, self.intervention.shared_users)
self.intervention.share_with_user_list([
self.superuser,
self.user
])
self.assertIn(self.superuser, self.intervention.shared_users)
self.assertIn(self.user, self.intervention.shared_users)
def test_share_with_team_and_team_list(self):
self.assertNotIn(self.team, self.intervention.shared_teams)
self.intervention.share_with_team(self.team)
self.assertIn(self.team, self.intervention.shared_teams)
another_team = self.create_dummy_team(name="Another team")
team_list = [
self.team,
another_team
]
self.assertNotIn(another_team, self.intervention.shared_teams)
self.intervention.share_with_team_list(team_list)
self.assertIn(another_team, self.intervention.shared_teams)
def test_update_shared_access(self):
another_team = self.create_dummy_team(name="Another team")
request = RequestFactory().request()
request.user = self.superuser
self.superuser.groups.add(
self.groups.get(name=ZB_GROUP)
)
self.intervention.share_with_team(another_team)
self.intervention.share_with_user(self.user)
self.assertTrue(self.intervention.is_shared_with(self.user))
self.assertIn(another_team, self.intervention.shared_teams)
data = {
"users": [
self.superuser.id,
],
"teams": [
self.team.id,
]
}
form = ShareModalForm(data, request=request, instance=self.intervention)
self.assertTrue(form.is_valid(), msg=form.errors)
form.save()
self.assertNotIn(self.user, self.intervention.shared_users)
self.assertNotIn(another_team, self.intervention.shared_teams)
self.assertIn(self.superuser, self.intervention.shared_users)
self.assertIn(self.team, self.intervention.shared_teams)
def test_unshare_with_default_users(self):
self.superuser.groups.add(
self.groups.get(
name=ZB_GROUP
)
)
self.intervention.share_with_user(self.user)
self.intervention.share_with_user(self.superuser)
self.assertTrue(is_default_group_only(self.user))
self.assertFalse(is_default_group_only(self.superuser))
self.assertTrue(self.intervention.is_shared_with(self.user))
self.assertTrue(self.intervention.is_shared_with(self.superuser))
self.intervention.unshare_with_default_users()
self.assertFalse(self.intervention.is_shared_with(self.user))
self.assertTrue(self.intervention.is_shared_with(self.superuser))

View File

@@ -18,7 +18,7 @@ INTERVENTION_INVALID = _("There are errors in this intervention.")
IDENTIFIER_REPLACED = _("The identifier '{}' had to be changed to '{}' since another entry has been added in the meanwhile, which uses this identifier")
ENTRY_REMOVE_MISSING_PERMISSION = _("Only conservation or registration office users are allowed to remove entries.")
MISSING_GROUP_PERMISSION = _("You need to be part of another user group.")
CHECKED_RECORDED_RESET = _("Status of Checked and Recorded reseted")
CHECK_STATE_RESET = _("Status of Checked reset")
RECORDED_BLOCKS_EDIT = _("Entry is recorded. To edit data, the entry first needs to be unrecorded.")
# SHARE