6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
6 :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
7 """ |
7 """ |
8 import simplejson |
8 import simplejson |
9 |
9 |
10 from logilab.common.testlib import unittest_main, mock_object |
10 from logilab.common.testlib import unittest_main, mock_object |
11 from cubicweb.devtools.apptest import EnvBasedTC, ControllerTC |
|
12 |
11 |
13 from cubicweb import Binary, NoSelectableObject, ValidationError |
12 from cubicweb import Binary, NoSelectableObject, ValidationError |
14 from cubicweb.view import STRICT_DOCTYPE |
13 from cubicweb.view import STRICT_DOCTYPE |
|
14 from cubicweb.devtools.testlib import CubicWebTC |
15 from cubicweb.common.uilib import rql_for_eid |
15 from cubicweb.common.uilib import rql_for_eid |
16 |
|
17 from cubicweb.web import INTERNAL_FIELD_VALUE, Redirect, RequestError |
16 from cubicweb.web import INTERNAL_FIELD_VALUE, Redirect, RequestError |
18 |
|
19 from cubicweb.entities.authobjs import CWUser |
17 from cubicweb.entities.authobjs import CWUser |
20 |
18 |
21 |
19 |
22 class EditControllerTC(ControllerTC): |
20 class EditControllerTC(CubicWebTC): |
23 def setUp(self): |
21 def setUp(self): |
24 ControllerTC.setUp(self) |
22 CubicWebTC.setUp(self) |
25 self.failUnless('users' in self.schema.eschema('CWGroup').get_groups('read')) |
23 self.failUnless('users' in self.schema.eschema('CWGroup').get_groups('read')) |
26 |
24 |
27 def tearDown(self): |
25 def tearDown(self): |
28 ControllerTC.tearDown(self) |
26 CubicWebTC.tearDown(self) |
29 self.failUnless('users' in self.schema.eschema('CWGroup').get_groups('read')) |
27 self.failUnless('users' in self.schema.eschema('CWGroup').get_groups('read')) |
30 |
28 |
31 def test_noparam_edit(self): |
29 def test_noparam_edit(self): |
32 """check behaviour of this controller without any form parameter |
30 """check behaviour of this controller without any form parameter |
33 """ |
31 """ |
34 |
32 self.assertRaises(ValidationError, self.publish, self.request()) |
35 self.req.form = {} |
|
36 self.assertRaises(ValidationError, self.publish, self.req) |
|
37 |
33 |
38 def test_validation_unique(self): |
34 def test_validation_unique(self): |
39 """test creation of two linked entities |
35 """test creation of two linked entities |
40 """ |
36 """ |
41 user = self.user() |
37 user = self.user() |
42 self.req.form = {'eid': 'X', '__type:X': 'CWUser', |
38 req = self.request() |
43 'login:X': u'admin', 'edits-login:X': u'', |
39 req.form = {'eid': 'X', '__type:X': 'CWUser', |
44 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
40 'login:X': u'admin', 'edits-login:X': u'', |
45 } |
41 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
46 self.assertRaises(ValidationError, self.publish, self.req) |
42 } |
|
43 self.assertRaises(ValidationError, self.publish, req) |
47 |
44 |
48 |
45 |
49 def test_user_editing_itself(self): |
46 def test_user_editing_itself(self): |
50 """checking that a manager user can edit itself |
47 """checking that a manager user can edit itself |
51 """ |
48 """ |
52 user = self.user() |
49 user = self.user() |
53 basegroups = [str(eid) for eid, in self.execute('CWGroup G WHERE X in_group G, X eid %(x)s', {'x': user.eid})] |
50 basegroups = [str(eid) for eid, in self.execute('CWGroup G WHERE X in_group G, X eid %(x)s', {'x': user.eid})] |
54 groupeids = [eid for eid, in self.execute('CWGroup G WHERE G name in ("managers", "users")')] |
51 groupeids = [eid for eid, in self.execute('CWGroup G WHERE G name in ("managers", "users")')] |
55 groups = [str(eid) for eid in groupeids] |
52 groups = [str(eid) for eid in groupeids] |
56 stateeid = [eid for eid, in self.execute('State S WHERE S name "activated"')][0] |
53 stateeid = [eid for eid, in self.execute('State S WHERE S name "activated"')][0] |
57 self.req.form = { |
54 req = self.request() |
|
55 req.form = { |
58 'eid': `user.eid`, |
56 'eid': `user.eid`, |
59 '__type:'+`user.eid`: 'CWUser', |
57 '__type:'+`user.eid`: 'CWUser', |
60 'login:'+`user.eid`: unicode(user.login), |
58 'login:'+`user.eid`: unicode(user.login), |
61 'firstname:'+`user.eid`: u'Th\xe9nault', |
59 'firstname:'+`user.eid`: u'Th\xe9nault', |
62 'surname:'+`user.eid`: u'Sylvain', |
60 'surname:'+`user.eid`: u'Sylvain', |
122 self.assertEquals([s.eid for s in e.in_state], stateeids) |
119 self.assertEquals([s.eid for s in e.in_state], stateeids) |
123 |
120 |
124 |
121 |
125 def test_create_multiple_linked(self): |
122 def test_create_multiple_linked(self): |
126 gueid = self.execute('CWGroup G WHERE G name "users"')[0][0] |
123 gueid = self.execute('CWGroup G WHERE G name "users"')[0][0] |
127 self.req.form = {'eid': ['X', 'Y'], |
124 req = self.request() |
128 |
125 req.form = {'eid': ['X', 'Y'], |
129 '__type:X': 'CWUser', |
126 |
130 '__maineid' : 'X', |
127 '__type:X': 'CWUser', |
131 'login:X': u'adim', 'edits-login:X': u'', |
128 '__maineid' : 'X', |
132 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
129 'login:X': u'adim', 'edits-login:X': u'', |
133 'surname:X': u'Di Mascio', 'edits-surname:X': '', |
130 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
134 |
131 'surname:X': u'Di Mascio', 'edits-surname:X': '', |
135 'in_group:X': `gueid`, 'edits-in_group:X': INTERNAL_FIELD_VALUE, |
132 |
136 |
133 'in_group:X': `gueid`, 'edits-in_group:X': INTERNAL_FIELD_VALUE, |
137 '__type:Y': 'EmailAddress', |
134 |
138 'address:Y': u'dima@logilab.fr', 'edits-address:Y': '', |
135 '__type:Y': 'EmailAddress', |
139 'use_email:X': 'Y', 'edits-use_email:X': INTERNAL_FIELD_VALUE, |
136 'address:Y': u'dima@logilab.fr', 'edits-address:Y': '', |
140 } |
137 'use_email:X': 'Y', 'edits-use_email:X': INTERNAL_FIELD_VALUE, |
141 path, params = self.expect_redirect_publish() |
138 } |
|
139 path, params = self.expect_redirect_publish(req) |
142 # should be redirected on the created person |
140 # should be redirected on the created person |
143 self.assertEquals(path, 'cwuser/adim') |
141 self.assertEquals(path, 'cwuser/adim') |
144 e = self.execute('Any P WHERE P surname "Di Mascio"').get_entity(0, 0) |
142 e = self.execute('Any P WHERE P surname "Di Mascio"').get_entity(0, 0) |
145 self.assertEquals(e.surname, 'Di Mascio') |
143 self.assertEquals(e.surname, 'Di Mascio') |
146 email = e.use_email[0] |
144 email = e.use_email[0] |
147 self.assertEquals(email.address, 'dima@logilab.fr') |
145 self.assertEquals(email.address, 'dima@logilab.fr') |
148 |
146 |
149 def test_edit_multiple_linked(self): |
147 def test_edit_multiple_linked(self): |
150 peid = self.create_user('adim').eid |
148 peid = self.create_user('adim').eid |
151 self.req.form = {'eid': [`peid`, 'Y'], |
149 req = self.request() |
152 '__type:%s'%peid: 'CWUser', |
150 req.form = {'eid': [`peid`, 'Y'], |
153 'surname:%s'%peid: u'Di Masci', 'edits-surname:%s'%peid: '', |
151 '__type:%s'%peid: 'CWUser', |
154 |
152 'surname:%s'%peid: u'Di Masci', 'edits-surname:%s'%peid: '', |
155 '__type:Y': 'EmailAddress', |
153 |
156 'address:Y': u'dima@logilab.fr', 'edits-address:Y': '', |
154 '__type:Y': 'EmailAddress', |
157 'use_email:%s'%peid: 'Y', 'edits-use_email:%s'%peid: INTERNAL_FIELD_VALUE, |
155 'address:Y': u'dima@logilab.fr', 'edits-address:Y': '', |
158 |
156 'use_email:%s'%peid: 'Y', 'edits-use_email:%s'%peid: INTERNAL_FIELD_VALUE, |
159 '__redirectrql': 'Any X WHERE X eid %s'%peid, |
157 |
160 } |
158 '__redirectrql': 'Any X WHERE X eid %s'%peid, |
161 path, params = self.expect_redirect_publish() |
159 } |
|
160 path, params = self.expect_redirect_publish(req) |
162 # should be redirected on the created person |
161 # should be redirected on the created person |
163 eid = params['rql'].split()[-1] |
162 eid = params['rql'].split()[-1] |
164 e = self.execute('Any X WHERE X eid %(x)s', {'x': eid}, 'x').get_entity(0, 0) |
163 e = self.execute('Any X WHERE X eid %(x)s', {'x': eid}, 'x').get_entity(0, 0) |
165 self.assertEquals(e.surname, 'Di Masci') |
164 self.assertEquals(e.surname, 'Di Masci') |
166 email = e.use_email[0] |
165 email = e.use_email[0] |
167 self.assertEquals(email.address, 'dima@logilab.fr') |
166 self.assertEquals(email.address, 'dima@logilab.fr') |
168 |
167 |
169 emaileid = email.eid |
168 emaileid = email.eid |
170 self.req.form = {'eid': [`peid`, `emaileid`], |
169 req = self.request() |
|
170 req.form = {'eid': [`peid`, `emaileid`], |
171 '__type:%s'%peid: 'CWUser', |
171 '__type:%s'%peid: 'CWUser', |
172 'surname:%s'%peid: u'Di Masci', 'edits-surname:%s'%peid: 'Di Masci', |
172 'surname:%s'%peid: u'Di Masci', 'edits-surname:%s'%peid: 'Di Masci', |
173 '__type:%s'%emaileid: 'EmailAddress', |
173 '__type:%s'%emaileid: 'EmailAddress', |
174 'address:%s'%emaileid: u'adim@logilab.fr', 'edits-address:%s'%emaileid: 'dima@logilab.fr', |
174 'address:%s'%emaileid: u'adim@logilab.fr', 'edits-address:%s'%emaileid: 'dima@logilab.fr', |
175 'use_email:%s'%peid: `emaileid`, 'edits-use_email:%s'%peid: `emaileid`, |
175 'use_email:%s'%peid: `emaileid`, 'edits-use_email:%s'%peid: `emaileid`, |
176 '__redirectrql': 'Any X WHERE X eid %s'%peid, |
176 '__redirectrql': 'Any X WHERE X eid %s'%peid, |
177 } |
177 } |
178 path, params = self.expect_redirect_publish() |
178 path, params = self.expect_redirect_publish(req) |
179 # should be redirected on the created person |
179 # should be redirected on the created person |
180 eid = params['rql'].split()[-1] |
180 eid = params['rql'].split()[-1] |
181 e = self.execute('Any X WHERE X eid %(x)s', {'x': eid}, 'x').get_entity(0, 0) |
181 e = self.execute('Any X WHERE X eid %(x)s', {'x': eid}, 'x').get_entity(0, 0) |
182 self.assertEquals(e.surname, 'Di Masci') |
182 self.assertEquals(e.surname, 'Di Masci') |
183 email = e.use_email[0] |
183 email = e.use_email[0] |
186 |
186 |
187 def test_password_confirm(self): |
187 def test_password_confirm(self): |
188 """test creation of two linked entities |
188 """test creation of two linked entities |
189 """ |
189 """ |
190 user = self.user() |
190 user = self.user() |
191 self.req.form = {'__cloned_eid:X': user.eid, |
191 req = self.request() |
192 'eid': 'X', '__type:X': 'CWUser', |
192 req.form = {'__cloned_eid:X': user.eid, |
193 'login:X': u'toto', 'edits-login:X': u'', |
193 'eid': 'X', '__type:X': 'CWUser', |
194 'upassword:X': u'toto', 'edits-upassword:X': u'', |
194 'login:X': u'toto', 'edits-login:X': u'', |
195 } |
195 'upassword:X': u'toto', 'edits-upassword:X': u'', |
196 self.assertRaises(ValidationError, self.publish, self.req) |
196 } |
197 self.req.form = {'__cloned_eid:X': user.eid, |
197 self.assertRaises(ValidationError, self.publish, req) |
198 'eid': 'X', '__type:X': 'CWUser', |
198 req = self.request() |
199 'login:X': u'toto', 'edits-login:X': u'', |
199 req.form = {'__cloned_eid:X': user.eid, |
200 'upassword:X': u'toto', 'upassword-confirm:X': u'tutu', 'edits-upassword:X': u'', |
200 'eid': 'X', '__type:X': 'CWUser', |
201 } |
201 'login:X': u'toto', 'edits-login:X': u'', |
202 self.assertRaises(ValidationError, self.publish, self.req) |
202 'upassword:X': u'toto', |
|
203 'upassword-confirm:X': u'tutu', 'edits-upassword:X': u'', |
|
204 } |
|
205 self.assertRaises(ValidationError, self.publish, req) |
203 |
206 |
204 |
207 |
205 def test_interval_bound_constraint_success(self): |
208 def test_interval_bound_constraint_success(self): |
206 feid = self.execute('INSERT File X: X name "toto.txt", X data %(data)s', |
209 feid = self.execute('INSERT File X: X name "toto.txt", X data %(data)s', |
207 {'data': Binary('yo')})[0][0] |
210 {'data': Binary('yo')})[0][0] |
208 self.req.form = {'eid': ['X'], |
211 req = self.request() |
209 '__type:X': 'Salesterm', |
212 req.form = {'eid': ['X'], |
210 'amount:X': u'-10', 'edits-amount:X': '', |
213 '__type:X': 'Salesterm', |
211 'described_by_test:X': str(feid), 'edits-described_by_test:X': INTERNAL_FIELD_VALUE, |
214 'amount:X': u'-10', 'edits-amount:X': '', |
212 } |
215 'described_by_test:X': str(feid), 'edits-described_by_test:X': INTERNAL_FIELD_VALUE, |
213 self.assertRaises(ValidationError, self.publish, self.req) |
216 } |
214 self.req.form = {'eid': ['X'], |
217 self.assertRaises(ValidationError, self.publish, req) |
215 '__type:X': 'Salesterm', |
218 req = self.request() |
216 'amount:X': u'110', 'edits-amount:X': '', |
219 req.form = {'eid': ['X'], |
217 'described_by_test:X': str(feid), 'edits-described_by_test:X': INTERNAL_FIELD_VALUE, |
220 '__type:X': 'Salesterm', |
218 } |
221 'amount:X': u'110', 'edits-amount:X': '', |
219 self.assertRaises(ValidationError, self.publish, self.req) |
222 'described_by_test:X': str(feid), 'edits-described_by_test:X': INTERNAL_FIELD_VALUE, |
220 self.req.form = {'eid': ['X'], |
223 } |
221 '__type:X': 'Salesterm', |
224 self.assertRaises(ValidationError, self.publish, req) |
222 'amount:X': u'10', 'edits-amount:X': '', |
225 req = self.request() |
223 'described_by_test:X': str(feid), 'edits-described_by_test:X': INTERNAL_FIELD_VALUE, |
226 req.form = {'eid': ['X'], |
224 } |
227 '__type:X': 'Salesterm', |
225 self.expect_redirect_publish() |
228 'amount:X': u'10', 'edits-amount:X': '', |
|
229 'described_by_test:X': str(feid), 'edits-described_by_test:X': INTERNAL_FIELD_VALUE, |
|
230 } |
|
231 self.expect_redirect_publish(req) |
226 # should be redirected on the created |
232 # should be redirected on the created |
227 #eid = params['rql'].split()[-1] |
233 #eid = params['rql'].split()[-1] |
228 e = self.execute('Salesterm X').get_entity(0, 0) |
234 e = self.execute('Salesterm X').get_entity(0, 0) |
229 self.assertEquals(e.amount, 10) |
235 self.assertEquals(e.amount, 10) |
230 |
236 |
231 def test_req_pending_insert(self): |
237 def test_req_pending_insert(self): |
232 """make sure req's pending insertions are taken into account""" |
238 """make sure req's pending insertions are taken into account""" |
233 tmpgroup = self.add_entity('CWGroup', name=u"test") |
239 tmpgroup = self.add_entity('CWGroup', name=u"test") |
234 user = self.user() |
240 user = self.user() |
235 self.req.set_session_data('pending_insert', set([(user.eid, 'in_group', tmpgroup.eid)])) |
241 req = self.request() |
236 path, params = self.expect_redirect_publish() |
242 req.set_session_data('pending_insert', set([(user.eid, 'in_group', tmpgroup.eid)])) |
|
243 path, params = self.expect_redirect_publish(req) |
237 usergroups = [gname for gname, in |
244 usergroups = [gname for gname, in |
238 self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
245 self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
239 self.assertUnorderedIterableEquals(usergroups, ['managers', 'test']) |
246 self.assertUnorderedIterableEquals(usergroups, ['managers', 'test']) |
240 self.assertEquals(self.req.get_pending_inserts(), []) |
247 self.assertEquals(req.get_pending_inserts(), []) |
241 |
248 |
242 |
249 |
243 def test_req_pending_delete(self): |
250 def test_req_pending_delete(self): |
244 """make sure req's pending deletions are taken into account""" |
251 """make sure req's pending deletions are taken into account""" |
245 user = self.user() |
252 user = self.user() |
248 usergroups = [gname for gname, in |
255 usergroups = [gname for gname, in |
249 self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
256 self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
250 # just make sure everything was set correctly |
257 # just make sure everything was set correctly |
251 self.assertUnorderedIterableEquals(usergroups, ['managers', 'test']) |
258 self.assertUnorderedIterableEquals(usergroups, ['managers', 'test']) |
252 # now try to delete the relation |
259 # now try to delete the relation |
253 self.req.set_session_data('pending_delete', set([(user.eid, 'in_group', groupeid)])) |
260 req = self.request() |
254 path, params = self.expect_redirect_publish() |
261 req.set_session_data('pending_delete', set([(user.eid, 'in_group', groupeid)])) |
|
262 path, params = self.expect_redirect_publish(req) |
255 usergroups = [gname for gname, in |
263 usergroups = [gname for gname, in |
256 self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
264 self.execute('Any N WHERE G name N, U in_group G, U eid %(u)s', {'u': user.eid})] |
257 self.assertUnorderedIterableEquals(usergroups, ['managers']) |
265 self.assertUnorderedIterableEquals(usergroups, ['managers']) |
258 self.assertEquals(self.req.get_pending_deletes(), []) |
266 self.assertEquals(req.get_pending_deletes(), []) |
259 |
267 |
260 def test_custom_attribute_handler(self): |
268 def test_custom_attribute_handler(self): |
261 def custom_login_edit(self, formparams, value, relations): |
269 def custom_login_edit(self, formparams, value, relations): |
262 formparams['login'] = value.upper() |
270 formparams['login'] = value.upper() |
263 relations.append('X login %(login)s') |
271 relations.append('X login %(login)s') |
264 CWUser.custom_login_edit = custom_login_edit |
272 CWUser.custom_login_edit = custom_login_edit |
265 try: |
273 try: |
266 user = self.user() |
274 user = self.user() |
267 eid = repr(user.eid) |
275 eid = repr(user.eid) |
268 self.req.form = { |
276 req = self.request() |
|
277 req.form = { |
269 'eid': eid, |
278 'eid': eid, |
270 '__type:'+eid: 'CWUser', |
279 '__type:'+eid: 'CWUser', |
271 'login:'+eid: u'foo', |
280 'login:'+eid: u'foo', |
272 'edits-login:'+eid: unicode(user.login), |
281 'edits-login:'+eid: unicode(user.login), |
273 } |
282 } |
274 path, params = self.expect_redirect_publish() |
283 path, params = self.expect_redirect_publish(req) |
275 rset = self.execute('Any L WHERE X eid %(x)s, X login L', {'x': user.eid}, 'x') |
284 rset = self.execute('Any L WHERE X eid %(x)s, X login L', {'x': user.eid}, 'x') |
276 self.assertEquals(rset[0][0], 'FOO') |
285 self.assertEquals(rset[0][0], 'FOO') |
277 finally: |
286 finally: |
278 del CWUser.custom_login_edit |
287 del CWUser.custom_login_edit |
279 |
288 |
280 def test_redirect_apply_button(self): |
289 def test_redirect_apply_button(self): |
281 redirectrql = rql_for_eid(4012) # whatever |
290 redirectrql = rql_for_eid(4012) # whatever |
282 self.req.form = { |
291 req = self.request() |
283 'eid': 'A', '__type:A': 'BlogEntry', |
292 req.form = { |
284 '__maineid' : 'A', |
293 'eid': 'A', '__type:A': 'BlogEntry', |
285 'content:A': u'"13:03:43"', 'edits-content:A': '', |
294 '__maineid' : 'A', |
286 'title:A': u'huuu', 'edits-title:A': '', |
295 'content:A': u'"13:03:43"', 'edits-content:A': '', |
287 '__redirectrql': redirectrql, |
296 'title:A': u'huuu', 'edits-title:A': '', |
288 '__redirectvid': 'primary', |
297 '__redirectrql': redirectrql, |
289 '__redirectparams': 'toto=tutu&tata=titi', |
298 '__redirectvid': 'primary', |
290 '__form_id': 'edition', |
299 '__redirectparams': 'toto=tutu&tata=titi', |
291 '__action_apply': '', |
300 '__form_id': 'edition', |
292 } |
301 '__action_apply': '', |
293 path, params = self.expect_redirect_publish() |
302 } |
|
303 path, params = self.expect_redirect_publish(req) |
294 self.failUnless(path.startswith('blogentry/')) |
304 self.failUnless(path.startswith('blogentry/')) |
295 eid = path.split('/')[1] |
305 eid = path.split('/')[1] |
296 self.assertEquals(params['vid'], 'edition') |
306 self.assertEquals(params['vid'], 'edition') |
297 self.assertNotEquals(int(eid), 4012) |
307 self.assertNotEquals(int(eid), 4012) |
298 self.assertEquals(params['__redirectrql'], redirectrql) |
308 self.assertEquals(params['__redirectrql'], redirectrql) |
299 self.assertEquals(params['__redirectvid'], 'primary') |
309 self.assertEquals(params['__redirectvid'], 'primary') |
300 self.assertEquals(params['__redirectparams'], 'toto=tutu&tata=titi') |
310 self.assertEquals(params['__redirectparams'], 'toto=tutu&tata=titi') |
301 |
311 |
302 def test_redirect_ok_button(self): |
312 def test_redirect_ok_button(self): |
303 redirectrql = rql_for_eid(4012) # whatever |
313 redirectrql = rql_for_eid(4012) # whatever |
304 self.req.form = { |
314 req = self.request() |
305 'eid': 'A', '__type:A': 'BlogEntry', |
315 req.form = { |
306 '__maineid' : 'A', |
316 'eid': 'A', '__type:A': 'BlogEntry', |
307 'content:A': u'"13:03:43"', 'edits-content:A': '', |
317 '__maineid' : 'A', |
308 'title:A': u'huuu', 'edits-title:A': '', |
318 'content:A': u'"13:03:43"', 'edits-content:A': '', |
309 '__redirectrql': redirectrql, |
319 'title:A': u'huuu', 'edits-title:A': '', |
310 '__redirectvid': 'primary', |
320 '__redirectrql': redirectrql, |
311 '__redirectparams': 'toto=tutu&tata=titi', |
321 '__redirectvid': 'primary', |
312 '__form_id': 'edition', |
322 '__redirectparams': 'toto=tutu&tata=titi', |
313 } |
323 '__form_id': 'edition', |
314 path, params = self.expect_redirect_publish() |
324 } |
|
325 path, params = self.expect_redirect_publish(req) |
315 self.assertEquals(path, 'view') |
326 self.assertEquals(path, 'view') |
316 self.assertEquals(params['rql'], redirectrql) |
327 self.assertEquals(params['rql'], redirectrql) |
317 self.assertEquals(params['vid'], 'primary') |
328 self.assertEquals(params['vid'], 'primary') |
318 self.assertEquals(params['tata'], 'titi') |
329 self.assertEquals(params['tata'], 'titi') |
319 self.assertEquals(params['toto'], 'tutu') |
330 self.assertEquals(params['toto'], 'tutu') |
320 |
331 |
321 def test_redirect_delete_button(self): |
332 def test_redirect_delete_button(self): |
322 eid = self.add_entity('BlogEntry', title=u'hop', content=u'hop').eid |
333 eid = self.add_entity('BlogEntry', title=u'hop', content=u'hop').eid |
323 self.req.form = {'eid': str(eid), '__type:%s'%eid: 'BlogEntry', |
334 req = self.request() |
324 '__action_delete': ''} |
335 req.form = {'eid': str(eid), '__type:%s'%eid: 'BlogEntry', |
325 path, params = self.expect_redirect_publish() |
336 '__action_delete': ''} |
|
337 path, params = self.expect_redirect_publish(req) |
326 self.assertEquals(path, 'blogentry') |
338 self.assertEquals(path, 'blogentry') |
327 self.assertEquals(params, {u'__message': u'entity deleted'}) |
339 self.assertEquals(params, {u'__message': u'entity deleted'}) |
328 eid = self.add_entity('EmailAddress', address=u'hop@logilab.fr').eid |
340 eid = self.add_entity('EmailAddress', address=u'hop@logilab.fr').eid |
329 self.execute('SET X use_email E WHERE E eid %(e)s, X eid %(x)s', |
341 self.execute('SET X use_email E WHERE E eid %(e)s, X eid %(x)s', |
330 {'x': self.session().user.eid, 'e': eid}, 'x') |
342 {'x': self.session.user.eid, 'e': eid}, 'x') |
331 self.commit() |
343 self.commit() |
332 self.req.form = {'eid': str(eid), '__type:%s'%eid: 'EmailAddress', |
344 req = self.request() |
333 '__action_delete': ''} |
345 req.form = {'eid': str(eid), '__type:%s'%eid: 'EmailAddress', |
334 path, params = self.expect_redirect_publish() |
346 '__action_delete': ''} |
|
347 path, params = self.expect_redirect_publish(req) |
335 self.assertEquals(path, 'cwuser/admin') |
348 self.assertEquals(path, 'cwuser/admin') |
336 self.assertEquals(params, {u'__message': u'entity deleted'}) |
349 self.assertEquals(params, {u'__message': u'entity deleted'}) |
337 eid1 = self.add_entity('BlogEntry', title=u'hop', content=u'hop').eid |
350 eid1 = self.add_entity('BlogEntry', title=u'hop', content=u'hop').eid |
338 eid2 = self.add_entity('EmailAddress', address=u'hop@logilab.fr').eid |
351 eid2 = self.add_entity('EmailAddress', address=u'hop@logilab.fr').eid |
339 self.req.form = {'eid': [str(eid1), str(eid2)], |
352 req = self.request() |
340 '__type:%s'%eid1: 'BlogEntry', |
353 req.form = {'eid': [str(eid1), str(eid2)], |
341 '__type:%s'%eid2: 'EmailAddress', |
354 '__type:%s'%eid1: 'BlogEntry', |
342 '__action_delete': ''} |
355 '__type:%s'%eid2: 'EmailAddress', |
343 path, params = self.expect_redirect_publish() |
356 '__action_delete': ''} |
|
357 path, params = self.expect_redirect_publish(req) |
344 self.assertEquals(path, 'view') |
358 self.assertEquals(path, 'view') |
345 self.assertEquals(params, {u'__message': u'entities deleted'}) |
359 self.assertEquals(params, {u'__message': u'entities deleted'}) |
346 |
360 |
347 def test_nonregr_egroup_etype_editing(self): |
361 def test_nonregr_egroup_etype_editing(self): |
348 """non-regression test checking that a manager user can edit a CWEType entity (CWGroup) |
362 """non-regression test checking that a manager user can edit a CWEType entity (CWGroup) |
349 """ |
363 """ |
350 groupeids = [eid for eid, in self.execute('CWGroup G WHERE G name "managers"')] |
364 groupeids = [eid for eid, in self.execute('CWGroup G WHERE G name "managers"')] |
351 groups = [str(eid) for eid in groupeids] |
365 groups = [str(eid) for eid in groupeids] |
352 eeetypeeid = self.execute('CWEType X WHERE X name "CWGroup"')[0][0] |
366 eeetypeeid = self.execute('CWEType X WHERE X name "CWGroup"')[0][0] |
353 basegroups = [str(eid) for eid, in self.execute('CWGroup G WHERE X read_permission G, X eid %(x)s', {'x': eeetypeeid})] |
367 basegroups = [str(eid) for eid, in self.execute('CWGroup G WHERE X read_permission G, X eid %(x)s', {'x': eeetypeeid})] |
354 self.req.form = { |
368 req = self.request() |
355 'eid': `eeetypeeid`, |
369 req.form = { |
356 '__type:'+`eeetypeeid`: 'CWEType', |
370 'eid': `eeetypeeid`, |
357 'name:'+`eeetypeeid`: u'CWGroup', |
371 '__type:'+`eeetypeeid`: 'CWEType', |
358 'final:'+`eeetypeeid`: False, |
372 'name:'+`eeetypeeid`: u'CWGroup', |
359 'meta:'+`eeetypeeid`: True, |
373 'final:'+`eeetypeeid`: False, |
360 'description:'+`eeetypeeid`: u'users group', |
374 'meta:'+`eeetypeeid`: True, |
361 'read_permission:'+`eeetypeeid`: groups, |
375 'description:'+`eeetypeeid`: u'users group', |
362 # |
376 'read_permission:'+`eeetypeeid`: groups, |
363 'edits-name:'+`eeetypeeid`: u'CWGroup', |
377 # |
364 'edits-final:'+`eeetypeeid`: False, |
378 'edits-name:'+`eeetypeeid`: u'CWGroup', |
365 'edits-meta:'+`eeetypeeid`: True, |
379 'edits-final:'+`eeetypeeid`: False, |
366 'edits-description:'+`eeetypeeid`: u'users group', |
380 'edits-meta:'+`eeetypeeid`: True, |
367 'edits-read_permission:'+`eeetypeeid`: basegroups, |
381 'edits-description:'+`eeetypeeid`: u'users group', |
368 } |
382 'edits-read_permission:'+`eeetypeeid`: basegroups, |
|
383 } |
369 try: |
384 try: |
370 path, params = self.expect_redirect_publish() |
385 path, params = self.expect_redirect_publish(req) |
371 e = self.execute('Any X WHERE X eid %(x)s', {'x': eeetypeeid}, 'x').get_entity(0, 0) |
386 e = self.execute('Any X WHERE X eid %(x)s', {'x': eeetypeeid}, 'x').get_entity(0, 0) |
372 self.assertEquals(e.name, 'CWGroup') |
387 self.assertEquals(e.name, 'CWGroup') |
373 self.assertEquals([g.eid for g in e.read_permission], groupeids) |
388 self.assertEquals([g.eid for g in e.read_permission], groupeids) |
374 finally: |
389 finally: |
375 # restore |
390 # restore |
411 def test_nonregr_strange_text_input(self): |
427 def test_nonregr_strange_text_input(self): |
412 """non-regression test checking text input containing "13:03:43" |
428 """non-regression test checking text input containing "13:03:43" |
413 |
429 |
414 this seems to be postgres (tsearch?) specific |
430 this seems to be postgres (tsearch?) specific |
415 """ |
431 """ |
416 self.req.form = { |
432 req = self.request() |
417 'eid': 'A', '__type:A': 'BlogEntry', |
433 req.form = { |
418 '__maineid' : 'A', |
434 'eid': 'A', '__type:A': 'BlogEntry', |
419 'title:A': u'"13:03:40"', 'edits-title:A': '', |
435 '__maineid' : 'A', |
420 'content:A': u'"13:03:43"', 'edits-content:A': ''} |
436 'title:A': u'"13:03:40"', 'edits-title:A': '', |
421 path, params = self.expect_redirect_publish() |
437 'content:A': u'"13:03:43"', 'edits-content:A': ''} |
|
438 path, params = self.expect_redirect_publish(req) |
422 self.failUnless(path.startswith('blogentry/')) |
439 self.failUnless(path.startswith('blogentry/')) |
423 eid = path.split('/')[1] |
440 eid = path.split('/')[1] |
424 e = self.execute('Any C, T WHERE C eid %(x)s, C content T', {'x': eid}, 'x').get_entity(0, 0) |
441 e = self.execute('Any C, T WHERE C eid %(x)s, C content T', {'x': eid}, 'x').get_entity(0, 0) |
425 self.assertEquals(e.title, '"13:03:40"') |
442 self.assertEquals(e.title, '"13:03:40"') |
426 self.assertEquals(e.content, '"13:03:43"') |
443 self.assertEquals(e.content, '"13:03:43"') |
427 |
444 |
428 |
445 |
429 def test_nonregr_multiple_empty_email_addr(self): |
446 def test_nonregr_multiple_empty_email_addr(self): |
430 gueid = self.execute('CWGroup G WHERE G name "users"')[0][0] |
447 gueid = self.execute('CWGroup G WHERE G name "users"')[0][0] |
431 self.req.form = {'eid': ['X', 'Y'], |
448 req = self.request() |
432 |
449 req.form = {'eid': ['X', 'Y'], |
433 '__type:X': 'CWUser', |
450 |
434 'login:X': u'adim', 'edits-login:X': u'', |
451 '__type:X': 'CWUser', |
435 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
452 'login:X': u'adim', 'edits-login:X': u'', |
436 'in_group:X': `gueid`, 'edits-in_group:X': INTERNAL_FIELD_VALUE, |
453 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
437 |
454 'in_group:X': `gueid`, 'edits-in_group:X': INTERNAL_FIELD_VALUE, |
438 '__type:Y': 'EmailAddress', |
455 |
439 'address:Y': u'', 'edits-address:Y': '', |
456 '__type:Y': 'EmailAddress', |
440 'alias:Y': u'', 'edits-alias:Y': '', |
457 'address:Y': u'', 'edits-address:Y': '', |
441 'use_email:X': 'Y', 'edits-use_email:X': INTERNAL_FIELD_VALUE, |
458 'alias:Y': u'', 'edits-alias:Y': '', |
442 } |
459 'use_email:X': 'Y', 'edits-use_email:X': INTERNAL_FIELD_VALUE, |
443 self.assertRaises(ValidationError, self.publish, self.req) |
460 } |
|
461 self.assertRaises(ValidationError, self.publish, req) |
444 |
462 |
445 def test_nonregr_copy(self): |
463 def test_nonregr_copy(self): |
446 user = self.user() |
464 user = self.user() |
447 self.req.form = {'__cloned_eid:X': user.eid, |
465 req = self.request() |
448 'eid': 'X', '__type:X': 'CWUser', |
466 req.form = {'__cloned_eid:X': user.eid, |
449 '__maineid' : 'X', |
467 'eid': 'X', '__type:X': 'CWUser', |
450 'login:X': u'toto', 'edits-login:X': u'', |
468 '__maineid' : 'X', |
451 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
469 'login:X': u'toto', 'edits-login:X': u'', |
452 } |
470 'upassword:X': u'toto', 'upassword-confirm:X': u'toto', 'edits-upassword:X': u'', |
453 path, params = self.expect_redirect_publish() |
471 } |
|
472 path, params = self.expect_redirect_publish(req) |
454 self.assertEquals(path, 'cwuser/toto') |
473 self.assertEquals(path, 'cwuser/toto') |
455 e = self.execute('Any X WHERE X is CWUser, X login "toto"').get_entity(0, 0) |
474 e = self.execute('Any X WHERE X is CWUser, X login "toto"').get_entity(0, 0) |
456 self.assertEquals(e.login, 'toto') |
475 self.assertEquals(e.login, 'toto') |
457 self.assertEquals(e.in_group[0].name, 'managers') |
476 self.assertEquals(e.in_group[0].name, 'managers') |
458 |
477 |
464 p.__class__.skip_copy_for = () |
483 p.__class__.skip_copy_for = () |
465 try: |
484 try: |
466 e = self.add_entity('EmailAddress', address=u'doe@doe.com') |
485 e = self.add_entity('EmailAddress', address=u'doe@doe.com') |
467 self.execute('SET P use_email E, P primary_email E WHERE P eid %(p)s, E eid %(e)s', |
486 self.execute('SET P use_email E, P primary_email E WHERE P eid %(p)s, E eid %(e)s', |
468 {'p' : p.eid, 'e' : e.eid}) |
487 {'p' : p.eid, 'e' : e.eid}) |
469 self.req.form = {'__cloned_eid:X': p.eid, |
488 req = self.request() |
470 'eid': 'X', '__type:X': 'CWUser', |
489 req.form = {'__cloned_eid:X': p.eid, |
471 'login': u'dodo', 'edits-login': u'dodo', |
490 'eid': 'X', '__type:X': 'CWUser', |
472 'surname:X': u'Boom', 'edits-surname:X': u'', |
491 'login': u'dodo', 'edits-login': u'dodo', |
473 '__errorurl' : "whatever but required", |
492 'surname:X': u'Boom', 'edits-surname:X': u'', |
|
493 '__errorurl' : "whatever but required", |
474 } |
494 } |
475 # try to emulate what really happens in the web application |
495 # try to emulate what really happens in the web application |
476 # 1/ validate form => EditController.publish raises a ValidationError |
496 # 1/ validate form => EditController.publish raises a ValidationError |
477 # which fires a Redirect |
497 # which fires a Redirect |
478 # 2/ When re-publishing the copy form, the publisher implicitly commits |
498 # 2/ When re-publishing the copy form, the publisher implicitly commits |
479 try: |
499 try: |
480 self.env.app.publish('edit', self.req) |
500 self.app.publish('edit', req) |
481 except Redirect: |
501 except Redirect: |
482 self.req.form['rql'] = 'Any X WHERE X eid %s' % p.eid |
502 req.form['rql'] = 'Any X WHERE X eid %s' % p.eid |
483 self.req.form['vid'] = 'copy' |
503 req.form['vid'] = 'copy' |
484 self.env.app.publish('view', self.req) |
504 self.app.publish('view', req) |
485 rset = self.execute('CWUser P WHERE P surname "Boom"') |
505 rset = self.execute('CWUser P WHERE P surname "Boom"') |
486 self.assertEquals(len(rset), 0) |
506 self.assertEquals(len(rset), 0) |
487 finally: |
507 finally: |
488 p.__class__.skip_copy_for = old_skips |
508 p.__class__.skip_copy_for = old_skips |
489 |
509 |
490 |
510 |
491 class EmbedControllerTC(EnvBasedTC): |
511 class EmbedControllerTC(CubicWebTC): |
492 |
512 |
493 def test_nonregr_embed_publish(self): |
513 def test_nonregr_embed_publish(self): |
494 # This test looks a bit stupid but at least it will probably |
514 # This test looks a bit stupid but at least it will probably |
495 # fail if the controller API changes and if EmbedController is not |
515 # fail if the controller API changes and if EmbedController is not |
496 # updated (which is what happened before this test) |
516 # updated (which is what happened before this test) |