From f4f482cd4074898f5344a3a078e27800bbd060fd Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Thu, 26 Oct 2023 17:03:41 +0200 Subject: ✨ refactoring import permissions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ishtar_common/tests.py | 466 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 389 insertions(+), 77 deletions(-) (limited to 'ishtar_common/tests.py') diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py index 979b38395..f14872295 100644 --- a/ishtar_common/tests.py +++ b/ishtar_common/tests.py @@ -37,7 +37,7 @@ from unittest.runner import TextTestRunner, TextTestResult from django.apps import apps from django.conf import settings -from django.contrib.auth.models import User, Permission +from django.contrib.auth.models import User, Permission, Group from django.contrib.contenttypes.models import ContentType from django.contrib.gis.geos import ( GEOSGeometry, @@ -2474,10 +2474,16 @@ class ShortMenuTest(TestCase): class BaseImportTest(TestCase): - - def create_import(self): - create_user() + def setUp(self): imp_model = models.ImporterModel.objects.create( + klass="ishtar_common.models.Parcel", name="Parcel" + ) + self.importer_type = models.ImporterType.objects.create(associated_models=imp_model) + + def create_import(self, name="My Import", need_user=True): + if need_user: + create_user() + imp_model, __ = models.ImporterModel.objects.get_or_create( klass="ishtar_common.models.Person", name="Person" ) importer_type = models.ImporterType.objects.create(associated_models=imp_model) @@ -2490,6 +2496,7 @@ class BaseImportTest(TestCase): with open(dest, "rb") as f: mcc_operation_file = DjangoFile(f) imprt = models.Import.objects.create( + name=name, user=models.IshtarUser.objects.all()[0], importer_type=importer_type, imported_file=mcc_operation_file, @@ -2554,7 +2561,7 @@ class BaseImportTest(TestCase): "csv_sep": ",", } form = forms_common.NewImportGroupForm( - data=post_dict, files=file_dict, user=ishtar_user + data=post_dict, files=file_dict, user=ishtar_user.user_ptr ) self.assertTrue(form.is_valid()) impt = form.save(ishtar_user) @@ -2563,102 +2570,303 @@ class BaseImportTest(TestCase): self.init_group_import(impt) return impt - def create_importer_model(self): - return models.ImporterModel.objects.create( - klass="ishtar_common.models.Parcel", name="Parcel" + +class ImportTestInterface(BaseImportTest): + + def setUp(self): + super().setUp() + self.super_username, self.super_password, __ = create_superuser() + self.simple_username, self.simple_password, __ = create_user() + self.import_username, self.import_password, self.import_user = create_user( + "import-user", "password" ) + self.import_group = Group.objects.create(name="Import") + self.import_user.groups.add(self.import_group) - def create_importer_type(self, imp_model): - return models.ImporterType.objects.create(associated_models=imp_model) + def superuser_login(self): + client = Client() + client.login(username=self.super_username, password=self.super_password) + return client + def simple_login(self): + client = Client() + client.login(username=self.simple_username, password=self.simple_password) + return client -class ImportTest(BaseImportTest): + def import_login(self): + client = Client() + client.login(username=self.import_username, password=self.import_password) + return client + + def set_global_permission(self, imports, codenames): + self.import_group.permissions.clear() + for imprt in imports: + imprt.importer_type.users.clear() + if not isinstance(codenames, (list, tuple)): + codenames = (codenames,) + for codename in codenames: + self.import_group.permissions.add(Permission.objects.get(codename=codename)) + + def remove_global_permission(self, imports, codenames): + self.import_group.permissions.clear() + for imprt in imports: + imprt.importer_type.users.clear() + if not isinstance(codenames, (list, tuple)): + codenames = (codenames,) + for codename in codenames: + perm = Permission.objects.get(codename=codename) + if perm in list(self.import_group.permissions.all()): + self.import_group.permissions.remove() + + def set_own_permission(self, imports, codenames): + self.set_global_permission(imports, codenames) + user = models.IshtarUser.objects.get(user_ptr=self.import_user) + for imprt in imports: + imprt.importer_type.users.add(user) + + def test_list_import(self): + imprt = self.create_import() + imprt2 = self.create_import(name="My-import-2", need_user=False) + # no login and simple user login + for client in (Client(), self.simple_login()): + response = client.get(reverse("current_imports")) + self.assertRedirects(response, '/') + + # superuser + client = self.superuser_login() + response = client.get(reverse("current_imports")) + self.assertEqual(response.status_code, 200) + content = response.content.decode() + self.assertIn(imprt.name, content) + self.assertIn(imprt2.name, content) - def test_edit_import(self): - username, password, user = create_superuser() + # import user + client = self.import_login() + response = client.get(reverse("current_imports")) + self.assertRedirects(response, '/') + + self.set_global_permission([imprt, imprt2], "change_import") + client = self.import_login() + response = client.get(reverse("current_imports")) + self.assertEqual(response.status_code, 200) + content = response.content.decode() + self.assertIn(imprt.name, content) + self.assertIn(imprt2.name, content) + self.remove_global_permission([imprt, imprt2], "change_import") + + self.set_own_permission([imprt], "change_own_import") + client = self.import_login() + response = client.get(reverse("current_imports")) + self.assertEqual(response.status_code, 200) + content = response.content.decode() + self.assertIn(imprt.name, content) + self.assertNotIn(imprt2.name, content, + msg="Import 2 unexpectedly found in import list") + + def test_import_action_permission(self): imprt = self.create_import() - c = Client() - c.login(username=username, password=password) + imprt2 = self.create_import(name="My-import-2", need_user=False) + delete_tag = "