From eb73f28eac5ef8768eb167df5da3710852328c72 Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Wed, 8 Jul 2026 15:00:56 -0500 Subject: [PATCH 1/4] [test]: delete permit without blockers --- .../backend/businessrules/tests/test_permit.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/specifyweb/backend/businessrules/tests/test_permit.py b/specifyweb/backend/businessrules/tests/test_permit.py index 43a91327236..d8eff2ee6c5 100644 --- a/specifyweb/backend/businessrules/tests/test_permit.py +++ b/specifyweb/backend/businessrules/tests/test_permit.py @@ -130,3 +130,17 @@ def test_add_and_delete_attachment(self): self.assertEqual(permit.permitattachments.count(), 0) self.assertEqual(models.Attachment.objects.filter(id=attachment.id).count(), 0) + + def test_delete_permit_without_blockers(self): + permit = models.Permit.objects.create( + institution=self.institution, + permitnumber='P-DEL-001', + ) + permit_id = permit.id + + permit.delete() + + self.assertEqual( + models.Permit.objects.filter(id=permit_id).count(), + 0, + ) From dbdca1906cf96271f1ab3b1039ec2bb19d24737f Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Wed, 8 Jul 2026 16:03:41 -0500 Subject: [PATCH 2/4] [test]: edit permit --- .../businessrules/tests/test_permit.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/specifyweb/backend/businessrules/tests/test_permit.py b/specifyweb/backend/businessrules/tests/test_permit.py index d8eff2ee6c5..ac3524fae09 100644 --- a/specifyweb/backend/businessrules/tests/test_permit.py +++ b/specifyweb/backend/businessrules/tests/test_permit.py @@ -3,6 +3,7 @@ from specifyweb.specify.tests.test_api import ApiTests from ..exceptions import BusinessRuleException import datetime +from specifyweb.specify.api.crud import update_obj, get_resource class PermitTests(ApiTests): @@ -144,3 +145,29 @@ def test_delete_permit_without_blockers(self): models.Permit.objects.filter(id=permit_id).count(), 0, ) + + def test_edit_permit_updates_version(self): + permit = models.Permit.objects.create( + institution=self.institution, + permitnumber='P-EDIT-001', + ) + skip_perms_check = lambda x: None #skip the permissions checks + data = get_resource('permit', permit.id, skip_perms_check) # fetches the permit from the database and stores in the data dictionary + data['remarks'] = 'Updated remark' + + updated = update_obj( + self.collection, + self.agent, + 'permit', + data['id'], + data['version'], + data, + ) + self.assertEqual(updated.version, permit.version + 1) + + fetched = models.Permit.objects.get(id=permit.id) + self.assertEqual(fetched.remarks, 'Updated remark') + self.assertEqual(fetched.version, permit.version + 1) + + + From cd228b147e92cae86020bf1712ad39c8625d97bf Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Wed, 8 Jul 2026 16:05:08 -0500 Subject: [PATCH 3/4] [test]: added state object detection --- .../backend/businessrules/tests/test_permit.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/specifyweb/backend/businessrules/tests/test_permit.py b/specifyweb/backend/businessrules/tests/test_permit.py index ac3524fae09..24cee56e9e3 100644 --- a/specifyweb/backend/businessrules/tests/test_permit.py +++ b/specifyweb/backend/businessrules/tests/test_permit.py @@ -4,7 +4,7 @@ from ..exceptions import BusinessRuleException import datetime from specifyweb.specify.api.crud import update_obj, get_resource - +from specifyweb.specify.api.exceptions import StaleObjectException class PermitTests(ApiTests): def test_number_is_unique(self): @@ -169,5 +169,18 @@ def test_edit_permit_updates_version(self): self.assertEqual(fetched.remarks, 'Updated remark') self.assertEqual(fetched.version, permit.version + 1) + # Stale object detection + data['version'] = 0 + with self.assertRaises(StaleObjectException): + update_obj( + self.collection, + self.agent, + 'permit', + data['id'], + data['version'], + data, + ) + + From 5897a3a4e62c2ad8d0e449742c727eb96fe938a8 Mon Sep 17 00:00:00 2001 From: Rijul Poudel Date: Wed, 15 Jul 2026 13:43:54 -0500 Subject: [PATCH 4/4] [fix]: Replace lambda with local function --- specifyweb/backend/businessrules/tests/test_permit.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/specifyweb/backend/businessrules/tests/test_permit.py b/specifyweb/backend/businessrules/tests/test_permit.py index 8612274bd1a..cab325a1f99 100644 --- a/specifyweb/backend/businessrules/tests/test_permit.py +++ b/specifyweb/backend/businessrules/tests/test_permit.py @@ -155,7 +155,8 @@ def test_edit_permit_updates_version(self): institution=self.institution, permitnumber='P-EDIT-001', ) - skip_perms_check = lambda x: None #skip the permissions checks + def skip_perms_check(_): + return None data = get_resource('permit', permit.id, skip_perms_check) # fetches the permit from the database and stores in the data dictionary data['remarks'] = 'Updated remark'