[c-c create] make post-create step optional (closes #2712041)
In this context the "post-create" step refers to the database's creation and
initialization. We want to be able to create a new instance but skip the
database creation (`db-create` and `db-init` commands) in automatic setup.
# coding: utf-8# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr## This file is part of CubicWeb.## CubicWeb is free software: you can redistribute it and/or modify it under the# terms of the GNU Lesser General Public License as published by the Free# Software Foundation, either version 2.1 of the License, or (at your option)# any later version.## CubicWeb is distributed in the hope that it will be useful, but WITHOUT# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more# details.## You should have received a copy of the GNU Lesser General Public License along# with CubicWeb. If not, see <http://www.gnu.org/licenses/>."""unit tests for module cubicweb.utils"""fromurlparseimporturlsplitimportpicklefromrqlimportparsefromlogilab.common.testlibimportTestCase,unittest_main,mock_objectfromcubicweb.devtools.testlibimportCubicWebTCfromcubicweb.rsetimportNotAnEntity,ResultSet,attr_desc_iteratordefpprelcachedict(d):res={}fork,(rset,related)ind.items():res[k]=sorted(v.eidforvinrelated)returnsorted(res.items())classAttrDescIteratorTC(TestCase):"""TestCase for cubicweb.rset.attr_desc_iterator"""deftest_relations_description(self):"""tests relations_description() function"""queries={'Any U,L,M where U is CWUser, U login L, U mail M':[(1,'login','subject'),(2,'mail','subject')],'Any U,L,M where U is CWUser, L is Foo, U mail M':[(2,'mail','subject')],'Any C,P where C is Company, C employs P':[(1,'employs','subject')],'Any C,P where C is Company, P employed_by P':[],'Any C where C is Company, C employs P':[],}forrql,relationsinqueries.items():result=list(attr_desc_iterator(parse(rql).children[0],0,0))self.assertEqual((rql,result),(rql,relations))deftest_relations_description_indexed(self):"""tests relations_description() function"""queries={'Any C,U,P,L,M where C is Company, C employs P, U is CWUser, U login L, U mail M':{0:[(2,'employs','subject')],1:[(3,'login','subject'),(4,'mail','subject')]},}forrql,resultsinqueries.items():foridx,relationsinresults.items():result=list(attr_desc_iterator(parse(rql).children[0],idx,idx))self.assertEqual(result,relations)deftest_subquery_callfunc(self):rql=('Any A,B,C,COUNT(D) GROUPBY A,B,C WITH A,B,C,D BEING ''(Any YEAR(CD), MONTH(CD), S, X WHERE X is CWUser, X creation_date CD, X in_state S)')rqlst=parse(rql)select,col=rqlst.locate_subquery(2,'CWUser',None)result=list(attr_desc_iterator(select,col,2))self.assertEqual(result,[])deftest_subquery_callfunc_2(self):rql=('Any X,S,L WHERE X in_state S WITH X, L BEING (Any X,MAX(L) GROUPBY X WHERE X is CWUser, T wf_info_for X, T creation_date L)')rqlst=parse(rql)select,col=rqlst.locate_subquery(0,'CWUser',None)result=list(attr_desc_iterator(select,col,0))self.assertEqual(result,[(1,'in_state','subject')])classResultSetTC(CubicWebTC):defsetUp(self):super(ResultSetTC,self).setUp()self.rset=ResultSet([[12,'adim'],[13,'syt']],'Any U,L where U is CWUser, U login L',description=[['CWUser','String'],['Bar','String']])self.rset.req=mock_object(vreg=self.vreg)defcompare_urls(self,url1,url2):info1=urlsplit(url1)info2=urlsplit(url2)self.assertEqual(info1[:3],info2[:3])ifinfo1[3]!=info2[3]:params1=dict(pair.split('=')forpairininfo1[3].split('&'))params2=dict(pair.split('=')forpairininfo1[3].split('&'))self.assertDictEqual(params1,params2)deftest_pickle(self):delself.rset.reqself.assertEqual(len(pickle.dumps(self.rset)),392)deftest_build_url(self):req=self.request()baseurl=req.base_url()self.compare_urls(req.build_url('view',vid='foo',rql='yo'),'%sview?vid=foo&rql=yo'%baseurl)self.compare_urls(req.build_url('view',_restpath='task/title/go'),'%stask/title/go'%baseurl)#self.compare_urls(req.build_url('view', _restpath='/task/title/go'),# '%stask/title/go' % baseurl)# empty _restpath should not crashself.compare_urls(req.build_url('view',_restpath=''),baseurl)self.assertNotIn('https',req.build_url('view',vid='foo',rql='yo',__secure__=True))try:self.config.global_set_option('https-url','https://testing.fr/')self.assertTrue('https',req.build_url('view',vid='foo',rql='yo',__secure__=True))self.compare_urls(req.build_url('view',vid='foo',rql='yo',__secure__=True),'%sview?vid=foo&rql=yo'%req.base_url(secure=True))finally:self.config.global_set_option('https-url',None)deftest_build(self):"""test basic build of a ResultSet"""rs=ResultSet([1,2,3],'CWGroup X',description=['CWGroup','CWGroup','CWGroup'])self.assertEqual(rs.rowcount,3)self.assertEqual(rs.rows,[1,2,3])self.assertEqual(rs.description,['CWGroup','CWGroup','CWGroup'])deftest_limit(self):rs=ResultSet([[12000,'adim'],[13000,'syt'],[14000,'nico']],'Any U,L where U is CWUser, U login L',description=[['CWUser','String']]*3)rs.req=self.request()rs.vreg=self.vregself.assertEqual(rs.limit(2).rows,[[12000,'adim'],[13000,'syt']])rs2=rs.limit(2,offset=1)self.assertEqual(rs2.rows,[[13000,'syt'],[14000,'nico']])self.assertEqual(rs2.get_entity(0,0).cw_row,0)self.assertEqual(rs.limit(2,offset=2).rows,[[14000,'nico']])self.assertEqual(rs.limit(2,offset=3).rows,[])deftest_limit_2(self):req=self.request()# drop user from cache for the sake of this testreq.drop_entity_cache(req.user.eid)rs=req.execute('Any E,U WHERE E is CWEType, E created_by U')# get entity on row 9. This will fill its created_by relation cache,# with cwuser on row 9 as welle1=rs.get_entity(9,0)# get entity on row 10. This will fill its created_by relation cache,# with cwuser built on row 9e2=rs.get_entity(10,0)# limit result set from row 10rs.limit(1,10,inplace=True)# get back eide=rs.get_entity(0,0)self.assertTrue(e2ise)# rs.limit has properly removed cwuser for request cache, but it's# still referenced by e/e2 relation cacheu=e.created_by[0]# now ensure this doesn't trigger IndexError because cwuser.cw_row is 9# while now rset has only one rowu.cw_rset[u.cw_row]deftest_filter(self):rs=ResultSet([[12000,'adim'],[13000,'syt'],[14000,'nico']],'Any U,L where U is CWUser, U login L',description=[['CWUser','String']]*3)rs.req=self.request()rs.vreg=self.vregdeftest_filter(entity):returnentity.login!='nico'rs2=rs.filtered_rset(test_filter)self.assertEqual(len(rs2),2)self.assertEqual([loginfor_,logininrs2],['adim','syt'])deftest_transform(self):rs=ResultSet([[12,'adim'],[13,'syt'],[14,'nico']],'Any U,L where U is CWUser, U login L',description=[['CWUser','String']]*3)rs.req=self.request()deftest_transform(row,desc):returnrow[1:],desc[1:]rs2=rs.transformed_rset(test_transform)self.assertEqual(len(rs2),3)self.assertEqual(list(rs2),[['adim'],['syt'],['nico']])deftest_sort(self):rs=ResultSet([[12000,'adim'],[13000,'syt'],[14000,'nico']],'Any U,L where U is CWUser, U login L',description=[['CWUser','String']]*3)rs.req=self.request()rs.vreg=self.vregrs2=rs.sorted_rset(lambdae:e.cw_attr_cache['login'])self.assertEqual(len(rs2),3)self.assertEqual([loginfor_,logininrs2],['adim','nico','syt'])# make sure rs is unchangedself.assertEqual([loginfor_,logininrs],['adim','syt','nico'])rs2=rs.sorted_rset(lambdae:e.cw_attr_cache['login'],reverse=True)self.assertEqual(len(rs2),3)self.assertEqual([loginfor_,logininrs2],['syt','nico','adim'])# make sure rs is unchangedself.assertEqual([loginfor_,logininrs],['adim','syt','nico'])rs3=rs.sorted_rset(lambdarow:row[1],col=-1)self.assertEqual(len(rs3),3)self.assertEqual([loginfor_,logininrs3],['adim','nico','syt'])# make sure rs is unchangedself.assertEqual([loginfor_,logininrs],['adim','syt','nico'])deftest_split(self):rs=ResultSet([[12000,'adim',u'Adim chez les pinguins'],[12000,'adim',u'Jardiner facile'],[13000,'syt',u'Le carrelage en 42 leçons'],[14000,'nico',u'La tarte tatin en 15 minutes'],[14000,'nico',u"L'épluchage du castor commun"]],'Any U, L, T WHERE U is CWUser, U login L,'\'D created_by U, D title T',description=[['CWUser','String','String']]*5)rs.req=self.request()rs.vreg=self.vregrsets=rs.split_rset(lambdae:e.cw_attr_cache['login'])self.assertEqual(len(rsets),3)self.assertEqual([loginfor_,login,_inrsets[0]],['adim','adim'])self.assertEqual([loginfor_,login,_inrsets[1]],['syt'])self.assertEqual([loginfor_,login,_inrsets[2]],['nico','nico'])# make sure rs is unchangedself.assertEqual([loginfor_,login,_inrs],['adim','adim','syt','nico','nico'])rsets=rs.split_rset(lambdae:e.cw_attr_cache['login'],return_dict=True)self.assertEqual(len(rsets),3)self.assertEqual([loginfor_,login,_inrsets['nico']],['nico','nico'])self.assertEqual([loginfor_,login,_inrsets['adim']],['adim','adim'])self.assertEqual([loginfor_,login,_inrsets['syt']],['syt'])# make sure rs is unchangedself.assertEqual([loginfor_,login,_inrs],['adim','adim','syt','nico','nico'])rsets=rs.split_rset(lambdas:s.count('d'),col=2)self.assertEqual(len(rsets),2)self.assertEqual([titlefor_,_,titleinrsets[0]],[u"Adim chez les pinguins",u"Jardiner facile",u"L'épluchage du castor commun",])self.assertEqual([titlefor_,_,titleinrsets[1]],[u"Le carrelage en 42 leçons",u"La tarte tatin en 15 minutes",])# make sure rs is unchangedself.assertEqual([titlefor_,_,titleinrs],[u'Adim chez les pinguins',u'Jardiner facile',u'Le carrelage en 42 leçons',u'La tarte tatin en 15 minutes',u"L'épluchage du castor commun"])deftest_cached_syntax_tree(self):"""make sure syntax tree is cached"""rqlst1=self.rset.syntax_tree()rqlst2=self.rset.syntax_tree()self.assert_(rqlst1isrqlst2)deftest_get_entity_simple(self):self.request().create_entity('CWUser',login=u'adim',upassword='adim',surname=u'di mascio',firstname=u'adrien')e=self.execute('Any X,T WHERE X login "adim", X surname T').get_entity(0,0)self.assertEqual(e.cw_attr_cache['surname'],'di mascio')self.assertRaises(KeyError,e.cw_attr_cache.__getitem__,'firstname')self.assertRaises(KeyError,e.cw_attr_cache.__getitem__,'creation_date')self.assertEqual(pprelcachedict(e._cw_related_cache),[])e.complete()self.assertEqual(e.cw_attr_cache['firstname'],'adrien')self.assertEqual(pprelcachedict(e._cw_related_cache),[])deftest_get_entity_advanced(self):self.request().create_entity('Bookmark',title=u'zou',path=u'/view')self.execute('SET X bookmarked_by Y WHERE X is Bookmark, Y login "anon"')rset=self.execute('Any X,Y,XT,YN WHERE X bookmarked_by Y, X title XT, Y login YN')e=rset.get_entity(0,0)self.assertEqual(e.cw_row,0)self.assertEqual(e.cw_col,0)self.assertEqual(e.cw_attr_cache['title'],'zou')self.assertRaises(KeyError,e.cw_attr_cache.__getitem__,'path')self.assertEqual(e.view('text'),'zou')self.assertEqual(pprelcachedict(e._cw_related_cache),[])e=rset.get_entity(0,1)self.assertEqual(e.cw_row,0)self.assertEqual(e.cw_col,1)self.assertEqual(e.cw_attr_cache['login'],'anon')self.assertRaises(KeyError,e.cw_attr_cache.__getitem__,'firstname')self.assertEqual(pprelcachedict(e._cw_related_cache),[])e.complete()self.assertEqual(e.cw_attr_cache['firstname'],None)self.assertEqual(e.view('text'),'anon')self.assertEqual(pprelcachedict(e._cw_related_cache),[])self.assertRaises(NotAnEntity,rset.get_entity,0,2)self.assertRaises(NotAnEntity,rset.get_entity,0,3)deftest_get_entity_relation_cache_compt(self):rset=self.execute('Any X,S WHERE X in_state S, X login "anon"')e=rset.get_entity(0,0)seid=self.execute('State X WHERE X name "activated"')[0][0]# for_user / in_group are prefetched in CWUser __init__, in_state should# be filed from our query rsetself.assertEqual(pprelcachedict(e._cw_related_cache),[('in_state_subject',[seid])])deftest_get_entity_advanced_prefilled_cache(self):e=self.request().create_entity('Bookmark',title=u'zou',path=u'path')self.commit()rset=self.execute('Any X,U,S,XT,UL,SN WHERE X created_by U, U in_state S, ''X title XT, S name SN, U login UL, X eid %s'%e.eid)e=rset.get_entity(0,0)self.assertEqual(e.cw_attr_cache['title'],'zou')self.assertEqual(pprelcachedict(e._cw_related_cache),[('created_by_subject',[self.user().eid])])# first level of recursionu=e.created_by[0]self.assertEqual(u.cw_attr_cache['login'],'admin')self.assertRaises(KeyError,u.cw_attr_cache.__getitem__,'firstname')# second level of recursions=u.in_state[0]self.assertEqual(s.cw_attr_cache['name'],'activated')self.assertRaises(KeyError,s.cw_attr_cache.__getitem__,'description')deftest_get_entity_cache_with_left_outer_join(self):eid=self.execute('INSERT CWUser E: E login "joe", E upassword "joe", E in_group G ''WHERE G name "users"')[0][0]rset=self.execute('Any X,E WHERE X eid %(x)s, X primary_email E?',{'x':eid})e=rset.get_entity(0,0)# if any of the assertion below fails with a KeyError, the relation is not cached# related entities should be an empty listself.assertEqual(e._cw_related_cache['primary_email_subject'][True],())# related rset should be an empty rsetcached=e._cw_related_cache['primary_email_subject'][False]self.assertIsInstance(cached,ResultSet)self.assertEqual(cached.rowcount,0)deftest_get_entity_union(self):e=self.request().create_entity('Bookmark',title=u'manger',path=u'path')rset=self.execute('Any X,N ORDERBY N WITH X,N BEING ''((Any X,N WHERE X is Bookmark, X title N)'' UNION '' (Any X,N WHERE X is CWGroup, X name N))')expected=(('CWGroup','guests'),('CWGroup','managers'),('Bookmark','manger'),('CWGroup','owners'),('CWGroup','users'))forentityinrset.entities():# test get_entity for each row actuallyetype,n=expected[entity.cw_row]self.assertEqual(entity.__regid__,etype)attr=etype=='Bookmark'and'title'or'name'self.assertEqual(entity.cw_attr_cache[attr],n)deftest_related_entity_optional(self):e=self.request().create_entity('Bookmark',title=u'aaaa',path=u'path')rset=self.execute('Any B,U,L WHERE B bookmarked_by U?, U login L')entity,rtype=rset.related_entity(0,2)self.assertEqual(entity,None)self.assertEqual(rtype,None)deftest_related_entity_union_subquery_1(self):e=self.request().create_entity('Bookmark',title=u'aaaa',path=u'path')rset=self.execute('Any X,N ORDERBY N WITH X,N BEING ''((Any X,N WHERE X is CWGroup, X name N)'' UNION '' (Any X,N WHERE X is Bookmark, X title N))')entity,rtype=rset.related_entity(0,1)self.assertEqual(entity.eid,e.eid)self.assertEqual(rtype,'title')self.assertEqual(entity.title,'aaaa')entity,rtype=rset.related_entity(1,1)self.assertEqual(entity.__regid__,'CWGroup')self.assertEqual(rtype,'name')self.assertEqual(entity.name,'guests')deftest_related_entity_union_subquery_2(self):e=self.request().create_entity('Bookmark',title=u'aaaa',path=u'path')rset=self.execute('Any X,N ORDERBY N WHERE X is Bookmark WITH X,N BEING ''((Any X,N WHERE X is CWGroup, X name N)'' UNION '' (Any X,N WHERE X is Bookmark, X title N))')entity,rtype=rset.related_entity(0,1)self.assertEqual(entity.eid,e.eid)self.assertEqual(rtype,'title')self.assertEqual(entity.title,'aaaa')deftest_related_entity_union_subquery_3(self):e=self.request().create_entity('Bookmark',title=u'aaaa',path=u'path')rset=self.execute('Any X,N ORDERBY N WITH N,X BEING ''((Any N,X WHERE X is CWGroup, X name N)'' UNION '' (Any N,X WHERE X is Bookmark, X title N))')entity,rtype=rset.related_entity(0,1)self.assertEqual(entity.eid,e.eid)self.assertEqual(rtype,'title')self.assertEqual(entity.title,'aaaa')deftest_related_entity_union_subquery_4(self):e=self.request().create_entity('Bookmark',title=u'aaaa',path=u'path')rset=self.execute('Any X,X, N ORDERBY N WITH X,N BEING ''((Any X,N WHERE X is CWGroup, X name N)'' UNION '' (Any X,N WHERE X is Bookmark, X title N))')entity,rtype=rset.related_entity(0,2)self.assertEqual(entity.eid,e.eid)self.assertEqual(rtype,'title')self.assertEqual(entity.title,'aaaa')deftest_related_entity_trap_subquery(self):req=self.request()req.create_entity('Bookmark',title=u'test bookmark',path=u'')self.execute('SET B bookmarked_by U WHERE U login "admin"')rset=self.execute('Any B,T,L WHERE B bookmarked_by U, U login L ''WITH B,T BEING (Any B,T WHERE B is Bookmark, B title T)')rset.related_entity(0,2)deftest_related_entity_subquery_outerjoin(self):rset=self.execute('Any X,S,L WHERE X in_state S ''WITH X, L BEING (Any X,MAX(L) GROUPBY X ''WHERE X is CWUser, T? wf_info_for X, T creation_date L)')self.assertEqual(len(rset),2)rset.related_entity(0,1)rset.related_entity(0,2)deftest_entities(self):rset=self.execute('Any U,G WHERE U in_group G')# make sure we have at least one elementself.assertTrue(rset)self.assertEqual(set(e.e_schema.typeforeinrset.entities(0)),set(['CWUser',]))self.assertEqual(set(e.e_schema.typeforeinrset.entities(1)),set(['CWGroup',]))deftest_iter_rows_with_entities(self):rset=self.execute('Any U,UN,G,GN WHERE U in_group G, U login UN, G name GN')# make sure we have at least one elementself.assertTrue(rset)out=list(rset.iter_rows_with_entities())[0]self.assertEqual(out[0].login,out[1])self.assertEqual(out[2].name,out[3])deftest_printable_rql(self):rset=self.execute(u'CWEType X WHERE X final FALSE')self.assertEqual(rset.printable_rql(),'Any X WHERE X final FALSE, X is CWEType')deftest_searched_text(self):rset=self.execute(u'Any X WHERE X has_text "foobar"')self.assertEqual(rset.searched_text(),'foobar')rset=self.execute(u'Any X WHERE X has_text %(text)s',{'text':'foo'})self.assertEqual(rset.searched_text(),'foo')deftest_union_limited_rql(self):rset=self.execute('(Any X,N WHERE X is Bookmark, X title N)'' UNION ''(Any X,N WHERE X is CWGroup, X name N)')rset.limit(2,10,inplace=True)self.assertEqual(rset.limited_rql(),'Any A,B LIMIT 2 OFFSET 10 ''WITH A,B BEING (''(Any X,N WHERE X is Bookmark, X title N) ''UNION ''(Any X,N WHERE X is CWGroup, X name N)'')')deftest_count_users_by_date(self):rset=self.execute('Any D, COUNT(U) GROUPBY D WHERE U is CWUser, U creation_date D')self.assertEqual(rset.related_entity(0,0),(None,None))deftest_str(self):rset=self.execute('(Any X,N WHERE X is CWGroup, X name N)')self.assertIsInstance(str(rset),basestring)self.assertEqual(len(str(rset).splitlines()),1)deftest_repr(self):rset=self.execute('(Any X,N WHERE X is CWGroup, X name N)')self.assertIsInstance(repr(rset),basestring)self.assertTrue(len(repr(rset).splitlines())>1)rset=self.execute('(Any X WHERE X is CWGroup, X name "managers")')self.assertIsInstance(str(rset),basestring)self.assertEqual(len(str(rset).splitlines()),1)if__name__=='__main__':unittest_main()