From 849c3f81f01a9b73ee131751c27c7a92dc389c45 Mon Sep 17 00:00:00 2001 From: "Hanzhang Zeng (Roger)" Date: Mon, 21 Oct 2019 15:10:37 -0700 Subject: [PATCH 1/2] Allow cosmosdb document parameter to pass in null --- azure/functions/cosmosdb.py | 5 ++- tests/test_cosmosdb.py | 84 +++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 tests/test_cosmosdb.py diff --git a/azure/functions/cosmosdb.py b/azure/functions/cosmosdb.py index 4cd1a526..bffd57b7 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,7 @@ 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..c2d28018 --- /dev/null +++ b/tests/test_cosmosdb.py @@ -0,0 +1,84 @@ +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) From 2753290a8664d9363bf20836cf592b8d12f44e83 Mon Sep 17 00:00:00 2001 From: "Hanzhang Zeng (Roger)" Date: Mon, 21 Oct 2019 15:16:19 -0700 Subject: [PATCH 2/2] Fix flake8 --- azure/functions/cosmosdb.py | 3 ++- tests/test_cosmosdb.py | 22 +++++++++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/azure/functions/cosmosdb.py b/azure/functions/cosmosdb.py index bffd57b7..792b2107 100644 --- a/azure/functions/cosmosdb.py +++ b/azure/functions/cosmosdb.py @@ -43,7 +43,8 @@ def decode(cls, data: meta.Datum, *, trigger_metadata) -> cdb.DocumentList: documents = [documents] return cdb.DocumentList( - (None if doc is None else 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 index c2d28018..89d3946b 100644 --- a/tests/test_cosmosdb.py +++ b/tests/test_cosmosdb.py @@ -4,9 +4,11 @@ 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) + result: func.DocumentList = cdb.CosmosDBConverter.decode( + data=None, trigger_metadata=None) self.assertIsNone(result) def test_cosmosdb_convert_string(self): @@ -16,7 +18,8 @@ def test_cosmosdb_convert_string(self): "name": "awesome_name" } """, "string") - result: func.DocumentList = cdb.CosmosDBConverter.decode(data=datum, trigger_metadata=None) + 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') @@ -28,7 +31,8 @@ def test_cosmosdb_convert_bytes(self): "name": "awesome_name" } """.encode(), "bytes") - result: func.DocumentList = cdb.CosmosDBConverter.decode(data=datum, trigger_metadata=None) + 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') @@ -40,7 +44,8 @@ def test_cosmosdb_convert_json(self): "name": "awesome_name" } """, "json") - result: func.DocumentList = cdb.CosmosDBConverter.decode(data=datum, trigger_metadata=None) + 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') @@ -52,7 +57,8 @@ def test_cosmosdb_convert_json_name_is_null(self): "name": null } """, "json") - result: func.DocumentList = cdb.CosmosDBConverter.decode(data=datum, trigger_metadata=None) + 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) @@ -70,7 +76,8 @@ def test_cosmosdb_convert_json_multiple_entries(self): } ] """, "json") - result: func.DocumentList = cdb.CosmosDBConverter.decode(data=datum, trigger_metadata=None) + 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') @@ -78,7 +85,8 @@ def test_cosmosdb_convert_json_multiple_entries(self): def test_cosmosdb_convert_json_multiple_nulls(self): datum: Datum = Datum("[null]", "json") - result: func.DocumentList = cdb.CosmosDBConverter.decode(data=datum, trigger_metadata=None) + result: func.DocumentList = cdb.CosmosDBConverter.decode( + data=datum, trigger_metadata=None) self.assertIsNotNone(result) self.assertEqual(len(result), 1) self.assertEqual(result[0], None)