security: enforce actor-aware Mail profile access
This commit is contained in:
49
tests/test_mailbox_index.py
Normal file
49
tests/test_mailbox_index.py
Normal file
@@ -0,0 +1,49 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
|
||||
from govoplan_mail.backend.db.models import MailMailboxFolderIndex, MailMailboxMessageIndex
|
||||
from govoplan_mail.backend.mailbox_index import clear_mailbox_index
|
||||
|
||||
|
||||
class _DeleteQuery:
|
||||
def __init__(self, model: type, deleted_models: list[type]) -> None:
|
||||
self.model = model
|
||||
self.deleted_models = deleted_models
|
||||
|
||||
def filter(self, *_criteria):
|
||||
return self
|
||||
|
||||
def delete(self, *, synchronize_session: bool) -> int:
|
||||
if synchronize_session is not False:
|
||||
raise AssertionError("bulk invalidation must not synchronize loaded cache rows")
|
||||
self.deleted_models.append(self.model)
|
||||
return 2 if self.model is MailMailboxMessageIndex else 1
|
||||
|
||||
|
||||
class _Session:
|
||||
def __init__(self) -> None:
|
||||
self.deleted_models: list[type] = []
|
||||
|
||||
def query(self, model: type) -> _DeleteQuery:
|
||||
return _DeleteQuery(model, self.deleted_models)
|
||||
|
||||
|
||||
class MailboxIndexInvalidationTests(unittest.TestCase):
|
||||
def test_profile_wide_invalidation_deletes_messages_before_folders(self) -> None:
|
||||
session = _Session()
|
||||
|
||||
deleted_folders, deleted_messages = clear_mailbox_index(
|
||||
session, # type: ignore[arg-type]
|
||||
profile_id="profile-1",
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
session.deleted_models,
|
||||
[MailMailboxMessageIndex, MailMailboxFolderIndex],
|
||||
)
|
||||
self.assertEqual((deleted_folders, deleted_messages), (1, 2))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user