1 # -*- coding: utf-8 -*-
5 from lxml import etree, html
6 from lxml.builder import E
8 from openerp.tests import common
9 from openerp.addons.base.ir import ir_qweb
10 from openerp.addons.website.models.ir_qweb import html_to_text
11 from openerp.addons.website.models.website import slugify, unslug
13 class TestUnslug(unittest2.TestCase):
14 def test_unslug(self):
21 'foo-bar-1': ('foo-bar', 1),
22 'foo--1': ('foo', -1),
26 'foo---1': (None, None),
30 for slug, expected in tests.iteritems():
31 self.assertEqual(unslug(slug), expected)
34 class TestHTMLToText(unittest2.TestCase):
35 def test_rawstring(self):
38 html_to_text(E.div("foobar")))
43 html_to_text(E.div("foo", E.br(), "bar")))
48 "foo", E.br(), E.br(),
62 html_to_text(E.div(E.p("foo"))))
66 html_to_text(E.div("foo", E.p("bar"))))
69 html_to_text(E.div(E.p("foo"), "bar")))
90 html_to_text(E.div(E.div("foo"))))
94 html_to_text(E.div("foo", E.div("bar"))))
97 html_to_text(E.div(E.div("foo"), "bar")))
107 def test_other_block(self):
116 def test_inline(self):
119 html_to_text(E.div("foo", E.span("bar"), "baz")))
121 def test_whitespace(self):
133 E.div(E.span("foo"), " bar"),
136 class TestConvertBack(common.TransactionCase):
138 super(TestConvertBack, self).setUp()
140 def field_rountrip_result(self, field, value, expected):
141 model = 'website.converter.test'
142 Model = self.registry(model)
147 [record] = Model.browse(self.cr, self.uid, [id])
149 e = etree.Element('span')
150 field_value = 'record.%s' % field
151 e.set('t-field', field_value)
153 rendered = self.registry('website.qweb').render_tag_field(
154 e, {'field': field_value}, '', ir_qweb.QWebContext(self.cr, self.uid, {
156 }, context={'inherit_branding': True}))
157 element = html.fromstring(
158 rendered, parser=html.HTMLParser(encoding='utf-8'))
160 converter = self.registry('website.qweb').get_converter_for(
161 element.get('data-oe-type'))
163 value_back = converter.from_html(
164 self.cr, self.uid, model, Model._fields[field], element)
166 if isinstance(expected, str):
167 expected = expected.decode('utf-8')
168 self.assertEqual(value_back, expected)
170 def field_roundtrip(self, field, value):
171 self.field_rountrip_result(field, value, value)
173 def test_integer(self):
174 self.field_roundtrip('integer', 42)
176 def test_float(self):
177 self.field_roundtrip('float', 42.567890)
178 self.field_roundtrip('float', 324542.567890)
180 def test_numeric(self):
181 self.field_roundtrip('numeric', 42.77)
184 self.field_roundtrip('char', "foo bar")
186 self.field_roundtrip('char', "ⒸⓄⓇⒼⒺ")
188 def test_selection(self):
189 self.field_roundtrip('selection', 3)
191 def test_selection_str(self):
192 self.field_roundtrip('selection_str', 'B')
195 self.field_roundtrip('text', textwrap.dedent("""\
196 You must obey the dance commander
197 Givin' out the order for fun
198 You must obey the dance commander
199 You know that he's the only one
200 Who gives the orders here,
202 Who gives the orders here,
207 It would be awesome, yeah
208 Let's take the chance-a
209 It would be awesome, yeah
211 Because you never know
213 You never know until you go"""))
216 """ the M2O field conversion (from html) is markedly different from
217 others as it directly writes into the m2o and returns nothing at all.
219 model = 'website.converter.test'
222 Sub = self.registry('website.converter.test.sub')
223 sub_id = Sub.create(self.cr, self.uid, {'name': "Foo"})
225 Model = self.registry(model)
226 id = Model.create(self.cr, self.uid, {field: sub_id})
227 [record] = Model.browse(self.cr, self.uid, [id])
229 e = etree.Element('span')
230 field_value = 'record.%s' % field
231 e.set('t-field', field_value)
233 rendered = self.registry('website.qweb').render_tag_field(
234 e, {'field': field_value}, '', ir_qweb.QWebContext(self.cr, self.uid, {
236 }, context={'inherit_branding': True}))
238 element = html.fromstring(rendered, parser=html.HTMLParser(encoding='utf-8'))
240 element.text = "New content"
242 converter = self.registry('website.qweb').get_converter_for(
243 element.get('data-oe-type'))
245 value_back = converter.from_html(
246 self.cr, self.uid, model, Model._fields[field], element)
249 value_back, "the m2o converter should return None to avoid spurious"
250 " or useless writes on the parent record")
253 Sub.browse(self.cr, self.uid, sub_id).name,
255 "element edition should have been written directly to the m2o record"
258 class TestTitleToSlug(unittest2.TestCase):
260 Those tests should pass with or without python-slugify
261 See website/models/website.py slugify method
263 def test_spaces(self):
269 def test_unicode(self):
272 slugify(u"hétérogénéité")
275 def test_underscore(self):
284 slugify(u"CamelCase")
287 def test_special_chars(self):
290 slugify(u"o!#d{|\o/@~o&%^?")
293 def test_str_to_unicode(self):
299 def test_numbers(self):
302 slugify(u"Article 1")
307 "do-you-know-martine-a-la-plage",
308 slugify(u"Do YOU know 'Martine à la plage' ?")