205 '_cw_edited_fields:X': 'login-subject,upassword-subject', |
204 '_cw_edited_fields:X': 'login-subject,upassword-subject', |
206 'login-subject:X': u'toto', |
205 'login-subject:X': u'toto', |
207 'upassword-subject:X': u'toto', |
206 'upassword-subject:X': u'toto', |
208 } |
207 } |
209 ex = self.assertRaises(ValidationError, self.ctrl_publish, req) |
208 ex = self.assertRaises(ValidationError, self.ctrl_publish, req) |
210 self.assertEquals(ex.errors, {'upassword-subject': u'password and confirmation don\'t match'}) |
209 self.assertEqual(ex.errors, {'upassword-subject': u'password and confirmation don\'t match'}) |
211 req = self.request() |
210 req = self.request() |
212 req.form = {'__cloned_eid:X': u(user.eid), |
211 req.form = {'__cloned_eid:X': u(user.eid), |
213 'eid': 'X', '__type:X': 'CWUser', |
212 'eid': 'X', '__type:X': 'CWUser', |
214 '_cw_edited_fields:X': 'login-subject,upassword-subject', |
213 '_cw_edited_fields:X': 'login-subject,upassword-subject', |
215 'login-subject:X': u'toto', |
214 'login-subject:X': u'toto', |
216 'upassword-subject:X': u'toto', |
215 'upassword-subject:X': u'toto', |
217 'upassword-subject-confirm:X': u'tutu', |
216 'upassword-subject-confirm:X': u'tutu', |
218 } |
217 } |
219 ex = self.assertRaises(ValidationError, self.ctrl_publish, req) |
218 ex = self.assertRaises(ValidationError, self.ctrl_publish, req) |
220 self.assertEquals(ex.errors, {'upassword-subject': u'password and confirmation don\'t match'}) |
219 self.assertEqual(ex.errors, {'upassword-subject': u'password and confirmation don\'t match'}) |
221 |
220 |
222 |
221 |
223 def test_interval_bound_constraint_success(self): |
222 def test_interval_bound_constraint_success(self): |
224 feid = self.execute('INSERT File X: X data_name "toto.txt", X data %(data)s', |
223 feid = self.execute('INSERT File X: X data_name "toto.txt", X data %(data)s', |
225 {'data': Binary('yo')})[0][0] |
224 {'data': Binary('yo')})[0][0] |
226 req = self.request() |
225 self.commit() |
|
226 req = self.request(rollbackfirst=True) |
227 req.form = {'eid': ['X'], |
227 req.form = {'eid': ['X'], |
228 '__type:X': 'Salesterm', |
228 '__type:X': 'Salesterm', |
229 '_cw_edited_fields:X': 'amount-subject,described_by_test-subject', |
229 '_cw_edited_fields:X': 'amount-subject,described_by_test-subject', |
230 'amount-subject:X': u'-10', |
230 'amount-subject:X': u'-10', |
231 'described_by_test-subject:X': u(feid), |
231 'described_by_test-subject:X': u(feid), |
232 } |
232 } |
233 ex = self.assertRaises(ValidationError, self.ctrl_publish, req) |
233 ex = self.assertRaises(ValidationError, self.ctrl_publish, req) |
234 self.assertEquals(ex.errors, {'amount-subject': 'value must be >= 0'}) |
234 self.assertEqual(ex.errors, {'amount-subject': 'value must be >= 0'}) |
235 req = self.request() |
235 req = self.request(rollbackfirst=True) |
236 req.form = {'eid': ['X'], |
236 req.form = {'eid': ['X'], |
237 '__type:X': 'Salesterm', |
237 '__type:X': 'Salesterm', |
238 '_cw_edited_fields:X': 'amount-subject,described_by_test-subject', |
238 '_cw_edited_fields:X': 'amount-subject,described_by_test-subject', |
239 'amount-subject:X': u'110', |
239 'amount-subject:X': u'110', |
240 'described_by_test-subject:X': u(feid), |
240 'described_by_test-subject:X': u(feid), |
241 } |
241 } |
242 ex = self.assertRaises(ValidationError, self.ctrl_publish, req) |
242 ex = self.assertRaises(ValidationError, self.ctrl_publish, req) |
243 self.assertEquals(ex.errors, {'amount-subject': 'value must be <= 100'}) |
243 self.assertEqual(ex.errors, {'amount-subject': 'value must be <= 100'}) |
244 req = self.request() |
244 req = self.request(rollbackfirst=True) |
245 req.form = {'eid': ['X'], |
245 req.form = {'eid': ['X'], |
246 '__type:X': 'Salesterm', |
246 '__type:X': 'Salesterm', |
247 '_cw_edited_fields:X': 'amount-subject,described_by_test-subject', |
247 '_cw_edited_fields:X': 'amount-subject,described_by_test-subject', |
248 'amount-subject:X': u'10', |
248 'amount-subject:X': u'10', |
249 'described_by_test-subject:X': u(feid), |
249 'described_by_test-subject:X': u(feid), |
250 } |
250 } |
251 self.expect_redirect_publish(req, 'edit') |
251 self.expect_redirect_publish(req, 'edit') |
252 # should be redirected on the created |
252 # should be redirected on the created |
253 #eid = params['rql'].split()[-1] |
253 #eid = params['rql'].split()[-1] |
254 e = self.execute('Salesterm X').get_entity(0, 0) |
254 e = self.execute('Salesterm X').get_entity(0, 0) |
255 self.assertEquals(e.amount, 10) |
255 self.assertEqual(e.amount, 10) |
256 |
256 |
257 def test_req_pending_insert(self): |
257 def test_req_pending_insert(self): |
258 """make sure req's pending insertions are taken into account""" |
258 """make sure req's pending insertions are taken into account""" |
259 tmpgroup = self.request().create_entity('CWGroup', name=u"test") |
259 tmpgroup = self.request().create_entity('CWGroup', name=u"test") |
260 user = self.user() |
260 user = self.user() |
261 req = self.request(**req_form(user)) |
261 req = self.request(**req_form(user)) |
262 req.session.data['pending_insert'] = set([(user.eid, 'in_group', tmpgroup.eid)]) |
262 req.session.data['pending_insert'] = set([(user.eid, 'in_group', tmpgroup.eid)]) |
263 path, params = self.expect_redirect_publish(req, 'edit') |
263 path, params = self.expect_redirect_publish(req, 'edit') |
264 usergroups = [gname for gname, in |
264 usergroups = [gname for gname, in |
265 self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
265 self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
266 self.assertUnorderedIterableEquals(usergroups, ['managers', 'test']) |
266 self.assertItemsEqual(usergroups, ['managers', 'test']) |
267 self.assertEquals(get_pending_inserts(req), []) |
267 self.assertEqual(get_pending_inserts(req), []) |
268 |
268 |
269 |
269 |
270 def test_req_pending_delete(self): |
270 def test_req_pending_delete(self): |
271 """make sure req's pending deletions are taken into account""" |
271 """make sure req's pending deletions are taken into account""" |
272 user = self.user() |
272 user = self.user() |
273 groupeid = self.execute('INSERT CWGroup G: G name "test", U in_group G WHERE U eid %(x)s', |
273 groupeid = self.execute('INSERT CWGroup G: G name "test", U in_group G WHERE U eid %(x)s', |
274 {'x': user.eid})[0][0] |
274 {'x': user.eid})[0][0] |
275 usergroups = [gname for gname, in |
275 usergroups = [gname for gname, in |
276 self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
276 self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
277 # just make sure everything was set correctly |
277 # just make sure everything was set correctly |
278 self.assertUnorderedIterableEquals(usergroups, ['managers', 'test']) |
278 self.assertItemsEqual(usergroups, ['managers', 'test']) |
279 # now try to delete the relation |
279 # now try to delete the relation |
280 req = self.request(**req_form(user)) |
280 req = self.request(**req_form(user)) |
281 req.session.data['pending_delete'] = set([(user.eid, 'in_group', groupeid)]) |
281 req.session.data['pending_delete'] = set([(user.eid, 'in_group', groupeid)]) |
282 path, params = self.expect_redirect_publish(req, 'edit') |
282 path, params = self.expect_redirect_publish(req, 'edit') |
283 usergroups = [gname for gname, in |
283 usergroups = [gname for gname, in |
284 self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
284 self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
285 self.assertUnorderedIterableEquals(usergroups, ['managers']) |
285 self.assertItemsEqual(usergroups, ['managers']) |
286 self.assertEquals(get_pending_deletes(req), []) |
286 self.assertEqual(get_pending_deletes(req), []) |
287 |
|
288 # def test_custom_attribute_handler(self): |
|
289 # def custom_login_edit(self, formparams, value, relations): |
|
290 # formparams['login'] = value.upper() |
|
291 # relations.append('X login %(login)s') |
|
292 # CWUser.custom_login_edit = custom_login_edit |
|
293 # try: |
|
294 # user = self.user() |
|
295 # eid = repr(user.eid) |
|
296 # req = self.request() |
|
297 # req.form = { |
|
298 # 'eid': eid, |
|
299 # '__type:'+eid: 'CWUser', |
|
300 # 'login:'+eid: u'foo', |
|
301 # } |
|
302 # path, params = self.expect_redirect_publish(req, 'edit') |
|
303 # rset = self.execute('Any L WHERE X eid %(x)s, X login L', {'x': user.eid}, 'x') |
|
304 # self.assertEquals(rset[0][0], 'FOO') |
|
305 # finally: |
|
306 # del CWUser.custom_login_edit |
|
307 |
287 |
308 def test_redirect_apply_button(self): |
288 def test_redirect_apply_button(self): |
309 redirectrql = rql_for_eid(4012) # whatever |
289 redirectrql = rql_for_eid(4012) # whatever |
310 req = self.request() |
290 req = self.request() |
311 req.form = { |
291 req.form = { |
340 '__redirectvid': 'primary', |
320 '__redirectvid': 'primary', |
341 '__redirectparams': 'toto=tutu&tata=titi', |
321 '__redirectparams': 'toto=tutu&tata=titi', |
342 '__form_id': 'edition', |
322 '__form_id': 'edition', |
343 } |
323 } |
344 path, params = self.expect_redirect_publish(req, 'edit') |
324 path, params = self.expect_redirect_publish(req, 'edit') |
345 self.assertEquals(path, 'view') |
325 self.assertEqual(path, 'view') |
346 self.assertEquals(params['rql'], redirectrql) |
326 self.assertEqual(params['rql'], redirectrql) |
347 self.assertEquals(params['vid'], 'primary') |
327 self.assertEqual(params['vid'], 'primary') |
348 self.assertEquals(params['tata'], 'titi') |
328 self.assertEqual(params['tata'], 'titi') |
349 self.assertEquals(params['toto'], 'tutu') |
329 self.assertEqual(params['toto'], 'tutu') |
350 |
330 |
351 def test_redirect_delete_button(self): |
331 def test_redirect_delete_button(self): |
352 req = self.request() |
332 req = self.request() |
353 eid = req.create_entity('BlogEntry', title=u'hop', content=u'hop').eid |
333 eid = req.create_entity('BlogEntry', title=u'hop', content=u'hop').eid |
354 req.form = {'eid': u(eid), '__type:%s'%eid: 'BlogEntry', |
334 req.form = {'eid': u(eid), '__type:%s'%eid: 'BlogEntry', |
355 '__action_delete': ''} |
335 '__action_delete': ''} |
356 path, params = self.expect_redirect_publish(req, 'edit') |
336 path, params = self.expect_redirect_publish(req, 'edit') |
357 self.assertEquals(path, 'blogentry') |
337 self.assertEqual(path, 'blogentry') |
358 self.assertIn('_cwmsgid', params) |
338 self.assertIn('_cwmsgid', params) |
359 eid = req.create_entity('EmailAddress', address=u'hop@logilab.fr').eid |
339 eid = req.create_entity('EmailAddress', address=u'hop@logilab.fr').eid |
360 self.execute('SET X use_email E WHERE E eid %(e)s, X eid %(x)s', |
340 self.execute('SET X use_email E WHERE E eid %(e)s, X eid %(x)s', |
361 {'x': self.session.user.eid, 'e': eid}) |
341 {'x': self.session.user.eid, 'e': eid}) |
362 self.commit() |
342 self.commit() |
363 req = req |
343 req = req |
364 req.form = {'eid': u(eid), '__type:%s'%eid: 'EmailAddress', |
344 req.form = {'eid': u(eid), '__type:%s'%eid: 'EmailAddress', |
365 '__action_delete': ''} |
345 '__action_delete': ''} |
366 path, params = self.expect_redirect_publish(req, 'edit') |
346 path, params = self.expect_redirect_publish(req, 'edit') |
367 self.assertEquals(path, 'cwuser/admin') |
347 self.assertEqual(path, 'cwuser/admin') |
368 self.assertIn('_cwmsgid', params) |
348 self.assertIn('_cwmsgid', params) |
369 eid1 = req.create_entity('BlogEntry', title=u'hop', content=u'hop').eid |
349 eid1 = req.create_entity('BlogEntry', title=u'hop', content=u'hop').eid |
370 eid2 = req.create_entity('EmailAddress', address=u'hop@logilab.fr').eid |
350 eid2 = req.create_entity('EmailAddress', address=u'hop@logilab.fr').eid |
371 req = self.request() |
351 req = self.request() |
372 req.form = {'eid': [u(eid1), u(eid2)], |
352 req.form = {'eid': [u(eid1), u(eid2)], |
373 '__type:%s'%eid1: 'BlogEntry', |
353 '__type:%s'%eid1: 'BlogEntry', |
374 '__type:%s'%eid2: 'EmailAddress', |
354 '__type:%s'%eid2: 'EmailAddress', |
375 '__action_delete': ''} |
355 '__action_delete': ''} |
376 path, params = self.expect_redirect_publish(req, 'edit') |
356 path, params = self.expect_redirect_publish(req, 'edit') |
377 self.assertEquals(path, 'view') |
357 self.assertEqual(path, 'view') |
378 self.assertIn('_cwmsgid', params) |
358 self.assertIn('_cwmsgid', params) |
379 |
359 |
380 def test_nonregr_eetype_etype_editing(self): |
360 def test_nonregr_eetype_etype_editing(self): |
381 """non-regression test checking that a manager user can edit a CWEType entity |
361 """non-regression test checking that a manager user can edit a CWEType entity |
382 """ |
362 """ |
559 self.failUnless(source.startswith('<div>')) |
539 self.failUnless(source.startswith('<div>')) |
560 |
540 |
561 # def test_json_exec(self): |
541 # def test_json_exec(self): |
562 # rql = 'Any T,N WHERE T is Tag, T name N' |
542 # rql = 'Any T,N WHERE T is Tag, T name N' |
563 # ctrl = self.ctrl(self.request(mode='json', rql=rql, pageid='123')) |
543 # ctrl = self.ctrl(self.request(mode='json', rql=rql, pageid='123')) |
564 # self.assertEquals(ctrl.publish(), |
544 # self.assertEqual(ctrl.publish(), |
565 # json.dumps(self.execute(rql).rows)) |
545 # json_dumps(self.execute(rql).rows)) |
566 |
546 |
567 def test_remote_add_existing_tag(self): |
547 def test_remote_add_existing_tag(self): |
568 self.remote_call('tag_entity', self.john.eid, ['python']) |
548 self.remote_call('tag_entity', self.john.eid, ['python']) |
569 self.assertUnorderedIterableEquals( |
549 self.assertItemsEqual( |
570 [tname for tname, in self.execute('Any N WHERE T is Tag, T name N')], |
550 [tname for tname, in self.execute('Any N WHERE T is Tag, T name N')], |
571 ['python', 'cubicweb']) |
551 ['python', 'cubicweb']) |
572 self.assertEquals( |
552 self.assertEqual( |
573 self.execute('Any N WHERE T tags P, P is CWUser, T name N').rows, |
553 self.execute('Any N WHERE T tags P, P is CWUser, T name N').rows, |
574 [['python']]) |
554 [['python']]) |
575 |
555 |
576 def test_remote_add_new_tag(self): |
556 def test_remote_add_new_tag(self): |
577 self.remote_call('tag_entity', self.john.eid, ['javascript']) |
557 self.remote_call('tag_entity', self.john.eid, ['javascript']) |
578 self.assertUnorderedIterableEquals( |
558 self.assertItemsEqual( |
579 [tname for tname, in self.execute('Any N WHERE T is Tag, T name N')], |
559 [tname for tname, in self.execute('Any N WHERE T is Tag, T name N')], |
580 ['python', 'cubicweb', 'javascript']) |
560 ['python', 'cubicweb', 'javascript']) |
581 self.assertEquals( |
561 self.assertEqual( |
582 self.execute('Any N WHERE T tags P, P is CWUser, T name N').rows, |
562 self.execute('Any N WHERE T tags P, P is CWUser, T name N').rows, |
583 [['javascript']]) |
563 [['javascript']]) |
584 |
564 |
585 def test_pending_insertion(self): |
565 def test_pending_insertion(self): |
586 res, req = self.remote_call('add_pending_inserts', [['12', 'tags', '13']]) |
566 res, req = self.remote_call('add_pending_inserts', [['12', 'tags', '13']]) |
587 deletes = get_pending_deletes(req) |
567 deletes = get_pending_deletes(req) |
588 self.assertEquals(deletes, []) |
568 self.assertEqual(deletes, []) |
589 inserts = get_pending_inserts(req) |
569 inserts = get_pending_inserts(req) |
590 self.assertEquals(inserts, ['12:tags:13']) |
570 self.assertEqual(inserts, ['12:tags:13']) |
591 res, req = self.remote_call('add_pending_inserts', [['12', 'tags', '14']]) |
571 res, req = self.remote_call('add_pending_inserts', [['12', 'tags', '14']]) |
592 deletes = get_pending_deletes(req) |
572 deletes = get_pending_deletes(req) |
593 self.assertEquals(deletes, []) |
573 self.assertEqual(deletes, []) |
594 inserts = get_pending_inserts(req) |
574 inserts = get_pending_inserts(req) |
595 self.assertEquals(inserts, ['12:tags:13', '12:tags:14']) |
575 self.assertEqual(inserts, ['12:tags:13', '12:tags:14']) |
596 inserts = get_pending_inserts(req, 12) |
576 inserts = get_pending_inserts(req, 12) |
597 self.assertEquals(inserts, ['12:tags:13', '12:tags:14']) |
577 self.assertEqual(inserts, ['12:tags:13', '12:tags:14']) |
598 inserts = get_pending_inserts(req, 13) |
578 inserts = get_pending_inserts(req, 13) |
599 self.assertEquals(inserts, ['12:tags:13']) |
579 self.assertEqual(inserts, ['12:tags:13']) |
600 inserts = get_pending_inserts(req, 14) |
580 inserts = get_pending_inserts(req, 14) |
601 self.assertEquals(inserts, ['12:tags:14']) |
581 self.assertEqual(inserts, ['12:tags:14']) |
602 req.remove_pending_operations() |
582 req.remove_pending_operations() |
603 |
583 |
604 def test_pending_deletion(self): |
584 def test_pending_deletion(self): |
605 res, req = self.remote_call('add_pending_delete', ['12', 'tags', '13']) |
585 res, req = self.remote_call('add_pending_delete', ['12', 'tags', '13']) |
606 inserts = get_pending_inserts(req) |
586 inserts = get_pending_inserts(req) |
607 self.assertEquals(inserts, []) |
587 self.assertEqual(inserts, []) |
608 deletes = get_pending_deletes(req) |
588 deletes = get_pending_deletes(req) |
609 self.assertEquals(deletes, ['12:tags:13']) |
589 self.assertEqual(deletes, ['12:tags:13']) |
610 res, req = self.remote_call('add_pending_delete', ['12', 'tags', '14']) |
590 res, req = self.remote_call('add_pending_delete', ['12', 'tags', '14']) |
611 inserts = get_pending_inserts(req) |
591 inserts = get_pending_inserts(req) |
612 self.assertEquals(inserts, []) |
592 self.assertEqual(inserts, []) |
613 deletes = get_pending_deletes(req) |
593 deletes = get_pending_deletes(req) |
614 self.assertEquals(deletes, ['12:tags:13', '12:tags:14']) |
594 self.assertEqual(deletes, ['12:tags:13', '12:tags:14']) |
615 deletes = get_pending_deletes(req, 12) |
595 deletes = get_pending_deletes(req, 12) |
616 self.assertEquals(deletes, ['12:tags:13', '12:tags:14']) |
596 self.assertEqual(deletes, ['12:tags:13', '12:tags:14']) |
617 deletes = get_pending_deletes(req, 13) |
597 deletes = get_pending_deletes(req, 13) |
618 self.assertEquals(deletes, ['12:tags:13']) |
598 self.assertEqual(deletes, ['12:tags:13']) |
619 deletes = get_pending_deletes(req, 14) |
599 deletes = get_pending_deletes(req, 14) |
620 self.assertEquals(deletes, ['12:tags:14']) |
600 self.assertEqual(deletes, ['12:tags:14']) |
621 req.remove_pending_operations() |
601 req.remove_pending_operations() |
622 |
602 |
623 def test_remove_pending_operations(self): |
603 def test_remove_pending_operations(self): |
624 self.remote_call('add_pending_delete', ['12', 'tags', '13']) |
604 self.remote_call('add_pending_delete', ['12', 'tags', '13']) |
625 _, req = self.remote_call('add_pending_inserts', [['12', 'tags', '14']]) |
605 _, req = self.remote_call('add_pending_inserts', [['12', 'tags', '14']]) |
626 inserts = get_pending_inserts(req) |
606 inserts = get_pending_inserts(req) |
627 self.assertEquals(inserts, ['12:tags:14']) |
607 self.assertEqual(inserts, ['12:tags:14']) |
628 deletes = get_pending_deletes(req) |
608 deletes = get_pending_deletes(req) |
629 self.assertEquals(deletes, ['12:tags:13']) |
609 self.assertEqual(deletes, ['12:tags:13']) |
630 req.remove_pending_operations() |
610 req.remove_pending_operations() |
631 self.assertEquals(get_pending_deletes(req), []) |
611 self.assertEqual(get_pending_deletes(req), []) |
632 self.assertEquals(get_pending_inserts(req), []) |
612 self.assertEqual(get_pending_inserts(req), []) |
633 |
613 |
634 |
614 |
635 def test_add_inserts(self): |
615 def test_add_inserts(self): |
636 res, req = self.remote_call('add_pending_inserts', |
616 res, req = self.remote_call('add_pending_inserts', |
637 [('12', 'tags', '13'), ('12', 'tags', '14')]) |
617 [('12', 'tags', '13'), ('12', 'tags', '14')]) |
638 inserts = get_pending_inserts(req) |
618 inserts = get_pending_inserts(req) |
639 self.assertEquals(inserts, ['12:tags:13', '12:tags:14']) |
619 self.assertEqual(inserts, ['12:tags:13', '12:tags:14']) |
640 req.remove_pending_operations() |
620 req.remove_pending_operations() |
641 |
621 |
642 |
622 |
643 # silly tests |
623 # silly tests |
644 def test_external_resource(self): |
624 def test_external_resource(self): |
645 self.assertEquals(self.remote_call('external_resource', 'RSS_LOGO')[0], |
625 self.assertEqual(self.remote_call('external_resource', 'RSS_LOGO')[0], |
646 json.dumps(self.request().external_resource('RSS_LOGO'))) |
626 json_dumps(self.config.uiprops['RSS_LOGO'])) |
647 def test_i18n(self): |
627 def test_i18n(self): |
648 self.assertEquals(self.remote_call('i18n', ['bimboom'])[0], |
628 self.assertEqual(self.remote_call('i18n', ['bimboom'])[0], |
649 json.dumps(['bimboom'])) |
629 json_dumps(['bimboom'])) |
650 |
630 |
651 def test_format_date(self): |
631 def test_format_date(self): |
652 self.assertEquals(self.remote_call('format_date', '2007-01-01 12:00:00')[0], |
632 self.assertEqual(self.remote_call('format_date', '2007-01-01 12:00:00')[0], |
653 json.dumps('2007/01/01')) |
633 json_dumps('2007/01/01')) |
654 |
634 |
655 |
635 |
656 |
636 |
657 |
637 |
658 if __name__ == '__main__': |
638 if __name__ == '__main__': |