def test_user_has_resource_db_permission(self):
        resolver = ActionAliasPermissionsResolver()
        all_permission_types = PermissionType.get_valid_permissions_for_resource_type(
            ResourceType.ACTION_ALIAS)

        # Admin user, should always return true
        resource_db = self.resources['alias_1']
        user_db = self.users['admin']

        self.assertTrue(self._user_has_resource_db_permissions(
            resolver=resolver,
            user_db=user_db,
            resource_db=resource_db,
            permission_types=all_permission_types))

        # Observer, should always return true for VIEW permission
        user_db = self.users['observer']
        self.assertTrue(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=self.resources['alias_1'],
            permission_type=PermissionType.ACTION_ALIAS_VIEW))
        self.assertTrue(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=self.resources['alias_2'],
            permission_type=PermissionType.ACTION_ALIAS_VIEW))

        self.assertFalse(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=self.resources['alias_1'],
            permission_type=PermissionType.ACTION_ALIAS_MODIFY))
        self.assertFalse(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=self.resources['alias_2'],
            permission_type=PermissionType.ACTION_ALIAS_DELETE))

        # No roles, should return false for everything
        user_db = self.users['no_roles']
        self.assertFalse(self._user_has_resource_db_permissions(
            resolver=resolver,
            user_db=user_db,
            resource_db=resource_db,
            permission_types=all_permission_types))

        # Custom role with no permission grants, should return false for everything
        user_db = self.users['1_custom_role_no_permissions']
        self.assertFalse(self._user_has_resource_db_permissions(
            resolver=resolver,
            user_db=user_db,
            resource_db=resource_db,
            permission_types=all_permission_types))

        # Custom role with unrelated permission grant to parent pack
        user_db = self.users['alias_pack_grant']
        self.assertFalse(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=self.resources['alias_1'],
            permission_type=PermissionType.ACTION_ALIAS_DELETE))
        self.assertFalse(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=self.resources['alias_1'],
            permission_type=PermissionType.ACTION_ALIAS_MODIFY))

        # Custom role with with grant on the parent pack
        user_db = self.users['alias_pack_grant']
        self.assertTrue(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=self.resources['alias_1'],
            permission_type=PermissionType.ACTION_ALIAS_VIEW))
        self.assertTrue(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=self.resources['alias_2'],
            permission_type=PermissionType.ACTION_ALIAS_VIEW))

        self.assertFalse(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=self.resources['alias_2'],
            permission_type=PermissionType.ACTION_ALIAS_DELETE))

        # Custom role with a direct grant on alias
        user_db = self.users['alias_grant']
        self.assertTrue(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=self.resources['alias_3'],
            permission_type=PermissionType.ACTION_ALIAS_VIEW))

        self.assertFalse(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=self.resources['alias_2'],
            permission_type=PermissionType.ACTION_ALIAS_MODIFY))
        self.assertFalse(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=self.resources['alias_3'],
            permission_type=PermissionType.ACTION_ALIAS_MODIFY))

        # Custom role - "action_alias_all" grant on the parent pack
        user_db = self.users['pack_alias_all_grant']
        resource_db = self.resources['alias_1']
        self.assertTrue(self._user_has_resource_db_permissions(
            resolver=resolver,
            user_db=user_db,
            resource_db=resource_db,
            permission_types=all_permission_types))

        # Custom role - "action_alias_all" grant on the alias
        user_db = self.users['alias_all_grant']
        resource_db = self.resources['alias_1']
        self.assertTrue(self._user_has_resource_db_permissions(
            resolver=resolver,
            user_db=user_db,
            resource_db=resource_db,
            permission_types=all_permission_types))

        # Custom role - "action_alias_modify" grant on alias_1
        user_db = self.users['alias_modify_grant']
        resource_db = self.resources['alias_1']
        self.assertTrue(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=resource_db,
            permission_type=PermissionType.ACTION_ALIAS_MODIFY))

        # "modify" also grants "view"
        self.assertTrue(resolver.user_has_resource_db_permission(
            user_db=user_db,
            resource_db=resource_db,
            permission_type=PermissionType.ACTION_ALIAS_VIEW))

        permission_types = [
            PermissionType.ACTION_ALIAS_CREATE,
            PermissionType.ACTION_ALIAS_MODIFY,
            PermissionType.ACTION_ALIAS_DELETE
        ]
        self.assertFalse(self._user_has_resource_db_permissions(
            resolver=resolver,
            user_db=user_db,
            resource_db=resource_db,
            permission_types=permission_types))