jsonifier: fix field validation

An invalid field must be skipped in any case if not in strict mode.
Error message has been downgraded to warning since is not really broken
till you use string mode.

Log tests reworked.
pull/3205/head
Simone Orsi 2024-08-20 08:00:17 +02:00
parent f58c7447ca
commit 2e7ee2269b
2 changed files with 18 additions and 17 deletions

View File

@ -119,15 +119,15 @@ class Base(models.AbstractModel):
if strict: if strict:
# let it fail # let it fail
rec._fields[field_name] # pylint: disable=pointless-statement rec._fields[field_name] # pylint: disable=pointless-statement
else:
if not tools.config["test_enable"]: if not tools.config["test_enable"]:
# If running live, log proper error # If running live, log proper error
# so that techies can track it down # so that techies can track it down
_logger.error( _logger.warning(
"%(model)s.%(fname)s not available", "%(model)s.%(fname)s not available",
{"model": self._name, "fname": field_name}, {"model": self._name, "fname": field_name},
) )
raise SwallableException() raise SwallableException()
return True return True
def _jsonify_record_handle_function(self, rec, field_dict, strict): def _jsonify_record_handle_function(self, rec, field_dict, strict):

View File

@ -385,24 +385,25 @@ class TestParser(TransactionCase):
def test_bad_parsers_fail_gracefully(self): def test_bad_parsers_fail_gracefully(self):
rec = self.category rec = self.category
logger_patch_path = "odoo.addons.jsonifier.models.models._logger.error" # logging is disabled when testing as it makes too much noise
# logging is disabled when testing as it's useless and makes build fail.
tools.config["test_enable"] = False tools.config["test_enable"] = False
logger_name = "odoo.addons.jsonifier.models.models"
bad_field_name = ["Name"] bad_field_name = ["Name"]
with mock.patch(logger_patch_path) as mocked_logger: with self.assertLogs(logger=logger_name, level="WARNING") as capt:
rec.jsonify(bad_field_name, one=True) rec.jsonify(bad_field_name, one=True)
mocked_logger.assert_called() self.assertIn("res.partner.category.Name not availabl", capt.output[0])
bad_function_name = {"fields": [{"name": "name", "function": "notafunction"}]} bad_function_name = {"fields": [{"name": "name", "function": "notafunction"}]}
with mock.patch(logger_patch_path) as mocked_logger: with self.assertLogs(logger=logger_name, level="WARNING") as capt:
rec.jsonify(bad_function_name, one=True) rec.jsonify(bad_function_name, one=True)
mocked_logger.assert_called() self.assertIn(
"res.partner.category.notafunction not available", capt.output[0]
)
bad_subparser = {"fields": [({"name": "name"}, [{"name": "subparser_name"}])]} bad_subparser = {"fields": [({"name": "name"}, [{"name": "subparser_name"}])]}
with mock.patch(logger_patch_path) as mocked_logger: with self.assertLogs(logger=logger_name, level="WARNING") as capt:
rec.jsonify(bad_subparser, one=True) rec.jsonify(bad_subparser, one=True)
mocked_logger.assert_called() self.assertIn("res.partner.category.name not relational", capt.output[0])
tools.config["test_enable"] = True tools.config["test_enable"] = True