317 # should be default groups but owners, i.e. managers, users, guests |
317 # should be default groups but owners, i.e. managers, users, guests |
318 self.assertEqual(len(unrelated), 3) |
318 self.assertEqual(len(unrelated), 3) |
319 |
319 |
320 def test_printable_value_string(self): |
320 def test_printable_value_string(self): |
321 e = self.request().create_entity('Card', title=u'rest test', content=u'du :eid:`1:*ReST*`', |
321 e = self.request().create_entity('Card', title=u'rest test', content=u'du :eid:`1:*ReST*`', |
322 content_format=u'text/rest') |
322 content_format=u'text/rest') |
323 self.assertEqual(e.printable_value('content'), |
323 self.assertEqual(e.printable_value('content'), |
324 '<p>du <a class="reference" href="http://testing.fr/cubicweb/cwgroup/guests">*ReST*</a></p>\n') |
324 '<p>du <a class="reference" href="http://testing.fr/cubicweb/cwsource/system">*ReST*</a></p>\n') |
325 e['content'] = 'du <em>html</em> <ref rql="CWUser X">users</ref>' |
325 e.cw_attr_cache['content'] = 'du <em>html</em> <ref rql="CWUser X">users</ref>' |
326 e['content_format'] = 'text/html' |
326 e.cw_attr_cache['content_format'] = 'text/html' |
327 self.assertEqual(e.printable_value('content'), |
327 self.assertEqual(e.printable_value('content'), |
328 'du <em>html</em> <a href="http://testing.fr/cubicweb/view?rql=CWUser%20X">users</a>') |
328 'du <em>html</em> <a href="http://testing.fr/cubicweb/view?rql=CWUser%20X">users</a>') |
329 e['content'] = 'du *texte*' |
329 e.cw_attr_cache['content'] = 'du *texte*' |
330 e['content_format'] = 'text/plain' |
330 e.cw_attr_cache['content_format'] = 'text/plain' |
331 self.assertEqual(e.printable_value('content'), |
331 self.assertEqual(e.printable_value('content'), |
332 '<p>\ndu *texte*<br/>\n</p>') |
332 '<p>\ndu *texte*<br/>\n</p>') |
333 e['title'] = 'zou' |
333 e.cw_attr_cache['title'] = 'zou' |
334 e['content'] = '''\ |
334 e.cw_attr_cache['content'] = '''\ |
335 a title |
335 a title |
336 ======= |
336 ======= |
337 du :eid:`1:*ReST*`''' |
337 du :eid:`1:*ReST*`''' |
338 e['content_format'] = 'text/rest' |
338 e.cw_attr_cache['content_format'] = 'text/rest' |
339 self.assertEqual(e.printable_value('content', format='text/plain'), |
339 self.assertEqual(e.printable_value('content', format='text/plain'), |
340 e['content']) |
340 e.cw_attr_cache['content']) |
341 |
341 |
342 e['content'] = u'<b>yo (zou éà ;)</b>' |
342 e.cw_attr_cache['content'] = u'<b>yo (zou éà ;)</b>' |
343 e['content_format'] = 'text/html' |
343 e.cw_attr_cache['content_format'] = 'text/html' |
344 self.assertEqual(e.printable_value('content', format='text/plain').strip(), |
344 self.assertEqual(e.printable_value('content', format='text/plain').strip(), |
345 u'**yo (zou éà ;)**') |
345 u'**yo (zou éà ;)**') |
346 if HAS_TAL: |
346 if HAS_TAL: |
347 e['content'] = '<h1 tal:content="self/title">titre</h1>' |
347 e.cw_attr_cache['content'] = '<h1 tal:content="self/title">titre</h1>' |
348 e['content_format'] = 'text/cubicweb-page-template' |
348 e.cw_attr_cache['content_format'] = 'text/cubicweb-page-template' |
349 self.assertEqual(e.printable_value('content'), |
349 self.assertEqual(e.printable_value('content'), |
350 '<h1>zou</h1>') |
350 '<h1>zou</h1>') |
351 |
351 |
352 |
352 |
353 def test_printable_value_bytes(self): |
353 def test_printable_value_bytes(self): |
385 e = req.create_entity('Card', title=u'bad html', content=u'<div>R&D<br>', |
385 e = req.create_entity('Card', title=u'bad html', content=u'<div>R&D<br>', |
386 content_format=u'text/html') |
386 content_format=u'text/html') |
387 tidy = lambda x: x.replace('\n', '') |
387 tidy = lambda x: x.replace('\n', '') |
388 self.assertEqual(tidy(e.printable_value('content')), |
388 self.assertEqual(tidy(e.printable_value('content')), |
389 '<div>R&D<br/></div>') |
389 '<div>R&D<br/></div>') |
390 e['content'] = u'yo !! R&D <div> pas fermé' |
390 e.cw_attr_cache['content'] = u'yo !! R&D <div> pas fermé' |
391 self.assertEqual(tidy(e.printable_value('content')), |
391 self.assertEqual(tidy(e.printable_value('content')), |
392 u'yo !! R&D <div> pas fermé</div>') |
392 u'yo !! R&D <div> pas fermé</div>') |
393 e['content'] = u'R&D' |
393 e.cw_attr_cache['content'] = u'R&D' |
394 self.assertEqual(tidy(e.printable_value('content')), u'R&D') |
394 self.assertEqual(tidy(e.printable_value('content')), u'R&D') |
395 e['content'] = u'R&D;' |
395 e.cw_attr_cache['content'] = u'R&D;' |
396 self.assertEqual(tidy(e.printable_value('content')), u'R&D;') |
396 self.assertEqual(tidy(e.printable_value('content')), u'R&D;') |
397 e['content'] = u'yo !! R&D <div> pas fermé' |
397 e.cw_attr_cache['content'] = u'yo !! R&D <div> pas fermé' |
398 self.assertEqual(tidy(e.printable_value('content')), |
398 self.assertEqual(tidy(e.printable_value('content')), |
399 u'yo !! R&D <div> pas fermé</div>') |
399 u'yo !! R&D <div> pas fermé</div>') |
400 e['content'] = u'été <div> été' |
400 e.cw_attr_cache['content'] = u'été <div> été' |
401 self.assertEqual(tidy(e.printable_value('content')), |
401 self.assertEqual(tidy(e.printable_value('content')), |
402 u'été <div> été</div>') |
402 u'été <div> été</div>') |
403 e['content'] = u'C'est un exemple sérieux' |
403 e.cw_attr_cache['content'] = u'C'est un exemple sérieux' |
404 self.assertEqual(tidy(e.printable_value('content')), |
404 self.assertEqual(tidy(e.printable_value('content')), |
405 u"C'est un exemple sérieux") |
405 u"C'est un exemple sérieux") |
406 # make sure valid xhtml is left untouched |
406 # make sure valid xhtml is left untouched |
407 e['content'] = u'<div>R&D<br/></div>' |
407 e.cw_attr_cache['content'] = u'<div>R&D<br/></div>' |
408 self.assertEqual(e.printable_value('content'), e['content']) |
408 self.assertEqual(e.printable_value('content'), e.cw_attr_cache['content']) |
409 e['content'] = u'<div>été</div>' |
409 e.cw_attr_cache['content'] = u'<div>été</div>' |
410 self.assertEqual(e.printable_value('content'), e['content']) |
410 self.assertEqual(e.printable_value('content'), e.cw_attr_cache['content']) |
411 e['content'] = u'été' |
411 e.cw_attr_cache['content'] = u'été' |
412 self.assertEqual(e.printable_value('content'), e['content']) |
412 self.assertEqual(e.printable_value('content'), e.cw_attr_cache['content']) |
413 e['content'] = u'hop\r\nhop\nhip\rmomo' |
413 e.cw_attr_cache['content'] = u'hop\r\nhop\nhip\rmomo' |
414 self.assertEqual(e.printable_value('content'), u'hop\nhop\nhip\nmomo') |
414 self.assertEqual(e.printable_value('content'), u'hop\nhop\nhip\nmomo') |
415 |
415 |
416 def test_printable_value_bad_html_ms(self): |
416 def test_printable_value_bad_html_ms(self): |
417 self.skipTest('fix soup2xhtml to handle this test') |
|
418 req = self.request() |
417 req = self.request() |
419 e = req.create_entity('Card', title=u'bad html', content=u'<div>R&D<br>', |
418 e = req.create_entity('Card', title=u'bad html', content=u'<div>R&D<br>', |
420 content_format=u'text/html') |
419 content_format=u'text/html') |
421 tidy = lambda x: x.replace('\n', '') |
420 tidy = lambda x: x.replace('\n', '') |
422 e['content'] = u'<div x:foo="bar">ms orifice produces weird html</div>' |
421 e.cw_attr_cache['content'] = u'<div x:foo="bar">ms orifice produces weird html</div>' |
423 self.assertEqual(tidy(e.printable_value('content')), |
422 # Caution! current implementation of soup2xhtml strips first div element |
424 u'<div>ms orifice produces weird html</div>') |
423 content = soup2xhtml(e.printable_value('content'), 'utf-8') |
425 import tidy as tidymod # apt-get install python-tidy |
424 self.assertMultiLineEqual(content, u'<div>ms orifice produces weird html</div>') |
426 tidy = lambda x: str(tidymod.parseString(x.encode('utf-8'), |
|
427 **{'drop_proprietary_attributes': True, |
|
428 'output_xhtml': True, |
|
429 'show_body_only' : True, |
|
430 'quote-nbsp' : False, |
|
431 'char_encoding' : 'utf8'})).decode('utf-8').strip() |
|
432 self.assertEqual(tidy(e.printable_value('content')), |
|
433 u'<div>ms orifice produces weird html</div>') |
|
434 |
|
435 |
425 |
436 def test_fulltextindex(self): |
426 def test_fulltextindex(self): |
437 e = self.vreg['etypes'].etype_class('File')(self.request()) |
427 e = self.vreg['etypes'].etype_class('File')(self.request()) |
438 e['description'] = 'du <em>html</em>' |
428 e.cw_attr_cache['description'] = 'du <em>html</em>' |
439 e['description_format'] = 'text/html' |
429 e.cw_attr_cache['description_format'] = 'text/html' |
440 e['data'] = Binary('some <em>data</em>') |
430 e.cw_attr_cache['data'] = Binary('some <em>data</em>') |
441 e['data_name'] = 'an html file' |
431 e.cw_attr_cache['data_name'] = 'an html file' |
442 e['data_format'] = 'text/html' |
432 e.cw_attr_cache['data_format'] = 'text/html' |
443 e['data_encoding'] = 'ascii' |
433 e.cw_attr_cache['data_encoding'] = 'ascii' |
444 e._cw.transaction_data = {} # XXX req should be a session |
434 e._cw.transaction_data = {} # XXX req should be a session |
445 self.assertEqual(e.cw_adapt_to('IFTIndexable').get_words(), |
435 self.assertEqual(e.cw_adapt_to('IFTIndexable').get_words(), |
446 {'C': [u'du', u'html', 'an', 'html', 'file', u'some', u'data']}) |
436 {'C': ['an', 'html', 'file', 'du', 'html', 'some', 'data']}) |
447 |
437 |
448 |
438 |
449 def test_nonregr_relation_cache(self): |
439 def test_nonregr_relation_cache(self): |
450 req = self.request() |
440 req = self.request() |
451 p1 = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien') |
441 p1 = req.create_entity('Personne', nom=u'di mascio', prenom=u'adrien') |
459 eid = session.execute( |
449 eid = session.execute( |
460 'INSERT TrInfo X: X comment "zou", X wf_info_for U, X from_state S1, X to_state S2 ' |
450 'INSERT TrInfo X: X comment "zou", X wf_info_for U, X from_state S1, X to_state S2 ' |
461 'WHERE U login "admin", S1 name "activated", S2 name "deactivated"')[0][0] |
451 'WHERE U login "admin", S1 name "activated", S2 name "deactivated"')[0][0] |
462 trinfo = self.execute('Any X WHERE X eid %(x)s', {'x': eid}).get_entity(0, 0) |
452 trinfo = self.execute('Any X WHERE X eid %(x)s', {'x': eid}).get_entity(0, 0) |
463 trinfo.complete() |
453 trinfo.complete() |
464 self.failUnless(isinstance(trinfo['creation_date'], datetime)) |
454 self.failUnless(isinstance(trinfo.cw_attr_cache['creation_date'], datetime)) |
465 self.failUnless(trinfo.cw_relation_cached('from_state', 'subject')) |
455 self.failUnless(trinfo.cw_relation_cached('from_state', 'subject')) |
466 self.failUnless(trinfo.cw_relation_cached('to_state', 'subject')) |
456 self.failUnless(trinfo.cw_relation_cached('to_state', 'subject')) |
467 self.failUnless(trinfo.cw_relation_cached('wf_info_for', 'subject')) |
457 self.failUnless(trinfo.cw_relation_cached('wf_info_for', 'subject')) |
468 self.assertEqual(trinfo.by_transition, ()) |
458 self.assertEqual(trinfo.by_transition, ()) |
469 |
459 |