diff --git a/addons/queue_job/tests/test_json_field.py b/addons/queue_job/tests/test_json_field.py new file mode 100644 index 0000000..dd3e09c --- /dev/null +++ b/addons/queue_job/tests/test_json_field.py @@ -0,0 +1,154 @@ +# copyright 2016 Camptocamp +# license lgpl-3.0 or later (http://www.gnu.org/licenses/lgpl.html) + +import json +from datetime import date, datetime + +from lxml import etree + +from odoo.tests import common + +# pylint: disable=odoo-addons-relative-import +# we are testing, we want to test as we were an external consumer of the API +from odoo.addons.queue_job.fields import JobDecoder, JobEncoder + + +class TestJson(common.TransactionCase): + def test_encoder_recordset(self): + demo_user = self.env.ref("base.user_demo") + context = demo_user.context_get() + partner = self.env(user=demo_user, context=context).ref("base.main_partner") + value = partner + value_json = json.dumps(value, cls=JobEncoder) + expected_context = context.copy() + expected_context.pop("uid") + expected = { + "uid": demo_user.id, + "_type": "odoo_recordset", + "model": "res.partner", + "ids": [partner.id], + "su": False, + "context": expected_context, + } + self.assertEqual(json.loads(value_json), expected) + + def test_encoder_recordset_list(self): + demo_user = self.env.ref("base.user_demo") + context = demo_user.context_get() + partner = self.env(user=demo_user, context=context).ref("base.main_partner") + value = ["a", 1, partner] + value_json = json.dumps(value, cls=JobEncoder) + expected_context = context.copy() + expected_context.pop("uid") + expected = [ + "a", + 1, + { + "uid": demo_user.id, + "_type": "odoo_recordset", + "model": "res.partner", + "ids": [partner.id], + "su": False, + "context": expected_context, + }, + ] + self.assertEqual(json.loads(value_json), expected) + + def test_decoder_recordset(self): + demo_user = self.env.ref("base.user_demo") + context = demo_user.context_get() + partner = self.env(user=demo_user).ref("base.main_partner") + value_json = ( + '{"_type": "odoo_recordset",' + '"model": "res.partner",' + '"su": false,' + '"ids": [%s],"uid": %s, ' + '"context": {"tz": "%s", "lang": "%s"}}' + % (partner.id, demo_user.id, context["tz"], context["lang"]) + ) + expected = partner + value = json.loads(value_json, cls=JobDecoder, env=self.env) + self.assertEqual(value, expected) + self.assertEqual(demo_user, expected.env.user) + + def test_decoder_recordset_list(self): + demo_user = self.env.ref("base.user_demo") + context = demo_user.context_get() + partner = self.env(user=demo_user).ref("base.main_partner") + value_json = ( + '["a", 1, ' + '{"_type": "odoo_recordset",' + '"model": "res.partner",' + '"su": false,' + '"ids": [%s],"uid": %s, ' + '"context": {"tz": "%s", "lang": "%s"}}]' + % (partner.id, demo_user.id, context["tz"], context["lang"]) + ) + expected = ["a", 1, partner] + value = json.loads(value_json, cls=JobDecoder, env=self.env) + self.assertEqual(value, expected) + self.assertEqual(demo_user, expected[2].env.user) + + def test_decoder_recordset_list_without_user(self): + value_json = ( + '["a", 1, {"_type": "odoo_recordset",' '"model": "res.users", "ids": [1]}]' + ) + expected = ["a", 1, self.env.ref("base.user_root")] + value = json.loads(value_json, cls=JobDecoder, env=self.env) + self.assertEqual(value, expected) + + def test_encoder_datetime(self): + value = ["a", 1, datetime(2017, 4, 19, 8, 48, 50, 1)] + value_json = json.dumps(value, cls=JobEncoder) + expected = [ + "a", + 1, + {"_type": "datetime_isoformat", "value": "2017-04-19T08:48:50.000001"}, + ] + self.assertEqual(json.loads(value_json), expected) + + def test_decoder_datetime(self): + value_json = ( + '["a", 1, {"_type": "datetime_isoformat",' + '"value": "2017-04-19T08:48:50.000001"}]' + ) + expected = ["a", 1, datetime(2017, 4, 19, 8, 48, 50, 1)] + value = json.loads(value_json, cls=JobDecoder, env=self.env) + self.assertEqual(value, expected) + + def test_encoder_date(self): + value = ["a", 1, date(2017, 4, 19)] + value_json = json.dumps(value, cls=JobEncoder) + expected = ["a", 1, {"_type": "date_isoformat", "value": "2017-04-19"}] + self.assertEqual(json.loads(value_json), expected) + + def test_decoder_date(self): + value_json = '["a", 1, {"_type": "date_isoformat",' '"value": "2017-04-19"}]' + expected = ["a", 1, date(2017, 4, 19)] + value = json.loads(value_json, cls=JobDecoder, env=self.env) + self.assertEqual(value, expected) + + def test_encoder_etree(self): + etree_el = etree.Element("root", attr="val") + etree_el.append(etree.Element("child", attr="val")) + value = ["a", 1, etree_el] + value_json = json.dumps(value, cls=JobEncoder) + expected = [ + "a", + 1, + { + "_type": "etree_element", + "value": '', + }, + ] + self.assertEqual(json.loads(value_json), expected) + + def test_decoder_etree(self): + value_json = '["a", 1, {"_type": "etree_element", "value": \ + ""}]' + etree_el = etree.Element("root", attr="val") + etree_el.append(etree.Element("child", attr="val")) + expected = ["a", 1, etree.tostring(etree_el)] + value = json.loads(value_json, cls=JobDecoder, env=self.env) + value[2] = etree.tostring(value[2]) + self.assertEqual(value, expected)