############################################################################## # # Copyright (c) 2005 Zope Corporation and Contributors. All Rights # Reserved. # # This software is subject to the provisions of the Zope Public License, # Version 2.1 (ZPL). A copy of the ZPL should accompany this # distribution. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS # FOR A PARTICULAR PURPOSE. # ############################################################################## """ Unit tests for plugin.exportimport $Id: test_exportimport.py 40167 2005-11-16 18:50:53Z tseaver $ """ import unittest try: import Products.GenericSetup except ImportError: # No GenericSetup, so no tests print 'XXXX: No GenericSetup!' def test_suite(): return unittest.TestSuite() else: from Products.GenericSetup.tests.conformance \ import ConformsToIFilesystemExporter from Products.GenericSetup.tests.conformance \ import ConformsToIFilesystemImporter from Products.GenericSetup.tests.common import SecurityRequestTest from Products.GenericSetup.tests.common import DOMComparator from Products.GenericSetup.tests.common import DummyExportContext from Products.GenericSetup.tests.common import DummyImportContext class _TestBase(SecurityRequestTest, DOMComparator, ConformsToIFilesystemExporter, ConformsToIFilesystemImporter, ): def _makeOne(self, context, *args, **kw): return self._getTargetClass()(context, *args, **kw) class ZODBUserManagerExportImportTests(_TestBase): def _getTargetClass(self): from Products.PluggableAuthService.plugins.exportimport \ import ZODBUserManagerExportImport return ZODBUserManagerExportImport def _makePlugin(self, id='zodbusers', *args, **kw): from Products.PluggableAuthService.plugins.ZODBUserManager \ import ZODBUserManager return ZODBUserManager(id, *args, **kw) def test_listExportableItems(self): plugin = self._makePlugin('lEI').__of__(self.root) adapter = self._makeOne(plugin) self.assertEqual(len(adapter.listExportableItems()), 0) plugin.addUser('foo', 'bar', 'baz') self.assertEqual(len(adapter.listExportableItems()), 0) def test__getExportInfo_empty(self): plugin = self._makePlugin('empty').__of__(self.root) adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], None) self.assertEqual(len(info['users']), 0) def test_export_empty(self): plugin = self._makePlugin('empty').__of__(self.root) adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual( len( context._wrote ), 1 ) filename, text, content_type = context._wrote[ 0 ] self.assertEqual( filename, 'plugins/empty.xml' ) self._compareDOM( text, _EMPTY_ZODB_USERS ) self.assertEqual( content_type, 'text/xml' ) def test__getExportInfo_with_users(self): plugin = self._makePlugin('with_users').__of__(self.root) plugin.title = 'Plugin Title' source_info = [] for info in _ZODB_USER_INFO: info = info.copy() plugin.addUser(**info) hash = plugin._user_passwords[info['user_id']] info['password_hash'] = hash source_info.append(info) adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], 'Plugin Title') self.assertEqual(len(info['users']), len(source_info)) for x, y in zip(info['users'], source_info): self.assertEqual(x['user_id'], y['user_id']) self.assertEqual(x['login_name'], y['login_name']) self.assertEqual(x['password_hash'], y['password_hash']) def test_export_with_users(self): plugin = self._makePlugin('with_users').__of__(self.root) plugin.title = 'Plugin Title' hashes = [] for info in _ZODB_USER_INFO: plugin.addUser(**info) hash = plugin._user_passwords[info['user_id']] hashes.append(hash) adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual( len(context._wrote), 1) filename, text, content_type = context._wrote[ 0 ] self.assertEqual(filename, 'plugins/with_users.xml') self._compareDOM(text, _FILLED_ZODB_USERS % tuple(hashes)) self.assertEqual(content_type, 'text/xml') def test_import_empty(self): HASHES = ('abcde', 'wxyz') plugin = self._makePlugin('empty').__of__(self.root) adapter = self._makeOne(plugin) context = DummyImportContext(plugin) context._files['plugins/empty.xml'] = _FILLED_ZODB_USERS % HASHES self.assertEqual(plugin.title, None) adapter.import_(context, 'plugins', False) self.assertEqual(len(plugin._user_passwords), len(_ZODB_USER_INFO)) self.assertEqual(plugin.title, 'Plugin Title') for info, hash in zip(_ZODB_USER_INFO, HASHES): user_id = info['user_id'] self.assertEqual(plugin.getLoginForUserId(user_id), info['login_name']) self.assertEqual(plugin._user_passwords[user_id], hash) def test_import_without_purge_leaves_existing_users(self): plugin = self._makePlugin('with_users').__of__(self.root) plugin.title = 'Plugin Title' for info in _ZODB_USER_INFO: plugin.addUser(**info) adapter = self._makeOne(plugin) context = DummyImportContext(plugin, purge=False) context._files['plugins/with_users.xml'] = _EMPTY_ZODB_USERS self.assertEqual(len(plugin._user_passwords), len(_ZODB_USER_INFO)) adapter.import_(context, 'plugins', False) self.assertEqual(len(plugin._user_passwords), len(_ZODB_USER_INFO)) self.assertEqual(plugin.title, None) def test_import_with_purge_wipes_existing_users(self): plugin = self._makePlugin('with_users').__of__(self.root) plugin.title = 'Plugin Title' for info in _ZODB_USER_INFO: plugin.addUser(**info) adapter = self._makeOne(plugin) context = DummyImportContext(plugin, purge=True) context._files['plugins/with_users.xml'] = _EMPTY_ZODB_USERS self.assertEqual(len(plugin._user_passwords), len(_ZODB_USER_INFO)) adapter.import_(context, 'plugins', False) self.assertEqual(len(plugin._user_passwords), 0) self.assertEqual(plugin.title, None) class ZODBGroupManagerExportImportTests(_TestBase): def _getTargetClass(self): from Products.PluggableAuthService.plugins.exportimport \ import ZODBGroupManagerExportImport return ZODBGroupManagerExportImport def _makePlugin(self, id, *args, **kw): from Products.PluggableAuthService.plugins.ZODBGroupManager \ import ZODBGroupManager return ZODBGroupManager(id, *args, **kw) def test_listExportableItems(self): plugin = self._makePlugin('lEI').__of__(self.root) adapter = self._makeOne(plugin) self.assertEqual(len(adapter.listExportableItems()), 0) plugin.addGroup('group_id', 'title', 'description') self.assertEqual(len(adapter.listExportableItems()), 0) def test__getExportInfo_empty(self): plugin = self._makePlugin('empty').__of__(self.root) adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], None) self.assertEqual(len(info['groups']), 0) def test_export_empty(self): plugin = self._makePlugin('empty').__of__(self.root) adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual( len( context._wrote ), 1 ) filename, text, content_type = context._wrote[ 0 ] self.assertEqual( filename, 'plugins/empty.xml' ) self._compareDOM( text, _EMPTY_ZODB_GROUPS ) self.assertEqual( content_type, 'text/xml' ) def test__getExportInfo_with_groups(self): plugin = self._makePlugin('with_groups').__of__(self.root) plugin.title = 'Plugin Title' for g in _ZODB_GROUP_INFO: plugin.addGroup(g['group_id'], g['title'], g['description']) for principal in g['principals']: plugin.addPrincipalToGroup(principal, g['group_id']) adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], 'Plugin Title') self.assertEqual(len(info['groups']), len(_ZODB_GROUP_INFO)) for x, y in zip(info['groups'], _ZODB_GROUP_INFO): self.assertEqual(x, y) def test_export_with_groups(self): plugin = self._makePlugin('with_groups').__of__(self.root) plugin.title = 'Plugin Title' for g in _ZODB_GROUP_INFO: plugin.addGroup(g['group_id'], g['title'], g['description']) for principal in g['principals']: plugin.addPrincipalToGroup(principal, g['group_id']) adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual( len(context._wrote), 1) filename, text, content_type = context._wrote[ 0 ] self.assertEqual(filename, 'plugins/with_groups.xml') self._compareDOM(text, _FILLED_ZODB_GROUPS) self.assertEqual(content_type, 'text/xml') def test_import_empty(self): plugin = self._makePlugin('empty').__of__(self.root) adapter = self._makeOne(plugin) context = DummyImportContext(plugin) context._files['plugins/empty.xml'] = _FILLED_ZODB_GROUPS self.assertEqual(plugin.title, None) adapter.import_(context, 'plugins', False) found = plugin.listGroupInfo() self.assertEqual(len(found), len(_ZODB_GROUP_INFO)) self.assertEqual(plugin.title, 'Plugin Title') for finfo, ginfo in zip(found, _ZODB_GROUP_INFO): self.assertEqual(finfo['id'], ginfo['group_id']) self.assertEqual(finfo['title'], ginfo['title']) self.assertEqual(finfo['description'], ginfo['description']) for principal_id in ginfo['principals']: groups = plugin._principal_groups[principal_id] self.failUnless(ginfo['group_id'] in groups) def test_import_without_purge_leaves_existing_users(self): plugin = self._makePlugin('with_groups').__of__(self.root) plugin.title = 'Plugin Title' for g in _ZODB_GROUP_INFO: plugin.addGroup(g['group_id'], g['title'], g['description']) for principal in g['principals']: plugin.addPrincipalToGroup(principal, g['group_id']) adapter = self._makeOne(plugin) context = DummyImportContext(plugin, purge=False) context._files['plugins/with_groups.xml'] = _EMPTY_ZODB_GROUPS self.assertEqual(len(plugin._groups), len(_ZODB_GROUP_INFO)) adapter.import_(context, 'plugins', False) self.assertEqual(len(plugin._groups), len(_ZODB_GROUP_INFO)) self.assertEqual(plugin.title, None) def test_import_with_purge_wipes_existing_users(self): plugin = self._makePlugin('with_groups').__of__(self.root) plugin.title = 'Plugin Title' for g in _ZODB_GROUP_INFO: plugin.addGroup(g['group_id'], g['title'], g['description']) for principal in g['principals']: plugin.addPrincipalToGroup(principal, g['group_id']) adapter = self._makeOne(plugin) context = DummyImportContext(plugin, purge=True) context._files['plugins/with_groups.xml'] = _EMPTY_ZODB_GROUPS self.assertEqual(len(plugin._groups), len(_ZODB_GROUP_INFO)) adapter.import_(context, 'plugins', False) self.assertEqual(len(plugin._groups), 0) self.assertEqual(plugin.title, None) class ZODBRoleManagerExportImportTests(_TestBase): def _getTargetClass(self): from Products.PluggableAuthService.plugins.exportimport \ import ZODBRoleManagerExportImport return ZODBRoleManagerExportImport def _makePlugin(self, id, *args, **kw): from Products.PluggableAuthService.plugins.ZODBRoleManager \ import ZODBRoleManager return ZODBRoleManager(id, *args, **kw) def test_listExportableItems(self): plugin = self._makePlugin('lEI').__of__(self.root) adapter = self._makeOne(plugin) self.assertEqual(len(adapter.listExportableItems()), 0) plugin.addRole('role_id', 'title', 'description') self.assertEqual(len(adapter.listExportableItems()), 0) def test__getExportInfo_empty(self): plugin = self._makePlugin('empty').__of__(self.root) adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], None) self.assertEqual(len(info['roles']), 0) def test_export_empty(self): plugin = self._makePlugin('empty').__of__(self.root) adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual( len( context._wrote ), 1 ) filename, text, content_type = context._wrote[ 0 ] self.assertEqual( filename, 'plugins/empty.xml' ) self._compareDOM( text, _EMPTY_ZODB_ROLES ) self.assertEqual( content_type, 'text/xml' ) def test__getExportInfo_with_roles(self): plugin = self._makePlugin('with_roles').__of__(self.root) plugin.title = 'Plugin Title' for r in _ZODB_ROLE_INFO: plugin.addRole(r['role_id'], r['title'], r['description']) for principal in r['principals']: plugin.assignRoleToPrincipal(r['role_id'], principal) adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], 'Plugin Title') self.assertEqual(len(info['roles']), len(_ZODB_ROLE_INFO)) for x, y in zip(info['roles'], _ZODB_ROLE_INFO): self.assertEqual(x, y) def test_export_with_roles(self): plugin = self._makePlugin('with_roles').__of__(self.root) plugin.title = 'Plugin Title' for r in _ZODB_ROLE_INFO: plugin.addRole(r['role_id'], r['title'], r['description']) for principal in r['principals']: plugin.assignRoleToPrincipal(r['role_id'], principal) adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual( len(context._wrote), 1) filename, text, content_type = context._wrote[ 0 ] self.assertEqual(filename, 'plugins/with_roles.xml') self._compareDOM(text, _FILLED_ZODB_ROLES) self.assertEqual(content_type, 'text/xml') def test_import_empty(self): plugin = self._makePlugin('empty').__of__(self.root) adapter = self._makeOne(plugin) context = DummyImportContext(plugin) context._files['plugins/empty.xml'] = _FILLED_ZODB_ROLES self.assertEqual(plugin.title, None) adapter.import_(context, 'plugins', False) found = plugin.listRoleInfo() self.assertEqual(len(found), len(_ZODB_ROLE_INFO)) self.assertEqual(plugin.title, 'Plugin Title') for finfo, rinfo in zip(found, _ZODB_ROLE_INFO): self.assertEqual(finfo['id'], rinfo['role_id']) self.assertEqual(finfo['title'], rinfo['title']) self.assertEqual(finfo['description'], rinfo['description']) for principal_id in rinfo['principals']: roles = plugin._principal_roles[principal_id] self.failUnless(rinfo['role_id'] in roles) def test_import_without_purge_leaves_existing_users(self): plugin = self._makePlugin('with_roles').__of__(self.root) plugin.title = 'Plugin Title' for r in _ZODB_ROLE_INFO: plugin.addRole(r['role_id'], r['title'], r['description']) for principal in r['principals']: plugin.assignRoleToPrincipal(r['role_id'], principal) adapter = self._makeOne(plugin) context = DummyImportContext(plugin, purge=False) context._files['plugins/with_roles.xml'] = _EMPTY_ZODB_ROLES self.assertEqual(len(plugin._roles), len(_ZODB_ROLE_INFO)) adapter.import_(context, 'plugins', False) self.assertEqual(len(plugin._roles), len(_ZODB_ROLE_INFO)) self.assertEqual(plugin.title, None) def test_import_with_purge_wipes_existing_users(self): plugin = self._makePlugin('with_roles').__of__(self.root) plugin.title = 'Plugin Title' for r in _ZODB_ROLE_INFO: plugin.addRole(r['role_id'], r['title'], r['description']) for principal in r['principals']: plugin.assignRoleToPrincipal(r['role_id'], principal) adapter = self._makeOne(plugin) context = DummyImportContext(plugin, purge=True) context._files['plugins/with_roles.xml'] = _EMPTY_ZODB_ROLES self.assertEqual(len(plugin._roles), len(_ZODB_ROLE_INFO)) adapter.import_(context, 'plugins', False) self.assertEqual(len(plugin._roles), 0) self.assertEqual(plugin.title, None) class CookieAuthHelperExportImportTests(_TestBase): def _getTargetClass(self): from Products.PluggableAuthService.plugins.exportimport \ import CookieAuthHelperExportImport return CookieAuthHelperExportImport def _makePlugin(self, id, *args, **kw): from Products.PluggableAuthService.plugins.CookieAuthHelper \ import CookieAuthHelper return CookieAuthHelper(id, *args, **kw) def test_listExportableItems(self): plugin = self._makePlugin('lEI').__of__(self.root) adapter = self._makeOne(plugin) self.assertEqual(len(adapter.listExportableItems()), 0) plugin.cookie_name = 'COOKIE_NAME' plugin.login_path = 'LOGIN_PATH' self.assertEqual(len(adapter.listExportableItems()), 0) def test__getExportInfo_default(self): from Products.PluggableAuthService.plugins.CookieAuthHelper \ import CookieAuthHelper plugin = self._makePlugin('default').__of__(self.root) adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], None) self.assertEqual(info['cookie_name'], CookieAuthHelper.cookie_name) self.assertEqual(info['login_path'], CookieAuthHelper.login_path) def test_export_default(self): from Products.PluggableAuthService.plugins.CookieAuthHelper \ import CookieAuthHelper as CAH plugin = self._makePlugin('default').__of__(self.root) adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual(len(context._wrote), 1) filename, text, content_type = context._wrote[0] self.assertEqual(filename, 'plugins/default.xml' ) self._compareDOM(text, _COOKIE_AUTH_TEMPLATE_NO_TITLE % (CAH.cookie_name, CAH.login_path, )) self.assertEqual( content_type, 'text/xml' ) def test__getExportInfo_explicitly_set(self): TITLE = 'Plugin Title' COOKIE_NAME = 'COOKIE_NAME' LOGIN_PATH = 'LOGIN_PATH' plugin = self._makePlugin('explicit').__of__(self.root) plugin.title = TITLE plugin.cookie_name = COOKIE_NAME plugin.login_path = LOGIN_PATH adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], TITLE) self.assertEqual(info['cookie_name'], COOKIE_NAME) self.assertEqual(info['login_path'], LOGIN_PATH) def test_export_explicitly_set(self): TITLE = 'Plugin Title' COOKIE_NAME = 'COOKIE_NAME' LOGIN_PATH = 'LOGIN_PATH' plugin = self._makePlugin('explicit').__of__(self.root) plugin.title = TITLE plugin.cookie_name = COOKIE_NAME plugin.login_path = LOGIN_PATH adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual(len(context._wrote), 1) filename, text, content_type = context._wrote[0] self.assertEqual(filename, 'plugins/explicit.xml' ) self._compareDOM(text, _COOKIE_AUTH_TEMPLATE % (TITLE, COOKIE_NAME, LOGIN_PATH, )) self.assertEqual( content_type, 'text/xml' ) def test_import_with_title(self): TITLE = 'Plugin Title' COOKIE_NAME = 'COOKIE_NAME' LOGIN_PATH = 'LOGIN_PATH' plugin = self._makePlugin('with_title').__of__(self.root) adapter = self._makeOne(plugin) context = DummyImportContext(plugin) context._files['plugins/with_title.xml' ] = _COOKIE_AUTH_TEMPLATE % (TITLE, COOKIE_NAME, LOGIN_PATH, ) adapter.import_(context, 'plugins', False) self.assertEqual( plugin.title, TITLE ) self.assertEqual( plugin.cookie_name, COOKIE_NAME ) self.assertEqual( plugin.login_path, LOGIN_PATH ) def test_import_no_title(self): TITLE = 'Plugin Title' COOKIE_NAME = 'COOKIE_NAME' LOGIN_PATH = 'LOGIN_PATH' plugin = self._makePlugin('no_title').__of__(self.root) plugin.title = TITLE plugin.cookie_name = COOKIE_NAME plugin.login_path = LOGIN_PATH adapter = self._makeOne(plugin) context = DummyImportContext(plugin) context._files['plugins/no_title.xml' ] = _COOKIE_AUTH_TEMPLATE_NO_TITLE % (COOKIE_NAME, LOGIN_PATH, ) adapter.import_(context, 'plugins', False) self.assertEqual( plugin.title, None ) self.assertEqual( plugin.cookie_name, COOKIE_NAME ) self.assertEqual( plugin.login_path, LOGIN_PATH ) class DomainAuthHelperExportImportTests(_TestBase): def _getTargetClass(self): from Products.PluggableAuthService.plugins.exportimport \ import DomainAuthHelperExportImport return DomainAuthHelperExportImport def _makePlugin(self, id, *args, **kw): from Products.PluggableAuthService.plugins.DomainAuthHelper \ import DomainAuthHelper return DomainAuthHelper(id, *args, **kw) def test_listExportableItems(self): plugin = self._makePlugin('lEI').__of__(self.root) adapter = self._makeOne(plugin) self.assertEqual(len(adapter.listExportableItems()), 0) plugin.cookie_name = 'COOKIE_NAME' plugin.login_path = 'LOGIN_PATH' plugin.manage_addMapping(user_id='user_id', match_type='equals', match_string='host.example.com', roles=['foo', 'bar'], ) self.assertEqual(len(adapter.listExportableItems()), 0) def test__getExportInfo_empty(self): plugin = self._makePlugin('empty', None).__of__(self.root) adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], None) self.assertEqual(len(info['map']), 0) def test_export_empty(self): plugin = self._makePlugin('empty', None).__of__(self.root) adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual( len( context._wrote ), 1 ) filename, text, content_type = context._wrote[ 0 ] self.assertEqual( filename, 'plugins/empty.xml' ) self._compareDOM( text, _EMPTY_DOMAIN_AUTH ) self.assertEqual( content_type, 'text/xml' ) def test__getExportInfo_with_map(self): TITLE = 'With Map' USER_ID = 'some_user_id' DOMAIN = 'host.example.com' ROLES = ['foo', 'bar'] plugin = self._makePlugin('with_map', TITLE).__of__(self.root) adapter = self._makeOne(plugin) plugin.manage_addMapping(user_id=USER_ID, match_type='equals', match_string=DOMAIN, roles=ROLES, ) info = adapter._getExportInfo() self.assertEqual(info['title'], TITLE) user_map = info['map'] self.assertEqual(len(user_map), 1) self.failUnless(USER_ID in user_map) match_list = user_map[USER_ID] self.assertEqual(len(match_list), 1) match = match_list[0] self.assertEqual(match['username'], USER_ID) self.assertEqual(match['match_type'], 'equals') self.assertEqual(match['match_string'], DOMAIN) self.assertEqual(match['roles'], ','.join(ROLES)) def test_export_with_map(self): TITLE = 'With Map' USER_ID = 'some_user_id' DOMAIN = 'host.example.com' ROLES = ['foo', 'bar'] plugin = self._makePlugin('with_map', TITLE).__of__(self.root) adapter = self._makeOne(plugin) plugin.manage_addMapping(user_id=USER_ID, match_type='equals', match_string=DOMAIN, roles=ROLES, ) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual(len(context._wrote), 1) filename, text, content_type = context._wrote[0] self.assertEqual(filename, 'plugins/with_map.xml' ) self._compareDOM(text, _FILLED_DOMAIN_AUTH % (TITLE, USER_ID, DOMAIN, 'equals', ','.join(ROLES), USER_ID, )) self.assertEqual( content_type, 'text/xml' ) def test_import_empty(self): TITLE = 'With Map' USER_ID = 'some_user_id' DOMAIN = 'host.example.com' ROLES = ['foo', 'bar'] plugin = self._makePlugin('empty').__of__(self.root) adapter = self._makeOne(plugin) context = DummyImportContext(plugin) context._files['plugins/empty.xml' ] = _FILLED_DOMAIN_AUTH % (TITLE, USER_ID, DOMAIN, 'equals', ','.join(ROLES), USER_ID, ) self.assertEqual(plugin.title, '') adapter.import_(context, 'plugins', False) self.assertEqual(len(plugin._domain_map), 1) self.assertEqual(plugin.title, TITLE) username, match_list = plugin._domain_map.items()[0] self.assertEqual(username, USER_ID) self.assertEqual(len(match_list), 1) match = match_list[0] self.assertEqual(match['username'], USER_ID) self.assertEqual(match['match_string'], DOMAIN) self.assertEqual(match['match_real'], DOMAIN) self.assertEqual(match['match_type'], 'equals') self.assertEqual(len(match['roles']), len(ROLES)) for role in ROLES: self.failUnless(role in match['roles']) def test_import_without_purge_leaves_existing_users(self): TITLE = 'With Map' USER_ID = 'some_user_id' DOMAIN = 'host.example.com' ROLES = ['foo', 'bar'] plugin = self._makePlugin('with_map', TITLE).__of__(self.root) adapter = self._makeOne(plugin) plugin.manage_addMapping(user_id=USER_ID, match_type='equals', match_string=DOMAIN, roles=ROLES, ) adapter = self._makeOne(plugin) context = DummyImportContext(plugin, purge=False) context._files['plugins/with_map.xml'] = _EMPTY_DOMAIN_AUTH self.assertEqual(len(plugin._domain_map), 1) adapter.import_(context, 'plugins', False) self.assertEqual(len(plugin._domain_map), 1) self.assertEqual(plugin.title, None) def test_import_with_purge_wipes_existing_users(self): TITLE = 'With Map' USER_ID = 'some_user_id' DOMAIN = 'host.example.com' ROLES = ['foo', 'bar'] plugin = self._makePlugin('with_map', TITLE).__of__(self.root) adapter = self._makeOne(plugin) plugin.manage_addMapping(user_id=USER_ID, match_type='equals', match_string=DOMAIN, roles=ROLES, ) adapter = self._makeOne(plugin) context = DummyImportContext(plugin, purge=True) context._files['plugins/with_map.xml'] = _EMPTY_DOMAIN_AUTH self.assertEqual(len(plugin._domain_map), 1) adapter.import_(context, 'plugins', False) self.assertEqual(len(plugin._domain_map), 0) self.assertEqual(plugin.title, None) class TitleOnlyExportImportTests(_TestBase): def _getTargetClass(self): from Products.PluggableAuthService.plugins.exportimport \ import TitleOnlyExportImport return TitleOnlyExportImport def _makePlugin(self, id, *args, **kw): from OFS.SimpleItem import SimpleItem class _Plugin(SimpleItem): title = None def __init__(self, id, title=None): self._setId(id) if title is not None: self.title = title return _Plugin(id, *args, **kw) def test_listExportableItems(self): plugin = self._makePlugin('lEI').__of__(self.root) adapter = self._makeOne(plugin) self.assertEqual(len(adapter.listExportableItems()), 0) def test__getExportInfo_no_title(self): plugin = self._makePlugin('simple', None).__of__(self.root) adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], None) def test__getExportInfo_with_title(self): plugin = self._makePlugin('simple', None).__of__(self.root) plugin.title = 'Plugin Title' adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], 'Plugin Title') def test_export_no_title(self): plugin = self._makePlugin('no_title', None).__of__(self.root) adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual( len( context._wrote ), 1 ) filename, text, content_type = context._wrote[ 0 ] self.assertEqual( filename, 'plugins/no_title.xml' ) self._compareDOM( text, _TITLE_ONLY_TEMPLATE_NO_TITLE ) self.assertEqual( content_type, 'text/xml' ) def test_export_with_title(self): TITLE = 'Plugin Title' plugin = self._makePlugin('with_title', None).__of__(self.root) plugin.title = TITLE adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual( len( context._wrote ), 1 ) filename, text, content_type = context._wrote[ 0 ] self.assertEqual( filename, 'plugins/with_title.xml' ) self._compareDOM( text, _TITLE_ONLY_TEMPLATE % TITLE ) self.assertEqual( content_type, 'text/xml' ) def test_import_with_title(self): TITLE = 'Plugin Title' plugin = self._makePlugin('with_title').__of__(self.root) adapter = self._makeOne(plugin) context = DummyImportContext(plugin) context._files['plugins/with_title.xml' ] = _TITLE_ONLY_TEMPLATE % TITLE adapter.import_(context, 'plugins', False) self.assertEqual( plugin.title, TITLE ) def test_import_no_title(self): TITLE = 'Plugin Title' plugin = self._makePlugin('no_title').__of__(self.root) plugin.title = TITLE adapter = self._makeOne(plugin) context = DummyImportContext(plugin) context._files['plugins/no_title.xml' ] = _TITLE_ONLY_TEMPLATE_NO_TITLE adapter.import_(context, 'plugins', False) self.assertEqual( plugin.title, None ) class DelegatePathExportImportTests(_TestBase): def _getTargetClass(self): from Products.PluggableAuthService.plugins.exportimport \ import DelegatePathExportImport return DelegatePathExportImport def _makePlugin(self, id, *args, **kw): from OFS.SimpleItem import SimpleItem class _Plugin(SimpleItem): title = None delegate_path = '' def __init__(self, id, title=None): self._setId(id) if title is not None: self.title = title return _Plugin(id, *args, **kw) def test_listExportableItems(self): plugin = self._makePlugin('lEI').__of__(self.root) adapter = self._makeOne(plugin) self.assertEqual(len(adapter.listExportableItems()), 0) plugin.delegate_path = 'path/to/delegate' self.assertEqual(len(adapter.listExportableItems()), 0) def test__getExportInfo_default(self): plugin = self._makePlugin('default').__of__(self.root) adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], None) self.assertEqual(info['delegate_path'], '') def test_export_default(self): plugin = self._makePlugin('default').__of__(self.root) adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual(len(context._wrote), 1) filename, text, content_type = context._wrote[0] self.assertEqual(filename, 'plugins/default.xml' ) self._compareDOM(text, _DELEGATE_PATH_TEMPLATE_NO_TITLE % "") self.assertEqual( content_type, 'text/xml' ) def test__getExportInfo_explicitly_set(self): TITLE = 'Plugin Title' DELEGATE_PATH = 'path/to/delegate' plugin = self._makePlugin('explicit').__of__(self.root) plugin.title = TITLE plugin.delegate_path = DELEGATE_PATH adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], TITLE) self.assertEqual(info['delegate_path'], DELEGATE_PATH) def test_export_explicitly_set(self): TITLE = 'Plugin Title' DELEGATE_PATH = 'path/to/delegate' plugin = self._makePlugin('explicit').__of__(self.root) plugin.title = TITLE plugin.delegate_path = DELEGATE_PATH adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual(len(context._wrote), 1) filename, text, content_type = context._wrote[0] self.assertEqual(filename, 'plugins/explicit.xml' ) self._compareDOM(text, _DELEGATE_PATH_TEMPLATE % (TITLE, DELEGATE_PATH, )) self.assertEqual( content_type, 'text/xml' ) def test_import_with_title(self): TITLE = 'Plugin Title' DELEGATE_PATH = 'path/to/delegate' plugin = self._makePlugin('with_title').__of__(self.root) adapter = self._makeOne(plugin) context = DummyImportContext(plugin) context._files['plugins/with_title.xml' ] = _DELEGATE_PATH_TEMPLATE % (TITLE, DELEGATE_PATH, ) adapter.import_(context, 'plugins', False) self.assertEqual( plugin.title, TITLE ) self.assertEqual( plugin.delegate_path, DELEGATE_PATH ) def test_import_no_title(self): TITLE = 'Plugin Title' DELEGATE_PATH = 'path/to/delegate' plugin = self._makePlugin('no_title').__of__(self.root) plugin.title = TITLE plugin.delegate_path = DELEGATE_PATH adapter = self._makeOne(plugin) context = DummyImportContext(plugin) context._files['plugins/no_title.xml' ] = _DELEGATE_PATH_TEMPLATE_NO_TITLE % DELEGATE_PATH adapter.import_(context, 'plugins', False) self.assertEqual( plugin.title, None ) self.assertEqual( plugin.delegate_path, DELEGATE_PATH ) class DynamicGroupsPluginExportImportTests(_TestBase): def _getTargetClass(self): from Products.PluggableAuthService.plugins.exportimport \ import DynamicGroupsPluginExportImport return DynamicGroupsPluginExportImport def _makePlugin(self, id, *args, **kw): from Products.PluggableAuthService.plugins.DynamicGroupsPlugin \ import DynamicGroupsPlugin return DynamicGroupsPlugin(id, *args, **kw) def test_listExportableItems(self): plugin = self._makePlugin('lEI').__of__(self.root) adapter = self._makeOne(plugin) self.assertEqual(len(adapter.listExportableItems()), 0) plugin.addGroup('group_id', 'python:1', 'Group Title' ) self.assertEqual(len(adapter.listExportableItems()), 0) def test__getExportInfo_empty(self): plugin = self._makePlugin('empty', None).__of__(self.root) adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], None) self.assertEqual(len(info['groups']), 0) def test_export_empty(self): plugin = self._makePlugin('empty', None).__of__(self.root) adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual( len( context._wrote ), 1 ) filename, text, content_type = context._wrote[ 0 ] self.assertEqual( filename, 'plugins/empty.xml' ) self._compareDOM( text, _EMPTY_DYNAMIC_GROUPS ) self.assertEqual( content_type, 'text/xml' ) def test__getExportInfo_with_groups(self): plugin = self._makePlugin('with_groups').__of__(self.root) plugin.title = 'Plugin Title' for g in _DYNAMIC_GROUP_INFO: plugin.addGroup(g['group_id'], g['predicate'], g['title'], g['description'], g['active'], ) adapter = self._makeOne(plugin) info = adapter._getExportInfo() self.assertEqual(info['title'], 'Plugin Title') self.assertEqual(len(info['groups']), len(_DYNAMIC_GROUP_INFO)) for x, y in zip(info['groups'], _DYNAMIC_GROUP_INFO): self.assertEqual(x, y) def test_export_with_groups(self): plugin = self._makePlugin('with_groups').__of__(self.root) plugin.title = 'Plugin Title' for g in _DYNAMIC_GROUP_INFO: plugin.addGroup(g['group_id'], g['predicate'], g['title'], g['description'], g['active'], ) adapter = self._makeOne(plugin) context = DummyExportContext(plugin) adapter.export(context, 'plugins', False) self.assertEqual( len(context._wrote), 1) filename, text, content_type = context._wrote[ 0 ] self.assertEqual(filename, 'plugins/with_groups.xml') self._compareDOM(text, _FILLED_DYNAMIC_GROUPS) self.assertEqual(content_type, 'text/xml') def test_import_empty(self): plugin = self._makePlugin('empty', None).__of__(self.root) adapter = self._makeOne(plugin) context = DummyImportContext(plugin, encoding='ascii') context._files['plugins/empty.xml'] = _FILLED_DYNAMIC_GROUPS self.assertEqual(plugin.title, None) adapter.import_(context, 'plugins', False) found = plugin.listGroupInfo() self.assertEqual(len(found), len(_DYNAMIC_GROUP_INFO)) self.assertEqual(plugin.title, 'Plugin Title') for finfo, ginfo in zip(found, _DYNAMIC_GROUP_INFO): self.assertEqual(finfo['id'], ginfo['group_id']) self.assertEqual(finfo['predicate'], ginfo['predicate']) self.assertEqual(finfo['title'], ginfo['title']) self.assertEqual(finfo['description'], ginfo['description']) self.assertEqual(finfo['active'], ginfo['active']) def test_import_without_purge_leaves_existing_users(self): plugin = self._makePlugin('with_groups').__of__(self.root) plugin.title = 'Plugin Title' for g in _DYNAMIC_GROUP_INFO: plugin.addGroup(g['group_id'], g['predicate'], g['title'], g['description'], g['active'], ) adapter = self._makeOne(plugin) context = DummyImportContext(plugin, purge=False) context._files['plugins/with_groups.xml'] = _EMPTY_DYNAMIC_GROUPS self.assertEqual(len(plugin.listGroupIds()), len(_DYNAMIC_GROUP_INFO)) adapter.import_(context, 'plugins', False) self.assertEqual(len(plugin.listGroupIds()), len(_DYNAMIC_GROUP_INFO)) self.assertEqual(plugin.title, None) def test_import_with_purge_wipes_existing_users(self): plugin = self._makePlugin('with_groups').__of__(self.root) plugin.title = 'Plugin Title' for g in _DYNAMIC_GROUP_INFO: plugin.addGroup(g['group_id'], g['predicate'], g['title'], g['description'], g['active'], ) adapter = self._makeOne(plugin) context = DummyImportContext(plugin, purge=True) context._files['plugins/with_groups.xml'] = _EMPTY_DYNAMIC_GROUPS self.assertEqual(len(plugin.listGroupIds()), len(_DYNAMIC_GROUP_INFO)) adapter.import_(context, 'plugins', False) self.assertEqual(len(plugin.listGroupIds()), 0) self.assertEqual(plugin.title, None) def test_suite(): suite = unittest.TestSuite(( unittest.makeSuite(ZODBUserManagerExportImportTests), unittest.makeSuite(ZODBGroupManagerExportImportTests), unittest.makeSuite(ZODBRoleManagerExportImportTests), unittest.makeSuite(CookieAuthHelperExportImportTests), unittest.makeSuite(DomainAuthHelperExportImportTests), unittest.makeSuite(TitleOnlyExportImportTests), unittest.makeSuite(DelegatePathExportImportTests), unittest.makeSuite(DynamicGroupsPluginExportImportTests), )) return suite _EMPTY_ZODB_USERS = """\ """ _ZODB_USER_INFO = ({'user_id': 'user_1', 'login_name': 'user1@example.com', 'password': 'password1', }, {'user_id': 'user_2', 'login_name': 'user2@example.com', 'password': 'password2', }, ) _FILLED_ZODB_USERS = """\ """ _EMPTY_ZODB_GROUPS = """\ """ _ZODB_GROUP_INFO = ({'group_id': 'group_1', 'title': 'Group 1', 'description': 'First Group', 'principals': ('principal1', 'principal2'), }, {'group_id': 'group_2', 'title': 'Group 2', 'description': 'Second Group', 'principals': ('principal1', 'principal3'), }, ) _FILLED_ZODB_GROUPS = """\ """ _EMPTY_ZODB_ROLES = """\ """ _ZODB_ROLE_INFO = ({'role_id': 'role_1', 'title': 'Role 1', 'description': 'First Role', 'principals': ('principal1', 'principal2'), }, {'role_id': 'role_2', 'title': 'Role 2', 'description': 'Second Role', 'principals': ('principal1', 'principal3'), }, ) _FILLED_ZODB_ROLES = """\ """ _COOKIE_AUTH_TEMPLATE_NO_TITLE = """\ """ _COOKIE_AUTH_TEMPLATE = """\ """ _EMPTY_DOMAIN_AUTH = """\ """ _FILLED_DOMAIN_AUTH = """\ """ _TITLE_ONLY_TEMPLATE_NO_TITLE = """\ """ _TITLE_ONLY_TEMPLATE = """\ """ _DELEGATE_PATH_TEMPLATE_NO_TITLE = """\ """ _DELEGATE_PATH_TEMPLATE = """\ """ _DYNAMIC_GROUP_INFO = ({'group_id': 'group_1', 'title': 'Group 1', 'predicate': 'python:1', 'description': 'First Group', 'active': True, }, {'group_id': 'group_2', 'title': 'Group 2', 'predicate': 'python:0', 'description': 'Second Group', 'active': False, }, ) _EMPTY_DYNAMIC_GROUPS = """\ """ _FILLED_DYNAMIC_GROUPS = """\ """ if __name__ == '__main__': unittest.main(defaultTest='test_suite')