#
# Test Zope's standard UserFolder
#

import os, sys
if __name__ == '__main__':
    execfile(os.path.join(sys.path[0], 'framework.py'))

from OFS.Folder import Folder

from Testing import ZopeTestCase
from Testing.ZopeTestCase import _user_name, _user_role, _folder_name, \
    _standard_permissions, ZopeLite

from Products.PluggableUserFolder.PluggableUserFolder import \
    manage_addPluggableUserFolder, PluggableUserFolder
from Products.PluggableUserFolder.InternalAuthentication import \
    InternalAuthenticationPlugin
from Products.PluggableUserFolder.PluginInterfaces import \
    IAuthenticationPlugin, IIdentificationPlugin, IRolePlugin
from Products.PluggableUserFolder.BasicIdentification import \
    manage_addBasicIdentificationPlugin
from Products.PluggableUserFolder.SimpleGroupRoles import \
    manage_addSimpleGroupRolesPlugin

def sorted(l):
    l = list(l)
    l.sort()
    return l

class TestBase(ZopeTestCase.ZopeTestCase):

    _setup_fixture = 0

    def afterSetUp(self):
        self._setupFolder()
        manage_addPluggableUserFolder(self.folder)
        self.uf = self.folder.acl_users
        manage_addSimpleGroupRolesPlugin(self.uf)
        self.uf.userFolderAddUser('someuser', 'secret', ['SomeRole'], ['somegroup'])

    def beforeClose(self, call_close_hook=1):
        '''Clears out the fixture.'''
        self._logout()
        try: del self.uf
        except AttributeError: pass
        try: del self.folder.acl_users
        except AttributeError: pass
        try: self.app._delObject(_folder_name)
        except (AttributeError, RuntimeError): pass
        try: del self.folder
        except AttributeError: pass
        try: del self._user
        except AttributeError: pass

class TestUserFolder(TestBase):
    '''Test UF is working'''

    def makeFolders(self):
        self.root = Folder('root')
        self.root.fold = Folder('fold')
        self.root.fold.ob = Folder('ob')
        return self.root

    def test_getRolesInContext_blocking(self):
        user = self.uf.getUser('someuser')
        root = self.makeFolders()
        fold = root.fold
        ob = fold.ob

        base = ['Authenticated', 'SomeRole']
        self.assertEquals(sorted(user.getRolesInContext(root)), base)
        self.assertEquals(sorted(user.getRolesInContext(fold)), base)
        self.assertEquals(sorted(user.getRolesInContext(ob)), base)

        # Blocking a specific role for a user (not usable from CMF)
        fold.manage_setLocalRoles('someuser', ['Daddy'])
        ob.manage_setLocalRoles('someuser', ['-Daddy'])
        self.assertEquals(sorted(user.getRolesInContext(fold)),
                          ['Authenticated', 'Daddy', 'SomeRole'])
        self.assertEquals(sorted(user.getRolesInContext(ob)), base)

        # Blocking all roles for a user (not usable from CMF)
        ob.manage_setLocalRoles('someuser', ['-'])
        self.assertEquals(sorted(user.getRolesInContext(fold)),
                          ['Authenticated', 'Daddy', 'SomeRole'])
        self.assertEquals(sorted(user.getRolesInContext(ob)), base)

        # Blocking all roles for all
        ob.manage_delLocalRoles(['someuser'])
        ob.manage_setLocalGroupRoles('role:Anonymous', ['-'])
        self.assertEquals(sorted(user.getRolesInContext(fold)),
                          ['Authenticated', 'Daddy', 'SomeRole'])
        self.assertEquals(sorted(user.getRolesInContext(ob)), base)

        # Blocking a specific role for all
        ob.manage_setLocalGroupRoles('role:Anonymous', ['-Daddy'])
        self.assertEquals(sorted(user.getRolesInContext(fold)),
                          ['Authenticated', 'Daddy', 'SomeRole'])


        # XXX FAILS
        self.assertEquals(sorted(user.getRolesInContext(ob)), base)


if __name__ == '__main__':
    framework(descriptions=0, verbosity=1)
else:
    import unittest
    def test_suite():
        suite = unittest.TestSuite()
        suite.addTest(unittest.makeSuite(TestUserFolder))
        return suite

