85 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # ------------------------------------------------------------------------------
 | |
| import os, os.path, sys
 | |
| 
 | |
| # ------------------------------------------------------------------------------
 | |
| class TestMixin:
 | |
|     '''This class is mixed in with any PloneTestCase.'''
 | |
|     def createUser(self, userId, roles):
 | |
|         '''Creates a user p_name p_with some p_roles.'''
 | |
|         pms = self.portal.portal_membership
 | |
|         pms.addMember(userId, 'password', [], [])
 | |
|         self.setRoles(roles, name=userId)
 | |
| 
 | |
|     def changeUser(self, userId):
 | |
|         '''Logs out currently logged user and logs in p_loginName.'''
 | |
|         self.logout()
 | |
|         self.login(userId)
 | |
| 
 | |
|     def getNonEmptySubModules(self, moduleName):
 | |
|         '''Returns the list fo sub-modules of p_app that are non-empty.'''
 | |
|         res = []
 | |
|         try:
 | |
|             exec 'import %s' % moduleName
 | |
|             exec 'moduleObj = %s' % moduleName
 | |
|             moduleFile = moduleObj.__file__
 | |
|             if moduleFile.endswith('.pyc'):
 | |
|                 moduleFile = moduleFile[:-1]
 | |
|         except ImportError, ie:
 | |
|             return res
 | |
|         except SyntaxError, se:
 | |
|             return res
 | |
|         # Include the module if not empty. "Emptyness" is determined by the
 | |
|         # absence of names beginning with other chars than "__".
 | |
|         for elem in moduleObj.__dict__.iterkeys():
 | |
|             if not elem.startswith('__'):
 | |
|                 res.append(moduleObj)
 | |
|                 break
 | |
|         # Include sub-modules if any
 | |
|         if moduleFile.find("__init__.py") != -1:
 | |
|             # Potentially, sub-modules exist.
 | |
|             moduleFolder = os.path.dirname(moduleFile)
 | |
|             for elem in os.listdir(moduleFolder):
 | |
|                 if elem.startswith('.'): continue
 | |
|                 subModuleName, ext = os.path.splitext(elem)
 | |
|                 if ((ext == '.py') and (subModuleName != '__init__')) or \
 | |
|                    os.path.isdir(os.path.join(moduleFolder, subModuleName)):
 | |
|                     # Submodules may be sub-folders or Python files
 | |
|                     subModuleName = '%s.%s' % (moduleName, subModuleName)
 | |
|                     res += self.getNonEmptySubModules(subModuleName)
 | |
|         return res
 | |
| 
 | |
|     @staticmethod
 | |
|     def getCovFolder():
 | |
|         '''Returns the folder where to put the coverage folder if needed.'''
 | |
|         for arg in sys.argv:
 | |
|             if arg.startswith('[coverage'):
 | |
|                 return arg[10:].strip(']')
 | |
|         return None
 | |
| 
 | |
| # Functions executed before and after every test -------------------------------
 | |
| def beforeTest(test):
 | |
|     '''Is executed before every test.'''
 | |
|     g = test.globs
 | |
|     g['tool'] = test.app.plone.get('portal_%s' % g['appName'].lower()).appy()
 | |
|     cfg = g['tool'].o.getProductConfig()
 | |
|     g['appFolder'] = cfg.diskFolder
 | |
|     moduleOrClassName = g['test'].name # Not used yet.
 | |
|     # Initialize the test
 | |
|     test.createUser('admin', ('Member','Manager'))
 | |
|     test.login('admin')
 | |
|     g['t'] = g['test']
 | |
| 
 | |
| def afterTest(test):
 | |
|     '''Is executed after every test.'''
 | |
|     g = test.globs
 | |
|     appName = g['tool'].o.getAppName()
 | |
|     exec 'from Products.%s import cov, covFolder, totalNumberOfTests, ' \
 | |
|          'countTest' % appName
 | |
|     countTest()
 | |
|     exec 'from Products.%s import numberOfExecutedTests' % appName
 | |
|     if cov and (numberOfExecutedTests == totalNumberOfTests):
 | |
|         cov.stop()
 | |
|         # Dumps the coverage report
 | |
|         appModules = test.getNonEmptySubModules(appName)
 | |
|         cov.html_report(directory=covFolder, morfs=appModules)
 | |
| # ------------------------------------------------------------------------------
 | 
