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&D<br/></div>') |
389 '<div>R&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&D <div> pas fermé</div>') |
392 u'yo !! R&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&D') |
394 self.assertEqual(tidy(e.printable_value('content')), u'R&D') |
395 e['content'] = u'R&D;' |
395 e['content'] = u'R&D;' |
396 self.assertEquals(tidy(e.printable_value('content')), u'R&D;') |
396 self.assertEqual(tidy(e.printable_value('content')), u'R&D;') |
397 e['content'] = u'yo !! R&D <div> pas fermé' |
397 e['content'] = u'yo !! R&D <div> pas fermé' |
398 self.assertEquals(tidy(e.printable_value('content')), |
398 self.assertEqual(tidy(e.printable_value('content')), |
399 u'yo !! R&D <div> pas fermé</div>') |
399 u'yo !! R&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'est un exemple sérieux' |
403 e['content'] = u'C'est un exemple sé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&D<br/></div>' |
407 e['content'] = u'<div>R&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()) |
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') |