diff --git a/azure/functions/cosmosdb.py b/azure/functions/cosmosdb.py index 4cd1a526..792b2107 100644 --- a/azure/functions/cosmosdb.py +++ b/azure/functions/cosmosdb.py @@ -20,6 +20,9 @@ def check_output_type_annotation(cls, pytype: type) -> bool: @classmethod def decode(cls, data: meta.Datum, *, trigger_metadata) -> cdb.DocumentList: + if data is None or data.type is None: + return None + data_type = data.type if data_type == 'string': @@ -40,7 +43,8 @@ def decode(cls, data: meta.Datum, *, trigger_metadata) -> cdb.DocumentList: documents = [documents] return cdb.DocumentList( - cdb.Document.from_dict(doc) for doc in documents) + (None if doc is None else cdb.Document.from_dict(doc)) + for doc in documents) @classmethod def encode(cls, obj: typing.Any, *, diff --git a/tests/test_cosmosdb.py b/tests/test_cosmosdb.py new file mode 100644 index 00000000..89d3946b --- /dev/null +++ b/tests/test_cosmosdb.py @@ -0,0 +1,92 @@ +import unittest + +import azure.functions as func +import azure.functions.cosmosdb as cdb +from azure.functions.meta import Datum + + +class TestCosmosdb(unittest.TestCase): + def test_cosmosdb_convert_none(self): + result: func.DocumentList = cdb.CosmosDBConverter.decode( + data=None, trigger_metadata=None) + self.assertIsNone(result) + + def test_cosmosdb_convert_string(self): + datum: Datum = Datum(""" + { + "id": "1", + "name": "awesome_name" + } + """, "string") + result: func.DocumentList = cdb.CosmosDBConverter.decode( + data=datum, trigger_metadata=None) + self.assertIsNotNone(result) + self.assertEqual(len(result), 1) + self.assertEqual(result[0]['name'], 'awesome_name') + + def test_cosmosdb_convert_bytes(self): + datum: Datum = Datum(""" + { + "id": "1", + "name": "awesome_name" + } + """.encode(), "bytes") + result: func.DocumentList = cdb.CosmosDBConverter.decode( + data=datum, trigger_metadata=None) + self.assertIsNotNone(result) + self.assertEqual(len(result), 1) + self.assertEqual(result[0]['name'], 'awesome_name') + + def test_cosmosdb_convert_json(self): + datum: Datum = Datum(""" + { + "id": "1", + "name": "awesome_name" + } + """, "json") + result: func.DocumentList = cdb.CosmosDBConverter.decode( + data=datum, trigger_metadata=None) + self.assertIsNotNone(result) + self.assertEqual(len(result), 1) + self.assertEqual(result[0]['name'], 'awesome_name') + + def test_cosmosdb_convert_json_name_is_null(self): + datum: Datum = Datum(""" + { + "id": "1", + "name": null + } + """, "json") + result: func.DocumentList = cdb.CosmosDBConverter.decode( + data=datum, trigger_metadata=None) + self.assertIsNotNone(result) + self.assertEqual(len(result), 1) + self.assertEqual(result[0]['name'], None) + + def test_cosmosdb_convert_json_multiple_entries(self): + datum: Datum = Datum(""" + [ + { + "id": "1", + "name": "awesome_name" + }, + { + "id": "2", + "name": "bossy_name" + } + ] + """, "json") + result: func.DocumentList = cdb.CosmosDBConverter.decode( + data=datum, trigger_metadata=None) + self.assertIsNotNone(result) + self.assertEqual(len(result), 2) + self.assertEqual(result[0]['name'], 'awesome_name') + self.assertEqual(result[1]['name'], 'bossy_name') + + def test_cosmosdb_convert_json_multiple_nulls(self): + datum: Datum = Datum("[null]", "json") + result: func.DocumentList = cdb.CosmosDBConverter.decode( + data=datum, trigger_metadata=None) + self.assertIsNotNone(result) + self.assertEqual(len(result), 1) + self.assertEqual(result[0], None)