195 lines
6.2 KiB
Python
195 lines
6.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2017 Camptocamp SA
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
|
|
|
from odoo.addons.component.core import (
|
|
AbstractComponent,
|
|
Component,
|
|
)
|
|
from .common import ComponentRegistryCase
|
|
|
|
|
|
class TestLookup(ComponentRegistryCase):
|
|
""" Test the ComponentRegistry
|
|
|
|
Tests in this testsuite mainly do:
|
|
|
|
* Create new Components (classes inheriting from
|
|
:class:`component.core.Component` or
|
|
:class:`component.core.AbstractComponent`
|
|
* Call :meth:`component.core.Component._build_component` on them
|
|
in order to build the 'final class' composed from all the ``_inherit``
|
|
and push it in the components registry (``self.comp_registry`` here)
|
|
* Use the lookup method of the components registry and check
|
|
that we get the correct result
|
|
|
|
"""
|
|
|
|
def test_lookup_collection(self):
|
|
""" Lookup components of a collection """
|
|
# we register 2 components in foobar and one in other
|
|
class Foo(Component):
|
|
_name = 'foo'
|
|
_collection = 'foobar'
|
|
|
|
class Bar(Component):
|
|
_name = 'bar'
|
|
_collection = 'foobar'
|
|
|
|
class Homer(Component):
|
|
_name = 'homer'
|
|
_collection = 'other'
|
|
|
|
self._build_components(Foo, Bar, Homer)
|
|
|
|
# we should no see the component in 'other'
|
|
components = self.comp_registry.lookup('foobar')
|
|
self.assertEqual(
|
|
['foo', 'bar'],
|
|
[c._name for c in components]
|
|
)
|
|
|
|
def test_lookup_usage(self):
|
|
""" Lookup components by usage """
|
|
class Foo(Component):
|
|
_name = 'foo'
|
|
_collection = 'foobar'
|
|
_usage = 'speaker'
|
|
|
|
class Bar(Component):
|
|
_name = 'bar'
|
|
_collection = 'foobar'
|
|
_usage = 'speaker'
|
|
|
|
class Baz(Component):
|
|
_name = 'baz'
|
|
_collection = 'foobar'
|
|
_usage = 'listener'
|
|
|
|
self._build_components(Foo, Bar, Baz)
|
|
|
|
components = self.comp_registry.lookup('foobar', usage='listener')
|
|
self.assertEqual('baz', components[0]._name)
|
|
|
|
components = self.comp_registry.lookup('foobar', usage='speaker')
|
|
self.assertEqual(
|
|
['foo', 'bar'],
|
|
[c._name for c in components]
|
|
)
|
|
|
|
def test_lookup_no_component(self):
|
|
""" No component """
|
|
# we just expect an empty list when no component match, the error
|
|
# handling is handled at an higher level
|
|
self.assertEqual(
|
|
[],
|
|
self.comp_registry.lookup('something', usage='something')
|
|
)
|
|
|
|
def test_get_by_name(self):
|
|
""" Get component by name """
|
|
class Foo(AbstractComponent):
|
|
_name = 'foo'
|
|
_collection = 'foobar'
|
|
|
|
self._build_components(Foo)
|
|
# this is just a dict access
|
|
self.assertEqual('foo', self.comp_registry['foo']._name)
|
|
|
|
def test_lookup_abstract(self):
|
|
""" Do not include abstract components in lookup """
|
|
class Foo(AbstractComponent):
|
|
_name = 'foo'
|
|
_collection = 'foobar'
|
|
_usage = 'speaker'
|
|
|
|
class Bar(Component):
|
|
_name = 'bar'
|
|
_inherit = 'foo'
|
|
|
|
self._build_components(Foo, Bar)
|
|
|
|
comp_registry = self.comp_registry
|
|
|
|
# we should never have 'foo' in the returned components
|
|
# as it is abstract
|
|
components = comp_registry.lookup('foobar', usage='speaker')
|
|
self.assertEqual('bar', components[0]._name)
|
|
|
|
components = comp_registry.lookup('foobar', usage='speaker')
|
|
self.assertEqual(
|
|
['bar'],
|
|
[c._name for c in components]
|
|
)
|
|
|
|
def test_lookup_model_name(self):
|
|
""" Lookup with model names """
|
|
class Foo(Component):
|
|
_name = 'foo'
|
|
_collection = 'foobar'
|
|
_usage = 'speaker'
|
|
# support list
|
|
_apply_on = ['res.partner']
|
|
|
|
class Bar(Component):
|
|
_name = 'bar'
|
|
_collection = 'foobar'
|
|
_usage = 'speaker'
|
|
# support string
|
|
_apply_on = 'res.users'
|
|
|
|
class Any(Component):
|
|
# can be used with any model as far as we look it up
|
|
# with its usage
|
|
_name = 'any'
|
|
_collection = 'foobar'
|
|
_usage = 'listener'
|
|
|
|
self._build_components(Foo, Bar, Any)
|
|
|
|
components = self.comp_registry.lookup('foobar',
|
|
usage='speaker',
|
|
model_name='res.partner')
|
|
self.assertEqual('foo', components[0]._name)
|
|
|
|
components = self.comp_registry.lookup('foobar',
|
|
usage='speaker',
|
|
model_name='res.users')
|
|
self.assertEqual('bar', components[0]._name)
|
|
|
|
components = self.comp_registry.lookup('foobar',
|
|
usage='listener',
|
|
model_name='res.users')
|
|
self.assertEqual('any', components[0]._name)
|
|
|
|
def test_lookup_cache(self):
|
|
""" Lookup uses a cache """
|
|
class Foo(Component):
|
|
_name = 'foo'
|
|
_collection = 'foobar'
|
|
|
|
self._build_components(Foo)
|
|
|
|
components = self.comp_registry.lookup('foobar')
|
|
self.assertEqual(['foo'], [c._name for c in components])
|
|
|
|
# we add a new component
|
|
class Bar(Component):
|
|
_name = 'bar'
|
|
_collection = 'foobar'
|
|
|
|
self._build_components(Bar)
|
|
|
|
# As the lookups are cached, we should still see only foo,
|
|
# even if we added a new component.
|
|
# We do this for testing, but in a real use case, we can't
|
|
# add new Component classes on the fly, and when we install
|
|
# new addons, the registry is rebuilt and cache cleared.
|
|
components = self.comp_registry.lookup('foobar')
|
|
self.assertEqual(['foo'], [c._name for c in components])
|
|
|
|
self.comp_registry._cache.clear()
|
|
# now we should find them both as the cache has been cleared
|
|
components = self.comp_registry.lookup('foobar')
|
|
self.assertEqual(['foo', 'bar'], [c._name for c in components])
|