Skip to content

Commit 315a62d

Browse files
committed
test: add unit tests for org glob enforcements
1 parent d43e7bf commit 315a62d

1 file changed

Lines changed: 82 additions & 2 deletions

File tree

openedx_authz/tests/test_enforcement.py

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,22 @@
1111

1212
import casbin
1313
import pytest
14+
from casbin.util import key_match_func
1415
from ddt import data, ddt, unpack
1516
from django.contrib.auth import get_user_model
1617

1718
from openedx_authz import ROOT_DIRECTORY
18-
from openedx_authz.api.data import GLOBAL_SCOPE_WILDCARD
19-
from openedx_authz.constants import roles
19+
from openedx_authz.api.data import GLOBAL_SCOPE_WILDCARD, ContentLibraryData, CourseOverviewData
20+
from openedx_authz.constants import permissions, roles
2021
from openedx_authz.engine.matcher import is_admin_or_superuser_check
2122
from openedx_authz.tests.test_utils import (
2223
make_action_key,
24+
make_course_key,
2325
make_library_key,
2426
make_role_key,
2527
make_scope_key,
2628
make_user_key,
29+
make_wildcard_key,
2730
)
2831

2932
User = get_user_model()
@@ -73,6 +76,7 @@ def setUpClass(cls) -> None:
7376

7477
cls.enforcer = casbin.Enforcer(model_file)
7578
cls.enforcer.add_function("is_staff_or_superuser", is_admin_or_superuser_check)
79+
cls.enforcer.add_named_domain_matching_func("g", key_match_func)
7680

7781
def _load_policy(self, policy: list[str]) -> None:
7882
"""
@@ -583,6 +587,82 @@ def test_wildcard_library_access(self, scope: str, expected_result: bool):
583587
self._test_enforcement(self.POLICY, request)
584588

585589

590+
@ddt
591+
class OrgGlobEnforcementTests(CasbinEnforcementTestCase):
592+
"""
593+
Tests for organization-level glob patterns in course and library scopes.
594+
595+
This test class verifies that policies defined with org-level glob patterns
596+
(e.g., "course-v1:OpenedX*" or "lib:DemoX*") are correctly enforced for
597+
concrete course and library scopes that belong to those organizations.
598+
"""
599+
600+
POLICY = [
601+
# Policies
602+
[
603+
"p",
604+
make_role_key(roles.COURSE_STAFF.external_key),
605+
make_action_key("courses.view_course"),
606+
make_wildcard_key(CourseOverviewData.NAMESPACE),
607+
"allow",
608+
],
609+
[
610+
"p",
611+
make_role_key(roles.LIBRARY_ADMIN.external_key),
612+
make_action_key("content_libraries.view_library"),
613+
make_wildcard_key(ContentLibraryData.NAMESPACE),
614+
"allow",
615+
],
616+
# Role assignments
617+
[
618+
"g",
619+
make_user_key("user-1"),
620+
make_role_key(roles.COURSE_STAFF.external_key),
621+
make_course_key("course-v1:OpenedX*"),
622+
],
623+
[
624+
"g",
625+
make_user_key("user-2"),
626+
make_role_key(roles.LIBRARY_ADMIN.external_key),
627+
make_library_key("lib:DemoX*"),
628+
],
629+
]
630+
631+
CASES = [
632+
# Permission granted
633+
{
634+
"subject": make_user_key("user-1"),
635+
"action": make_action_key(permissions.COURSES_VIEW_COURSE.action.external_key),
636+
"scope": make_course_key("course-v1:OpenedX+DemoCourse+2026_T1"),
637+
"expected_result": True,
638+
},
639+
{
640+
"subject": make_user_key("user-2"),
641+
"action": make_action_key(permissions.VIEW_LIBRARY.action.external_key),
642+
"scope": make_library_key("lib:DemoX:OrgLevelGlobLib"),
643+
"expected_result": True,
644+
},
645+
# Permission denied
646+
{
647+
"subject": make_user_key("user-1"),
648+
"action": make_action_key(permissions.COURSES_VIEW_COURSE.action.external_key),
649+
"scope": make_course_key("course-v1:InexistentOrg+DemoCourse+2026_T1"),
650+
"expected_result": False,
651+
},
652+
{
653+
"subject": make_user_key("user-2"),
654+
"action": make_action_key(permissions.VIEW_LIBRARY.action.external_key),
655+
"scope": make_library_key("lib:InexistentOrg:OrgLevelGlobLib"),
656+
"expected_result": False,
657+
},
658+
]
659+
660+
@data(*CASES)
661+
def test_org_level_glob_enforcement(self, request: AuthRequest):
662+
"""Test that org-level glob patterns in scopes are enforced correctly."""
663+
self._test_enforcement(self.POLICY, request)
664+
665+
586666
@pytest.mark.django_db
587667
@ddt
588668
class StaffSuperuserAccessTests(CasbinEnforcementTestCase):

0 commit comments

Comments
 (0)