[IMP] base ir.qweb: add and update tests for the new ir.qweb

This commit is contained in:
Christophe Matthieu
2016-06-14 09:46:25 +02:00
parent 7ede9bcb2d
commit 956bb2b6e9
9 changed files with 139 additions and 66 deletions
@@ -1,4 +1,14 @@
<templates>
<t t-name="static">
<div foo="a" bar="b" baz="c"/>
</t>
<result id="static"><![CDATA[<div foo="a" bar="b" baz="c"></div>]]></result>
<t t-name="static-void">
<img src="/test.jpg"/>
</t>
<result id="static-void"><![CDATA[<img src="/test.jpg"/>]]></result>
<t t-name="fixed-literal">
<div t-att-foo="'bar'"/>
</t>
@@ -55,4 +65,19 @@
<result id="format-multiple"><![CDATA[
<div foo="a 0 is 1 of 2 ]"></div>
]]></result>
<t t-name="various-escapes">
<div foo="&lt;foo"
t-att-bar="bar"
t-attf-baz="&lt;{{baz}}&gt;"
t-att="qux"/>
</t>
<params id="various-escapes"><![CDATA[{
"bar": "<bar>",
"baz": "\"<baz>\"",
"qux": {"qux": "<>"}
}]]></params>
<result id="various-escapes"><![CDATA[
<div foo="&lt;foo" bar="&lt;bar&gt;" baz="&lt;&quot;&lt;baz&gt;&quot;&gt;" qux="&lt;&gt;"></div>
]]></result>
</templates>
@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<templates>
<t t-name="_callee-asc"><Año t-att-falló="'agüero'" t-raw="0"/></t>
<t t-name="_callee-uses-foo"><span t-esc="foo">foo default</span></t>
<t t-name="_callee-asc-toto"><div t-raw="toto">toto default</div></t>
<t t-name="caller">
<t t-foreach="[4,5,6]" t-as="value">
<span t-esc="value"/>
<t t-call="_callee-asc">
<t t-call="_callee-uses-foo">
<t t-set="foo" t-value="'aaa'"/>
</t>
<t t-call="_callee-uses-foo"/>
<t t-set="foo" t-value="'bbb'"/>
<t t-call="_callee-uses-foo"/>
</t>
</t>
<t t-call="_callee-asc-toto"/>
<t t-set="toto"><t t-set="truc" t-value="'bbb'"/><i t-att-notruc="not truc" t-att-truc="bool(truc)">i</i></t>
<t t-call="_callee-asc-toto"/>
</t>
<result id="caller"><![CDATA[
<span>4</span>
<Año falló="agüero">
<span>aaa</span>
<span>foo default</span>
<span>bbb</span>
</Año>
<span>5</span>
<Año falló="agüero">
<span>aaa</span>
<span>foo default</span>
<span>bbb</span>
</Año>
<span>6</span>
<Año falló="agüero">
<span>aaa</span>
<span>foo default</span>
<span>bbb</span>
</Año>
<div>toto default</div>
<div><i truc="True">i</i></div>
]]></result>
</templates>
@@ -16,6 +16,10 @@
</t>
<params id="esc-toescape"><![CDATA[{"var": "<ok>"}]]></params>
<result id="esc-toescape"><![CDATA[&lt;ok&gt;]]></result>
<t t-name="esc-node">
<span t-esc="'ok'"/>
</t>
<result id="esc-node"><![CDATA[<span>ok</span>]]></result>
<!-- raw, evaluates and returns @t-raw directly (no escaping) -->
@@ -59,6 +59,7 @@
test("Template calling (to the faraway pages)",
'qweb-test-call.xml');
test("Foreach", 'qweb-test-foreach.xml');
test("Global", 'qweb-test-global.xml');
test('Template inheritance', 'qweb-test-extend.xml');
});
+11 -8
View File
@@ -125,15 +125,17 @@ class TestConvertBack(common.TransactionCase):
model = 'web_editor.converter.test'
record = self.env[model].create({field: value})
t = etree.Element('t')
e = etree.Element('span')
t.append(e)
field_value = 'record.%s' % field
e.set('t-field', field_value)
qwebcontext = self.qwebcontext({'record': record})
rendered = self.env['ir.qweb'].render_tag_field(e, {'field': field_value}, '', qwebcontext)
element = html.fromstring(rendered, parser=html.HTMLParser(encoding='utf-8'))
rendered = self.env['ir.qweb'].compile(t)(qwebcontext)
converter = self.env['ir.qweb'].get_converter_for(element.get('data-oe-type'))
element = html.fromstring(rendered, parser=html.HTMLParser(encoding='utf-8'))
converter = self.env['ir.qweb'].get_field_for(element.get('data-oe-type'))
value_back = converter.from_html(model, record._fields[field], element)
if isinstance(expected, str):
@@ -188,27 +190,28 @@ class TestConvertBack(common.TransactionCase):
""" the M2O field conversion (from html) is markedly different from
others as it directly writes into the m2o and returns nothing at all.
"""
model = 'web_editor.converter.test'
field = 'many2one'
subrec1 = self.env['web_editor.converter.test.sub'].create({'name': "Foo"})
subrec2 = self.env['web_editor.converter.test.sub'].create({'name': "Bar"})
record = self.env[model].create({field: subrec1.id})
record = self.env['web_editor.converter.test'].create({field: subrec1.id})
t = etree.Element('t')
e = etree.Element('span')
t.append(e)
field_value = 'record.%s' % field
e.set('t-field', field_value)
qwebcontext = self.qwebcontext({'record': record})
rendered = self.env['ir.qweb'].render_tag_field(e, {'field': field_value}, '', qwebcontext)
rendered = self.env['ir.qweb'].compile(t)(qwebcontext)
element = html.fromstring(rendered, parser=html.HTMLParser(encoding='utf-8'))
# emulate edition
element.set('data-oe-many2one-id', str(subrec2.id))
element.text = "New content"
converter = self.env['ir.qweb'].get_converter_for(element.get('data-oe-type'))
value_back = converter.from_html(model, record._fields[field], element)
converter = self.env['ir.qweb'].get_field_for(element.get('data-oe-type'))
value_back = converter.from_html('web_editor.converter.test', record._fields[field], element)
self.assertIsNone(
value_back, "the m2o converter should return None to avoid spurious"
+1 -2
View File
@@ -113,10 +113,9 @@ class TestQWeb(TransactionCase):
self.assertEqual(
qweb.render(template, qwebcontext=ctx).strip().encode('utf-8'),
(result or u'').strip().encode('utf-8'),
template,
template
)
def load_tests(loader, suite, _):
# can't override TestQWeb.__dir__ because dir() called on *class* not
# instance
@@ -4,7 +4,7 @@
from openerp import api
from openerp.tests import HttpCase
from openerp.tests.common import TransactionCase
from openerp.addons.base.ir.ir_qweb import AssetsBundle, QWebContext
from openerp.addons.base.ir.ir_qweb import QWebContext
from openerp.modules.module import get_resource_path
from collections import Counter
@@ -19,7 +19,7 @@ class TestJavascriptAssetsBundle(TransactionCase):
self.cssbundle_xmlid = 'test_assetsbundle.bundle2'
def _get_asset(self, xmlid, env=None):
return self.en['ir.qweb']._get_asset(xmlid, QWebContext(env or self.env, {}))
return self.env['ir.qweb']._get_asset(xmlid, QWebContext(env or self.env, {}))
def _any_ira_for_bundle(self, type):
""" Returns all ir.attachments associated to a bundle, regardless of the verion.
@@ -98,7 +98,8 @@ class TestJavascriptAssetsBundle(TransactionCase):
"""
bundle0 = self._get_asset(self.jsbundle_xmlid)
bundle0.js()
html0 = bundle0.html
files0 = bundle0.files
remains0 = bundle0.remains
version0 = bundle0.version
self.assertEquals(len(self._any_ira_for_bundle('js')), 1)
@@ -120,10 +121,12 @@ class TestJavascriptAssetsBundle(TransactionCase):
bundle1 = self._get_asset(self.jsbundle_xmlid, env=self.env(context={'check_view_ids': [newid]}))
bundle1.js()
html1 = bundle1.html
files1 = bundle1.files
remains1 = bundle1.remains
version1 = bundle1.version
self.assertNotEquals(html0, html1)
self.assertNotEquals(files0, files1)
self.assertEquals(remains0, remains1)
self.assertNotEquals(version0, version1)
# check if the previous attachment are correctly cleaned
@@ -228,7 +231,8 @@ class TestJavascriptAssetsBundle(TransactionCase):
"""
bundle0 = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'max_css_rules': 1}))
bundle0.css()
html0 = bundle0.html
files0 = bundle0.files
remains0 = bundle0.remains
version0 = bundle0.version
self.assertEquals(len(self._any_ira_for_bundle('css')), 3)
@@ -250,10 +254,12 @@ class TestJavascriptAssetsBundle(TransactionCase):
bundle1 = self._get_asset(self.cssbundle_xmlid, env=self.env(context={'check_view_ids': [newid], 'max_css_rules': 1}))
bundle1.css()
html1 = bundle1.html
files1 = bundle1.files
remains1 = bundle1.remains
version1 = bundle1.version
self.assertNotEquals(html0, html1)
self.assertNotEquals(files0, files1)
self.assertEquals(remains0, remains1)
self.assertNotEquals(version0, version1)
# check if the previous attachment are correctly cleaned
@@ -342,7 +348,8 @@ class TestAssetsBundleWithIRAMock(TransactionCase):
def _bundle(self, should_create, should_unlink):
self.counter.clear()
self.en['ir.qweb']._get_asset(self.lessbundle_xmlid, QWebContext(self.env, {})).to_html(debug='assets')
qw = QWebContext(self.env, {})
self.env['ir.qweb']._get_asset(self.lessbundle_xmlid, qw).to_html(debug='assets')
self.assertEquals(self.counter['create'], int(should_create))
self.assertEquals(self.counter['unlink'], int(should_unlink))
+1 -1
View File
@@ -17,7 +17,7 @@ class test_model(orm.Model):
(1, "réponse A"),
(2, "réponse B"),
(3, "réponse C"),
(4, "réponse D"),
(4, "réponse <D>"),
]),
'selection_str': fields.selection([
('A', "Qu'il n'est pas arrivé à Toronto"),
@@ -1,10 +1,7 @@
# -*- encoding: utf-8 -*-
import json
import os
import datetime
from lxml import etree
from openerp.tests import common
from openerp.tools import html_escape as e
from openerp.addons.base.ir.ir_qweb import QWebContext
@@ -34,8 +31,8 @@ class TestExport(common.TransactionCase):
break
except KeyError: pass
return lambda value, options=None, context=None: e(model.value_to_html(
self.cr, self.uid, value, field, options=options, context=context))
return lambda value, options=None, context=None: model.value_to_html(
self.cr, self.uid, value, field, options=options, context=context)
class TestBasicExport(TestExport):
_model = 'test_converter.test_model'
@@ -106,17 +103,10 @@ class TestCurrencyExport(TestExport):
converter = self.registry('ir.qweb.field.monetary')
options = {
'widget': 'monetary',
'display_currency': 'c2'
'display_currency': dest
}
context = dict(inherit_branding=True)
converted = converter.to_html(
self.cr, self.uid, 'value', obj, options,
etree.Element('span'),
{'field': 'obj.value', 'field-options': json.dumps(options)},
'', QWebContext(self.env, {'obj': obj, 'c2': dest, }),
context=context,
)
return converted
return converter.record_to_html(self.cr, self.uid, obj, 'value', options,
QWebContext(self.env(context=dict(inherit_branding=True)), {'obj': obj}))
def test_currency_post(self):
currency = self.create(self.Currency, name="Test", symbol=u"test")
@@ -125,15 +115,11 @@ class TestCurrencyExport(TestExport):
converted = self.convert(obj, dest=currency)
self.assertEqual(
converted,
'<span data-oe-model="{obj._model._name}" data-oe-id="{obj.id}" '
'data-oe-field="value" data-oe-type="monetary" '
'data-oe-expression="obj.value">'
'<span class="oe_currency_value">0.12</span>'
u'\N{NO-BREAK SPACE}{symbol}</span>'.format(
converted, '<span class="oe_currency_value">0.12</span>'
u'\N{NO-BREAK SPACE}{symbol}'.format(
obj=obj,
symbol=currency.symbol.encode('utf-8')
).encode('utf-8'),)
),)
def test_currency_pre(self):
currency = self.create(
@@ -144,15 +130,11 @@ class TestCurrencyExport(TestExport):
self.assertEqual(
converted,
'<span data-oe-model="{obj._model._name}" data-oe-id="{obj.id}" '
'data-oe-field="value" data-oe-type="monetary" '
'data-oe-expression="obj.value">'
u'{symbol}\N{NO-BREAK SPACE}'
'<span class="oe_currency_value">0.12</span>'
'</span>'.format(
'<span class="oe_currency_value">0.12</span>'.format(
obj=obj,
symbol=currency.symbol.encode('utf-8')
).encode('utf-8'),)
),)
def test_currency_precision(self):
""" Precision should be the currency's, not the float field's
@@ -164,14 +146,11 @@ class TestCurrencyExport(TestExport):
self.assertEqual(
converted,
'<span data-oe-model="{obj._model._name}" data-oe-id="{obj.id}" '
'data-oe-field="value" data-oe-type="monetary" '
'data-oe-expression="obj.value">'
'<span class="oe_currency_value">0.12</span>'
u'\N{NO-BREAK SPACE}{symbol}</span>'.format(
u'\N{NO-BREAK SPACE}{symbol}'.format(
obj=obj,
symbol=currency.symbol.encode('utf-8')
).encode('utf-8'),)
),)
class TestTextExport(TestBasicExport):
def test_text(self):
@@ -221,8 +200,9 @@ class TestMany2OneExport(TestBasicExport):
})
def converter(record):
model = self.registry('ir.qweb.field.many2one')
return e(model.record_to_html(self.cr, self.uid, 'many2one', record))
converter = self.registry('ir.qweb.field.many2one')
field_name = 'many2one'
return converter.record_to_html(self.cr, self.uid, record, field_name, {})
value = converter(self.Model.browse(self.cr, self.uid, id0))
self.assertEqual(value, "Foo")
@@ -239,8 +219,8 @@ class TestBinaryExport(TestBasicExport):
content = f.read()
encoded_content = content.encode('base64')
value = e(converter.value_to_html(
self.cr, self.uid, encoded_content, field))
value = converter.value_to_html(self.cr, self.uid, encoded_content, field)
self.assertEqual(
value, '<img src="data:image/jpeg;base64,%s">' % (
encoded_content
@@ -250,32 +230,32 @@ class TestBinaryExport(TestBasicExport):
content = f.read()
with self.assertRaises(ValueError):
e(converter.value_to_html(
self.cr, self.uid, 'binary', content.encode('base64'), field))
converter.value_to_html(
self.cr, self.uid, 'binary', content.encode('base64'), field)
with open(os.path.join(directory, 'test_vectors', 'pptx'), 'rb') as f:
content = f.read()
with self.assertRaises(ValueError):
e(converter.value_to_html(
self.cr, self.uid, 'binary', content.encode('base64'), field))
converter.value_to_html(
self.cr, self.uid, 'binary', content.encode('base64'), field)
class TestSelectionExport(TestBasicExport):
def test_selection(self):
[record] = self.Model.browse(self.cr, self.uid, [self.Model.create(self.cr, self.uid, {
'selection': 2,
'selection': 4,
'selection_str': 'C',
})])
converter = self.registry('ir.qweb.field.selection')
field_name = 'selection'
value = converter.record_to_html(self.cr, self.uid, field_name, record)
self.assertEqual(value, "réponse B")
value = converter.record_to_html(self.cr, self.uid, record, field_name, {})
self.assertEqual(value, e(u"réponse <D>"))
field_name = 'selection_str'
value = converter.record_to_html(self.cr, self.uid, field_name, record)
self.assertEqual(value, "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?")
value = converter.record_to_html(self.cr, self.uid, record, field_name, {})
self.assertEqual(value, u"Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?")
class TestHTMLExport(TestBasicExport):
def test_html(self):