Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -0,0 +1,461 @@
# Copyright 2017 Camptocamp SA
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html)
import unittest
from unittest import mock
from odoo.tests.common import MetaCase, tagged
from odoo.addons.component.core import Component
from odoo.addons.component.tests.common import (
ComponentRegistryCase,
TransactionComponentRegistryCase,
)
from odoo.addons.component_event.components.event import skip_if
from odoo.addons.component_event.core import EventWorkContext
@tagged("standard", "at_install")
class TestEventWorkContext(unittest.TestCase, MetaCase("DummyCase", (), {})):
"""Test Events Components"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.test_sequence = 0
def setUp(self):
super().setUp()
self.env = mock.MagicMock(name="env")
self.record = mock.MagicMock(name="record")
self.components_registry = mock.MagicMock(name="ComponentRegistry")
def test_env(self):
"""WorkContext with env"""
work = EventWorkContext(
model_name="res.users",
env=self.env,
components_registry=self.components_registry,
)
self.assertEqual(self.env, work.env)
self.assertEqual("res.users", work.model_name)
with self.assertRaises(ValueError):
# pylint: disable=W0104
work.collection # noqa
def test_collection(self):
"""WorkContext with collection"""
env = mock.MagicMock(name="env")
collection = mock.MagicMock(name="collection")
collection.env = env
work = EventWorkContext(
model_name="res.users",
collection=collection,
components_registry=self.components_registry,
)
self.assertEqual(collection, work.collection)
self.assertEqual(env, work.env)
self.assertEqual("res.users", work.model_name)
def test_env_and_collection(self):
"""WorkContext with collection and env is forbidden"""
env = mock.MagicMock(name="env")
collection = mock.MagicMock(name="collection")
collection.env = env
with self.assertRaises(ValueError):
EventWorkContext(
model_name="res.users",
collection=collection,
env=env,
components_registry=self.components_registry,
)
def test_missing(self):
"""WorkContext with collection and env is forbidden"""
with self.assertRaises(ValueError):
EventWorkContext(
model_name="res.users", components_registry=self.components_registry
)
def test_env_work_on(self):
"""WorkContext propagated through work_on"""
env = mock.MagicMock(name="env")
collection = mock.MagicMock(name="collection")
collection.env = env
work = EventWorkContext(
env=env,
model_name="res.users",
components_registry=self.components_registry,
)
work2 = work.work_on(model_name="res.partner", collection=collection)
self.assertEqual("WorkContext", work2.__class__.__name__)
self.assertEqual(env, work2.env)
self.assertEqual("res.partner", work2.model_name)
self.assertEqual(self.components_registry, work2.components_registry)
with self.assertRaises(ValueError):
# pylint: disable=W0104
work.collection # noqa
def test_collection_work_on(self):
"""WorkContext propagated through work_on"""
env = mock.MagicMock(name="env")
collection = mock.MagicMock(name="collection")
collection.env = env
work = EventWorkContext(
collection=collection,
model_name="res.users",
components_registry=self.components_registry,
)
work2 = work.work_on(model_name="res.partner")
self.assertEqual("WorkContext", work2.__class__.__name__)
self.assertEqual(collection, work2.collection)
self.assertEqual(env, work2.env)
self.assertEqual("res.partner", work2.model_name)
self.assertEqual(self.components_registry, work2.components_registry)
def test_collection_work_on_collection(self):
"""WorkContext collection changed with work_on"""
env = mock.MagicMock(name="env")
collection = mock.MagicMock(name="collection")
collection.env = env
work = EventWorkContext(
model_name="res.users",
env=env,
components_registry=self.components_registry,
)
work2 = work.work_on(collection=collection)
# when work_on is used inside an event component, we want
# to switch back to a normal WorkContext, because we don't
# need anymore the EventWorkContext
self.assertEqual("WorkContext", work2.__class__.__name__)
self.assertEqual(collection, work2.collection)
self.assertEqual(env, work2.env)
self.assertEqual("res.users", work2.model_name)
self.assertEqual(self.components_registry, work2.components_registry)
class TestEvent(ComponentRegistryCase):
"""Test Events Components"""
def setUp(self):
super(TestEvent, self).setUp()
self._setup_registry(self)
self._load_module_components("component_event")
# get the collecter to notify the event
# we don't mind about the collection and the model here,
# the events we test are global
env = mock.MagicMock()
self.work = EventWorkContext(
model_name="res.users", env=env, components_registry=self.comp_registry
)
self.collecter = self.comp_registry["base.event.collecter"](self.work)
def test_event(self):
class MyEventListener(Component):
_name = "my.event.listener"
_inherit = "base.event.listener"
def on_record_create(self, recipient, something, fields=None):
recipient.append(("OK", something, fields))
MyEventListener._build_component(self.comp_registry)
something = object()
fields = ["name", "code"]
# as there is no return value by the event, we
# modify this recipient to check it has been called
recipient = []
# collect the event and notify it
self.collecter.collect_events("on_record_create").notify(
recipient, something, fields=fields
)
self.assertEqual([("OK", something, fields)], recipient)
def test_collect_several(self):
class MyEventListener(Component):
_name = "my.event.listener"
_inherit = "base.event.listener"
def on_record_create(self, recipient, something, fields=None):
recipient.append(("OK", something, fields))
class MyOtherEventListener(Component):
_name = "my.other.event.listener"
_inherit = "base.event.listener"
def on_record_create(self, recipient, something, fields=None):
recipient.append(("OK", something, fields))
MyEventListener._build_component(self.comp_registry)
MyOtherEventListener._build_component(self.comp_registry)
something = object()
fields = ["name", "code"]
# as there is no return value by the event, we
# modify this recipient to check it has been called
recipient = []
# collect the event and notify them
collected = self.collecter.collect_events("on_record_create")
self.assertEqual(2, len(collected.events))
collected.notify(recipient, something, fields=fields)
self.assertEqual(
[("OK", something, fields), ("OK", something, fields)], recipient
)
def test_event_cache(self):
class MyEventListener(Component):
_name = "my.event.listener"
_inherit = "base.event.listener"
def on_record_create(self):
pass
MyEventListener._build_component(self.comp_registry)
# collect the event
collected = self.collecter.collect_events("on_record_create")
# CollectedEvents.events contains the collected events
self.assertEqual(1, len(collected.events))
event = list(collected.events)[0]
self.assertEqual(self.work, event.__self__.work)
self.assertEqual(self.work.env, event.__self__.work.env)
# build and register a new listener
class MyOtherEventListener(Component):
_name = "my.other.event.listener"
_inherit = "base.event.listener"
def on_record_create(self):
pass
MyOtherEventListener._build_component(self.comp_registry)
# get a new collecter and check that we it finds the same
# events even if we built a new one: it means the cache works
env = mock.MagicMock()
work = EventWorkContext(
model_name="res.users", env=env, components_registry=self.comp_registry
)
collecter = self.comp_registry["base.event.collecter"](work)
collected = collecter.collect_events("on_record_create")
# CollectedEvents.events contains the collected events
self.assertEqual(1, len(collected.events))
event = list(collected.events)[0]
self.assertEqual(work, event.__self__.work)
self.assertEqual(env, event.__self__.work.env)
# if we empty the cache, as it on the class, both collecters
# should now find the 2 events
collecter._cache.clear()
self.comp_registry._cache.clear()
# CollectedEvents.events contains the collected events
self.assertEqual(2, len(collecter.collect_events("on_record_create").events))
self.assertEqual(
2, len(self.collecter.collect_events("on_record_create").events)
)
def test_event_cache_collection(self):
class MyEventListener(Component):
_name = "my.event.listener"
_inherit = "base.event.listener"
def on_record_create(self):
pass
MyEventListener._build_component(self.comp_registry)
# collect the event
collected = self.collecter.collect_events("on_record_create")
# CollectedEvents.events contains the collected events
self.assertEqual(1, len(collected.events))
# build and register a new listener
class MyOtherEventListener(Component):
_name = "my.other.event.listener"
_inherit = "base.event.listener"
_collection = "base.collection"
def on_record_create(self):
pass
MyOtherEventListener._build_component(self.comp_registry)
# get a new collecter and check that we it finds the same
# events even if we built a new one: it means the cache works
collection = mock.MagicMock(name="base.collection")
collection._name = "base.collection"
collection.env = mock.MagicMock()
work = EventWorkContext(
model_name="res.users",
collection=collection,
components_registry=self.comp_registry,
)
collecter = self.comp_registry["base.event.collecter"](work)
collected = collecter.collect_events("on_record_create")
# for a different collection, we should not have the same
# cache entry
self.assertEqual(2, len(collected.events))
def test_event_cache_model_name(self):
class MyEventListener(Component):
_name = "my.event.listener"
_inherit = "base.event.listener"
def on_record_create(self):
pass
MyEventListener._build_component(self.comp_registry)
# collect the event
collected = self.collecter.collect_events("on_record_create")
# CollectedEvents.events contains the collected events
self.assertEqual(1, len(collected.events))
# build and register a new listener
class MyOtherEventListener(Component):
_name = "my.other.event.listener"
_inherit = "base.event.listener"
_apply_on = ["res.country"]
def on_record_create(self):
pass
MyOtherEventListener._build_component(self.comp_registry)
# get a new collecter and check that we it finds the same
# events even if we built a new one: it means the cache works
env = mock.MagicMock()
work = EventWorkContext(
model_name="res.country", env=env, components_registry=self.comp_registry
)
collecter = self.comp_registry["base.event.collecter"](work)
collected = collecter.collect_events("on_record_create")
# for a different collection, we should not have the same
# cache entry
self.assertEqual(2, len(collected.events))
def test_skip_if(self):
class MyEventListener(Component):
_name = "my.event.listener"
_inherit = "base.event.listener"
def on_record_create(self, msg):
pass
class MyOtherEventListener(Component):
_name = "my.other.event.listener"
_inherit = "base.event.listener"
@skip_if(lambda self, msg: msg == "foo")
def on_record_create(self, msg):
raise AssertionError()
self._build_components(MyEventListener, MyOtherEventListener)
# collect the event and notify it
collected = self.collecter.collect_events("on_record_create")
self.assertEqual(2, len(collected.events))
collected.notify("foo")
class TestEventFromModel(TransactionComponentRegistryCase):
"""Test Events Components from Models"""
def setUp(self):
super(TestEventFromModel, self).setUp()
self._setup_registry(self)
self._load_module_components("component_event")
def test_event_from_model(self):
class MyEventListener(Component):
_name = "my.event.listener"
_inherit = "base.event.listener"
def on_foo(self, record, name):
record.name = name
MyEventListener._build_component(self.comp_registry)
partner = self.env["res.partner"].create({"name": "test"})
# Normally you would not pass a components_registry,
# this is for the sake of the test, letting it empty
# will use the global registry.
# In a real code it would look like:
# partner._event('on_foo').notify('bar')
events = partner._event("on_foo", components_registry=self.comp_registry)
events.notify(partner, "bar")
self.assertEqual("bar", partner.name)
def test_event_filter_on_model(self):
class GlobalListener(Component):
_name = "global.event.listener"
_inherit = "base.event.listener"
def on_foo(self, record, name):
record.name = name
class PartnerListener(Component):
_name = "partner.event.listener"
_inherit = "base.event.listener"
_apply_on = ["res.partner"]
def on_foo(self, record, name):
record.ref = name
class UserListener(Component):
_name = "user.event.listener"
_inherit = "base.event.listener"
_apply_on = ["res.users"]
def on_foo(self, record, name):
raise AssertionError()
self._build_components(GlobalListener, PartnerListener, UserListener)
partner = self.env["res.partner"].create({"name": "test"})
partner._event("on_foo", components_registry=self.comp_registry).notify(
partner, "bar"
)
self.assertEqual("bar", partner.name)
self.assertEqual("bar", partner.ref)
def test_event_filter_on_collection(self):
class GlobalListener(Component):
_name = "global.event.listener"
_inherit = "base.event.listener"
def on_foo(self, record, name):
record.name = name
class PartnerListener(Component):
_name = "partner.event.listener"
_inherit = "base.event.listener"
_collection = "collection.base"
def on_foo(self, record, name):
record.ref = name
class UserListener(Component):
_name = "user.event.listener"
_inherit = "base.event.listener"
_collection = "magento.backend"
def on_foo(self, record, name):
raise AssertionError()
self._build_components(GlobalListener, PartnerListener, UserListener)
partner = self.env["res.partner"].create({"name": "test"})
events = partner._event(
"on_foo",
collection=self.env["collection.base"],
components_registry=self.comp_registry,
)
events.notify(partner, "bar")
self.assertEqual("bar", partner.name)
self.assertEqual("bar", partner.ref)