From 81b94aae4e86a8c4852385c2849613eeaa035d87 Mon Sep 17 00:00:00 2001 From: Helmy Giacoman Date: Fri, 10 Jan 2025 16:45:02 +0100 Subject: [PATCH] Cleanup code and add tests SDESK-7459 --- superdesk/core/privileges.py | 10 ++-- tests/core/privileges_registry_test.py | 65 ++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 tests/core/privileges_registry_test.py diff --git a/superdesk/core/privileges.py b/superdesk/core/privileges.py index c8ee62779..57fd146b6 100644 --- a/superdesk/core/privileges.py +++ b/superdesk/core/privileges.py @@ -1,4 +1,3 @@ -from typing import cast from dataclasses import dataclass from quart_babel.speaklater import LazyString @@ -12,7 +11,10 @@ class Privilege: class PrivilegesRegistry: - __privileges: set[Privilege] | frozenset[Privilege] = set() + __privileges: set[Privilege] | frozenset[Privilege] + + def __init__(self): + self.__privileges = set() def add(self, privilege: Privilege): """Add a privilege if the registry is not locked.""" @@ -20,9 +22,7 @@ def add(self, privilege: Privilege): if self.is_locked: raise RuntimeError("Cannot add privileges after the app has started.") - # mypy does not pick the `is_locked` condition - self.__privileges = cast(set[Privilege], self.__privileges) - self.__privileges.add(privilege) + self.__privileges.add(privilege) # type: ignore[union-attr] @property def is_locked(self): diff --git a/tests/core/privileges_registry_test.py b/tests/core/privileges_registry_test.py new file mode 100644 index 000000000..742c54eb2 --- /dev/null +++ b/tests/core/privileges_registry_test.py @@ -0,0 +1,65 @@ +import pytest +from superdesk.core.privileges import PrivilegesRegistry, Privilege + + +@pytest.fixture(scope="function") +def registry(): + reg = PrivilegesRegistry() + yield reg + + print("*" * 100) + reg = None + + +def test_add_privilege_before_lock(registry): + privilege = Privilege(name="edit_article") + + registry.add(privilege) + + assert "edit_article" in registry + assert registry.get_all() == [privilege] + + +def test_add_multiple_privileges(registry): + privilege1 = Privilege(name="edit_article") + privilege2 = Privilege(name="delete_article") + + registry.add(privilege1) + registry.add(privilege2) + + assert "edit_article" in registry + assert "delete_article" in registry + assert len(registry.get_all()) == 2 + + +def test_lock_registry(registry): + privilege = Privilege(name="edit_article") + + registry.add(privilege) + registry.lock() + + assert registry.is_locked + assert "edit_article" in registry + + +def test_cannot_add_after_lock(registry): + privilege = Privilege(name="edit_article") + + registry.add(privilege) + registry.lock() + + with pytest.raises(RuntimeError): + registry.add(Privilege(name="new_privilege")) + + +def test_lock_prevents_further_additions(registry): + privilege = Privilege(name="edit_article") + + registry.add(privilege) + registry.lock() + + with pytest.raises(RuntimeError, match="Cannot add privileges after the app has started."): + registry.add(Privilege(name="new_privilege")) + + assert len(registry.get_all()) == 1 + assert registry.is_locked