Something went wrong on our end
-
Vincent Hatakeyama authored
In Model converter, also validate messages in ``message_to_odoo``. Model converter argument changed, `__type__` is now the last argument and is optional. It is expected not to be used anymore. Added possible_datatypes property and odoo_datatype on Converter. Defaults to empty set and None. On Model, it can be set. Replace generic exceptions.
Vincent Hatakeyama authoredIn Model converter, also validate messages in ``message_to_odoo``. Model converter argument changed, `__type__` is now the last argument and is optional. It is expected not to be used anymore. Added possible_datatypes property and odoo_datatype on Converter. Defaults to empty set and None. On Model, it can be set. Replace generic exceptions.
test_relation.py 7.04 KiB
##############################################################################
#
# Converter Odoo module
# Copyright © 2021, 2024 XCG Consulting <https://xcg-consulting.fr>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from typing import Any
from odoo import tests # type: ignore[import-untyped]
from .. import (
Field,
Model,
RelationToMany,
RelationToOne,
Skip,
Xref,
message_to_odoo,
)
class Test(tests.TransactionCase):
@classmethod
def setUpClass(cls) -> None:
super().setUpClass()
cls.converter1 = RelationToOne("company_id", "res.company", Xref(None))
cls.converter2 = RelationToOne("action_id", "res.company", Xref(None))
cls.converter3 = RelationToOne(
"action_id", "res.company", Xref(None), send_empty=False
)
cls.converter4 = RelationToOne(
"company_id", "res.company", Xref(None), send_empty=False
)
def setUp(self):
super().setUp()
self.user_root = self.env.ref("base.user_root")
self.user_admin = self.env.ref("base.user_admin")
def test_many2one_from_odoo(self):
message = self.converter1.odoo_to_message(self.user_admin)
self.assertEqual(message, "base.main_company")
message = self.converter1.odoo_to_message(self.user_root)
self.assertEqual(message, "base.main_company")
def test_many2one_skip_from_odoo(self):
message = self.converter4.odoo_to_message(self.user_admin)
self.assertEqual(message, "base.main_company")
def test_empty_many2one_from_odoo(self):
message = self.converter2.odoo_to_message(self.user_root)
self.assertEqual(message, "")
def test_empty_many2one_skip_from_odoo(self):
message = self.converter3.odoo_to_message(self.user_root)
self.assertEqual(message, Skip)
def test_many2one_to_odoo(self):
"""Ensure a sub-object linked from the main one gets updated when Odoo
receives a message.
"""
# This converter wraps a user and adds info from its related partner.
converter = Model(
{
"partner": RelationToOne(
"partner_id",
"res.partner",
Model(
{
"color": Field("color"),
"name": Field("name"),
"xref": Xref("test"),
},
__type__="partner",
),
),
"xref": Xref("base"),
},
)
user = self.env.ref("base.user_admin")
old_partner = user.partner_id
# Run our message reception.
message: dict[str, Any] = {
"partner": {
"__type__": "partner",
"color": 2,
"name": "TEST",
"xref": "new_partner_converter",
},
"xref": "user_admin",
}
message_to_odoo(self.env, message, self.env["res.users"], converter)
# Ensure a new partner got created and that it has an xref (post hook).
new_partner = self.env.ref("test.new_partner_converter")
self.assertEqual(user.partner_id, new_partner)
self.assertNotEqual(new_partner, old_partner)
self.assertEqual(new_partner.color, 2)
self.assertEqual(new_partner.name, "TEST")
# Try again with the same partner ref; check update (but no creations).
message["partner"]["color"] = 3
message_to_odoo(self.env, message, self.env["res.users"], converter)
self.assertEqual(user.partner_id, new_partner)
self.assertEqual(new_partner.color, 3)
def test_many2many_to_odoo(self):
"""Ensure multiple sub-objects linked from the main one gets updated
when Odoo receives a message.
"""
# This converter wraps a user and adds info from its related partner.
converter = Model(
{
"users": RelationToMany(
"user_ids",
"res.users",
Model(
{
"email": Field("email"),
"xref": Xref("base"),
},
__type__="user",
),
),
"xref": Xref("base"),
},
)
partner = self.env.ref("base.main_partner")
self.assertFalse(partner.user_ids)
# Run our message reception.
message: dict[str, Any] = {
"users": [
{
"__type__": "user",
"xref": "user_admin",
},
{
"__type__": "user",
"xref": "user_demo",
},
],
"xref": "main_partner",
}
message_to_odoo(self.env, message, self.env["res.partner"], converter)
# Check the partner's users
self.assertTrue(partner.user_ids)
self.assertEqual(len(partner.user_ids), 2)
def test_many2many_to_odoo_no___type__(self):
"""Ensure multiple sub-objects linked from the main one gets updated
when Odoo receives a message.
"""
# This converter wraps a user and adds info from its related partner.
converter = Model(
{
"users": RelationToMany(
"user_ids",
"res.users",
Model(
{
"email": Field("email"),
"xref": Xref("base"),
},
),
),
"xref": Xref("base"),
},
)
partner = self.env.ref("base.main_partner")
self.assertFalse(partner.user_ids)
# Run our message reception.
message: dict[str, Any] = {
"users": [
{
"xref": "user_admin",
},
{
"xref": "user_demo",
},
],
"xref": "main_partner",
}
message_to_odoo(self.env, message, self.env["res.partner"], converter)
# Check the partner's users
self.assertTrue(partner.user_ids)
self.assertEqual(len(partner.user_ids), 2)