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])
 |