[javascript] upgrade excanvas.js (rev. M3, mars 2009): this fixes plot widgets rendering in IE
"""Hidden internals for the devtools.apptest module:organization: Logilab:copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2.:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses"""__docformat__="restructuredtext en"importsys,tracebackfromlogilab.common.pytestimportpause_tracing,resume_tracingimportyams.schemafromcubicweb.dbapiimportrepo_connect,ConnectionProperties,ProgrammingErrorfromcubicweb.cwvregimportCubicWebVRegistryfromcubicweb.web.applicationimportCubicWebPublisherfromcubicweb.webimportRedirectfromcubicweb.devtoolsimportApptestConfiguration,init_test_databasefromcubicweb.devtools.fakeimportFakeRequestSYSTEM_ENTITIES=('CWGroup','CWUser','CWAttribute','CWRelation','CWConstraint','CWConstraintType','CWProperty','CWEType','CWRType','Workflow','State','BaseTransition','Transition','WorkflowTransition','TrInfo','SubWorkflowExitPoint','RQLExpression',)SYSTEM_RELATIONS=(# virtual relation'identity',# metadata'is','is_instance_of','owned_by','created_by','specializes',# workflow related'workflow_of','state_of','transition_of','initial_state','allowed_transition','destination_state','in_state','wf_info_for','from_state','to_state','condition','subworkflow','subworkflow_state','subworkflow_exit',# permission'in_group','require_group','require_permission','read_permission','update_permission','delete_permission','add_permission',# eproperty'for_user',# schema definition'relation_type','from_entity','to_entity','constrained_by','cstrtype','widget',# deducted from other relations'primary_email',)defunprotected_entities(app_schema,strict=False):"""returned a Set of each non final entity type, excluding CWGroup, and CWUser... """ifstrict:protected_entities=yams.schema.BASE_TYPESelse:protected_entities=yams.schema.BASE_TYPES.union(set(SYSTEM_ENTITIES))entities=set(app_schema.entities())returnentities-protected_entitiesdefignore_relations(*relations):globalSYSTEM_RELATIONSSYSTEM_RELATIONS+=relationsclassTestEnvironment(object):"""TestEnvironment defines a context (e.g. a config + a given connection) in which the tests are executed """def__init__(self,appid,reporter=None,verbose=False,configcls=ApptestConfiguration,requestcls=FakeRequest):config=configcls(appid)self.requestcls=requestclsself.cnx=Noneconfig.db_perms=Falsesource=config.sources()['system']ifverbose:print"init test database ..."self.vreg=vreg=CubicWebVRegistry(config)self.admlogin=source['db-user']# restore database <=> init databaseself.restore_database()ifverbose:print"init done"config.repository=lambdax=None:self.repoself.app=CubicWebPublisher(config,vreg=vreg)self.verbose=verboseschema=self.vreg.schema# else we may run into problems since email address are ususally share in app tests# XXX should not be necessary anymoreschema.rschema('primary_email').set_rproperty('CWUser','EmailAddress','composite',False)self.deletable_entities=unprotected_entities(schema)defrestore_database(self):"""called by unittests' tearDown to restore the original database """try:pause_tracing()ifself.cnx:self.cnx.close()source=self.vreg.config.sources()['system']self.repo,self.cnx=init_test_database(driver=source['db-driver'],vreg=self.vreg)self._orig_cnx=self.cnxresume_tracing()except:resume_tracing()traceback.print_exc()sys.exit(1)# XXX cnx decoration is usually done by the repository authentication manager,# necessary in authentication testsself.cnx.vreg=self.vregself.cnx.login=source['db-user']self.cnx.password=source['db-password']defcreate_user(self,login,groups=('users',),req=None):req=reqorself.create_request()cursor=self._orig_cnx.cursor(req)rset=cursor.execute('INSERT CWUser X: X login %(login)s, X upassword %(passwd)s',{'login':unicode(login),'passwd':login.encode('utf8')})user=rset.get_entity(0,0)cursor.execute('SET X in_group G WHERE X eid %%(x)s, G name IN(%s)'%','.join(repr(g)forgingroups),{'x':user.eid},'x')user.clear_related_cache('in_group','subject')self._orig_cnx.commit()returnuserdeflogin(self,login,password=None):iflogin==self.admlogin:self.restore_connection()else:self.cnx=repo_connect(self.repo,unicode(login),passwordorstr(login),ConnectionProperties('inmemory'))iflogin==self.vreg.config.anonymous_user()[0]:self.cnx.anonymous_connection=Truereturnself.cnxdefrestore_connection(self):ifnotself.cnxisself._orig_cnx:try:self.cnx.close()exceptProgrammingError:pass# already closedself.cnx=self._orig_cnx############################################################################defexecute(self,rql,args=None,eidkey=None,req=None):"""executes <rql>, builds a resultset, and returns a couple (rset, req) where req is a FakeRequest """req=reqorself.create_request(rql=rql)returnself.cnx.cursor(req).execute(unicode(rql),args,eidkey)defcreate_request(self,rql=None,**kwargs):"""executes <rql>, builds a resultset, and returns a couple (rset, req) where req is a FakeRequest """ifrql:kwargs['rql']=rqlreq=self.requestcls(self.vreg,form=kwargs)req.set_connection(self.cnx)returnreqdefget_rset_and_req(self,rql,optional_args=None,args=None,eidkey=None):"""executes <rql>, builds a resultset, and returns a couple (rset, req) where req is a FakeRequest """return(self.execute(rql,args,eidkey),self.create_request(rql=rql,**optional_argsor{}))classExistingTestEnvironment(TestEnvironment):def__init__(self,appid,sourcefile,verbose=False):config=ApptestConfiguration(appid,sourcefile=sourcefile)ifverbose:print"init test database ..."source=config.sources()['system']self.vreg=CubicWebVRegistry(config)self.cnx=init_test_database(driver=source['db-driver'],vreg=self.vreg)[1]ifverbose:print"init done"self.app=CubicWebPublisher(config,vreg=self.vreg)self.verbose=verbose# this is done when the publisher is opening a connectionself.cnx.vreg=self.vregdefsetup(self,config=None):"""config is passed by TestSuite but is ignored in this environment"""cursor=self.cnx.cursor()self.last_eid=cursor.execute('Any X WHERE X creation_date D ORDERBY D DESC LIMIT 1').rows[0][0]defcleanup(self):"""cancel inserted elements during tests"""cursor=self.cnx.cursor()cursor.execute('DELETE Any X WHERE X eid > %(x)s',{'x':self.last_eid},eid_key='x')print"cleaning done"self.cnx.commit()