class TestPermissionsChecksApplied: """Validate some generic things like applied decorators""" SKIP_CHECK = ( # generic endpoints that do not require access checks '/static/', '/hello/', ) def test_access_check_applied(self, test_app): missed = [] for rule, view in self._iter_flask_views(test_app): if rule.rule in self.SKIP_CHECK: continue if not self._has_check_access(view): missed.append(rule.rule) assert missed == [] def _iter_flask_views(self, app): for rule in app.url_map.iter_rules(): endpoint = rule.endpoint view = app.view_functions.get(endpoint) if view is None: continue yield rule, view def _has_check_access(self, view): # Function-based views if getattr(view, '__check_access__', False): return True # Class-based views (MethodView) view_class = getattr(view, 'view_class', None) if view_class: for method_name in view_class.methods or []: method = getattr(view_class, method_name.lower(), None) if method and getattr(method, '__check_access__', False): return True return False