# Unit test konova app
* adds unit test for konova app models * drops unused/unnecessary code fragments * updates translation
This commit is contained in:
@@ -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=_(""),
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
182
konova/tests/unit/test_models.py
Normal file
182
konova/tests/unit/test_models.py
Normal 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))
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user