test/unittest_entity.py
branchstable
changeset 6340 470d8e828fda
parent 6168 a52ea49434c8
child 6366 1806148d6ce8
equal deleted inserted replaced
6339:bdc3dc94d744 6340:470d8e828fda
    40         e2 = self.vreg['etypes'].etype_class('SubNote')(self.request())
    40         e2 = self.vreg['etypes'].etype_class('SubNote')(self.request())
    41         self.assertIs(e.__class__, e2.__class__)
    41         self.assertIs(e.__class__, e2.__class__)
    42 
    42 
    43     def test_has_eid(self):
    43     def test_has_eid(self):
    44         e = self.vreg['etypes'].etype_class('CWUser')(self.request())
    44         e = self.vreg['etypes'].etype_class('CWUser')(self.request())
    45         self.assertEquals(e.eid, None)
    45         self.assertEqual(e.eid, None)
    46         self.assertEquals(e.has_eid(), False)
    46         self.assertEqual(e.has_eid(), False)
    47         e.eid = 'X'
    47         e.eid = 'X'
    48         self.assertEquals(e.has_eid(), False)
    48         self.assertEqual(e.has_eid(), False)
    49         e.eid = 0
    49         e.eid = 0
    50         self.assertEquals(e.has_eid(), True)
    50         self.assertEqual(e.has_eid(), True)
    51         e.eid = 2
    51         e.eid = 2
    52         self.assertEquals(e.has_eid(), True)
    52         self.assertEqual(e.has_eid(), True)
    53 
    53 
    54     def test_copy(self):
    54     def test_copy(self):
    55         req = self.request()
    55         req = self.request()
    56         req.create_entity('Tag', name=u'x')
    56         req.create_entity('Tag', name=u'x')
    57         p = req.create_entity('Personne', nom=u'toto')
    57         p = req.create_entity('Personne', nom=u'toto')
    59         self.execute('SET T ecrit_par U WHERE T eid %(t)s, U eid %(u)s',
    59         self.execute('SET T ecrit_par U WHERE T eid %(t)s, U eid %(u)s',
    60                      {'t': oe.eid, 'u': p.eid})
    60                      {'t': oe.eid, 'u': p.eid})
    61         self.execute('SET TAG tags X WHERE X eid %(x)s', {'x': oe.eid})
    61         self.execute('SET TAG tags X WHERE X eid %(x)s', {'x': oe.eid})
    62         e = req.create_entity('Note', type=u'z')
    62         e = req.create_entity('Note', type=u'z')
    63         e.copy_relations(oe.eid)
    63         e.copy_relations(oe.eid)
    64         self.assertEquals(len(e.ecrit_par), 1)
    64         self.assertEqual(len(e.ecrit_par), 1)
    65         self.assertEquals(e.ecrit_par[0].eid, p.eid)
    65         self.assertEqual(e.ecrit_par[0].eid, p.eid)
    66         self.assertEquals(len(e.reverse_tags), 1)
    66         self.assertEqual(len(e.reverse_tags), 1)
    67         # check meta-relations are not copied, set on commit
    67         # check meta-relations are not copied, set on commit
    68         self.assertEquals(len(e.created_by), 0)
    68         self.assertEqual(len(e.created_by), 0)
    69 
    69 
    70     def test_copy_with_nonmeta_composite_inlined(self):
    70     def test_copy_with_nonmeta_composite_inlined(self):
    71         req = self.request()
    71         req = self.request()
    72         p = req.create_entity('Personne', nom=u'toto')
    72         p = req.create_entity('Personne', nom=u'toto')
    73         oe = req.create_entity('Note', type=u'x')
    73         oe = req.create_entity('Note', type=u'x')
    81 
    81 
    82     def test_copy_with_composite(self):
    82     def test_copy_with_composite(self):
    83         user = self.user()
    83         user = self.user()
    84         adeleid = self.execute('INSERT EmailAddress X: X address "toto@logilab.org", U use_email X WHERE U login "admin"')[0][0]
    84         adeleid = self.execute('INSERT EmailAddress X: X address "toto@logilab.org", U use_email X WHERE U login "admin"')[0][0]
    85         e = self.execute('Any X WHERE X eid %(x)s', {'x': user.eid}).get_entity(0, 0)
    85         e = self.execute('Any X WHERE X eid %(x)s', {'x': user.eid}).get_entity(0, 0)
    86         self.assertEquals(e.use_email[0].address, "toto@logilab.org")
    86         self.assertEqual(e.use_email[0].address, "toto@logilab.org")
    87         self.assertEquals(e.use_email[0].eid, adeleid)
    87         self.assertEqual(e.use_email[0].eid, adeleid)
    88         usereid = self.execute('INSERT CWUser X: X login "toto", X upassword "toto", X in_group G '
    88         usereid = self.execute('INSERT CWUser X: X login "toto", X upassword "toto", X in_group G '
    89                                'WHERE G name "users"')[0][0]
    89                                'WHERE G name "users"')[0][0]
    90         e = self.execute('Any X WHERE X eid %(x)s', {'x': usereid}).get_entity(0, 0)
    90         e = self.execute('Any X WHERE X eid %(x)s', {'x': usereid}).get_entity(0, 0)
    91         e.copy_relations(user.eid)
    91         e.copy_relations(user.eid)
    92         self.failIf(e.use_email)
    92         self.failIf(e.use_email)
   102         eid2 = self.execute('INSERT CWUser X: X login "tutu", X upassword %(pwd)s', {'pwd': 'toto'})[0][0]
   102         eid2 = self.execute('INSERT CWUser X: X login "tutu", X upassword %(pwd)s', {'pwd': 'toto'})[0][0]
   103         e = self.execute('Any X WHERE X eid %(x)s', {'x': eid2}).get_entity(0, 0)
   103         e = self.execute('Any X WHERE X eid %(x)s', {'x': eid2}).get_entity(0, 0)
   104         e.copy_relations(user.eid)
   104         e.copy_relations(user.eid)
   105         self.commit()
   105         self.commit()
   106         e.cw_clear_relation_cache('in_state', 'subject')
   106         e.cw_clear_relation_cache('in_state', 'subject')
   107         self.assertEquals(e.cw_adapt_to('IWorkflowable').state, 'activated')
   107         self.assertEqual(e.cw_adapt_to('IWorkflowable').state, 'activated')
   108 
   108 
   109     def test_related_cache_both(self):
   109     def test_related_cache_both(self):
   110         user = self.execute('Any X WHERE X eid %(x)s', {'x':self.user().eid}).get_entity(0, 0)
   110         user = self.execute('Any X WHERE X eid %(x)s', {'x':self.user().eid}).get_entity(0, 0)
   111         adeleid = self.execute('INSERT EmailAddress X: X address "toto@logilab.org", U use_email X WHERE U login "admin"')[0][0]
   111         adeleid = self.execute('INSERT EmailAddress X: X address "toto@logilab.org", U use_email X WHERE U login "admin"')[0][0]
   112         self.commit()
   112         self.commit()
   113         self.assertEquals(user._cw_related_cache, {})
   113         self.assertEqual(user._cw_related_cache, {})
   114         email = user.primary_email[0]
   114         email = user.primary_email[0]
   115         self.assertEquals(sorted(user._cw_related_cache), ['primary_email_subject'])
   115         self.assertEqual(sorted(user._cw_related_cache), ['primary_email_subject'])
   116         self.assertEquals(email._cw_related_cache.keys(), ['primary_email_object'])
   116         self.assertEqual(email._cw_related_cache.keys(), ['primary_email_object'])
   117         groups = user.in_group
   117         groups = user.in_group
   118         self.assertEquals(sorted(user._cw_related_cache), ['in_group_subject', 'primary_email_subject'])
   118         self.assertEqual(sorted(user._cw_related_cache), ['in_group_subject', 'primary_email_subject'])
   119         for group in groups:
   119         for group in groups:
   120             self.failIf('in_group_subject' in group._cw_related_cache, group._cw_related_cache.keys())
   120             self.failIf('in_group_subject' in group._cw_related_cache, group._cw_related_cache.keys())
   121 
   121 
   122     def test_related_limit(self):
   122     def test_related_limit(self):
   123         req = self.request()
   123         req = self.request()
   124         p = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien')
   124         p = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien')
   125         for tag in u'abcd':
   125         for tag in u'abcd':
   126             req.create_entity('Tag', name=tag)
   126             req.create_entity('Tag', name=tag)
   127         self.execute('SET X tags Y WHERE X is Tag, Y is Personne')
   127         self.execute('SET X tags Y WHERE X is Tag, Y is Personne')
   128         self.assertEquals(len(p.related('tags', 'object', limit=2)), 2)
   128         self.assertEqual(len(p.related('tags', 'object', limit=2)), 2)
   129         self.assertEquals(len(p.related('tags', 'object')), 4)
   129         self.assertEqual(len(p.related('tags', 'object')), 4)
   130 
   130 
   131 
   131 
   132     def test_fetch_rql(self):
   132     def test_fetch_rql(self):
   133         user = self.user()
   133         user = self.user()
   134         Personne = self.vreg['etypes'].etype_class('Personne')
   134         Personne = self.vreg['etypes'].etype_class('Personne')
   139         peschema.subjrels['travaille'].rdef(peschema, seschema).cardinality = '1*'
   139         peschema.subjrels['travaille'].rdef(peschema, seschema).cardinality = '1*'
   140         peschema.subjrels['connait'].rdef(peschema, peschema).cardinality = '11'
   140         peschema.subjrels['connait'].rdef(peschema, peschema).cardinality = '11'
   141         peschema.subjrels['evaluee'].rdef(peschema, Note.e_schema).cardinality = '1*'
   141         peschema.subjrels['evaluee'].rdef(peschema, Note.e_schema).cardinality = '1*'
   142         seschema.subjrels['evaluee'].rdef(seschema, Note.e_schema).cardinality = '1*'
   142         seschema.subjrels['evaluee'].rdef(seschema, Note.e_schema).cardinality = '1*'
   143         # testing basic fetch_attrs attribute
   143         # testing basic fetch_attrs attribute
   144         self.assertEquals(Personne.fetch_rql(user),
   144         self.assertEqual(Personne.fetch_rql(user),
   145                           'Any X,AA,AB,AC ORDERBY AA ASC '
   145                           'Any X,AA,AB,AC ORDERBY AA ASC '
   146                           'WHERE X is Personne, X nom AA, X prenom AB, X modification_date AC')
   146                           'WHERE X is Personne, X nom AA, X prenom AB, X modification_date AC')
   147         pfetch_attrs = Personne.fetch_attrs
   147         pfetch_attrs = Personne.fetch_attrs
   148         sfetch_attrs = Societe.fetch_attrs
   148         sfetch_attrs = Societe.fetch_attrs
   149         try:
   149         try:
   150             # testing unknown attributes
   150             # testing unknown attributes
   151             Personne.fetch_attrs = ('bloug', 'beep')
   151             Personne.fetch_attrs = ('bloug', 'beep')
   152             self.assertEquals(Personne.fetch_rql(user), 'Any X WHERE X is Personne')
   152             self.assertEqual(Personne.fetch_rql(user), 'Any X WHERE X is Personne')
   153             # testing one non final relation
   153             # testing one non final relation
   154             Personne.fetch_attrs = ('nom', 'prenom', 'travaille')
   154             Personne.fetch_attrs = ('nom', 'prenom', 'travaille')
   155             self.assertEquals(Personne.fetch_rql(user),
   155             self.assertEqual(Personne.fetch_rql(user),
   156                               'Any X,AA,AB,AC,AD ORDERBY AA ASC '
   156                               'Any X,AA,AB,AC,AD ORDERBY AA ASC '
   157                               'WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD')
   157                               'WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD')
   158             # testing two non final relations
   158             # testing two non final relations
   159             Personne.fetch_attrs = ('nom', 'prenom', 'travaille', 'evaluee')
   159             Personne.fetch_attrs = ('nom', 'prenom', 'travaille', 'evaluee')
   160             self.assertEquals(Personne.fetch_rql(user),
   160             self.assertEqual(Personne.fetch_rql(user),
   161                               'Any X,AA,AB,AC,AD,AE,AF ORDERBY AA ASC,AF DESC '
   161                               'Any X,AA,AB,AC,AD,AE,AF ORDERBY AA ASC,AF DESC '
   162                               'WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD, '
   162                               'WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD, '
   163                               'X evaluee AE?, AE modification_date AF')
   163                               'X evaluee AE?, AE modification_date AF')
   164             # testing one non final relation with recursion
   164             # testing one non final relation with recursion
   165             Personne.fetch_attrs = ('nom', 'prenom', 'travaille')
   165             Personne.fetch_attrs = ('nom', 'prenom', 'travaille')
   166             Societe.fetch_attrs = ('nom', 'evaluee')
   166             Societe.fetch_attrs = ('nom', 'evaluee')
   167             self.assertEquals(Personne.fetch_rql(user),
   167             self.assertEqual(Personne.fetch_rql(user),
   168                               'Any X,AA,AB,AC,AD,AE,AF ORDERBY AA ASC,AF DESC '
   168                               'Any X,AA,AB,AC,AD,AE,AF ORDERBY AA ASC,AF DESC '
   169                               'WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD, '
   169                               'WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD, '
   170                               'AC evaluee AE?, AE modification_date AF'
   170                               'AC evaluee AE?, AE modification_date AF'
   171                               )
   171                               )
   172             # testing symmetric relation
   172             # testing symmetric relation
   173             Personne.fetch_attrs = ('nom', 'connait')
   173             Personne.fetch_attrs = ('nom', 'connait')
   174             self.assertEquals(Personne.fetch_rql(user), 'Any X,AA,AB ORDERBY AA ASC '
   174             self.assertEqual(Personne.fetch_rql(user), 'Any X,AA,AB ORDERBY AA ASC '
   175                               'WHERE X is Personne, X nom AA, X connait AB?')
   175                               'WHERE X is Personne, X nom AA, X connait AB?')
   176             # testing optional relation
   176             # testing optional relation
   177             peschema.subjrels['travaille'].rdef(peschema, seschema).cardinality = '?*'
   177             peschema.subjrels['travaille'].rdef(peschema, seschema).cardinality = '?*'
   178             Personne.fetch_attrs = ('nom', 'prenom', 'travaille')
   178             Personne.fetch_attrs = ('nom', 'prenom', 'travaille')
   179             Societe.fetch_attrs = ('nom',)
   179             Societe.fetch_attrs = ('nom',)
   180             self.assertEquals(Personne.fetch_rql(user),
   180             self.assertEqual(Personne.fetch_rql(user),
   181                               'Any X,AA,AB,AC,AD ORDERBY AA ASC WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD')
   181                               'Any X,AA,AB,AC,AD ORDERBY AA ASC WHERE X is Personne, X nom AA, X prenom AB, X travaille AC?, AC nom AD')
   182             # testing relation with cardinality > 1
   182             # testing relation with cardinality > 1
   183             peschema.subjrels['travaille'].rdef(peschema, seschema).cardinality = '**'
   183             peschema.subjrels['travaille'].rdef(peschema, seschema).cardinality = '**'
   184             self.assertEquals(Personne.fetch_rql(user),
   184             self.assertEqual(Personne.fetch_rql(user),
   185                               'Any X,AA,AB ORDERBY AA ASC WHERE X is Personne, X nom AA, X prenom AB')
   185                               'Any X,AA,AB ORDERBY AA ASC WHERE X is Personne, X nom AA, X prenom AB')
   186             # XXX test unauthorized attribute
   186             # XXX test unauthorized attribute
   187         finally:
   187         finally:
   188             Personne.fetch_attrs = pfetch_attrs
   188             Personne.fetch_attrs = pfetch_attrs
   189             Societe.fetch_attrs = sfetch_attrs
   189             Societe.fetch_attrs = sfetch_attrs
   195         self.failUnless(issubclass(self.vreg['etypes'].etype_class('SubNote'), Note))
   195         self.failUnless(issubclass(self.vreg['etypes'].etype_class('SubNote'), Note))
   196         Personne.fetch_attrs, Personne.fetch_order = fetch_config(('nom', 'type'))
   196         Personne.fetch_attrs, Personne.fetch_order = fetch_config(('nom', 'type'))
   197         Note.fetch_attrs, Note.fetch_order = fetch_config(('type',))
   197         Note.fetch_attrs, Note.fetch_order = fetch_config(('type',))
   198         SubNote.fetch_attrs, SubNote.fetch_order = fetch_config(('type',))
   198         SubNote.fetch_attrs, SubNote.fetch_order = fetch_config(('type',))
   199         p = self.request().create_entity('Personne', nom=u'pouet')
   199         p = self.request().create_entity('Personne', nom=u'pouet')
   200         self.assertEquals(p.cw_related_rql('evaluee'),
   200         self.assertEqual(p.cw_related_rql('evaluee'),
   201                           'Any X,AA,AB ORDERBY AA ASC WHERE E eid %(x)s, E evaluee X, '
   201                           'Any X,AA,AB ORDERBY AA ASC WHERE E eid %(x)s, E evaluee X, '
   202                           'X type AA, X modification_date AB')
   202                           'X type AA, X modification_date AB')
   203         Personne.fetch_attrs, Personne.fetch_order = fetch_config(('nom', ))
   203         Personne.fetch_attrs, Personne.fetch_order = fetch_config(('nom', ))
   204         # XXX
   204         # XXX
   205         self.assertEquals(p.cw_related_rql('evaluee'),
   205         self.assertEqual(p.cw_related_rql('evaluee'),
   206                           'Any X,AA ORDERBY AA DESC '
   206                           'Any X,AA ORDERBY AA DESC '
   207                           'WHERE E eid %(x)s, E evaluee X, X modification_date AA')
   207                           'WHERE E eid %(x)s, E evaluee X, X modification_date AA')
   208 
   208 
   209         tag = self.vreg['etypes'].etype_class('Tag')(self.request())
   209         tag = self.vreg['etypes'].etype_class('Tag')(self.request())
   210         self.assertEquals(tag.cw_related_rql('tags', 'subject'),
   210         self.assertEqual(tag.cw_related_rql('tags', 'subject'),
   211                           'Any X,AA ORDERBY AA DESC '
   211                           'Any X,AA ORDERBY AA DESC '
   212                           'WHERE E eid %(x)s, E tags X, X modification_date AA')
   212                           'WHERE E eid %(x)s, E tags X, X modification_date AA')
   213         self.assertEquals(tag.cw_related_rql('tags', 'subject', ('Personne',)),
   213         self.assertEqual(tag.cw_related_rql('tags', 'subject', ('Personne',)),
   214                           'Any X,AA,AB ORDERBY AA ASC '
   214                           'Any X,AA,AB ORDERBY AA ASC '
   215                           'WHERE E eid %(x)s, E tags X, X is IN (Personne), X nom AA, '
   215                           'WHERE E eid %(x)s, E tags X, X is IN (Personne), X nom AA, '
   216                           'X modification_date AB')
   216                           'X modification_date AB')
   217 
   217 
   218     def test_related_rql_ambigous_cant_use_fetch_order(self):
   218     def test_related_rql_ambigous_cant_use_fetch_order(self):
   219         tag = self.vreg['etypes'].etype_class('Tag')(self.request())
   219         tag = self.vreg['etypes'].etype_class('Tag')(self.request())
   220         for ttype in self.schema['tags'].objects():
   220         for ttype in self.schema['tags'].objects():
   221             self.vreg['etypes'].etype_class(ttype).fetch_attrs = ('modification_date',)
   221             self.vreg['etypes'].etype_class(ttype).fetch_attrs = ('modification_date',)
   222         self.assertEquals(tag.cw_related_rql('tags', 'subject'),
   222         self.assertEqual(tag.cw_related_rql('tags', 'subject'),
   223                           'Any X,AA ORDERBY AA DESC '
   223                           'Any X,AA ORDERBY AA DESC '
   224                           'WHERE E eid %(x)s, E tags X, X modification_date AA')
   224                           'WHERE E eid %(x)s, E tags X, X modification_date AA')
   225 
   225 
   226     def test_unrelated_rql_security_1(self):
   226     def test_unrelated_rql_security_1(self):
   227         user = self.request().user
   227         user = self.request().user
   228         rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0]
   228         rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0]
   229         self.assertEquals(rql, 'Any O,AA,AB,AC ORDERBY AC DESC '
   229         self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC '
   230                           'WHERE NOT S use_email O, S eid %(x)s, O is EmailAddress, O address AA, O alias AB, O modification_date AC')
   230                           'WHERE NOT S use_email O, S eid %(x)s, O is EmailAddress, O address AA, O alias AB, O modification_date AC')
   231         self.create_user('toto')
   231         self.create_user('toto')
   232         self.login('toto')
   232         self.login('toto')
   233         user = self.request().user
   233         user = self.request().user
   234         rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0]
   234         rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0]
   235         self.assertEquals(rql, 'Any O,AA,AB,AC ORDERBY AC DESC '
   235         self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC '
   236                           'WHERE NOT S use_email O, S eid %(x)s, O is EmailAddress, O address AA, O alias AB, O modification_date AC')
   236                           'WHERE NOT S use_email O, S eid %(x)s, O is EmailAddress, O address AA, O alias AB, O modification_date AC')
   237         user = self.execute('Any X WHERE X login "admin"').get_entity(0, 0)
   237         user = self.execute('Any X WHERE X login "admin"').get_entity(0, 0)
   238         self.assertRaises(Unauthorized, user.cw_unrelated_rql, 'use_email', 'EmailAddress', 'subject')
   238         self.assertRaises(Unauthorized, user.cw_unrelated_rql, 'use_email', 'EmailAddress', 'subject')
   239         self.login('anon')
   239         self.login('anon')
   240         user = self.request().user
   240         user = self.request().user
   241         self.assertRaises(Unauthorized, user.cw_unrelated_rql, 'use_email', 'EmailAddress', 'subject')
   241         self.assertRaises(Unauthorized, user.cw_unrelated_rql, 'use_email', 'EmailAddress', 'subject')
   242 
   242 
   243     def test_unrelated_rql_security_2(self):
   243     def test_unrelated_rql_security_2(self):
   244         email = self.execute('INSERT EmailAddress X: X address "hop"').get_entity(0, 0)
   244         email = self.execute('INSERT EmailAddress X: X address "hop"').get_entity(0, 0)
   245         rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0]
   245         rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0]
   246         self.assertEquals(rql, 'Any S,AA,AB,AC,AD ORDERBY AA ASC '
   246         self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA ASC '
   247                           'WHERE NOT S use_email O, O eid %(x)s, S is CWUser, S login AA, S firstname AB, S surname AC, S modification_date AD')
   247                           'WHERE NOT S use_email O, O eid %(x)s, S is CWUser, S login AA, S firstname AB, S surname AC, S modification_date AD')
   248         #rql = email.cw_unrelated_rql('use_email', 'Person', 'object')[0]
   248         #rql = email.cw_unrelated_rql('use_email', 'Person', 'object')[0]
   249         #self.assertEquals(rql, '')
   249         #self.assertEqual(rql, '')
   250         self.login('anon')
   250         self.login('anon')
   251         email = self.execute('Any X WHERE X eid %(x)s', {'x': email.eid}).get_entity(0, 0)
   251         email = self.execute('Any X WHERE X eid %(x)s', {'x': email.eid}).get_entity(0, 0)
   252         rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0]
   252         rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0]
   253         self.assertEquals(rql, 'Any S,AA,AB,AC,AD ORDERBY AA '
   253         self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA '
   254                           'WHERE NOT EXISTS(S use_email O), O eid %(x)s, S is CWUser, S login AA, S firstname AB, S surname AC, S modification_date AD, '
   254                           'WHERE NOT EXISTS(S use_email O), O eid %(x)s, S is CWUser, S login AA, S firstname AB, S surname AC, S modification_date AD, '
   255                           'A eid %(B)s, EXISTS(S identity A, NOT A in_group C, C name "guests", C is CWGroup)')
   255                           'A eid %(B)s, EXISTS(S identity A, NOT A in_group C, C name "guests", C is CWGroup)')
   256         #rql = email.cw_unrelated_rql('use_email', 'Person', 'object')[0]
   256         #rql = email.cw_unrelated_rql('use_email', 'Person', 'object')[0]
   257         #self.assertEquals(rql, '')
   257         #self.assertEqual(rql, '')
   258 
   258 
   259     def test_unrelated_rql_security_nonexistant(self):
   259     def test_unrelated_rql_security_nonexistant(self):
   260         self.login('anon')
   260         self.login('anon')
   261         email = self.vreg['etypes'].etype_class('EmailAddress')(self.request())
   261         email = self.vreg['etypes'].etype_class('EmailAddress')(self.request())
   262         rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0]
   262         rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0]
   263         self.assertEquals(rql, 'Any S,AA,AB,AC,AD ORDERBY AA '
   263         self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA '
   264                           'WHERE S is CWUser, S login AA, S firstname AB, S surname AC, S modification_date AD, '
   264                           'WHERE S is CWUser, S login AA, S firstname AB, S surname AC, S modification_date AD, '
   265                           'A eid %(B)s, EXISTS(S identity A, NOT A in_group C, C name "guests", C is CWGroup)')
   265                           'A eid %(B)s, EXISTS(S identity A, NOT A in_group C, C name "guests", C is CWGroup)')
   266 
   266 
   267     def test_unrelated_base(self):
   267     def test_unrelated_base(self):
   268         req = self.request()
   268         req = self.request()
   280     def test_unrelated_limit(self):
   280     def test_unrelated_limit(self):
   281         req = self.request()
   281         req = self.request()
   282         e = req.create_entity('Tag', name=u'x')
   282         e = req.create_entity('Tag', name=u'x')
   283         req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien')
   283         req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien')
   284         req.create_entity('Personne', nom=u'thenault', prenom=u'sylvain')
   284         req.create_entity('Personne', nom=u'thenault', prenom=u'sylvain')
   285         self.assertEquals(len(e.unrelated('tags', 'Personne', 'subject', limit=1)),
   285         self.assertEqual(len(e.unrelated('tags', 'Personne', 'subject', limit=1)),
   286                           1)
   286                           1)
   287 
   287 
   288     def test_unrelated_security(self):
   288     def test_unrelated_security(self):
   289         email = self.execute('INSERT EmailAddress X: X address "hop"').get_entity(0, 0)
   289         email = self.execute('INSERT EmailAddress X: X address "hop"').get_entity(0, 0)
   290         rset = email.unrelated('use_email', 'CWUser', 'object')
   290         rset = email.unrelated('use_email', 'CWUser', 'object')
   291         self.assertEquals([x.login for x in rset.entities()], [u'admin', u'anon'])
   291         self.assertEqual([x.login for x in rset.entities()], [u'admin', u'anon'])
   292         user = self.request().user
   292         user = self.request().user
   293         rset = user.unrelated('use_email', 'EmailAddress', 'subject')
   293         rset = user.unrelated('use_email', 'EmailAddress', 'subject')
   294         self.assertEquals([x.address for x in rset.entities()], [u'hop'])
   294         self.assertEqual([x.address for x in rset.entities()], [u'hop'])
   295         self.create_user('toto')
   295         self.create_user('toto')
   296         self.login('toto')
   296         self.login('toto')
   297         email = self.execute('Any X WHERE X eid %(x)s', {'x': email.eid}).get_entity(0, 0)
   297         email = self.execute('Any X WHERE X eid %(x)s', {'x': email.eid}).get_entity(0, 0)
   298         rset = email.unrelated('use_email', 'CWUser', 'object')
   298         rset = email.unrelated('use_email', 'CWUser', 'object')
   299         self.assertEquals([x.login for x in rset.entities()], ['toto'])
   299         self.assertEqual([x.login for x in rset.entities()], ['toto'])
   300         user = self.request().user
   300         user = self.request().user
   301         rset = user.unrelated('use_email', 'EmailAddress', 'subject')
   301         rset = user.unrelated('use_email', 'EmailAddress', 'subject')
   302         self.assertEquals([x.address for x in rset.entities()], ['hop'])
   302         self.assertEqual([x.address for x in rset.entities()], ['hop'])
   303         user = self.execute('Any X WHERE X login "admin"').get_entity(0, 0)
   303         user = self.execute('Any X WHERE X login "admin"').get_entity(0, 0)
   304         rset = user.unrelated('use_email', 'EmailAddress', 'subject')
   304         rset = user.unrelated('use_email', 'EmailAddress', 'subject')
   305         self.assertEquals([x.address for x in rset.entities()], [])
   305         self.assertEqual([x.address for x in rset.entities()], [])
   306         self.login('anon')
   306         self.login('anon')
   307         email = self.execute('Any X WHERE X eid %(x)s', {'x': email.eid}).get_entity(0, 0)
   307         email = self.execute('Any X WHERE X eid %(x)s', {'x': email.eid}).get_entity(0, 0)
   308         rset = email.unrelated('use_email', 'CWUser', 'object')
   308         rset = email.unrelated('use_email', 'CWUser', 'object')
   309         self.assertEquals([x.login for x in rset.entities()], [])
   309         self.assertEqual([x.login for x in rset.entities()], [])
   310         user = self.request().user
   310         user = self.request().user
   311         rset = user.unrelated('use_email', 'EmailAddress', 'subject')
   311         rset = user.unrelated('use_email', 'EmailAddress', 'subject')
   312         self.assertEquals([x.address for x in rset.entities()], [])
   312         self.assertEqual([x.address for x in rset.entities()], [])
   313 
   313 
   314     def test_unrelated_new_entity(self):
   314     def test_unrelated_new_entity(self):
   315         e = self.vreg['etypes'].etype_class('CWUser')(self.request())
   315         e = self.vreg['etypes'].etype_class('CWUser')(self.request())
   316         unrelated = [r[0] for r in e.unrelated('in_group', 'CWGroup', 'subject')]
   316         unrelated = [r[0] for r in e.unrelated('in_group', 'CWGroup', 'subject')]
   317         # should be default groups but owners, i.e. managers, users, guests
   317         # should be default groups but owners, i.e. managers, users, guests
   318         self.assertEquals(len(unrelated), 3)
   318         self.assertEqual(len(unrelated), 3)
   319 
   319 
   320     def test_printable_value_string(self):
   320     def test_printable_value_string(self):
   321         e = self.request().create_entity('Card', title=u'rest test', content=u'du :eid:`1:*ReST*`',
   321         e = self.request().create_entity('Card', title=u'rest test', content=u'du :eid:`1:*ReST*`',
   322                             content_format=u'text/rest')
   322                             content_format=u'text/rest')
   323         self.assertEquals(e.printable_value('content'),
   323         self.assertEqual(e.printable_value('content'),
   324                           '<p>du <a class="reference" href="http://testing.fr/cubicweb/cwgroup/guests">*ReST*</a></p>\n')
   324                           '<p>du <a class="reference" href="http://testing.fr/cubicweb/cwgroup/guests">*ReST*</a></p>\n')
   325         e['content'] = 'du <em>html</em> <ref rql="CWUser X">users</ref>'
   325         e['content'] = 'du <em>html</em> <ref rql="CWUser X">users</ref>'
   326         e['content_format'] = 'text/html'
   326         e['content_format'] = 'text/html'
   327         self.assertEquals(e.printable_value('content'),
   327         self.assertEqual(e.printable_value('content'),
   328                           'du <em>html</em> <a href="http://testing.fr/cubicweb/view?rql=CWUser%20X">users</a>')
   328                           'du <em>html</em> <a href="http://testing.fr/cubicweb/view?rql=CWUser%20X">users</a>')
   329         e['content'] = 'du *texte*'
   329         e['content'] = 'du *texte*'
   330         e['content_format'] = 'text/plain'
   330         e['content_format'] = 'text/plain'
   331         self.assertEquals(e.printable_value('content'),
   331         self.assertEqual(e.printable_value('content'),
   332                           '<p>\ndu *texte*<br/>\n</p>')
   332                           '<p>\ndu *texte*<br/>\n</p>')
   333         e['title'] = 'zou'
   333         e['title'] = 'zou'
   334         e['content'] = '''\
   334         e['content'] = '''\
   335 a title
   335 a title
   336 =======
   336 =======
   337 du :eid:`1:*ReST*`'''
   337 du :eid:`1:*ReST*`'''
   338         e['content_format'] = 'text/rest'
   338         e['content_format'] = 'text/rest'
   339         self.assertEquals(e.printable_value('content', format='text/plain'),
   339         self.assertEqual(e.printable_value('content', format='text/plain'),
   340                           e['content'])
   340                           e['content'])
   341 
   341 
   342         e['content'] = u'<b>yo (zou éà ;)</b>'
   342         e['content'] = u'<b>yo (zou éà ;)</b>'
   343         e['content_format'] = 'text/html'
   343         e['content_format'] = 'text/html'
   344         self.assertEquals(e.printable_value('content', format='text/plain').strip(),
   344         self.assertEqual(e.printable_value('content', format='text/plain').strip(),
   345                           u'**yo (zou éà ;)**')
   345                           u'**yo (zou éà ;)**')
   346         if HAS_TAL:
   346         if HAS_TAL:
   347             e['content'] = '<h1 tal:content="self/title">titre</h1>'
   347             e['content'] = '<h1 tal:content="self/title">titre</h1>'
   348             e['content_format'] = 'text/cubicweb-page-template'
   348             e['content_format'] = 'text/cubicweb-page-template'
   349             self.assertEquals(e.printable_value('content'),
   349             self.assertEqual(e.printable_value('content'),
   350                               '<h1>zou</h1>')
   350                               '<h1>zou</h1>')
   351 
   351 
   352 
   352 
   353     def test_printable_value_bytes(self):
   353     def test_printable_value_bytes(self):
   354         req = self.request()
   354         req = self.request()
   356                             data_encoding=u'ascii', data_name=u'toto.py')
   356                             data_encoding=u'ascii', data_name=u'toto.py')
   357         from cubicweb import mttransforms
   357         from cubicweb import mttransforms
   358         if mttransforms.HAS_PYGMENTS_TRANSFORMS:
   358         if mttransforms.HAS_PYGMENTS_TRANSFORMS:
   359             import pygments
   359             import pygments
   360             if tuple(int(i) for i in pygments.__version__.split('.')[:2]) >= (1, 3):
   360             if tuple(int(i) for i in pygments.__version__.split('.')[:2]) >= (1, 3):
   361                 self.assertEquals(e.printable_value('data'),
   361                 self.assertEqual(e.printable_value('data'),
   362                                   '''<div class="highlight"><pre><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="mi">1</span>
   362                                   '''<div class="highlight"><pre><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="mi">1</span>
   363 </pre></div>
   363 </pre></div>
   364 ''')
   364 ''')
   365             else:
   365             else:
   366                 self.assertEquals(e.printable_value('data'),
   366                 self.assertEqual(e.printable_value('data'),
   367                                   '''<div class="highlight"><pre><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="mf">1</span>
   367                                   '''<div class="highlight"><pre><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="mf">1</span>
   368 </pre></div>
   368 </pre></div>
   369 ''')
   369 ''')
   370         else:
   370         else:
   371             self.assertEquals(e.printable_value('data'),
   371             self.assertEqual(e.printable_value('data'),
   372                               '''<pre class="python">
   372                               '''<pre class="python">
   373 <span style="color: #C00000;">lambda</span> <span style="color: #000000;">x</span><span style="color: #0000C0;">:</span> <span style="color: #0080C0;">1</span>
   373 <span style="color: #C00000;">lambda</span> <span style="color: #000000;">x</span><span style="color: #0000C0;">:</span> <span style="color: #0080C0;">1</span>
   374 </pre>
   374 </pre>
   375 ''')
   375 ''')
   376 
   376 
   377         e = req.create_entity('File', data=Binary('*héhéhé*'), data_format=u'text/rest',
   377         e = req.create_entity('File', data=Binary('*héhéhé*'), data_format=u'text/rest',
   378                             data_encoding=u'utf-8', data_name=u'toto.txt')
   378                             data_encoding=u'utf-8', data_name=u'toto.txt')
   379         self.assertEquals(e.printable_value('data'),
   379         self.assertEqual(e.printable_value('data'),
   380                           u'<p><em>héhéhé</em></p>\n')
   380                           u'<p><em>héhéhé</em></p>\n')
   381 
   381 
   382     def test_printable_value_bad_html(self):
   382     def test_printable_value_bad_html(self):
   383         """make sure we don't crash if we try to render invalid XHTML strings"""
   383         """make sure we don't crash if we try to render invalid XHTML strings"""
   384         req = self.request()
   384         req = self.request()
   385         e = req.create_entity('Card', title=u'bad html', content=u'<div>R&D<br>',
   385         e = req.create_entity('Card', title=u'bad html', content=u'<div>R&D<br>',
   386                             content_format=u'text/html')
   386                             content_format=u'text/html')
   387         tidy = lambda x: x.replace('\n', '')
   387         tidy = lambda x: x.replace('\n', '')
   388         self.assertEquals(tidy(e.printable_value('content')),
   388         self.assertEqual(tidy(e.printable_value('content')),
   389                           '<div>R&amp;D<br/></div>')
   389                           '<div>R&amp;D<br/></div>')
   390         e['content'] = u'yo !! R&D <div> pas fermé'
   390         e['content'] = u'yo !! R&D <div> pas fermé'
   391         self.assertEquals(tidy(e.printable_value('content')),
   391         self.assertEqual(tidy(e.printable_value('content')),
   392                           u'yo !! R&amp;D <div> pas fermé</div>')
   392                           u'yo !! R&amp;D <div> pas fermé</div>')
   393         e['content'] = u'R&D'
   393         e['content'] = u'R&D'
   394         self.assertEquals(tidy(e.printable_value('content')), u'R&amp;D')
   394         self.assertEqual(tidy(e.printable_value('content')), u'R&amp;D')
   395         e['content'] = u'R&D;'
   395         e['content'] = u'R&D;'
   396         self.assertEquals(tidy(e.printable_value('content')), u'R&amp;D;')
   396         self.assertEqual(tidy(e.printable_value('content')), u'R&amp;D;')
   397         e['content'] = u'yo !! R&amp;D <div> pas fermé'
   397         e['content'] = u'yo !! R&amp;D <div> pas fermé'
   398         self.assertEquals(tidy(e.printable_value('content')),
   398         self.assertEqual(tidy(e.printable_value('content')),
   399                           u'yo !! R&amp;D <div> pas fermé</div>')
   399                           u'yo !! R&amp;D <div> pas fermé</div>')
   400         e['content'] = u'été <div> été'
   400         e['content'] = u'été <div> été'
   401         self.assertEquals(tidy(e.printable_value('content')),
   401         self.assertEqual(tidy(e.printable_value('content')),
   402                           u'été <div> été</div>')
   402                           u'été <div> été</div>')
   403         e['content'] = u'C&apos;est un exemple s&eacute;rieux'
   403         e['content'] = u'C&apos;est un exemple s&eacute;rieux'
   404         self.assertEquals(tidy(e.printable_value('content')),
   404         self.assertEqual(tidy(e.printable_value('content')),
   405                           u"C'est un exemple sérieux")
   405                           u"C'est un exemple sérieux")
   406         # make sure valid xhtml is left untouched
   406         # make sure valid xhtml is left untouched
   407         e['content'] = u'<div>R&amp;D<br/></div>'
   407         e['content'] = u'<div>R&amp;D<br/></div>'
   408         self.assertEquals(e.printable_value('content'), e['content'])
   408         self.assertEqual(e.printable_value('content'), e['content'])
   409         e['content'] = u'<div>été</div>'
   409         e['content'] = u'<div>été</div>'
   410         self.assertEquals(e.printable_value('content'), e['content'])
   410         self.assertEqual(e.printable_value('content'), e['content'])
   411         e['content'] = u'été'
   411         e['content'] = u'été'
   412         self.assertEquals(e.printable_value('content'), e['content'])
   412         self.assertEqual(e.printable_value('content'), e['content'])
   413         e['content'] = u'hop\r\nhop\nhip\rmomo'
   413         e['content'] = u'hop\r\nhop\nhip\rmomo'
   414         self.assertEquals(e.printable_value('content'), u'hop\nhop\nhip\nmomo')
   414         self.assertEqual(e.printable_value('content'), u'hop\nhop\nhip\nmomo')
   415 
   415 
   416     def test_printable_value_bad_html_ms(self):
   416     def test_printable_value_bad_html_ms(self):
   417         self.skip('fix soup2xhtml to handle this test')
   417         self.skipTest('fix soup2xhtml to handle this test')
   418         req = self.request()
   418         req = self.request()
   419         e = req.create_entity('Card', title=u'bad html', content=u'<div>R&D<br>',
   419         e = req.create_entity('Card', title=u'bad html', content=u'<div>R&D<br>',
   420                             content_format=u'text/html')
   420                             content_format=u'text/html')
   421         tidy = lambda x: x.replace('\n', '')
   421         tidy = lambda x: x.replace('\n', '')
   422         e['content'] = u'<div x:foo="bar">ms orifice produces weird html</div>'
   422         e['content'] = u'<div x:foo="bar">ms orifice produces weird html</div>'
   423         self.assertEquals(tidy(e.printable_value('content')),
   423         self.assertEqual(tidy(e.printable_value('content')),
   424                           u'<div>ms orifice produces weird html</div>')
   424                           u'<div>ms orifice produces weird html</div>')
   425         import tidy as tidymod # apt-get install python-tidy
   425         import tidy as tidymod # apt-get install python-tidy
   426         tidy = lambda x: str(tidymod.parseString(x.encode('utf-8'),
   426         tidy = lambda x: str(tidymod.parseString(x.encode('utf-8'),
   427                                                  **{'drop_proprietary_attributes': True,
   427                                                  **{'drop_proprietary_attributes': True,
   428                                                     'output_xhtml': True,
   428                                                     'output_xhtml': True,
   429                                                     'show_body_only' : True,
   429                                                     'show_body_only' : True,
   430                                                     'quote-nbsp' : False,
   430                                                     'quote-nbsp' : False,
   431                                                     'char_encoding' : 'utf8'})).decode('utf-8').strip()
   431                                                     'char_encoding' : 'utf8'})).decode('utf-8').strip()
   432         self.assertEquals(tidy(e.printable_value('content')),
   432         self.assertEqual(tidy(e.printable_value('content')),
   433                           u'<div>ms orifice produces weird html</div>')
   433                           u'<div>ms orifice produces weird html</div>')
   434 
   434 
   435 
   435 
   436     def test_fulltextindex(self):
   436     def test_fulltextindex(self):
   437         e = self.vreg['etypes'].etype_class('File')(self.request())
   437         e = self.vreg['etypes'].etype_class('File')(self.request())
   440         e['data'] = Binary('some <em>data</em>')
   440         e['data'] = Binary('some <em>data</em>')
   441         e['data_name'] = 'an html file'
   441         e['data_name'] = 'an html file'
   442         e['data_format'] = 'text/html'
   442         e['data_format'] = 'text/html'
   443         e['data_encoding'] = 'ascii'
   443         e['data_encoding'] = 'ascii'
   444         e._cw.transaction_data = {} # XXX req should be a session
   444         e._cw.transaction_data = {} # XXX req should be a session
   445         self.assertEquals(e.cw_adapt_to('IFTIndexable').get_words(),
   445         self.assertEqual(e.cw_adapt_to('IFTIndexable').get_words(),
   446                           {'C': [u'du', u'html', 'an', 'html', 'file', u'some', u'data']})
   446                           {'C': [u'du', u'html', 'an', 'html', 'file', u'some', u'data']})
   447 
   447 
   448 
   448 
   449     def test_nonregr_relation_cache(self):
   449     def test_nonregr_relation_cache(self):
   450         req = self.request()
   450         req = self.request()
   451         p1 = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien')
   451         p1 = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien')
   452         p2 = req.create_entity('Personne', nom=u'toto')
   452         p2 = req.create_entity('Personne', nom=u'toto')
   453         self.execute('SET X evaluee Y WHERE X nom "di mascio", Y nom "toto"')
   453         self.execute('SET X evaluee Y WHERE X nom "di mascio", Y nom "toto"')
   454         self.assertEquals(p1.evaluee[0].nom, "toto")
   454         self.assertEqual(p1.evaluee[0].nom, "toto")
   455         self.failUnless(not p1.reverse_evaluee)
   455         self.failUnless(not p1.reverse_evaluee)
   456 
   456 
   457     def test_complete_relation(self):
   457     def test_complete_relation(self):
   458         session = self.session
   458         session = self.session
   459         eid = session.execute(
   459         eid = session.execute(
   463         trinfo.complete()
   463         trinfo.complete()
   464         self.failUnless(isinstance(trinfo['creation_date'], datetime))
   464         self.failUnless(isinstance(trinfo['creation_date'], datetime))
   465         self.failUnless(trinfo.cw_relation_cached('from_state', 'subject'))
   465         self.failUnless(trinfo.cw_relation_cached('from_state', 'subject'))
   466         self.failUnless(trinfo.cw_relation_cached('to_state', 'subject'))
   466         self.failUnless(trinfo.cw_relation_cached('to_state', 'subject'))
   467         self.failUnless(trinfo.cw_relation_cached('wf_info_for', 'subject'))
   467         self.failUnless(trinfo.cw_relation_cached('wf_info_for', 'subject'))
   468         self.assertEquals(trinfo.by_transition, ())
   468         self.assertEqual(trinfo.by_transition, ())
   469 
   469 
   470     def test_request_cache(self):
   470     def test_request_cache(self):
   471         req = self.request()
   471         req = self.request()
   472         user = self.execute('CWUser X WHERE X login "admin"', req=req).get_entity(0, 0)
   472         user = self.execute('CWUser X WHERE X login "admin"', req=req).get_entity(0, 0)
   473         state = user.in_state[0]
   473         state = user.in_state[0]
   475         self.failUnless(state is samestate)
   475         self.failUnless(state is samestate)
   476 
   476 
   477     def test_rest_path(self):
   477     def test_rest_path(self):
   478         req = self.request()
   478         req = self.request()
   479         note = req.create_entity('Note', type=u'z')
   479         note = req.create_entity('Note', type=u'z')
   480         self.assertEquals(note.rest_path(), 'note/%s' % note.eid)
   480         self.assertEqual(note.rest_path(), 'note/%s' % note.eid)
   481         # unique attr
   481         # unique attr
   482         tag = req.create_entity('Tag', name=u'x')
   482         tag = req.create_entity('Tag', name=u'x')
   483         self.assertEquals(tag.rest_path(), 'tag/x')
   483         self.assertEqual(tag.rest_path(), 'tag/x')
   484         # test explicit rest_attr
   484         # test explicit rest_attr
   485         person = req.create_entity('Personne', prenom=u'john', nom=u'doe')
   485         person = req.create_entity('Personne', prenom=u'john', nom=u'doe')
   486         self.assertEquals(person.rest_path(), 'personne/doe')
   486         self.assertEqual(person.rest_path(), 'personne/doe')
   487         # ambiguity test
   487         # ambiguity test
   488         person2 = req.create_entity('Personne', prenom=u'remi', nom=u'doe')
   488         person2 = req.create_entity('Personne', prenom=u'remi', nom=u'doe')
   489         person.clear_all_caches()
   489         person.clear_all_caches()
   490         self.assertEquals(person.rest_path(), 'personne/eid/%s' % person.eid)
   490         self.assertEqual(person.rest_path(), 'personne/eid/%s' % person.eid)
   491         self.assertEquals(person2.rest_path(), 'personne/eid/%s' % person2.eid)
   491         self.assertEqual(person2.rest_path(), 'personne/eid/%s' % person2.eid)
   492         # unique attr with None value (wikiid in this case)
   492         # unique attr with None value (wikiid in this case)
   493         card1 = req.create_entity('Card', title=u'hop')
   493         card1 = req.create_entity('Card', title=u'hop')
   494         self.assertEquals(card1.rest_path(), 'card/eid/%s' % card1.eid)
   494         self.assertEqual(card1.rest_path(), 'card/eid/%s' % card1.eid)
   495         # don't use rest if we have /, ? or & in the path (breaks mod_proxy)
   495         # don't use rest if we have /, ? or & in the path (breaks mod_proxy)
   496         card2 = req.create_entity('Card', title=u'pod', wikiid=u'zo/bi')
   496         card2 = req.create_entity('Card', title=u'pod', wikiid=u'zo/bi')
   497         self.assertEquals(card2.rest_path(), 'card/eid/%d' % card2.eid)
   497         self.assertEqual(card2.rest_path(), 'card/eid/%d' % card2.eid)
   498         card3 = req.create_entity('Card', title=u'pod', wikiid=u'zo&bi')
   498         card3 = req.create_entity('Card', title=u'pod', wikiid=u'zo&bi')
   499         self.assertEquals(card3.rest_path(), 'card/eid/%d' % card3.eid)
   499         self.assertEqual(card3.rest_path(), 'card/eid/%d' % card3.eid)
   500         card4 = req.create_entity('Card', title=u'pod', wikiid=u'zo?bi')
   500         card4 = req.create_entity('Card', title=u'pod', wikiid=u'zo?bi')
   501         self.assertEquals(card4.rest_path(), 'card/eid/%d' % card4.eid)
   501         self.assertEqual(card4.rest_path(), 'card/eid/%d' % card4.eid)
   502         
   502         
   503 
   503 
   504     def test_set_attributes(self):
   504     def test_set_attributes(self):
   505         req = self.request()
   505         req = self.request()
   506         person = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien')
   506         person = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien')
   507         self.assertEquals(person.prenom, u'adrien')
   507         self.assertEqual(person.prenom, u'adrien')
   508         self.assertEquals(person.nom, u'di mascio')
   508         self.assertEqual(person.nom, u'di mascio')
   509         person.set_attributes(prenom=u'sylvain', nom=u'thénault')
   509         person.set_attributes(prenom=u'sylvain', nom=u'thénault')
   510         person = self.execute('Personne P').get_entity(0, 0) # XXX retreival needed ?
   510         person = self.execute('Personne P').get_entity(0, 0) # XXX retreival needed ?
   511         self.assertEquals(person.prenom, u'sylvain')
   511         self.assertEqual(person.prenom, u'sylvain')
   512         self.assertEquals(person.nom, u'thénault')
   512         self.assertEqual(person.nom, u'thénault')
   513 
   513 
   514     def test_metainformation_and_external_absolute_url(self):
   514     def test_metainformation_and_external_absolute_url(self):
   515         req = self.request()
   515         req = self.request()
   516         note = req.create_entity('Note', type=u'z')
   516         note = req.create_entity('Note', type=u'z')
   517         metainf = note.cw_metainformation()
   517         metainf = note.cw_metainformation()
   518         self.assertEquals(metainf, {'source': {'adapter': 'native', 'uri': 'system'}, 'type': u'Note', 'extid': None})
   518         self.assertEqual(metainf, {'source': {'adapter': 'native', 'uri': 'system'}, 'type': u'Note', 'extid': None})
   519         self.assertEquals(note.absolute_url(), 'http://testing.fr/cubicweb/note/%s' % note.eid)
   519         self.assertEqual(note.absolute_url(), 'http://testing.fr/cubicweb/note/%s' % note.eid)
   520         metainf['source'] = metainf['source'].copy()
   520         metainf['source'] = metainf['source'].copy()
   521         metainf['source']['base-url']  = 'http://cubicweb2.com/'
   521         metainf['source']['base-url']  = 'http://cubicweb2.com/'
   522         metainf['extid']  = 1234
   522         metainf['extid']  = 1234
   523         self.assertEquals(note.absolute_url(), 'http://cubicweb2.com/note/1234')
   523         self.assertEqual(note.absolute_url(), 'http://cubicweb2.com/note/1234')
   524 
   524 
   525     def test_absolute_url_empty_field(self):
   525     def test_absolute_url_empty_field(self):
   526         req = self.request()
   526         req = self.request()
   527         card = req.create_entity('Card', wikiid=u'', title=u'test')
   527         card = req.create_entity('Card', wikiid=u'', title=u'test')
   528         self.assertEquals(card.absolute_url(),
   528         self.assertEqual(card.absolute_url(),
   529                           'http://testing.fr/cubicweb/card/eid/%s' % card.eid)
   529                           'http://testing.fr/cubicweb/card/eid/%s' % card.eid)
   530 
   530 
   531     def test_create_entity(self):
   531     def test_create_entity(self):
   532         req = self.request()
   532         req = self.request()
   533         p1 = req.create_entity('Personne', nom=u'fayolle', prenom=u'alexandre')
   533         p1 = req.create_entity('Personne', nom=u'fayolle', prenom=u'alexandre')
   535         note = req.create_entity('Note', type=u'z')
   535         note = req.create_entity('Note', type=u'z')
   536         req = self.request()
   536         req = self.request()
   537         p = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien',
   537         p = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien',
   538                               connait=p1, evaluee=[p1, p2],
   538                               connait=p1, evaluee=[p1, p2],
   539                               reverse_ecrit_par=note)
   539                               reverse_ecrit_par=note)
   540         self.assertEquals(p.nom, 'di mascio')
   540         self.assertEqual(p.nom, 'di mascio')
   541         self.assertEquals([c.nom for c in p.connait], ['fayolle'])
   541         self.assertEqual([c.nom for c in p.connait], ['fayolle'])
   542         self.assertEquals(sorted([c.nom for c in p.evaluee]), ['campeas', 'fayolle'])
   542         self.assertEqual(sorted([c.nom for c in p.evaluee]), ['campeas', 'fayolle'])
   543         self.assertEquals([c.type for c in p.reverse_ecrit_par], ['z'])
   543         self.assertEqual([c.type for c in p.reverse_ecrit_par], ['z'])
   544 
   544 
   545 
   545 
   546 
   546 
   547 if __name__ == '__main__':
   547 if __name__ == '__main__':
   548     from logilab.common.testlib import unittest_main
   548     from logilab.common.testlib import unittest_main