# HG changeset patch # User Sylvain Thénault # Date 1249077260 -7200 # Node ID 21856eda34f6ee42fd241f8999535ca4d841ae61 # Parent 5d889b4928bba211827bab5e5775212ce8831379 [F repo tests] tests have to be updated: * fix schema (stuff missed while rewriting old .sql / .rel files to python) * '* in_basket Basket' now consider all entity types * new ExternalUri / cwuri ertypes * group eids have changed diff -r 5d889b4928bb -r 21856eda34f6 server/test/data/schema.py --- a/server/test/data/schema.py Fri Jul 31 23:48:18 2009 +0200 +++ b/server/test/data/schema.py Fri Jul 31 23:54:20 2009 +0200 @@ -76,7 +76,7 @@ migrated_from = SubjectRelation('Note') attachment = SubjectRelation(('File', 'Image')) - inline1 = SubjectRelation('Affaire', inlined=True) + inline1 = SubjectRelation('Affaire', inlined=True, cardinality='?*') todo_by = SubjectRelation('CWUser') class Personne(EntityType): @@ -98,7 +98,7 @@ travaille = SubjectRelation('Societe') concerne = SubjectRelation('Affaire') connait = SubjectRelation('Personne') - inline2 = SubjectRelation('Affaire', inlined=True) + inline2 = SubjectRelation('Affaire', inlined=True, cardinality='?*') comments = ObjectRelation('Comment') @@ -167,7 +167,12 @@ object = 'Note' -class see_also(RelationDefinition): +class see_also_1(RelationDefinition): + name = 'see_also' + subject = object = 'Folder' + +class see_also_2(RelationDefinition): + name = 'see_also' subject = ('Bookmark', 'Note') object = ('Bookmark', 'Note') @@ -180,14 +185,13 @@ subject = 'Note' object ='Personne' constraints = [RQLConstraint('E concerns P, X version_of P')] + cardinality = '?*' class ecrit_par_2(RelationDefinition): name = 'ecrit_par' subject = 'Note' object ='CWUser' - -class see_also(RelationDefinition): - subject = object = 'Folder' + cardinality='?*' class copain(RelationDefinition): @@ -202,7 +206,7 @@ object = 'Folder' class require_permission(RelationDefinition): - subject = ('Card', 'Note') + subject = ('Card', 'Note', 'Personne') object = 'CWPermission' class require_state(RelationDefinition): diff -r 5d889b4928bb -r 21856eda34f6 server/test/unittest_hooks.py --- a/server/test/unittest_hooks.py Fri Jul 31 23:48:18 2009 +0200 +++ b/server/test/unittest_hooks.py Fri Jul 31 23:54:20 2009 +0200 @@ -62,12 +62,12 @@ def test_delete_if_singlecard1(self): self.assertEquals(self.repo.schema['in_state'].inlined, False) - ueid, = self.execute('INSERT CWUser X: X login "toto", X upassword "hop", X in_group Y, X in_state S ' - 'WHERE Y name "users", S name "activated"')[0] + ueid = self.create_user('toto') self.commit() self.execute('SET X in_state S WHERE S name "deactivated", X eid %(x)s', {'x': ueid}) rset = self.execute('Any S WHERE X in_state S, X eid %(x)s', {'x': ueid}) self.assertEquals(len(rset), 1) + self.commit() self.assertRaises(Exception, self.execute, 'SET X in_state S WHERE S name "deactivated", X eid %s' % ueid) rset2 = self.execute('Any S WHERE X in_state S, X eid %(x)s', {'x': ueid}) self.assertEquals(rset.rows, rset2.rows) @@ -251,7 +251,7 @@ if not hasattr(self, '_repo'): # first initialization repo = self.repo # set by the RepositoryBasedTC metaclass - # force to read schema from the database + # force to read schema from the database to get proper eid set on schema instances repo.config._cubes = None repo.fill_schema() RepositoryBasedTC.setUp(self) diff -r 5d889b4928bb -r 21856eda34f6 server/test/unittest_migractions.py --- a/server/test/unittest_migractions.py Fri Jul 31 23:48:18 2009 +0200 +++ b/server/test/unittest_migractions.py Fri Jul 31 23:54:20 2009 +0200 @@ -3,11 +3,12 @@ """ from datetime import date +from os.path import join from logilab.common.testlib import TestCase, unittest_main -from cubicweb.devtools.apptest import RepositoryBasedTC, get_versions from cubicweb import ConfigurationError +from cubicweb.devtools.apptest import RepositoryBasedTC, get_versions from cubicweb.schema import CubicWebSchemaLoader from cubicweb.server.sqlutils import SQL_PREFIX from cubicweb.server.repository import Repository @@ -32,10 +33,10 @@ repo.config._cubes = None repo.fill_schema() # hack to read the schema from data/migrschema - CubicWebSchemaLoader.main_schema_directory = 'migrschema' + self.repo.config.appid = join('data', 'migratedapp') global migrschema migrschema = self.repo.config.load_schema() - del CubicWebSchemaLoader.main_schema_directory + self.repo.config.appid = 'data' assert 'Folder' in migrschema self.repo.hm.deactivate_verification_hooks() RepositoryBasedTC.setUp(self) @@ -356,7 +357,7 @@ def test_add_remove_cube_and_deps(self): cubes = set(self.config.cubes()) schema = self.repo.schema - self.assertEquals(sorted(schema['see_also']._rproperties.keys()), + self.assertEquals(sorted((str(s), str(o)) for s, o in schema['see_also']._rproperties.keys()), sorted([('EmailThread', 'EmailThread'), ('Folder', 'Folder'), ('Bookmark', 'Bookmark'), ('Bookmark', 'Note'), ('Note', 'Note'), ('Note', 'Bookmark')])) diff -r 5d889b4928bb -r 21856eda34f6 server/test/unittest_msplanner.py --- a/server/test/unittest_msplanner.py Fri Jul 31 23:48:18 2009 +0200 +++ b/server/test/unittest_msplanner.py Fri Jul 31 23:54:20 2009 +0200 @@ -50,6 +50,7 @@ {'X': 'CWRelation'}, {'X': 'CWPermission'}, {'X': 'CWProperty'}, {'X': 'CWRType'}, {'X': 'CWUser'}, {'X': 'Email'}, {'X': 'EmailAddress'}, {'X': 'EmailPart'}, {'X': 'EmailThread'}, + {'X': 'ExternalUri'}, {'X': 'File'}, {'X': 'Folder'}, {'X': 'Image'}, {'X': 'Note'}, {'X': 'Personne'}, {'X': 'RQLExpression'}, {'X': 'Societe'}, {'X': 'State'}, {'X': 'SubDivision'}, @@ -873,13 +874,13 @@ [{'X': 'Card'}, {'X': 'Note'}, {'X': 'State'}])], [self.cards, self.system], {}, {'X': 'table0.C0'}, []), ('FetchStep', - [('Any X WHERE X is IN(Bookmark, CWAttribute, CWCache, CWConstraint, CWConstraintType, CWEType, CWGroup, CWPermission, CWProperty, CWRType, CWRelation, Comment, Division, Email, EmailAddress, EmailPart, EmailThread, File, Folder, Image, Personne, RQLExpression, Societe, SubDivision, Tag, TrInfo, Transition)', + [('Any X WHERE X is IN(Bookmark, CWAttribute, CWCache, CWConstraint, CWConstraintType, CWEType, CWGroup, CWPermission, CWProperty, CWRType, CWRelation, Comment, Division, Email, EmailAddress, EmailPart, EmailThread, ExternalUri, File, Folder, Image, Personne, RQLExpression, Societe, SubDivision, Tag, TrInfo, Transition)', sorted([{'X': 'Bookmark'}, {'X': 'Comment'}, {'X': 'Division'}, {'X': 'CWCache'}, {'X': 'CWConstraint'}, {'X': 'CWConstraintType'}, {'X': 'CWEType'}, {'X': 'CWAttribute'}, {'X': 'CWGroup'}, {'X': 'CWRelation'}, {'X': 'CWPermission'}, {'X': 'CWProperty'}, {'X': 'CWRType'}, {'X': 'Email'}, {'X': 'EmailAddress'}, - {'X': 'EmailPart'}, {'X': 'EmailThread'}, {'X': 'File'}, + {'X': 'EmailPart'}, {'X': 'EmailThread'}, {'X': 'ExternalUri'}, {'X': 'File'}, {'X': 'Folder'}, {'X': 'Image'}, {'X': 'Personne'}, {'X': 'RQLExpression'}, {'X': 'Societe'}, {'X': 'SubDivision'}, {'X': 'Tag'}, {'X': 'TrInfo'}, {'X': 'Transition'}]))], @@ -922,7 +923,7 @@ [self.system], {'X': 'table3.C0'}, {'ET': 'table0.C0', 'X': 'table0.C1'}, []), # extra UnionFetchStep could be avoided but has no cost, so don't care ('UnionFetchStep', - [('FetchStep', [('Any ET,X WHERE X is ET, ET is CWEType, X is IN(Bookmark, CWAttribute, CWCache, CWConstraint, CWConstraintType, CWEType, CWGroup, CWPermission, CWProperty, CWRType, CWRelation, Comment, Division, Email, EmailAddress, EmailPart, EmailThread, File, Folder, Image, Personne, RQLExpression, Societe, SubDivision, Tag, TrInfo, Transition)', + [('FetchStep', [('Any ET,X WHERE X is ET, ET is CWEType, X is IN(Bookmark, CWAttribute, CWCache, CWConstraint, CWConstraintType, CWEType, CWGroup, CWPermission, CWProperty, CWRType, CWRelation, Comment, Division, Email, EmailAddress, EmailPart, EmailThread, ExternalUri, File, Folder, Image, Personne, RQLExpression, Societe, SubDivision, Tag, TrInfo, Transition)', [{'X': 'Bookmark', 'ET': 'CWEType'}, {'X': 'Comment', 'ET': 'CWEType'}, {'X': 'Division', 'ET': 'CWEType'}, {'X': 'CWCache', 'ET': 'CWEType'}, {'X': 'CWConstraint', 'ET': 'CWEType'}, {'X': 'CWConstraintType', 'ET': 'CWEType'}, @@ -931,7 +932,9 @@ {'X': 'CWPermission', 'ET': 'CWEType'}, {'X': 'CWProperty', 'ET': 'CWEType'}, {'X': 'CWRType', 'ET': 'CWEType'}, {'X': 'Email', 'ET': 'CWEType'}, {'X': 'EmailAddress', 'ET': 'CWEType'}, {'X': 'EmailPart', 'ET': 'CWEType'}, - {'X': 'EmailThread', 'ET': 'CWEType'}, {'X': 'File', 'ET': 'CWEType'}, + {'X': 'EmailThread', 'ET': 'CWEType'}, + {'ET': 'CWEType', 'X': 'ExternalUri'}, + {'X': 'File', 'ET': 'CWEType'}, {'X': 'Folder', 'ET': 'CWEType'}, {'X': 'Image', 'ET': 'CWEType'}, {'X': 'Personne', 'ET': 'CWEType'}, {'X': 'RQLExpression', 'ET': 'CWEType'}, {'X': 'Societe', 'ET': 'CWEType'}, {'X': 'SubDivision', 'ET': 'CWEType'}, @@ -958,7 +961,9 @@ {'ET': 'CWEType', 'X': 'CWProperty'}, {'ET': 'CWEType', 'X': 'CWRType'}, {'ET': 'CWEType', 'X': 'CWUser'}, {'ET': 'CWEType', 'X': 'Email'}, {'ET': 'CWEType', 'X': 'EmailAddress'}, {'ET': 'CWEType', 'X': 'EmailPart'}, - {'ET': 'CWEType', 'X': 'EmailThread'}, {'ET': 'CWEType', 'X': 'File'}, + {'ET': 'CWEType', 'X': 'EmailThread'}, + {'ET': 'CWEType', 'X': 'ExternalUri'}, + {'ET': 'CWEType', 'X': 'File'}, {'ET': 'CWEType', 'X': 'Folder'}, {'ET': 'CWEType', 'X': 'Image'}, {'ET': 'CWEType', 'X': 'Note'}, {'ET': 'CWEType', 'X': 'Personne'}, {'ET': 'CWEType', 'X': 'RQLExpression'}, {'ET': 'CWEType', 'X': 'Societe'}, diff -r 5d889b4928bb -r 21856eda34f6 server/test/unittest_querier.py --- a/server/test/unittest_querier.py Fri Jul 31 23:48:18 2009 +0200 +++ b/server/test/unittest_querier.py Fri Jul 31 23:54:20 2009 +0200 @@ -110,7 +110,7 @@ 'ET': 'CWEType', 'ETN': 'String'}]) rql, solutions = partrqls[1] self.assertEquals(rql, 'Any ETN,X WHERE X is ET, ET name ETN, ET is CWEType, ' - 'X is IN(Bookmark, CWAttribute, CWCache, CWConstraint, CWConstraintType, CWEType, CWGroup, CWPermission, CWProperty, CWRType, CWRelation, CWUser, Card, Comment, Division, Email, EmailAddress, EmailPart, EmailThread, File, Folder, Image, Note, Personne, RQLExpression, Societe, State, SubDivision, Tag, TrInfo, Transition)') + 'X is IN(Bookmark, CWAttribute, CWCache, CWConstraint, CWConstraintType, CWEType, CWGroup, CWPermission, CWProperty, CWRType, CWRelation, CWUser, Card, Comment, Division, Email, EmailAddress, EmailPart, EmailThread, ExternalUri, File, Folder, Image, Note, Personne, RQLExpression, Societe, State, SubDivision, Tag, TrInfo, Transition)') self.assertListEquals(sorted(solutions), sorted([{'X': 'Bookmark', 'ETN': 'String', 'ET': 'CWEType'}, {'X': 'Card', 'ETN': 'String', 'ET': 'CWEType'}, @@ -131,6 +131,7 @@ {'X': 'CWProperty', 'ETN': 'String', 'ET': 'CWEType'}, {'X': 'CWRType', 'ETN': 'String', 'ET': 'CWEType'}, {'X': 'CWUser', 'ETN': 'String', 'ET': 'CWEType'}, + {'X': 'ExternalUri', 'ETN': 'String', 'ET': 'CWEType'}, {'X': 'File', 'ETN': 'String', 'ET': 'CWEType'}, {'X': 'Folder', 'ETN': 'String', 'ET': 'CWEType'}, {'X': 'Image', 'ETN': 'String', 'ET': 'CWEType'}, @@ -226,10 +227,10 @@ def test_select_2(self): rset = self.execute('Any X ORDERBY N WHERE X is CWGroup, X name N') - self.assertEquals(tuplify(rset.rows), [(3,), (1,), (4,), (2,)]) + self.assertEquals(tuplify(rset.rows), [(1,), (2,), (3,), (4,)]) self.assertEquals(rset.description, [('CWGroup',), ('CWGroup',), ('CWGroup',), ('CWGroup',)]) rset = self.execute('Any X ORDERBY N DESC WHERE X is CWGroup, X name N') - self.assertEquals(tuplify(rset.rows), [(2,), (4,), (1,), (3,)]) + self.assertEquals(tuplify(rset.rows), [(4,), (3,), (2,), (1,)]) def test_select_3(self): rset = self.execute('Any N GROUPBY N WHERE X is CWGroup, X name N') @@ -272,7 +273,7 @@ def test_select_5(self): rset = self.execute('Any X, TMP ORDERBY TMP WHERE X name TMP, X is CWGroup') - self.assertEquals(tuplify(rset.rows), [(3, 'guests',), (1, 'managers',), (4, 'owners',), (2, 'users',)]) + self.assertEquals(tuplify(rset.rows), [(1, 'guests',), (2, 'managers',), (3, 'owners',), (4, 'users',)]) self.assertEquals(rset.description, [('CWGroup', 'String',), ('CWGroup', 'String',), ('CWGroup', 'String',), ('CWGroup', 'String',)]) def test_select_6(self): @@ -344,7 +345,8 @@ peid1 = self.execute("INSERT Personne X: X nom 'bidule'")[0][0] rset = self.execute('Any X WHERE X eid %(x)s, P? connait X', {'x':peid1}, 'x') self.assertEquals(rset.rows, [[peid1]]) - rset = self.execute('Any X WHERE X eid %(x)s, X require_permission P?', {'x':peid1}, 'x') + rset = self.execute('Any X WHERE X eid %(x)s, X require_permission P?', + {'x':peid1}, 'x') self.assertEquals(rset.rows, [[peid1]]) def test_select_left_outer_join(self): @@ -464,10 +466,12 @@ 'WHERE RT name N, RDEF relation_type RT ' 'HAVING COUNT(RDEF) > 10') self.assertListEquals(rset.rows, - [[u'description', 11], ['in_basket', 11], - [u'name', 13], [u'created_by', 33], - [u'creation_date', 33], [u'is', 33], [u'is_instance_of', 33], - [u'modification_date', 33], [u'owned_by', 33]]) + [[u'description', 11], + [u'name', 13], [u'created_by', 34], + [u'creation_date', 34], [u'cwuri', 34], + ['in_basket', 34], + [u'is', 34], [u'is_instance_of', 34], + [u'modification_date', 34], [u'owned_by', 34]]) def test_select_aggregat_having_dumb(self): # dumb but should not raise an error @@ -553,10 +557,10 @@ def test_select_limit_offset(self): rset = self.execute('CWGroup X ORDERBY N LIMIT 2 WHERE X name N') - self.assertEquals(tuplify(rset.rows), [(3,), (1,)]) + self.assertEquals(tuplify(rset.rows), [(1,), (2,)]) self.assertEquals(rset.description, [('CWGroup',), ('CWGroup',)]) rset = self.execute('CWGroup X ORDERBY N LIMIT 2 OFFSET 2 WHERE X name N') - self.assertEquals(tuplify(rset.rows), [(4,), (2,)]) + self.assertEquals(tuplify(rset.rows), [(3,), (4,)]) def test_select_symetric(self): self.execute("INSERT Personne X: X nom 'machin'") diff -r 5d889b4928bb -r 21856eda34f6 server/test/unittest_repository.py --- a/server/test/unittest_repository.py Fri Jul 31 23:48:18 2009 +0200 +++ b/server/test/unittest_repository.py Fri Jul 31 23:54:20 2009 +0200 @@ -226,12 +226,12 @@ # check order of attributes is respected self.assertListEquals([r.type for r in schema.eschema('CWAttribute').ordered_relations() if not r.type in ('eid', 'is', 'is_instance_of', 'identity', - 'creation_date', 'modification_date', + 'creation_date', 'modification_date', 'cwuri', 'owned_by', 'created_by')], - ['relation_type', 'from_entity', 'to_entity', 'constrained_by', + ['relation_type', 'from_entity', 'in_basket', 'to_entity', 'constrained_by', 'cardinality', 'ordernum', 'indexed', 'fulltextindexed', 'internationalizable', - 'defaultval', 'description_format', 'description']) + 'defaultval', 'description', 'description_format']) self.assertEquals(schema.eschema('CWEType').main_attribute(), 'name') self.assertEquals(schema.eschema('State').main_attribute(), 'name') diff -r 5d889b4928bb -r 21856eda34f6 server/test/unittest_rqlrewrite.py --- a/server/test/unittest_rqlrewrite.py Fri Jul 31 23:48:18 2009 +0200 +++ b/server/test/unittest_rqlrewrite.py Fri Jul 31 23:54:20 2009 +0200 @@ -107,7 +107,7 @@ "Any S WHERE S owned_by C, C eid %(u)s, A eid %(B)s, " "EXISTS((C identity A) OR (C in_state D, E identity A, " "E in_state D, D name 'subscribed'), D is State, E is CWUser), " - "S is IN(Affaire, Basket, Bookmark, CWAttribute, CWCache, CWConstraint, CWConstraintType, CWEType, CWGroup, CWPermission, CWProperty, CWRType, CWRelation, CWUser, Card, Comment, Division, Email, EmailAddress, EmailPart, EmailThread, File, Folder, Image, Note, Personne, RQLExpression, Societe, State, SubDivision, Tag, TrInfo, Transition)") + "S is IN(Affaire, Basket, Bookmark, CWAttribute, CWCache, CWConstraint, CWConstraintType, CWEType, CWGroup, CWPermission, CWProperty, CWRType, CWRelation, CWUser, Card, Comment, Division, Email, EmailAddress, EmailPart, EmailThread, ExternalUri, File, Folder, Image, Note, Personne, RQLExpression, Societe, State, SubDivision, Tag, TrInfo, Transition)") def test_simplified_rqlst(self): card_constraint = ('X in_state S, U in_group G, P require_state S,' diff -r 5d889b4928bb -r 21856eda34f6 server/test/unittest_security.py --- a/server/test/unittest_security.py Fri Jul 31 23:48:18 2009 +0200 +++ b/server/test/unittest_security.py Fri Jul 31 23:54:20 2009 +0200 @@ -515,6 +515,7 @@ self.execute('SET TI comment %(c)s WHERE TI wf_info_for X, X ref "ARCT01"', {'c': u'creation'}) self.commit() + aff.clear_related_cache('wf_info_for', 'object') self.assertEquals(aff.latest_trinfo().comment, 'creation') # but not from_state/to_state self.execute('SET X in_state S WHERE X ref "ARCT01", S name "ben non"')