diff --git a/azure_functions_worker/bindings/datumdef.py b/azure_functions_worker/bindings/datumdef.py index 34fb9b0a..0e2a9c53 100644 --- a/azure_functions_worker/bindings/datumdef.py +++ b/azure_functions_worker/bindings/datumdef.py @@ -102,6 +102,8 @@ def from_typed_data(cls, td: protos.TypedData): val = td.collection_sint64 elif tt == 'model_binding_data': val = td.model_binding_data + elif tt == 'collection_model_binding_data': + val = td.collection_model_binding_data elif tt is None: return None else: diff --git a/azure_functions_worker/bindings/meta.py b/azure_functions_worker/bindings/meta.py index ae40ce39..5d84a06f 100644 --- a/azure_functions_worker/bindings/meta.py +++ b/azure_functions_worker/bindings/meta.py @@ -300,6 +300,15 @@ def deferred_bindings_decode(binding: typing.Any, """ global deferred_bindings_cache + # Only applies to Event Hub and Service Bus - cannot cache + # These types will always produce different content and are not clients + if (datum.type == "collection_model_binding_data" + or datum.value.source == "AzureEventHubsEventData" + or datum.value.source == "AzureServiceBusReceivedMessage"): + return binding.decode(datum, + trigger_metadata=metadata, + pytype=pytype) + if deferred_bindings_cache.get((pb.name, pytype, datum.value.content, diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings.py index 1899f9e7..c527cb68 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings.py @@ -137,7 +137,7 @@ async def test_deferred_bindings_dual_enabled_log(self): "is only supported for 3.9+.") class TestDeferredBindingsHelpers(testutils.AsyncTestCase): - def test_deferred_bindings_enabled_decode(self): + def test_mbd_deferred_bindings_enabled_decode(self): binding = BlobClientConverter pb = protos.ParameterBinding(name='test', data=protos.TypedData( diff --git a/tests/unittests/test_types.py b/tests/unittests/test_types.py index 963f2691..406510c2 100644 --- a/tests/unittests/test_types.py +++ b/tests/unittests/test_types.py @@ -194,3 +194,26 @@ def test_model_binding_data_td_ok(self): mbd_datum = datumdef.Datum.from_typed_data(mock_mbd) self.assertEqual(mbd_datum.type, 'model_binding_data') + + def test_collection_model_binding_data_datum_ok(self): + sample_mbd = MockMBD(version="1.0", + source="AzureStorageBlobs", + content_type="application/json", + content="{\"Connection\":\"python-worker-tests\"," + "\"ContainerName\":\"test-blob\"," + "\"BlobName\":\"test.txt\"}") + sample_cmbd = [sample_mbd, sample_mbd] + + datum: bind_meta.Datum = bind_meta.Datum(value=sample_cmbd, + type='collection_model_binding_data') + + self.assertEqual(datum.value, sample_cmbd) + self.assertEqual(datum.type, "collection_model_binding_data") + + def test_collection_model_binding_data_td_ok(self): + mock_cmbd = protos.TypedData( + collection_model_binding_data={'model_binding_data': [{'version': '1.0'}]} + ) + cmbd_datum = datumdef.Datum.from_typed_data(mock_cmbd) + + self.assertEqual(cmbd_datum.type, 'collection_model_binding_data')