--- a/test/unittest_entity.py Thu Mar 31 15:23:50 2011 +0200
+++ b/test/unittest_entity.py Thu Mar 31 15:23:52 2011 +0200
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
-# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# 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.
@@ -19,7 +19,7 @@
"""unit tests for cubicweb.web.views.entities module"""
from datetime import datetime
-
+from logilab.common import tempattr
from cubicweb import Binary, Unauthorized
from cubicweb.devtools.testlib import CubicWebTC
from cubicweb.mttransforms import HAS_TAL
@@ -29,6 +29,17 @@
class EntityTC(CubicWebTC):
+ def setUp(self):
+ super(EntityTC, self).setUp()
+ self.backup_dict = {}
+ for cls in self.vreg['etypes'].iter_classes():
+ self.backup_dict[cls] = (cls.fetch_attrs, cls.fetch_order)
+
+ def tearDown(self):
+ super(EntityTC, self).tearDown()
+ for cls in self.vreg['etypes'].iter_classes():
+ cls.fetch_attrs, cls.fetch_order = self.backup_dict[cls]
+
def test_boolean_value(self):
e = self.vreg['etypes'].etype_class('CWUser')(self.request())
self.failUnless(e)
@@ -136,17 +147,19 @@
Note = self.vreg['etypes'].etype_class('Note')
peschema = Personne.e_schema
seschema = Societe.e_schema
- peschema.subjrels['travaille'].rdef(peschema, seschema).cardinality = '1*'
- peschema.subjrels['connait'].rdef(peschema, peschema).cardinality = '11'
- peschema.subjrels['evaluee'].rdef(peschema, Note.e_schema).cardinality = '1*'
- seschema.subjrels['evaluee'].rdef(seschema, Note.e_schema).cardinality = '1*'
- # testing basic fetch_attrs attribute
- self.assertEqual(Personne.fetch_rql(user),
- 'Any X,AA,AB,AC ORDERBY AA ASC '
- 'WHERE X is Personne, X nom AA, X prenom AB, X modification_date AC')
- pfetch_attrs = Personne.fetch_attrs
- sfetch_attrs = Societe.fetch_attrs
+ torestore = []
+ for rdef, card in [(peschema.subjrels['travaille'].rdef(peschema, seschema), '1*'),
+ (peschema.subjrels['connait'].rdef(peschema, peschema), '11'),
+ (peschema.subjrels['evaluee'].rdef(peschema, Note.e_schema), '1*'),
+ (seschema.subjrels['evaluee'].rdef(seschema, Note.e_schema), '1*')]:
+ cm = tempattr(rdef, 'cardinality', card)
+ cm.__enter__()
+ torestore.append(cm)
try:
+ # testing basic fetch_attrs attribute
+ self.assertEqual(Personne.fetch_rql(user),
+ 'Any X,AA,AB,AC ORDERBY AA ASC '
+ 'WHERE X is Personne, X nom AA, X prenom AB, X modification_date AC')
# testing unknown attributes
Personne.fetch_attrs = ('bloug', 'beep')
self.assertEqual(Personne.fetch_rql(user), 'Any X WHERE X is Personne')
@@ -185,8 +198,9 @@
'Any X,AA,AB ORDERBY AA ASC WHERE X is Personne, X nom AA, X prenom AB')
# XXX test unauthorized attribute
finally:
- Personne.fetch_attrs = pfetch_attrs
- Societe.fetch_attrs = sfetch_attrs
+ # fetch_attrs restored by generic tearDown
+ for cm in torestore:
+ cm.__exit__(None, None, None)
def test_related_rql_base(self):
Personne = self.vreg['etypes'].etype_class('Personne')
@@ -227,7 +241,7 @@
user = self.request().user
rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0]
self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC '
- 'WHERE NOT S use_email O, S eid %(x)s, '
+ 'WHERE NOT EXISTS(S use_email O), S eid %(x)s, '
'O is EmailAddress, O address AA, O alias AB, O modification_date AC')
def test_unrelated_rql_security_1_user(self):
@@ -236,7 +250,7 @@
user = self.request().user
rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0]
self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC '
- 'WHERE NOT S use_email O, S eid %(x)s, '
+ 'WHERE NOT EXISTS(S use_email O), S eid %(x)s, '
'O is EmailAddress, O address AA, O alias AB, O modification_date AC')
user = self.execute('Any X WHERE X login "admin"').get_entity(0, 0)
rql = user.cw_unrelated_rql('use_email', 'EmailAddress', 'subject')[0]
@@ -257,49 +271,59 @@
def test_unrelated_rql_security_2(self):
email = self.execute('INSERT EmailAddress X: X address "hop"').get_entity(0, 0)
rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0]
- self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA ASC '
- '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')
+ self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA '
+ 'WHERE NOT EXISTS(S use_email O), S is CWUser, '
+ 'S login AA, S firstname AB, S surname AC, S modification_date AD')
self.login('anon')
email = self.execute('Any X WHERE X eid %(x)s', {'x': email.eid}).get_entity(0, 0)
rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0]
self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA '
- '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, '
- 'A eid %(B)s, EXISTS(S identity A, NOT A in_group C, C name "guests", C is CWGroup)')
+ 'WHERE NOT EXISTS(S use_email O, O is EmailAddress), S is CWUser, '
+ 'S login AA, S firstname AB, S surname AC, S modification_date AD, '
+ 'A eid %(B)s, EXISTS(S identity A, NOT A in_group C, C name "guests", C is CWGroup)')
def test_unrelated_rql_security_nonexistant(self):
self.login('anon')
email = self.vreg['etypes'].etype_class('EmailAddress')(self.request())
rql = email.cw_unrelated_rql('use_email', 'CWUser', 'object')[0]
self.assertEqual(rql, 'Any S,AA,AB,AC,AD ORDERBY AA '
- 'WHERE S is CWUser, S login AA, S firstname AB, S surname AC, S modification_date AD, '
- 'A eid %(B)s, EXISTS(S identity A, NOT A in_group C, C name "guests", C is CWGroup)')
+ 'WHERE NOT EXISTS(S use_email O, O is EmailAddress), S is CWUser, '
+ 'S login AA, S firstname AB, S surname AC, S modification_date AD, '
+ 'A eid %(B)s, EXISTS(S identity A, NOT A in_group C, C name "guests", C is CWGroup)')
def test_unrelated_rql_constraints_creation_subject(self):
person = self.vreg['etypes'].etype_class('Personne')(self.request())
rql = person.cw_unrelated_rql('connait', 'Personne', 'subject')[0]
- self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC WHERE '
- 'O is Personne, O nom AA, O prenom AB, O modification_date AC')
+ self.assertEqual(
+ rql, 'Any O,AA,AB,AC ORDERBY AC DESC WHERE '
+ 'O is Personne, O nom AA, O prenom AB, O modification_date AC')
def test_unrelated_rql_constraints_creation_object(self):
person = self.vreg['etypes'].etype_class('Personne')(self.request())
rql = person.cw_unrelated_rql('connait', 'Personne', 'object')[0]
- self.assertEqual(rql, 'Any S,AA,AB,AC ORDERBY AC DESC WHERE '
- 'NOT (S connait P, P nom "toto"), S is Personne, S nom AA, '
- 'S prenom AB, S modification_date AC')
+ self.assertEqual(
+ rql, 'Any S,AA,AB,AC ORDERBY AC DESC WHERE '
+ 'S is Personne, S nom AA, S prenom AB, S modification_date AC, '
+ 'NOT (S connait A, A nom "toto"), A is Personne, EXISTS(S travaille B, B nom "tutu")')
def test_unrelated_rql_constraints_edition_subject(self):
person = self.request().create_entity('Personne', nom=u'sylvain')
rql = person.cw_unrelated_rql('connait', 'Personne', 'subject')[0]
- self.assertEqual(rql, 'Any O,AA,AB,AC ORDERBY AC DESC WHERE '
- 'NOT S connait O, S eid %(x)s, NOT S identity O, O is Personne, '
- 'O nom AA, O prenom AB, O modification_date AC')
+ self.assertEqual(
+ rql, 'Any O,AA,AB,AC ORDERBY AC DESC WHERE '
+ 'NOT EXISTS(S connait O), S eid %(x)s, O is Personne, '
+ 'O nom AA, O prenom AB, O modification_date AC, '
+ 'NOT S identity O')
def test_unrelated_rql_constraints_edition_object(self):
person = self.request().create_entity('Personne', nom=u'sylvain')
rql = person.cw_unrelated_rql('connait', 'Personne', 'object')[0]
- self.assertEqual(rql, 'Any S,AA,AB,AC ORDERBY AC DESC WHERE '
- 'NOT S connait O, O eid %(x)s, NOT S identity O, NOT (S connait P, '
- 'P nom "toto"), S is Personne, S nom AA, S prenom AB, S modification_date AC')
+ self.assertEqual(
+ rql, 'Any S,AA,AB,AC ORDERBY AC DESC WHERE '
+ 'NOT EXISTS(S connait O), O eid %(x)s, S is Personne, '
+ 'S nom AA, S prenom AB, S modification_date AC, '
+ 'NOT S identity O, NOT (S connait A, A nom "toto"), '
+ 'EXISTS(S travaille B, B nom "tutu")')
def test_unrelated_base(self):
req = self.request()