server-tools/base_jsonify/tests/test_get_parser.py

165 lines
5.5 KiB
Python

# Copyright 2017 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields
from odoo.tests.common import TransactionCase
def jsonify_custom(self, field_name):
return "yeah!"
class TestParser(TransactionCase):
def test_getting_parser(self):
expected_parser = [
"name",
"active",
"credit_limit",
"color",
("category_id", ["name"]),
("country_id", ["name", "code"]),
(
"child_ids",
[
"name",
"id",
"email",
("country_id", ["name", "code"]),
("child_ids", ["name"]),
],
),
"lang",
"comment",
]
exporter = self.env.ref("base_jsonify.ir_exp_partner")
parser = exporter.get_json_parser()
self.assertListEqual(parser, expected_parser)
# modify an ir.exports_line to put an alias for a field
self.env.ref("base_jsonify.category_id_name").write(
{"alias": "category_id:category/name"}
)
expected_parser[4] = ("category_id:category", ["name"])
parser = exporter.get_json_parser()
self.assertEqual(parser, expected_parser)
def test_json_export(self):
# Enforces TZ to validate the serialization result of a Datetime
self.env.user.tz = "Europe/Brussels"
parser = [
"lang",
"comment",
"credit_limit",
"name",
"color",
(
"child_ids:children",
[
("child_ids:children", ["name"]),
"email",
("country_id:country", ["code", "name"]),
"name",
"id",
],
),
("country_id:country", ["code", "name"]),
"active",
("category_id", ["name"]),
"create_date",
"date",
]
partner = self.env["res.partner"].create(
{
"name": "Akretion",
"country_id": self.env.ref("base.fr").id,
"lang": "en_US", # default
"category_id": [(0, 0, {"name": "Inovator"})],
"child_ids": [
(
0,
0,
{
"name": "Sebatien Beau",
"country_id": self.env.ref("base.fr").id,
},
)
],
"date": fields.Date.from_string("2019-10-31"),
}
)
# put our own create date to ease tests
self.env.cr.execute(
"update res_partner set create_date=%s where id=%s",
("2019-10-31 14:39:49", partner.id),
)
expected_json = {
"lang": "en_US",
"comment": None,
"credit_limit": 0.0,
"name": "Akretion",
"color": 0,
"country": {"code": "FR", "name": "France"},
"active": True,
"category_id": [{"name": "Inovator"}],
"children": [
{
"id": partner.child_ids.id,
"country": {"code": "FR", "name": "France"},
"children": [],
"name": "Sebatien Beau",
"email": None,
}
],
"create_date": "2019-10-31T15:39:49+01:00",
"date": "2019-10-31",
}
json_partner = partner.jsonify(parser)
self.assertDictEqual(json_partner[0], expected_json)
# Check that only boolean fields have boolean values into json
# By default if a field is not set into Odoo, the value is always False
# This value is not the expected one into the json
partner.write({"child_ids": [(6, 0, [])], "active": False, "lang": False})
json_partner = partner.jsonify(parser)
expected_json["active"] = False
expected_json["lang"] = None
expected_json["children"] = []
self.assertDictEqual(json_partner[0], expected_json)
def test_json_export_callable_parser(self):
# Enforces TZ to validate the serialization result of a Datetime
partner = self.env["res.partner"].create(
{
"name": "Akretion",
"country_id": self.env.ref("base.fr").id,
"lang": "en_US", # default
"category_id": [(0, 0, {"name": "Inovator"})],
"child_ids": [
(
0,
0,
{
"name": "Sebatien Beau",
"country_id": self.env.ref("base.fr").id,
},
)
],
"date": fields.Date.from_string("2019-10-31"),
}
)
partner.__class__.jsonify_custom = jsonify_custom
parser = [
# callable subparser
("name", lambda rec, fname: rec[fname] + " rocks!"),
("name:custom", "jsonify_custom"),
]
expected_json = {
"name": "Akretion rocks!",
"custom": "yeah!",
}
json_partner = partner.jsonify(parser)
self.assertDictEqual(json_partner[0], expected_json)
del partner.__class__.jsonify_custom