odoo/openerp/tests/test_views.py

194 lines
6.2 KiB
Python
Raw Normal View History

from lxml import etree as ET
from lxml.builder import E
from . import common
Field = E.field
class TestNodeLocator(common.BaseCase):
"""
The node locator returns None when it can not find a node, and the first
match when it finds something (no jquery-style node sets)
"""
def setUp(self):
super(TestNodeLocator, self).setUp()
self.Views = self.registry('ir.ui.view')
def test_no_match_xpath(self):
"""
xpath simply uses the provided @expr pattern to find a node
"""
node = self.Views.locate_node(
E.root(E.foo(), E.bar(), E.baz()),
E.xpath(expr="//qux"))
self.assertIsNone(node)
def test_match_xpath(self):
bar = E.bar()
node = self.Views.locate_node(
E.root(E.foo(), bar, E.baz()),
E.xpath(expr="//bar"))
self.assertIs(node, bar)
def test_no_match_field(self):
"""
A field spec will match by @name against all fields of the view
"""
node = self.Views.locate_node(
E.root(E.foo(), E.bar(), E.baz()),
Field(name="qux"))
self.assertIsNone(node)
node = self.Views.locate_node(
E.root(Field(name="foo"), Field(name="bar"), Field(name="baz")),
Field(name="qux"))
self.assertIsNone(node)
def test_match_field(self):
bar = Field(name="bar")
node = self.Views.locate_node(
E.root(Field(name="foo"), bar, Field(name="baz")),
Field(name="bar"))
self.assertIs(node, bar)
def test_no_match_other(self):
"""
Non-xpath non-fields are matched by node name first
"""
node = self.Views.locate_node(
E.root(E.foo(), E.bar(), E.baz()),
E.qux())
self.assertIsNone(node)
def test_match_other(self):
bar = E.bar()
node = self.Views.locate_node(
E.root(E.foo(), bar, E.baz()),
E.bar())
self.assertIs(bar, node)
def test_attribute_mismatch(self):
"""
Non-xpath non-field are filtered by matching attributes on spec and
matched nodes
"""
node = self.Views.locate_node(
E.root(E.foo(attr='1'), E.bar(attr='2'), E.baz(attr='3')),
E.bar(attr='5'))
self.assertIsNone(node)
def test_attribute_filter(self):
match = E.bar(attr='2')
node = self.Views.locate_node(
E.root(E.bar(attr='1'), match, E.root(E.bar(attr='3'))),
E.bar(attr='2'))
self.assertIs(node, match)
def test_version_mismatch(self):
"""
A @version on the spec will be matched against the view's version
"""
node = self.Views.locate_node(
E.root(E.foo(attr='1'), version='4'),
E.foo(attr='1', version='3'))
self.assertIsNone(node)
class TestViewInheritance(common.TransactionCase):
def view_for(self, name):
return ET.tostring(ET.Element('form', string=name))
def makeView(self, name, parent=None):
view_id = self.View.create(self.cr, self.uid, {
'model': self.model,
'name': name,
'arch': self.view_for(name),
'inherit_id': parent,
})
self.ids[name] = view_id
return view_id
def setUp(self):
super(TestViewInheritance, self).setUp()
self.model = 'dummy'
self.View = self.registry('ir.ui.view')
self._init = self.View.pool._init
self.View.pool._init = False
self.ids = {}
a = self.makeView("A")
a1 = self.makeView("A1", a)
a11 = self.makeView("A11", a1)
self.makeView("A111", a11)
self.makeView("A12", a1)
a2 = self.makeView("A2", a)
self.makeView("A21", a2)
a22 = self.makeView("A22", a2)
self.makeView("A221", a22)
def tearDown(self):
self.View.pool._init = self._init
super(TestViewInheritance, self).tearDown()
def test_get_children(self):
self.assertEqual(self.View.get_inheriting_views_arch(
self.cr, self.uid, self.ids['A'], self.model), [
(self.view_for('A1'), self.ids['A1']),
(self.view_for('A2'), self.ids['A2']),
])
self.assertEqual(self.View.get_inheriting_views_arch(
self.cr, self.uid, self.ids['A21'], self.model),
[])
self.assertEqual(self.View.get_inheriting_views_arch(
self.cr, self.uid, self.ids['A11'], self.model),
[(self.view_for('A111'), self.ids['A111'])])
def test_iterate_descendents(self):
descendents = list(self.View.iter(self.cr, self.uid, self.ids['A1'], self.model))
self.assertEqual(descendents, [
(self.ids[name], self.view_for(name))
for name in ['A1', 'A11', 'A111', 'A12']
])
descendents = list(self.View.iter(
self.cr, self.uid, self.ids['A2'], self.model, exclude_base=True))
self.assertEqual(descendents, [
(self.ids[name], self.view_for(name))
for name in ['A21', 'A22', 'A221']
])
def test_find_root(self):
A_id = self.ids['A']
root_id = self.View.get_root_ancestor(self.cr, self.uid, view_id=A_id)
self.assertEqual(root_id, A_id,
"when given a root view, operation should be id")
root_id = self.View.get_root_ancestor(
self.cr, self.uid, view_id=self.ids['A11'])
self.assertEqual(root_id, A_id)
root_id = self.View.get_root_ancestor(
self.cr, self.uid, view_id=self.ids['A221'])
self.assertEqual(root_id, A_id)
# search by model
root_id = self.View.get_root_ancestor(
self.cr, self.uid, model=self.model, view_type='form')
self.assertEqual(root_id, A_id)
def test_no_root(self):
root = self.View.get_root_ancestor(
self.cr, self.uid, model='does.not.exist', view_type='form')
self.assertFalse(root)
root = self.View.get_root_ancestor(
self.cr, self.uid, model=self.model, view_type='tree')
self.assertFalse(root)
root = self.View.get_root_ancestor(
self.cr, self.uid, view_id=12345678)
self.assertFalse(root)