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