fromlogilab.common.dateimportdatetime2ticksfromcubicweb.devtools.testlibimportCubicWebTCfromcubicweb.webimportfacetclassBaseFacetTC(CubicWebTC):defprepare_rqlst(self,req,rql='CWUser X',mainvar='X',expected_baserql='Any X WHERE X is CWUser',expected_preparedrql='DISTINCT Any WHERE X is CWUser'):rset=req.cnx.execute(rql)rqlst=rset.syntax_tree().copy()filtered_variable,baserql=facet.init_facets(rset,rqlst.children[0],mainvar=mainvar)self.assertEqual(filtered_variable.name,mainvar)self.assertEqual(baserql,expected_baserql)self.assertEqual(rqlst.as_string(),expected_preparedrql)returnrset,rqlst,filtered_variabledef_in_group_facet(self,req,cls=facet.RelationFacet,no_relation=False):rset,rqlst,filtered_variable=self.prepare_rqlst(req)cls.no_relation=no_relationf=cls(req,rset=rset,select=rqlst.children[0],filtered_variable=filtered_variable)f.__regid__='in_group'f.rtype='in_group'f.role='subject'f.target_attr='name'guests,managers=[eidforeid,inreq.cnx.execute('CWGroup G ORDERBY GN ''WHERE G name GN, G name IN ("guests", "managers")')]groups=[eidforeid,inreq.cnx.execute('CWGroup G ORDERBY GN ''WHERE G name GN, G name IN ("guests", "managers")')]returnf,groupsdeftest_relation_simple(self):withself.admin_access.web_request()asreq:f,(guests,managers)=self._in_group_facet(req)self.assertEqual(f.vocabulary(),[(u'guests',guests),(u'managers',managers)])# ensure rqlst is left unmodifiedself.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser')#rqlst = rset.syntax_tree()self.assertEqual(f.possible_values(),[str(guests),str(managers)])# ensure rqlst is left unmodifiedself.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser')f._cw.form[f.__regid__]=str(guests)f.add_rql_restrictions()# selection is cluttered because rqlst has been prepared for facet (it# is not in real life)self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser, X in_group D, D eid %s'%guests)deftest_relation_multiple_and(self):withself.admin_access.web_request()asreq:f,(guests,managers)=self._in_group_facet(req)f._cw.form[f.__regid__]=[str(guests),str(managers)]f._cw.form[f.__regid__+'_andor']='AND'f.add_rql_restrictions()self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser, X in_group A, B eid %s, X in_group B, A eid %s'%(guests,managers))deftest_relation_multiple_or(self):withself.admin_access.web_request()asreq:f,(guests,managers)=self._in_group_facet(req)f._cw.form[f.__regid__]=[str(guests),str(managers)]f._cw.form[f.__regid__+'_andor']='OR'f.add_rql_restrictions()self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser, X in_group A, A eid IN(%s, %s)'%(guests,managers))deftest_relation_optional_rel(self):withself.admin_access.web_request()asreq:rset=req.cnx.execute(u'Any X,GROUP_CONCAT(GN) GROUPBY X ''WHERE X in_group G?, G name GN, NOT G name "users"')rqlst=rset.syntax_tree().copy()select=rqlst.children[0]filtered_variable,baserql=facet.init_facets(rset,select)f=facet.RelationFacet(req,rset=rset,select=select,filtered_variable=filtered_variable)f.rtype='in_group'f.role='subject'f.target_attr='name'guests,managers=[eidforeid,inreq.cnx.execute('CWGroup G ORDERBY GN ''WHERE G name GN, G name IN ("guests", "managers")')]self.assertEqual(f.vocabulary(),[(u'guests',guests),(u'managers',managers)])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X in_group G?, G name GN, NOT G name "users"')#rqlst = rset.syntax_tree()self.assertEqual(sorted(f.possible_values()),[str(guests),str(managers)])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X in_group G?, G name GN, NOT G name "users"')req.form[f.__regid__]=str(guests)f.add_rql_restrictions()# selection is cluttered because rqlst has been prepared for facet (it# is not in real life)self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X in_group G?, G name GN, NOT G name "users", X in_group D, D eid %s'%guests)deftest_relation_no_relation_1(self):withself.admin_access.web_request()asreq:f,(guests,managers)=self._in_group_facet(req,no_relation=True)self.assertEqual(f.vocabulary(),[(u'guests',guests),(u'managers',managers)])self.assertEqual(f.possible_values(),[str(guests),str(managers)])f._cw.create_entity('CWUser',login=u'hop',upassword='toto')self.assertEqual(f.vocabulary(),[(u'<no relation>',''),(u'guests',guests),(u'managers',managers)])self.assertEqual(f.possible_values(),[str(guests),str(managers),''])f._cw.form[f.__regid__]=''f.add_rql_restrictions()self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser, NOT X in_group G')deftest_relation_no_relation_2(self):withself.admin_access.web_request()asreq:f,(guests,managers)=self._in_group_facet(req,no_relation=True)f._cw.form[f.__regid__]=['',guests]f.select.save_state()f.add_rql_restrictions()self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser, (NOT X in_group B) OR (X in_group A, A eid %s)'%guests)f.select.recover()self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser')deftest_relationattribute(self):withself.admin_access.web_request()asreq:f,(guests,managers)=self._in_group_facet(req,cls=facet.RelationAttributeFacet)self.assertEqual(f.vocabulary(),[(u'guests',u'guests'),(u'managers',u'managers')])# ensure rqlst is left unmodifiedself.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser')#rqlst = rset.syntax_tree()self.assertEqual(f.possible_values(),['guests','managers'])# ensure rqlst is left unmodifiedself.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser')f._cw.form[f.__regid__]=u'guests'f.add_rql_restrictions()# selection is cluttered because rqlst has been prepared for facet (it# is not in real life)self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser, X in_group E, E name "guests"')deftest_hasrelation(self):withself.admin_access.web_request()asreq:rset,rqlst,filtered_variable=self.prepare_rqlst(req)f=facet.HasRelationFacet(req,rset=rset,select=rqlst.children[0],filtered_variable=filtered_variable)f.__regid__='has_group'f.rtype='in_group'f.role='subject'f._cw.form[f.__regid__]='feed me'f.add_rql_restrictions()self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser, EXISTS(X in_group A)')deftest_daterange(self):withself.admin_access.web_request()asreq:rset,rqlst,filtered_variable=self.prepare_rqlst(req)f=facet.DateRangeFacet(req,rset=rset,select=rqlst.children[0],filtered_variable=filtered_variable)f.rtype='creation_date'mind,maxd=req.cnx.execute('Any MIN(CD), MAX(CD) WHERE X is CWUser, X creation_date CD')[0]self.assertEqual(f.vocabulary(),[(str(mind),mind),(str(maxd),maxd)])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X is CWUser')#rqlst = rset.syntax_tree()self.assertEqual(f.possible_values(),[str(mind),str(maxd)])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X is CWUser')req.form['%s_inf'%f.__regid__]=str(datetime2ticks(mind))req.form['%s_sup'%f.__regid__]=str(datetime2ticks(mind))f.add_rql_restrictions()# selection is cluttered because rqlst has been prepared for facet (it# is not in real life)self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser, X creation_date >= "%s", ''X creation_date <= "%s"'%(mind.strftime('%Y/%m/%d'),mind.strftime('%Y/%m/%d')))deftest_attribute(self):withself.admin_access.web_request()asreq:rset,rqlst,filtered_variable=self.prepare_rqlst(req)f=facet.AttributeFacet(req,rset=rset,select=rqlst.children[0],filtered_variable=filtered_variable)f.rtype='login'self.assertEqual(f.vocabulary(),[(u'admin',u'admin'),(u'anon',u'anon')])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X is CWUser')#rqlst = rset.syntax_tree()self.assertEqual(f.possible_values(),['admin','anon'])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X is CWUser')req.form[f.__regid__]=u'admin'f.add_rql_restrictions()# selection is cluttered because rqlst has been prepared for facet (it# is not in real life)self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser, X login "admin"')deftest_bitfield(self):withself.admin_access.web_request()asreq:rset,rqlst,filtered_variable=self.prepare_rqlst(req,'CWAttribute X WHERE X ordernum XO',expected_baserql='Any X WHERE X ordernum XO, X is CWAttribute',expected_preparedrql='DISTINCT Any WHERE X ordernum XO, X is CWAttribute')f=facet.BitFieldFacet(req,rset=rset,select=rqlst.children[0],filtered_variable=filtered_variable)f.choices=[('un',1,),('deux',2,)]f.rtype='ordernum'self.assertEqual(f.vocabulary(),[(u'deux',2),(u'un',1)])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X ordernum XO, X is CWAttribute')#rqlst = rset.syntax_tree()self.assertEqual(f.possible_values(),['2','1'])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X ordernum XO, X is CWAttribute')req.form[f.__regid__]='3'f.add_rql_restrictions()# selection is cluttered because rqlst has been prepared for facet (it# is not in real life)self.assertEqual(f.select.as_string(),"DISTINCT Any WHERE X ordernum XO, X is CWAttribute, X ordernum C HAVING 3 = (C & 3)")deftest_bitfield_0_value(self):withself.admin_access.web_request()asreq:rset,rqlst,filtered_variable=self.prepare_rqlst(req,'CWAttribute X WHERE X ordernum XO',expected_baserql='Any X WHERE X ordernum XO, X is CWAttribute',expected_preparedrql='DISTINCT Any WHERE X ordernum XO, X is CWAttribute')f=facet.BitFieldFacet(req,rset=rset,select=rqlst.children[0],filtered_variable=filtered_variable)f.choices=[('zero',0,),('un',1,),('deux',2,)]f.rtype='ordernum'self.assertEqual(f.vocabulary(),[(u'deux',2),(u'un',1),(u'zero',0)])self.assertEqual(f.possible_values(),['2','1','0'])req.form[f.__regid__]='0'f.add_rql_restrictions()self.assertEqual(f.select.as_string(),"DISTINCT Any WHERE X ordernum XO, X is CWAttribute, X ordernum C HAVING 0 = C")deftest_rql_path_eid(self):withself.admin_access.web_request()asreq:rset,rqlst,filtered_variable=self.prepare_rqlst(req)classRPF(facet.RQLPathFacet):path=[('X created_by U'),('U owned_by O'),('O login OL')]filter_variable='O'label_variable='OL'f=RPF(req,rset=rset,select=rqlst.children[0],filtered_variable=filtered_variable)self.assertEqual(f.vocabulary(),[(u'admin',req.user.eid),])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X is CWUser')#rqlst = rset.syntax_tree()self.assertEqual(f.possible_values(),[str(req.user.eid),])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X is CWUser')req.form[f.__regid__]='1'f.add_rql_restrictions()# selection is cluttered because rqlst has been prepared for facet (it# is not in real life)self.assertEqual(f.select.as_string(),"DISTINCT Any WHERE X is CWUser, X created_by F, F owned_by G, G eid 1")deftest_rql_path_eid_no_label(self):withself.admin_access.web_request()asreq:rset,rqlst,filtered_variable=self.prepare_rqlst(req)classRPF(facet.RQLPathFacet):path=[('X created_by U'),('U owned_by O'),('O login OL')]filter_variable='O'f=RPF(req,rset=rset,select=rqlst.children[0],filtered_variable=filtered_variable)self.assertEqual(f.vocabulary(),[(str(req.user.eid),req.user.eid),])deftest_rql_path_attr(self):withself.admin_access.web_request()asreq:rset,rqlst,filtered_variable=self.prepare_rqlst(req)classRPF(facet.RQLPathFacet):path=[('X created_by U'),('U owned_by O'),('O login OL')]filter_variable='OL'f=RPF(req,rset=rset,select=rqlst.children[0],filtered_variable=filtered_variable)self.assertEqual(f.vocabulary(),[(u'admin','admin'),])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X is CWUser')self.assertEqual(f.possible_values(),['admin',])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X is CWUser')req.form[f.__regid__]=u'admin'f.add_rql_restrictions()# selection is cluttered because rqlst has been prepared for facet (it# is not in real life)self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser, X created_by G, G owned_by H, H login "admin"')deftest_rql_path_check_filter_label_variable(self):withself.admin_access.web_request()asreq:rset,rqlst,filtered_variable=self.prepareg_aggregat_rqlst(req)classRPF(facet.RQLPathFacet):path=[('X created_by U'),('U owned_by O'),('O login OL')]filter_variable='OL'label_variable='OL'self.assertRaises(AssertionError,RPF,req,rset=rset,select=rqlst.children[0],filtered_variable=filtered_variable)deftest_rqlpath_range(self):withself.admin_access.web_request()asreq:rset,rqlst,filtered_variable=self.prepare_rqlst(req)classRRF(facet.DateRangeRQLPathFacet):path=[('X created_by U'),('U owned_by O'),('O creation_date OL')]filter_variable='OL'f=RRF(req,rset=rset,select=rqlst.children[0],filtered_variable=filtered_variable)mind,maxd=req.cnx.execute('Any MIN(CD), MAX(CD) WHERE X is CWUser, X created_by U, U owned_by O, O creation_date CD')[0]self.assertEqual(f.vocabulary(),[(str(mind),mind),(str(maxd),maxd)])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X is CWUser')self.assertEqual(f.possible_values(),[str(mind),str(maxd)])# ensure rqlst is left unmodifiedself.assertEqual(rqlst.as_string(),'DISTINCT Any WHERE X is CWUser')req.form['%s_inf'%f.__regid__]=str(datetime2ticks(mind))req.form['%s_sup'%f.__regid__]=str(datetime2ticks(mind))f.add_rql_restrictions()# selection is cluttered because rqlst has been prepared for facet (it# is not in real life)self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser, X created_by G, G owned_by H, H creation_date >= "%s", ''H creation_date <= "%s"'%(mind.strftime('%Y/%m/%d'),mind.strftime('%Y/%m/%d')))defprepareg_aggregat_rqlst(self,req):returnself.prepare_rqlst(req,u'Any 1, COUNT(X) WHERE X is CWUser, X creation_date XD, ''X modification_date XM, Y creation_date YD, Y is CWGroup ''HAVING DAY(XD)>=DAY(YD) AND DAY(XM)<=DAY(YD)','X',expected_baserql=u'Any 1,COUNT(X) WHERE X is CWUser, X creation_date XD, ''X modification_date XM, Y creation_date YD, Y is CWGroup ''HAVING DAY(XD) >= DAY(YD), DAY(XM) <= DAY(YD)',expected_preparedrql=u'DISTINCT Any WHERE X is CWUser, X creation_date XD, ''X modification_date XM, Y creation_date YD, Y is CWGroup ''HAVING DAY(XD) >= DAY(YD), DAY(XM) <= DAY(YD)')deftest_aggregat_query_cleanup_select(self):withself.admin_access.web_request()asreq:rset,rqlst,filtered_variable=self.prepareg_aggregat_rqlst(req)select=rqlst.children[0]facet.cleanup_select(select,filtered_variable=filtered_variable)self.assertEqual(select.as_string(),'DISTINCT Any WHERE X is CWUser, X creation_date XD, ''X modification_date XM, Y creation_date YD, Y is CWGroup ''HAVING DAY(XD) >= DAY(YD), DAY(XM) <= DAY(YD)')deftest_aggregat_query_rql_path(self):withself.admin_access.web_request()asreq:rset,rqlst,filtered_variable=self.prepareg_aggregat_rqlst(req)classRPF(facet.RQLPathFacet):path=[('X created_by U'),('U owned_by O'),('O login OL')]filter_variable='OL'f=RPF(req,rset=rset,select=rqlst.children[0],filtered_variable=filtered_variable)self.assertEqual(f.vocabulary(),[(u'admin',u'admin')])self.assertEqual(f.possible_values(),['admin'])req.form[f.__regid__]=u'admin'f.add_rql_restrictions()self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser, X creation_date XD, ''X modification_date XM, Y creation_date YD, Y is CWGroup, ''X created_by G, G owned_by H, H login "admin" ''HAVING DAY(XD) >= DAY(YD), DAY(XM) <= DAY(YD)')deftest_aggregat_query_attribute(self):withself.admin_access.web_request()asreq:rset,rqlst,filtered_variable=self.prepareg_aggregat_rqlst(req)f=facet.AttributeFacet(req,rset=rset,select=rqlst.children[0],filtered_variable=filtered_variable)f.rtype='login'self.assertEqual(f.vocabulary(),[(u'admin',u'admin'),(u'anon',u'anon')])self.assertEqual(f.possible_values(),['admin','anon'])req.form[f.__regid__]=u'admin'f.add_rql_restrictions()self.assertEqual(f.select.as_string(),'DISTINCT Any WHERE X is CWUser, X creation_date XD, ''X modification_date XM, Y creation_date YD, Y is CWGroup, X login "admin" ''HAVING DAY(XD) >= DAY(YD), DAY(XM) <= DAY(YD)')if__name__=='__main__':fromlogilab.common.testlibimportunittest_mainunittest_main()