|
1 from logilab.common.testlib import unittest_main, mock_object |
|
2 from cubicweb import Binary |
|
3 from cubicweb.devtools.testlib import WebTest |
|
4 from cubicweb.web.form import EntityFieldsForm, FieldsForm |
|
5 from cubicweb.web.formrenderers import FormRenderer |
|
6 from cubicweb.web.formfields import (IntField, StringField, RichTextField, |
|
7 DateTimeField, DateTimePicker, |
|
8 FileField, EditableFileField) |
|
9 from cubicweb.web.formwidgets import PasswordInput |
|
10 from cubicweb.web.views.workflow import ChangeStateForm |
|
11 |
|
12 |
|
13 class FieldsFormTC(WebTest): |
|
14 |
|
15 def test_form_field_format(self): |
|
16 form = FieldsForm(self.request(), None) |
|
17 self.assertEquals(form.form_field_format(None), 'text/html') |
|
18 self.execute('INSERT CWProperty X: X pkey "ui.default-text-format", X value "text/rest", X for_user U WHERE U login "admin"') |
|
19 self.commit() |
|
20 self.assertEquals(form.form_field_format(None), 'text/rest') |
|
21 |
|
22 |
|
23 class EntityFieldsFormTC(WebTest): |
|
24 |
|
25 def setUp(self): |
|
26 super(EntityFieldsFormTC, self).setUp() |
|
27 self.req = self.request() |
|
28 self.entity = self.user(self.req) |
|
29 self.renderer = FormRenderer() |
|
30 |
|
31 def test_form_field_vocabulary_unrelated(self): |
|
32 b = self.add_entity('BlogEntry', title=u'di mascii code', content=u'a best-seller') |
|
33 t = self.add_entity('Tag', name=u'x') |
|
34 form1 = EntityFieldsForm(self.request(), None, entity=t) |
|
35 unrelated = [reid for rview, reid in form1.subject_relation_vocabulary('tags')] |
|
36 self.failUnless(b.eid in unrelated, unrelated) |
|
37 form2 = EntityFieldsForm(self.request(), None, entity=b) |
|
38 unrelated = [reid for rview, reid in form2.object_relation_vocabulary('tags')] |
|
39 self.failUnless(t.eid in unrelated, unrelated) |
|
40 self.execute('SET X tags Y WHERE X is Tag, Y is BlogEntry') |
|
41 unrelated = [reid for rview, reid in form1.subject_relation_vocabulary('tags')] |
|
42 self.failIf(b.eid in unrelated, unrelated) |
|
43 unrelated = [reid for rview, reid in form2.object_relation_vocabulary('tags')] |
|
44 self.failIf(t.eid in unrelated, unrelated) |
|
45 |
|
46 def test_form_field_vocabulary_new_entity(self): |
|
47 e = self.etype_instance('CWUser') |
|
48 form = EntityFieldsForm(self.request(), None, entity=e) |
|
49 unrelated = [rview for rview, reid in form.subject_relation_vocabulary('in_group')] |
|
50 # should be default groups but owners, i.e. managers, users, guests |
|
51 self.assertEquals(unrelated, [u'guests', u'managers', u'users']) |
|
52 |
|
53 def test_subject_in_state_vocabulary(self): |
|
54 # on a new entity |
|
55 e = self.etype_instance('CWUser') |
|
56 form = EntityFieldsForm(self.request(), None, entity=e) |
|
57 states = list(form.subject_in_state_vocabulary('in_state')) |
|
58 self.assertEquals(len(states), 1) |
|
59 self.assertEquals(states[0][0], u'activated') # list of (combobox view, state eid) |
|
60 # on an existant entity |
|
61 e = self.user() |
|
62 form = EntityFieldsForm(self.request(), None, entity=e) |
|
63 states = list(form.subject_in_state_vocabulary('in_state')) |
|
64 self.assertEquals(len(states), 1) |
|
65 self.assertEquals(states[0][0], u'deactivated') # list of (combobox view, state eid) |
|
66 |
|
67 |
|
68 |
|
69 # form view tests ######################################################### |
|
70 |
|
71 def test_massmailing_formview(self): |
|
72 self.execute('INSERT EmailAddress X: X address L + "@cubicweb.org", ' |
|
73 'U use_email X WHERE U is CWUser, U login L') |
|
74 rset = self.execute('CWUser X') |
|
75 self.view('massmailing', rset, template=None) |
|
76 |
|
77 |
|
78 # form tests ############################################################## |
|
79 |
|
80 def test_form_inheritance(self): |
|
81 class CustomChangeStateForm(ChangeStateForm): |
|
82 hello = IntField(name='youlou') |
|
83 creation_date = DateTimeField(widget=DateTimePicker) |
|
84 form = CustomChangeStateForm(self.req, redirect_path='perdu.com', |
|
85 entity=self.entity) |
|
86 form.form_render(state=123, trcomment=u'') |
|
87 |
|
88 def test_change_state_form(self): |
|
89 form = ChangeStateForm(self.req, redirect_path='perdu.com', |
|
90 entity=self.entity) |
|
91 form.form_render(state=123, trcomment=u'') |
|
92 |
|
93 # fields tests ############################################################ |
|
94 |
|
95 def _render_entity_field(self, name, form): |
|
96 form.form_build_context({}) |
|
97 return form.field_by_name(name).render(form, self.renderer) |
|
98 |
|
99 def _test_richtextfield(self, expected): |
|
100 class RTFForm(EntityFieldsForm): |
|
101 description = RichTextField() |
|
102 state = self.execute('State X WHERE X name "activated", X state_of ET, ET name "CWUser"').get_entity(0, 0) |
|
103 form = RTFForm(self.req, redirect_path='perdu.com', entity=state) |
|
104 # make it think it can use fck editor anyway |
|
105 form.form_field_format = lambda x: 'text/html' |
|
106 self.assertTextEquals(self._render_entity_field('description', form), |
|
107 expected % {'eid': state.eid}) |
|
108 |
|
109 |
|
110 def test_richtextfield_1(self): |
|
111 self.req.use_fckeditor = lambda: False |
|
112 self._test_richtextfield('''<select id="description_format:%(eid)s" name="description_format:%(eid)s" size="1" style="display: block" tabindex="0"> |
|
113 <option value="text/cubicweb-page-template">text/cubicweb-page-template</option> |
|
114 <option value="text/html">text/html</option> |
|
115 <option value="text/plain">text/plain</option> |
|
116 <option selected="selected" value="text/rest">text/rest</option> |
|
117 </select><textarea cols="60" id="description:%(eid)s" name="description:%(eid)s" onkeypress="autogrow(this)" rows="5" tabindex="1"/>''') |
|
118 |
|
119 |
|
120 def test_richtextfield_2(self): |
|
121 self.req.use_fckeditor = lambda: True |
|
122 self._test_richtextfield('<input name="description_format:%(eid)s" style="display: block" type="hidden" value="text/rest"/><textarea cols="80" cubicweb:type="wysiwyg" id="description:%(eid)s" name="description:%(eid)s" onkeypress="autogrow(this)" rows="20" tabindex="0"/>') |
|
123 |
|
124 |
|
125 def test_filefield(self): |
|
126 class FFForm(EntityFieldsForm): |
|
127 data = FileField(format_field=StringField(name='data_format'), |
|
128 encoding_field=StringField(name='data_encoding')) |
|
129 file = self.add_entity('File', name=u"pouet.txt", data_encoding=u'UTF-8', |
|
130 data=Binary('new widgets system')) |
|
131 form = FFForm(self.req, redirect_path='perdu.com', entity=file) |
|
132 self.assertTextEquals(self._render_entity_field('data', form), |
|
133 '''<input id="data:%(eid)s" name="data:%(eid)s" tabindex="0" type="file" value=""/> |
|
134 <a href="javascript: toggleVisibility('data:%(eid)s-advanced')" title="show advanced fields"><img src="http://testing.fr/cubicweb/data/puce_down.png" alt="show advanced fields"/></a> |
|
135 <div id="data:%(eid)s-advanced" class="hidden"> |
|
136 <label for="data_format:%(eid)s">data_format</label><input id="data_format:%(eid)s" name="data_format:%(eid)s" tabindex="1" type="text" value="text/plain"/><br/><br/> |
|
137 <label for="data_encoding:%(eid)s">data_encoding</label><input id="data_encoding:%(eid)s" name="data_encoding:%(eid)s" tabindex="2" type="text" value="UTF-8"/><br/><br/> |
|
138 </div> |
|
139 <br/> |
|
140 <input name="data:%(eid)s__detach" type="checkbox"/> |
|
141 detach attached file |
|
142 ''' % {'eid': file.eid}) |
|
143 |
|
144 |
|
145 def test_editablefilefield(self): |
|
146 class EFFForm(EntityFieldsForm): |
|
147 data = EditableFileField(format_field=StringField(name='data_format'), |
|
148 encoding_field=StringField(name='data_encoding')) |
|
149 def form_field_encoding(self, field): |
|
150 return 'ascii' |
|
151 def form_field_format(self, field): |
|
152 return 'text/plain' |
|
153 file = self.add_entity('File', name=u"pouet.txt", data_encoding=u'UTF-8', |
|
154 data=Binary('new widgets system')) |
|
155 form = EFFForm(self.req, redirect_path='perdu.com', entity=file) |
|
156 self.assertTextEquals(self._render_entity_field('data', form), |
|
157 '''<input id="data:%(eid)s" name="data:%(eid)s" tabindex="0" type="file" value=""/> |
|
158 <a href="javascript: toggleVisibility('data:%(eid)s-advanced')" title="show advanced fields"><img src="http://testing.fr/cubicweb/data/puce_down.png" alt="show advanced fields"/></a> |
|
159 <div id="data:%(eid)s-advanced" class="hidden"> |
|
160 <label for="data_format:%(eid)s">data_format</label><input id="data_format:%(eid)s" name="data_format:%(eid)s" tabindex="1" type="text" value="text/plain"/><br/><br/> |
|
161 <label for="data_encoding:%(eid)s">data_encoding</label><input id="data_encoding:%(eid)s" name="data_encoding:%(eid)s" tabindex="2" type="text" value="UTF-8"/><br/><br/> |
|
162 </div> |
|
163 <br/> |
|
164 <input name="data:%(eid)s__detach" type="checkbox"/> |
|
165 detach attached file |
|
166 <p><b>You can either submit a new file using the browse button above, or choose to remove already uploaded file by checking the "detach attached file" check-box, or edit file content online with the widget below.</b></p> |
|
167 <textarea cols="80" name="data:%(eid)s" onkeypress="autogrow(this)" rows="20" tabindex="3">new widgets system</textarea>''' % {'eid': file.eid}) |
|
168 |
|
169 |
|
170 def test_passwordfield(self): |
|
171 class PFForm(EntityFieldsForm): |
|
172 upassword = StringField(widget=PasswordInput) |
|
173 form = PFForm(self.req, redirect_path='perdu.com', entity=self.entity) |
|
174 self.assertTextEquals(self._render_entity_field('upassword', form), |
|
175 '''<input id="upassword:%(eid)s" name="upassword:%(eid)s" tabindex="0" type="password" value="__cubicweb_internal_field__"/> |
|
176 <br/> |
|
177 <input name="upassword-confirm:%(eid)s" tabindex="0" type="password" value="__cubicweb_internal_field__"/> |
|
178 |
|
179 <span class="emphasis">confirm password</span>''' % {'eid': self.entity.eid}) |
|
180 |
|
181 |
|
182 if __name__ == '__main__': |
|
183 unittest_main() |