diff -r 058bb3dc685f -r 0b59724cb3f2 web/test/unittest_views_editforms.py --- a/web/test/unittest_views_editforms.py Mon Jan 04 18:40:30 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,257 +0,0 @@ -# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved. -# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr -# -# This file is part of CubicWeb. -# -# CubicWeb is free software: you can redistribute it and/or modify it under the -# terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 2.1 of the License, or (at your option) -# any later version. -# -# CubicWeb is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License along -# with CubicWeb. If not, see . -from logilab.common.testlib import unittest_main, mock_object - -from cubicweb.devtools.testlib import CubicWebTC -from cubicweb.web.views import uicfg -from cubicweb.web.formwidgets import AutoCompletionWidget -from cubicweb.schema import RRQLExpression - - -AFFK = uicfg.autoform_field_kwargs -AFS = uicfg.autoform_section - -def rbc(entity, formtype, section): - if section in ('attributes', 'metadata', 'hidden'): - permission = 'update' - else: - permission = 'add' - return [(rschema.type, x) - for rschema, tschemas, x in AFS.relations_by_section(entity, - formtype, - section, - permission)] - -class AutomaticEntityFormTC(CubicWebTC): - - def test_custom_widget(self): - with self.admin_access.web_request() as req: - AFFK.tag_subject_of(('CWUser', 'login', '*'), - {'widget': AutoCompletionWidget(autocomplete_initfunc='get_logins')}) - form = self.vreg['forms'].select('edition', req, entity=req.user) - field = form.field_by_name('login', 'subject') - self.assertIsInstance(field.widget, AutoCompletionWidget) - AFFK.del_rtag('CWUser', 'login', '*', 'subject') - - - def test_cwuser_relations_by_category(self): - with self.admin_access.web_request() as req: - e = self.vreg['etypes'].etype_class('CWUser')(req) - # see custom configuration in views.cwuser - self.assertEqual(rbc(e, 'main', 'attributes'), - [('login', 'subject'), - ('upassword', 'subject'), - ('firstname', 'subject'), - ('surname', 'subject'), - ('in_group', 'subject'), - ]) - self.assertEqual(rbc(e, 'muledit', 'attributes'), - [('login', 'subject'), - ('upassword', 'subject'), - ('in_group', 'subject'), - ]) - self.assertCountEqual(rbc(e, 'main', 'metadata'), - [('last_login_time', 'subject'), - ('cw_source', 'subject'), - ('creation_date', 'subject'), - ('modification_date', 'subject'), - ('created_by', 'subject'), - ('owned_by', 'subject'), - ('bookmarked_by', 'object'), - ]) - # XXX skip 'tags' relation here and in the hidden category because - # of some test interdependancy when pytest is launched on whole cw - # (appears here while expected in hidden - self.assertCountEqual([x for x in rbc(e, 'main', 'relations') - if x != ('tags', 'object')], - [('connait', 'subject'), - ('custom_workflow', 'subject'), - ('primary_email', 'subject'), - ('checked_by', 'object'), - ]) - self.assertListEqual(rbc(e, 'main', 'inlined'), - [('use_email', 'subject'), - ]) - # owned_by is defined both as subject and object relations on CWUser - self.assertListEqual(sorted(x for x in rbc(e, 'main', 'hidden') - if x != ('tags', 'object')), - sorted([('for_user', 'object'), - ('created_by', 'object'), - ('wf_info_for', 'object'), - ('owned_by', 'object'), - ])) - - def test_inlined_view(self): - self.assertIn('main_inlined', - AFS.etype_get('CWUser', 'use_email', 'subject', 'EmailAddress')) - self.assertNotIn('main_inlined', - AFS.etype_get('CWUser', 'primary_email', 'subject', 'EmailAddress')) - self.assertIn('main_relations', - AFS.etype_get('CWUser', 'primary_email', 'subject', 'EmailAddress')) - - def test_personne_relations_by_category(self): - with self.admin_access.web_request() as req: - e = self.vreg['etypes'].etype_class('Personne')(req) - self.assertListEqual(rbc(e, 'main', 'attributes'), - [('nom', 'subject'), - ('prenom', 'subject'), - ('sexe', 'subject'), - ('promo', 'subject'), - ('titre', 'subject'), - ('ass', 'subject'), - ('web', 'subject'), - ('tel', 'subject'), - ('fax', 'subject'), - ('datenaiss', 'subject'), - ('test', 'subject'), - ('description', 'subject'), - ('salary', 'subject'), - ]) - self.assertListEqual(rbc(e, 'muledit', 'attributes'), - [('nom', 'subject'), - ]) - self.assertCountEqual(rbc(e, 'main', 'metadata'), - [('cw_source', 'subject'), - ('creation_date', 'subject'), - ('modification_date', 'subject'), - ('created_by', 'subject'), - ('owned_by', 'subject'), - ]) - self.assertCountEqual(rbc(e, 'main', 'relations'), - [('travaille', 'subject'), - ('manager', 'object'), - ('connait', 'object'), - ]) - self.assertListEqual(rbc(e, 'main', 'hidden'), - []) - - def test_edition_form(self): - with self.admin_access.web_request() as req: - rset = req.execute('CWUser X LIMIT 1') - form = self.vreg['forms'].select('edition', req, rset=rset, row=0, col=0) - # should be also selectable by specifying entity - self.vreg['forms'].select('edition', req, entity=rset.get_entity(0, 0)) - self.assertFalse(any(f for f in form.fields if f is None)) - - def test_edition_form_with_action(self): - with self.admin_access.web_request() as req: - rset = req.execute('CWUser X LIMIT 1') - form = self.vreg['forms'].select('edition', req, rset=rset, row=0, - col=0, action='my_custom_action') - self.assertEqual(form.form_action(), 'my_custom_action') - - def test_attribute_add_permissions(self): - # https://www.cubicweb.org/ticket/4342844 - with self.admin_access.repo_cnx() as cnx: - self.create_user(cnx, u'toto') - cnx.commit() - with self.new_access(u'toto').web_request() as req: - e = self.vreg['etypes'].etype_class('Personne')(req) - cform = self.vreg['forms'].select('edition', req, entity=e) - self.assertIn('sexe', - [rschema.type - for rschema, _ in cform.editable_attributes()]) - with self.new_access(u'toto').repo_cnx() as cnx: - person_eid = cnx.create_entity('Personne', nom=u'Robert').eid - cnx.commit() - person = req.entity_from_eid(person_eid) - mform = self.vreg['forms'].select('edition', req, entity=person) - self.assertNotIn('sexe', - [rschema.type - for rschema, _ in mform.editable_attributes()]) - - def test_inlined_relations(self): - with self.admin_access.web_request() as req: - with self.temporary_permissions(EmailAddress={'add': ()}): - autoform = self.vreg['forms'].select('edition', req, entity=req.user) - self.assertEqual(list(autoform.inlined_form_views()), []) - - def test_check_inlined_rdef_permissions(self): - # try to check permissions when creating an entity ('user' below is a - # fresh entity without an eid) - with self.admin_access.web_request() as req: - ttype = 'EmailAddress' - rschema = self.schema['use_email'] - rdef = rschema.rdefs[('CWUser', ttype)] - tschema = self.schema[ttype] - role = 'subject' - with self.temporary_permissions((rdef, {'add': ()})): - user = self.vreg['etypes'].etype_class('CWUser')(req) - autoform = self.vreg['forms'].select('edition', req, entity=user) - self.assertFalse(autoform.check_inlined_rdef_permissions(rschema, role, - tschema, ttype)) - # we actually don't care about the actual expression, - # may_have_permission only checks the presence of such expressions - expr = RRQLExpression('S use_email O') - with self.temporary_permissions((rdef, {'add': (expr,)})): - user = self.vreg['etypes'].etype_class('CWUser')(req) - autoform = self.vreg['forms'].select('edition', req, entity=user) - self.assertTrue(autoform.check_inlined_rdef_permissions(rschema, role, - tschema, ttype)) - - -class FormViewsTC(CubicWebTC): - - def test_delete_conf_formview(self): - with self.admin_access.web_request() as req: - rset = req.execute('CWGroup X') - self.view('deleteconf', rset, template=None, req=req).source - - def test_automatic_edition_formview(self): - with self.admin_access.web_request() as req: - rset = req.execute('CWUser X') - self.view('edition', rset, row=0, template=None, req=req).source - - def test_automatic_edition_copyformview(self): - with self.admin_access.web_request() as req: - rset = req.execute('CWUser X') - self.view('copy', rset, row=0, template=None, req=req).source - - def test_automatic_creation_formview(self): - with self.admin_access.web_request() as req: - self.view('creation', None, etype='CWUser', template=None, req=req).source - - def test_automatic_muledit_formview(self): - with self.admin_access.web_request() as req: - rset = req.execute('CWUser X') - self.view('muledit', rset, template=None, req=req).source - - def test_automatic_reledit_formview(self): - with self.admin_access.web_request() as req: - rset = req.execute('CWUser X') - self.view('reledit', rset, row=0, rtype='login', template=None, req=req).source - - def test_automatic_inline_edit_formview(self): - with self.admin_access.web_request() as req: - geid = req.execute('CWGroup X LIMIT 1')[0][0] - rset = req.execute('CWUser X LIMIT 1') - self.view('inline-edition', rset, row=0, col=0, rtype='in_group', - peid=geid, role='object', i18nctx='', pform=MOCKPFORM, - template=None, req=req).source - - def test_automatic_inline_creation_formview(self): - with self.admin_access.web_request() as req: - geid = req.execute('CWGroup X LIMIT 1')[0][0] - self.view('inline-creation', None, etype='CWUser', rtype='in_group', - peid=geid, petype='CWGroup', i18nctx='', role='object', pform=MOCKPFORM, - template=None, req=req) - -MOCKPFORM = mock_object(form_previous_values={}, form_valerror=None) - -if __name__ == '__main__': - unittest_main()