web/test/unittest_application.py
changeset 11122 fedcb69982af
parent 10356 a009a31fb1ea
parent 11118 0c645f09d96a
child 11127 6464edfa95bb
equal deleted inserted replaced
11053:ec44983e047c 11122:fedcb69982af
    21 import httplib
    21 import httplib
    22 
    22 
    23 from logilab.common.testlib import TestCase, unittest_main
    23 from logilab.common.testlib import TestCase, unittest_main
    24 from logilab.common.decorators import clear_cache, classproperty
    24 from logilab.common.decorators import clear_cache, classproperty
    25 
    25 
    26 from cubicweb import AuthenticationError
       
    27 from cubicweb import view
    26 from cubicweb import view
    28 from cubicweb.devtools.testlib import CubicWebTC, real_error_handling
    27 from cubicweb.devtools.testlib import CubicWebTC, real_error_handling
    29 from cubicweb.devtools.fake import FakeRequest
    28 from cubicweb.devtools.fake import FakeRequest
    30 from cubicweb.web import LogOut, Redirect, INTERNAL_FIELD_VALUE
    29 from cubicweb.web import LogOut, Redirect, INTERNAL_FIELD_VALUE
    31 from cubicweb.web.views.basecontrollers import ViewController
    30 from cubicweb.web.views.basecontrollers import ViewController
   255             self.assertEqual(forminfo['error'].entity, forminfo['eidmap']['X'])
   254             self.assertEqual(forminfo['error'].entity, forminfo['eidmap']['X'])
   256             self.assertEqual(forminfo['error'].errors,
   255             self.assertEqual(forminfo['error'].errors,
   257                               {'login-subject': u'the value "admin" is already used, use another one'})
   256                               {'login-subject': u'the value "admin" is already used, use another one'})
   258             self.assertEqual(forminfo['values'], req.form)
   257             self.assertEqual(forminfo['values'], req.form)
   259 
   258 
       
   259     def _edit_parent(self, dir_eid, parent_eid, role='subject',
       
   260                      etype='Directory', **kwargs):
       
   261         parent_eid = parent_eid or '__cubicweb_internal_field__'
       
   262         with self.admin_access.web_request() as req:
       
   263             req.form = {
       
   264                 'eid': unicode(dir_eid),
       
   265                 '__maineid': unicode(dir_eid),
       
   266                 '__type:%s' % dir_eid: etype,
       
   267                 'parent-%s:%s' % (role, dir_eid): parent_eid,
       
   268             }
       
   269             req.form.update(kwargs)
       
   270             req.form['_cw_entity_fields:%s' % dir_eid] = ','.join(
       
   271                 ['parent-%s' % role] +
       
   272                 [key.split(':')[0]
       
   273                  for key in kwargs.keys()
       
   274                  if not key.startswith('_')])
       
   275             self.expect_redirect_handle_request(req)
       
   276 
       
   277     def _edit_in_version(self, ticket_eid, version_eid, **kwargs):
       
   278         version_eid = version_eid or '__cubicweb_internal_field__'
       
   279         with self.admin_access.web_request() as req:
       
   280             req.form = {
       
   281                 'eid': unicode(ticket_eid),
       
   282                 '__maineid': unicode(ticket_eid),
       
   283                 '__type:%s' % ticket_eid: 'Ticket',
       
   284                 'in_version-subject:%s' % ticket_eid: version_eid,
       
   285             }
       
   286             req.form.update(kwargs)
       
   287             req.form['_cw_entity_fields:%s' % ticket_eid] = ','.join(
       
   288                 ['in_version-subject'] +
       
   289                 [key.split(':')[0]
       
   290                  for key in kwargs.keys()
       
   291                  if not key.startswith('_')])
       
   292             self.expect_redirect_handle_request(req)
       
   293 
       
   294     def test_create_and_link_directories(self):
       
   295         with self.admin_access.web_request() as req:
       
   296             req.form = {
       
   297                 'eid': (u'A', u'B'),
       
   298                 '__maineid': u'A',
       
   299                 '__type:A': 'Directory',
       
   300                 '__type:B': 'Directory',
       
   301                 'parent-subject:B': u'A',
       
   302                 'name-subject:A': u'topd',
       
   303                 'name-subject:B': u'subd',
       
   304                 '_cw_entity_fields:A': 'name-subject',
       
   305                 '_cw_entity_fields:B': 'parent-subject,name-subject',
       
   306             }
       
   307             self.expect_redirect_handle_request(req)
       
   308 
       
   309         with self.admin_access.repo_cnx() as cnx:
       
   310             self.assertTrue(cnx.find('Directory', name=u'topd'))
       
   311             self.assertTrue(cnx.find('Directory', name=u'subd'))
       
   312             self.assertEqual(1, cnx.execute(
       
   313                 'Directory SUBD WHERE SUBD parent TOPD,'
       
   314                 ' SUBD name "subd", TOPD name "topd"').rowcount)
       
   315 
       
   316     def test_create_subentity(self):
       
   317         with self.admin_access.repo_cnx() as cnx:
       
   318             topd = cnx.create_entity('Directory', name=u'topd')
       
   319             cnx.commit()
       
   320 
       
   321         with self.admin_access.web_request() as req:
       
   322             req.form = {
       
   323                 'eid': (unicode(topd.eid), u'B'),
       
   324                 '__maineid': unicode(topd.eid),
       
   325                 '__type:%s' % topd.eid: 'Directory',
       
   326                 '__type:B': 'Directory',
       
   327                 'parent-object:%s' % topd.eid: u'B',
       
   328                 'name-subject:B': u'subd',
       
   329                 '_cw_entity_fields:%s' % topd.eid: 'parent-object',
       
   330                 '_cw_entity_fields:B': 'name-subject',
       
   331             }
       
   332             self.expect_redirect_handle_request(req)
       
   333 
       
   334         with self.admin_access.repo_cnx() as cnx:
       
   335             self.assertTrue(cnx.find('Directory', name=u'topd'))
       
   336             self.assertTrue(cnx.find('Directory', name=u'subd'))
       
   337             self.assertEqual(1, cnx.execute(
       
   338                 'Directory SUBD WHERE SUBD parent TOPD,'
       
   339                 ' SUBD name "subd", TOPD name "topd"').rowcount)
       
   340 
       
   341     def test_subject_subentity_removal(self):
       
   342         """Editcontroller: detaching a composite relation removes the subentity
       
   343         (edit from the subject side)
       
   344         """
       
   345         with self.admin_access.repo_cnx() as cnx:
       
   346             topd = cnx.create_entity('Directory', name=u'topd')
       
   347             sub1 = cnx.create_entity('Directory', name=u'sub1', parent=topd)
       
   348             sub2 = cnx.create_entity('Directory', name=u'sub2', parent=topd)
       
   349             cnx.commit()
       
   350 
       
   351         attrs = {'name-subject:%s' % sub1.eid: ''}
       
   352         self._edit_parent(sub1.eid, parent_eid=None, **attrs)
       
   353 
       
   354         with self.admin_access.repo_cnx() as cnx:
       
   355             self.assertTrue(cnx.find('Directory', eid=topd.eid))
       
   356             self.assertFalse(cnx.find('Directory', eid=sub1.eid))
       
   357             self.assertTrue(cnx.find('Directory', eid=sub2.eid))
       
   358 
       
   359     def test_object_subentity_removal(self):
       
   360         """Editcontroller: detaching a composite relation removes the subentity
       
   361         (edit from the object side)
       
   362         """
       
   363         with self.admin_access.repo_cnx() as cnx:
       
   364             topd = cnx.create_entity('Directory', name=u'topd')
       
   365             sub1 = cnx.create_entity('Directory', name=u'sub1', parent=topd)
       
   366             sub2 = cnx.create_entity('Directory', name=u'sub2', parent=topd)
       
   367             cnx.commit()
       
   368 
       
   369         self._edit_parent(topd.eid, parent_eid=sub1.eid, role='object')
       
   370 
       
   371         with self.admin_access.repo_cnx() as cnx:
       
   372             self.assertTrue(cnx.find('Directory', eid=topd.eid))
       
   373             self.assertTrue(cnx.find('Directory', eid=sub1.eid))
       
   374             self.assertFalse(cnx.find('Directory', eid=sub2.eid))
       
   375 
       
   376     def test_reparent_subentity(self):
       
   377         "Editcontroller: re-parenting a subentity does not remove it"
       
   378         with self.admin_access.repo_cnx() as cnx:
       
   379             top1 = cnx.create_entity('Directory', name=u'top1')
       
   380             top2 = cnx.create_entity('Directory', name=u'top2')
       
   381             subd = cnx.create_entity('Directory', name=u'subd', parent=top1)
       
   382             cnx.commit()
       
   383 
       
   384         self._edit_parent(subd.eid, parent_eid=top2.eid)
       
   385 
       
   386         with self.admin_access.repo_cnx() as cnx:
       
   387             self.assertTrue(cnx.find('Directory', eid=top1.eid))
       
   388             self.assertTrue(cnx.find('Directory', eid=top2.eid))
       
   389             self.assertTrue(cnx.find('Directory', eid=subd.eid))
       
   390             self.assertEqual(
       
   391                 cnx.find('Directory', eid=subd.eid).one().parent[0], top2)
       
   392 
       
   393     def test_reparent_subentity_inlined(self):
       
   394         """Editcontroller: re-parenting a subentity does not remove it
       
   395         (inlined case)"""
       
   396         with self.admin_access.repo_cnx() as cnx:
       
   397             version1 = cnx.create_entity('Version', name=u'version1')
       
   398             version2 = cnx.create_entity('Version', name=u'version2')
       
   399             ticket = cnx.create_entity('Ticket', title=u'ticket',
       
   400                                        in_version=version1)
       
   401             cnx.commit()
       
   402 
       
   403         self._edit_in_version(ticket.eid, version_eid=version2.eid)
       
   404 
       
   405         with self.admin_access.repo_cnx() as cnx:
       
   406             self.assertTrue(cnx.find('Version', eid=version1.eid))
       
   407             self.assertTrue(cnx.find('Version', eid=version2.eid))
       
   408             self.assertTrue(cnx.find('Ticket', eid=ticket.eid))
       
   409             self.assertEqual(
       
   410                 cnx.find('Ticket', eid=ticket.eid).one().in_version[0], version2)
       
   411 
       
   412     def test_subject_mixed_composite_subentity_removal_1(self):
       
   413         """Editcontroller: detaching several subentities respects each rdef's
       
   414         compositeness - Remove non composite
       
   415         """
       
   416         with self.admin_access.repo_cnx() as cnx:
       
   417             topd = cnx.create_entity('Directory', name=u'topd')
       
   418             fs = cnx.create_entity('Filesystem', name=u'/tmp')
       
   419             subd = cnx.create_entity('Directory', name=u'subd',
       
   420                                      parent=(topd, fs))
       
   421             cnx.commit()
       
   422 
       
   423         self._edit_parent(subd.eid, parent_eid=topd.eid)
       
   424 
       
   425         with self.admin_access.repo_cnx() as cnx:
       
   426             self.assertTrue(cnx.find('Directory', eid=topd.eid))
       
   427             self.assertTrue(cnx.find('Directory', eid=subd.eid))
       
   428             self.assertTrue(cnx.find('Filesystem', eid=fs.eid))
       
   429             self.assertEqual(cnx.find('Directory', eid=subd.eid).one().parent,
       
   430                              [topd,])
       
   431 
       
   432     def test_subject_mixed_composite_subentity_removal_2(self):
       
   433         """Editcontroller: detaching several subentities respects each rdef's
       
   434         compositeness - Remove composite
       
   435         """
       
   436         with self.admin_access.repo_cnx() as cnx:
       
   437             topd = cnx.create_entity('Directory', name=u'topd')
       
   438             fs = cnx.create_entity('Filesystem', name=u'/tmp')
       
   439             subd = cnx.create_entity('Directory', name=u'subd',
       
   440                                      parent=(topd, fs))
       
   441             cnx.commit()
       
   442 
       
   443         self._edit_parent(subd.eid, parent_eid=fs.eid)
       
   444 
       
   445         with self.admin_access.repo_cnx() as cnx:
       
   446             self.assertTrue(cnx.find('Directory', eid=topd.eid))
       
   447             self.assertFalse(cnx.find('Directory', eid=subd.eid))
       
   448             self.assertTrue(cnx.find('Filesystem', eid=fs.eid))
       
   449 
       
   450     def test_object_mixed_composite_subentity_removal_1(self):
       
   451         """Editcontroller: detaching several subentities respects each rdef's
       
   452         compositeness - Remove non composite
       
   453         """
       
   454         with self.admin_access.repo_cnx() as cnx:
       
   455             topd = cnx.create_entity('Directory', name=u'topd')
       
   456             fs = cnx.create_entity('Filesystem', name=u'/tmp')
       
   457             subd = cnx.create_entity('Directory', name=u'subd',
       
   458                                      parent=(topd, fs))
       
   459             cnx.commit()
       
   460 
       
   461         self._edit_parent(fs.eid, parent_eid=None, role='object',
       
   462                           etype='Filesystem')
       
   463 
       
   464         with self.admin_access.repo_cnx() as cnx:
       
   465             self.assertTrue(cnx.find('Directory', eid=topd.eid))
       
   466             self.assertTrue(cnx.find('Directory', eid=subd.eid))
       
   467             self.assertTrue(cnx.find('Filesystem', eid=fs.eid))
       
   468             self.assertEqual(cnx.find('Directory', eid=subd.eid).one().parent,
       
   469                              [topd,])
       
   470 
       
   471     def test_object_mixed_composite_subentity_removal_2(self):
       
   472         """Editcontroller: detaching several subentities respects each rdef's
       
   473         compositeness - Remove composite
       
   474         """
       
   475         with self.admin_access.repo_cnx() as cnx:
       
   476             topd = cnx.create_entity('Directory', name=u'topd')
       
   477             fs = cnx.create_entity('Filesystem', name=u'/tmp')
       
   478             subd = cnx.create_entity('Directory', name=u'subd',
       
   479                                      parent=(topd, fs))
       
   480             cnx.commit()
       
   481 
       
   482         self._edit_parent(topd.eid, parent_eid=None, role='object')
       
   483 
       
   484         with self.admin_access.repo_cnx() as cnx:
       
   485             self.assertTrue(cnx.find('Directory', eid=topd.eid))
       
   486             self.assertFalse(cnx.find('Directory', eid=subd.eid))
       
   487             self.assertTrue(cnx.find('Filesystem', eid=fs.eid))
       
   488 
       
   489     def test_delete_mandatory_composite(self):
       
   490         with self.admin_access.repo_cnx() as cnx:
       
   491             perm = cnx.create_entity('DirectoryPermission')
       
   492             mydir = cnx.create_entity('Directory', name=u'dir',
       
   493                                       has_permission=perm)
       
   494             cnx.commit()
       
   495 
       
   496         with self.admin_access.web_request() as req:
       
   497             dir_eid = unicode(mydir.eid)
       
   498             perm_eid = unicode(perm.eid)
       
   499             req.form = {
       
   500                 'eid': [dir_eid, perm_eid],
       
   501                 '__maineid' : dir_eid,
       
   502                 '__type:%s' % dir_eid: 'Directory',
       
   503                 '__type:%s' % perm_eid: 'DirectoryPermission',
       
   504                 '_cw_entity_fields:%s' % dir_eid: '',
       
   505                 '_cw_entity_fields:%s' % perm_eid: 'has_permission-object',
       
   506                 'has_permission-object:%s' % perm_eid: '',
       
   507                 }
       
   508             path, _params = self.expect_redirect_handle_request(req, 'edit')
       
   509             self.assertTrue(req.find('Directory', eid=mydir.eid))
       
   510             self.assertFalse(req.find('DirectoryPermission', eid=perm.eid))
       
   511 
   260     def test_ajax_view_raise_arbitrary_error(self):
   512     def test_ajax_view_raise_arbitrary_error(self):
   261         class ErrorAjaxView(view.View):
   513         class ErrorAjaxView(view.View):
   262             __regid__ = 'test.ajax.error'
   514             __regid__ = 'test.ajax.error'
   263             def call(self):
   515             def call(self):
   264                 raise Exception('whatever')
   516                 raise Exception('whatever')