fix(addresses): require group visibility for book creation
This commit is contained in:
@@ -49,6 +49,7 @@ from govoplan_addresses.backend.schemas import (
|
||||
)
|
||||
from govoplan_addresses.backend.manifest import manifest
|
||||
from govoplan_addresses.backend.service import (
|
||||
AddressBookError,
|
||||
address_book_contact_counts,
|
||||
address_list_entry_counts,
|
||||
create_address_book,
|
||||
@@ -146,6 +147,15 @@ class ReadOnlyPrincipal(Principal):
|
||||
}
|
||||
|
||||
|
||||
class NoGroupPrincipal(Principal):
|
||||
group_ids = frozenset()
|
||||
|
||||
|
||||
class AddressBookAdminPrincipal(NoGroupPrincipal):
|
||||
def has(self, scope: str) -> bool:
|
||||
return scope == "addresses:address_book:admin" or super().has(scope)
|
||||
|
||||
|
||||
class AddressServiceTest(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
engine = create_engine("sqlite:///:memory:")
|
||||
@@ -169,6 +179,29 @@ class AddressServiceTest(unittest.TestCase):
|
||||
self.session = sessionmaker(bind=engine)()
|
||||
self.principal = Principal()
|
||||
|
||||
def test_group_book_creation_requires_membership_or_admin_scope(self) -> None:
|
||||
with self.assertRaisesRegex(AddressBookError, "selected group is not visible"):
|
||||
create_address_book(
|
||||
self.session,
|
||||
NoGroupPrincipal(),
|
||||
AddressBookCreateRequest(scope_type="group", group_id="group-2", name="Unassigned"),
|
||||
)
|
||||
|
||||
with self.assertRaisesRegex(AddressBookError, "selected group is not visible"):
|
||||
create_address_book(
|
||||
self.session,
|
||||
self.principal,
|
||||
AddressBookCreateRequest(scope_type="group", group_id="group-2", name="Other group"),
|
||||
)
|
||||
|
||||
admin_book = create_address_book(
|
||||
self.session,
|
||||
AddressBookAdminPrincipal(),
|
||||
AddressBookCreateRequest(scope_type="group", group_id="group-2", name="Admin-created"),
|
||||
)
|
||||
|
||||
self.assertEqual(admin_book.scope_id, "group-2")
|
||||
|
||||
def test_scoped_book_contact_lookup_and_soft_delete(self) -> None:
|
||||
book = create_address_book(self.session, self.principal, AddressBookCreateRequest(scope_type="user", name="Personal"))
|
||||
self.session.commit()
|
||||
|
||||
Reference in New Issue
Block a user