diff --git a/extensions/Worker.Extensions.EventGrid/src/TypeConverters/EventGridBinaryDataConverter.cs b/extensions/Worker.Extensions.EventGrid/src/TypeConverters/EventGridBinaryDataConverter.cs index 9f3f616a3..046dcac63 100644 --- a/extensions/Worker.Extensions.EventGrid/src/TypeConverters/EventGridBinaryDataConverter.cs +++ b/extensions/Worker.Extensions.EventGrid/src/TypeConverters/EventGridBinaryDataConverter.cs @@ -18,18 +18,20 @@ internal class EventGridBinaryDataConverter : EventGridConverterBase { protected override ConversionResult ConvertCore(Type targetType, string json) { - object result = targetType switch + ConversionResult result = targetType switch { - Type t when t == typeof(BinaryData) => BinaryData.FromString(json), - Type t when t == typeof(BinaryData[]) => () => - { - var data = JsonSerializer.Deserialize>(json); - return data.Select(item => BinaryData.FromString(item.ToString())).ToArray(); - }, + Type t when t == typeof(BinaryData) => ConversionResult.Success(BinaryData.FromString(json)), + Type t when t == typeof(BinaryData[]) => ConversionResult.Success(ConvertToBinaryDataArray(json)), _ => ConversionResult.Unhandled() }; - return ConversionResult.Success(result); + return result; + } + + private BinaryData[] ConvertToBinaryDataArray(string json) + { + var data = JsonSerializer.Deserialize>(json); + return data.Select(item => BinaryData.FromString(item.ToString())).ToArray(); } } } diff --git a/extensions/Worker.Extensions.Tables/src/TypeConverters/TableConverterBase.cs b/extensions/Worker.Extensions.Tables/src/TypeConverters/TableConverterBase.cs index 854384ae4..9938d77f5 100644 --- a/extensions/Worker.Extensions.Tables/src/TypeConverters/TableConverterBase.cs +++ b/extensions/Worker.Extensions.Tables/src/TypeConverters/TableConverterBase.cs @@ -42,7 +42,7 @@ protected bool CanConvert(ConverterContext context) if (bindingData.Source is not Constants.TablesExtensionName) { - throw new InvalidContentTypeException(Constants.JsonContentType); + throw new InvalidBindingSourceException(Constants.TablesExtensionName); } return true; diff --git a/test/FunctionMetadataGeneratorTests/FunctionMetadataGeneratorTests.cs b/test/FunctionMetadataGeneratorTests/FunctionMetadataGeneratorTests.cs index b86fe536b..8a13b4a4e 100644 --- a/test/FunctionMetadataGeneratorTests/FunctionMetadataGeneratorTests.cs +++ b/test/FunctionMetadataGeneratorTests/FunctionMetadataGeneratorTests.cs @@ -176,7 +176,7 @@ public void StorageFunctions() AssertDictionary(extensions, new Dictionary { { "Microsoft.Azure.WebJobs.Extensions.Storage.Queues", "5.1.3" }, - { "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.2" }, + { "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.3" }, }); void ValidateQueueTrigger(ExpandoObject b) @@ -270,7 +270,7 @@ public void BlobStorageFunctions_SDKTypeBindings() AssertDictionary(extensions, new Dictionary { - { "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.2" }, + { "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.3" }, }); var blobClientToBlobStringFunction = functions.Single(p => p.Name == "BlobClientToBlobStringFunction"); @@ -357,7 +357,7 @@ public void BlobCollectionFunctions_SDKTypeBindings() AssertDictionary(extensions, new Dictionary { - { "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.2" }, + { "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.3" }, }); var blobStringToBlobClientEnumerable = functions.Single(p => p.Name == "BlobStringToBlobClientEnumerable"); @@ -612,7 +612,7 @@ public void MultiOutput_OnReturnType() AssertDictionary(extensions, new Dictionary { { "Microsoft.Azure.WebJobs.Extensions.Storage.Queues", "5.1.3" }, - { "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.2" }, + { "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs", "5.1.3" }, }); void ValidateQueueTrigger(ExpandoObject b) diff --git a/test/SdkE2ETests/PublishTests.cs b/test/SdkE2ETests/PublishTests.cs index 4f6fcc87f..791bf5595 100644 --- a/test/SdkE2ETests/PublishTests.cs +++ b/test/SdkE2ETests/PublishTests.cs @@ -64,7 +64,7 @@ private async Task RunPublishTest(string outputDir, string additionalParams = nu "Microsoft.Azure.WebJobs.Extensions.FunctionMetadataLoader.Startup, Microsoft.Azure.WebJobs.Extensions.FunctionMetadataLoader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=551316b6919f366c", @"./.azurefunctions/Microsoft.Azure.WebJobs.Extensions.FunctionMetadataLoader.dll"), new Extension("AzureStorageBlobs", - "Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageBlobsWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.Storage.Blobs, Version=5.1.2.0, Culture=neutral, PublicKeyToken=92742159e12e44c8", + "Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageBlobsWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.Storage.Blobs, Version=5.1.3.0, Culture=neutral, PublicKeyToken=92742159e12e44c8", @"./.azurefunctions/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.dll"), new Extension("AzureStorageQueues", "Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageQueuesWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.Storage.Queues, Version=5.1.3.0, Culture=neutral, PublicKeyToken=92742159e12e44c8", @@ -134,7 +134,7 @@ private async Task RunPublishTestForSdkTypeBindings(string outputDir, string add "Microsoft.Azure.WebJobs.ServiceBus.ServiceBusWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.ServiceBus, Version=5.11.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8", @"./.azurefunctions/Microsoft.Azure.WebJobs.Extensions.ServiceBus.dll"), new Extension("AzureStorageBlobs", - "Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageBlobsWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.Storage.Blobs, Version=5.1.2.0, Culture=neutral, PublicKeyToken=92742159e12e44c8", + "Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageBlobsWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.Storage.Blobs, Version=5.1.3.0, Culture=neutral, PublicKeyToken=92742159e12e44c8", @"./.azurefunctions/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.dll"), new Extension("AzureStorageQueues", "Microsoft.Azure.WebJobs.Extensions.Storage.AzureStorageQueuesWebJobsStartup, Microsoft.Azure.WebJobs.Extensions.Storage.Queues, Version=5.1.3.0, Culture=neutral, PublicKeyToken=92742159e12e44c8", diff --git a/test/WorkerExtensionTests/Blob/BlobStorageConverterTests.cs b/test/WorkerExtensionTests/Blob/BlobStorageConverterTests.cs index 53ffb54c0..5474961df 100644 --- a/test/WorkerExtensionTests/Blob/BlobStorageConverterTests.cs +++ b/test/WorkerExtensionTests/Blob/BlobStorageConverterTests.cs @@ -603,25 +603,6 @@ public async Task ConvertAsync_ModelBindingData_Null_ReturnsUnhandled() Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); } - [Fact] - public async Task ConvertAsync_BlobClientIsNull_ReturnsUnhandled() - { - // Arrange - var grpcModelBindingData = Helper.GetTestGrpcModelBindingData(GetTestBinaryData(), "AzureStorageBlobs"); - var context = new TestConverterContext(typeof(BlobClient), grpcModelBindingData); - - var mockContainer = new Mock(); - mockContainer.Setup(m => m.GetBlobClient(It.IsAny())).Returns((BlobClient)null); - - _mockBlobServiceClient.Setup(m => m.GetBlobContainerClient(It.IsAny())).Returns(mockContainer.Object); - - // Act - var conversionResult = await _blobStorageConverter.ConvertAsync(context); - - // Assert - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); - } - [Fact] public async Task ConvertAsync_ThrowsException_ReturnsFailure() { @@ -641,7 +622,7 @@ public async Task ConvertAsync_ThrowsException_ReturnsFailure() } [Fact] - public async Task ConvertAsync_ModelBindingDataSource_NotBlobExtension_ReturnsUnhandled() + public async Task ConvertAsync_ModelBindingDataSource_NotBlobExtension_ReturnsFailed() { // Arrange var grpcModelBindingData = Helper.GetTestGrpcModelBindingData(GetTestBinaryData(), "anotherExtensions"); @@ -651,7 +632,7 @@ public async Task ConvertAsync_ModelBindingDataSource_NotBlobExtension_ReturnsUn var conversionResult = await _blobStorageConverter.ConvertAsync(context); // Assert - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); + Assert.Equal(ConversionStatus.Failed, conversionResult.Status); } [Fact] @@ -666,7 +647,7 @@ public async Task ConvertAsync_ModelBindingDataContentType_Unsupported_ReturnsFa // Assert Assert.Equal(ConversionStatus.Failed, conversionResult.Status); - Assert.Equal("Unexpected content-type. Currently only 'application/json' is supported.", conversionResult.Error.Message); + Assert.Equal("Unexpected content-type. Only 'application/json' is supported.", conversionResult.Error.Message); } [Fact] diff --git a/test/WorkerExtensionTests/Cosmos/CosmosDBConverterTests.cs b/test/WorkerExtensionTests/Cosmos/CosmosDBConverterTests.cs index c9fc321b4..ecd125d2d 100644 --- a/test/WorkerExtensionTests/Cosmos/CosmosDBConverterTests.cs +++ b/test/WorkerExtensionTests/Cosmos/CosmosDBConverterTests.cs @@ -9,7 +9,6 @@ using Microsoft.Azure.Cosmos; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Converters; -using Microsoft.Azure.Functions.Worker.Grpc.Messages; using Microsoft.Azure.Functions.Worker.Tests.Converters; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -264,21 +263,6 @@ public async Task ConvertAsync_ModelBindingData_Null_ReturnsUnhandled() Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); } - [Fact] // Should we fail if the result is ever null? - public async Task ConvertAsync_ResultIsNull_ReturnsUnhandled() - { - var grpcModelBindingData = Helper.GetTestGrpcModelBindingData(GetTestBinaryData(), "CosmosDB"); - var context = new TestConverterContext(typeof(Database), grpcModelBindingData); - - _mockCosmosClient - .Setup(m => m.GetDatabase(It.IsAny())) - .Returns(null); - - var conversionResult = await _cosmosDBConverter.ConvertAsync(context); - - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); - } - [Fact] public async Task ConvertAsync_ThrowsException_ReturnsFailure() { @@ -320,14 +304,14 @@ public async Task ConvertAsync_ItemResponse_ResourceIsNull_ThrowsException_Retur } [Fact] - public async Task ConvertAsync_ModelBindingDataSource_NotCosmosExtension_ReturnsUnhandled() + public async Task ConvertAsync_ModelBindingDataSource_NotCosmosExtension_ReturnsFailed() { var grpcModelBindingData = Helper.GetTestGrpcModelBindingData(GetTestBinaryData(), "anotherExtensions"); var context = new TestConverterContext(typeof(CosmosClient), grpcModelBindingData); var conversionResult = await _cosmosDBConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); + Assert.Equal(ConversionStatus.Failed, conversionResult.Status); } [Fact] @@ -339,7 +323,7 @@ public async Task ConvertAsync_ModelBindingDataContentType_Unsupported_ReturnsFa var conversionResult = await _cosmosDBConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); - Assert.Equal("Unexpected content-type. Currently only 'application/json' is supported.", conversionResult.Error.Message); + Assert.Equal("Unexpected content-type. Only 'application/json' is supported.", conversionResult.Error.Message); } [Fact] diff --git a/test/WorkerExtensionTests/EventGrid/EventGridBinaryDataConverterTests.cs b/test/WorkerExtensionTests/EventGrid/EventGridBinaryDataConverterTests.cs index 4b0a5cecf..42bf1a413 100644 --- a/test/WorkerExtensionTests/EventGrid/EventGridBinaryDataConverterTests.cs +++ b/test/WorkerExtensionTests/EventGrid/EventGridBinaryDataConverterTests.cs @@ -20,71 +20,64 @@ public EventGridBinaryDataConverterTests() } [Fact] - public async Task ConvertAsync_SourceAsObject_ReturnsUnhandled() + public async Task ConvertAsync_Source_IsNotAString_ReturnsFailed() { var context = new TestConverterContext(typeof(BinaryData), new object()); var conversionResult = await _eventGridConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Equal("Context source must be a non-null string", conversionResult.Error.Message); } [Fact] - public async Task ConvertAsync_Returns_Success() + public async Task ConvertAsync_UnsupportedTargetType_ReturnsUnhandled() { - var context = new TestConverterContext(typeof(BinaryData), "{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"lol test\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"some song\"}}"); - - var conversionResult = await _eventGridConverter.ConvertAsync(context); - - Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); - Assert.True(conversionResult.Value is BinaryData); - } - - [Fact] - public async Task ConvertAsync_Returns_Unhandled_For_Unsupported_Type() - { - var context = new TestConverterContext(typeof(string), "{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"lol test\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"some song\"}}"); + var context = new TestConverterContext(typeof(string), ""); var conversionResult = await _eventGridConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); } + [Fact] - public async Task ConvertAsync_SourceAsObject_BinaryDataCollectible_ReturnsUnhandled() + public async Task ConvertAsync_InvalidJson_ThrowsJsonException_ReturnsFailed() { - var context = new TestConverterContext(typeof(BinaryData[]), new object()); + var context = new TestConverterContext(typeof(BinaryData[]), @"{""invalid"" :json""}"); var conversionResult = await _eventGridConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Contains("Binding parameters to complex objects uses JSON serialization", conversionResult.Error.Message); } [Fact] - public async Task ConvertAsync_BinaryDataCollectible_Returns_Success() + public async Task ConvertAsync_SingleBinaryData_ReturnsSuccess() { - var context = new TestConverterContext(typeof(BinaryData[]), "[{\"specversion\":\"1.0\",\"id\":\"b85d631a-101e-005a-02f2-cee7aa06f148\",\"type\":\"zohan.music.request\",\"source\":\"https://zohan.dev/music/\",\"subject\":\"zohan/music/requests/4322\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"Gerardo\",\"song\":\"Rico Suave\"}},{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"life is very lit\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"life is lit\"}}]"); + var context = new TestConverterContext(typeof(BinaryData), EventGridTestHelper.GetEventGridJsonData()); var conversionResult = await _eventGridConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); - Assert.True(conversionResult.Value is BinaryData[]); - Assert.Equal(2, ((BinaryData[])conversionResult.Value).Length); + Assert.True(conversionResult.Value is BinaryData); } [Fact] - public async Task ConvertAsync_BinaryDataCollectible_Returns_Unhandled_For_Unsupported_Type() + public async Task ConvertAsync_BinaryDataArray_ReturnsSuccess() { - var context = new TestConverterContext(typeof(string), "[{\"specversion\":\"1.0\",\"id\":\"b85d631a-101e-005a-02f2-cee7aa06f148\",\"type\":\"zohan.music.request\",\"source\":\"https://zohan.dev/music/\",\"subject\":\"zohan/music/requests/4322\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"Gerardo\",\"song\":\"Rico Suave\"}},{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"life is very lit\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"life is lit\"}}]"); + var context = new TestConverterContext(typeof(BinaryData[]), EventGridTestHelper.GetEventGridJsonDataArray()); var conversionResult = await _eventGridConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); + Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); + Assert.True(conversionResult.Value is BinaryData[]); + Assert.Equal(2, ((BinaryData[])conversionResult.Value).Length); } [Fact] - public async Task ConvertAsync_SingleElement_Returns_Success() + public async Task ConvertAsync_BinaryDataArray_SingleElement_ReturnsSuccess() { - var context = new TestConverterContext(typeof(BinaryData[]), "[{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"lol test\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"some song\"}}]"); + var context = new TestConverterContext(typeof(BinaryData[]), $"[{EventGridTestHelper.GetEventGridJsonData()}]"); var conversionResult = await _eventGridConverter.ConvertAsync(context); diff --git a/test/WorkerExtensionTests/EventGrid/EventGridCloudEventConverterTests.cs b/test/WorkerExtensionTests/EventGrid/EventGridCloudEventConverterTests.cs index 16402067f..c1a0d985f 100644 --- a/test/WorkerExtensionTests/EventGrid/EventGridCloudEventConverterTests.cs +++ b/test/WorkerExtensionTests/EventGrid/EventGridCloudEventConverterTests.cs @@ -1,10 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. -using System; using System.Threading.Tasks; using Azure.Messaging; -using Azure.Messaging.EventGrid; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Converters; using Microsoft.Azure.Functions.Worker.Extensions.EventGrid.TypeConverters; @@ -21,35 +19,24 @@ public class EventGridCloudEventConverterTests public EventGridCloudEventConverterTests() { var host = new HostBuilder().ConfigureFunctionsWorkerDefaults((WorkerOptions options) => { }).Build(); - _eventGridConverter = new EventGridCloudEventConverter(); } [Fact] - public async Task ConvertAsync_SourceAsObject_ReturnsFailed() + public async Task ConvertAsync_Source_IsNotAString_ReturnsFailed() { var context = new TestConverterContext(typeof(CloudEvent), new object()); var conversionResult = await _eventGridConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Equal("Context source must be a non-null string", conversionResult.Error.Message); } [Fact] - public async Task ConvertAsync_Returns_Success() - { - var context = new TestConverterContext(typeof(CloudEvent), "{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"lol test\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"some song\"}}"); - - var conversionResult = await _eventGridConverter.ConvertAsync(context); - - Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); - Assert.True(conversionResult.Value is CloudEvent); - } - - [Fact] - public async Task ConvertAsync_Returns_Unhandled_For_Unsupported_Type() + public async Task ConvertAsync_UnsupportedTargetType_ReturnsUnhandled() { - var context = new TestConverterContext(typeof(string), "{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"lol test\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"some song\"}}"); + var context = new TestConverterContext(typeof(string), ""); var conversionResult = await _eventGridConverter.ConvertAsync(context); @@ -57,41 +44,44 @@ public async Task ConvertAsync_Returns_Unhandled_For_Unsupported_Type() } [Fact] - public async Task ConvertAsync_SourceAsObject_CloudEventCollectible_ReturnsFailed() + public async Task ConvertAsync_InvalidJson_ThrowsJsonException_ReturnsFailed() { - var context = new TestConverterContext(typeof(CloudEvent[]), new object()); + var context = new TestConverterContext(typeof(CloudEvent[]), @"{""invalid"" :json""}"); var conversionResult = await _eventGridConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Contains("Binding parameters to complex objects uses JSON serialization", conversionResult.Error.Message); } [Fact] - public async Task ConvertAsync_CloudEventCollectible_Returns_Success() + public async Task ConvertAsync_SingleCloudEvent_ReturnsSuccess() { - var context = new TestConverterContext(typeof(CloudEvent[]), "[{\"specversion\":\"1.0\",\"id\":\"b85d631a-101e-005a-02f2-cee7aa06f148\",\"type\":\"zohan.music.request\",\"source\":\"https://zohan.dev/music/\",\"subject\":\"zohan/music/requests/4322\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"Gerardo\",\"song\":\"Rico Suave\"}},{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"life is very lit\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"life is lit\"}}]"); + var context = new TestConverterContext(typeof(CloudEvent), EventGridTestHelper.GetEventGridJsonData()); var conversionResult = await _eventGridConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); - Assert.True(conversionResult.Value is CloudEvent[]); - Assert.Equal(2, ((CloudEvent[])conversionResult.Value).Length); + Assert.True(conversionResult.Value is CloudEvent); } + [Fact] - public async Task ConvertAsync_CloudEventCollectible_Returns_Unhandled_For_Unsupported_Type() + public async Task ConvertAsync_CloudEventArray_ReturnsSuccess() { - var context = new TestConverterContext(typeof(string), "[{\"specversion\":\"1.0\",\"id\":\"b85d631a-101e-005a-02f2-cee7aa06f148\",\"type\":\"zohan.music.request\",\"source\":\"https://zohan.dev/music/\",\"subject\":\"zohan/music/requests/4322\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"Gerardo\",\"song\":\"Rico Suave\"}},{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"life is very lit\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"life is lit\"}}]"); + var context = new TestConverterContext(typeof(CloudEvent[]), EventGridTestHelper.GetEventGridJsonDataArray()); var conversionResult = await _eventGridConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); + Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); + Assert.True(conversionResult.Value is CloudEvent[]); + Assert.Equal(2, ((CloudEvent[])conversionResult.Value).Length); } [Fact] - public async Task ConvertAsync_SingleElement_Returns_Success() + public async Task ConvertAsync_CloudEventArray_SingleElement_ReturnsSuccess() { - var context = new TestConverterContext(typeof(CloudEvent[]), "[{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"lol test\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"some song\"}}]"); + var context = new TestConverterContext(typeof(CloudEvent[]), $"[{EventGridTestHelper.GetEventGridJsonData()}]"); var conversionResult = await _eventGridConverter.ConvertAsync(context); diff --git a/test/WorkerExtensionTests/EventGrid/EventGridEventConverterTests.cs b/test/WorkerExtensionTests/EventGrid/EventGridEventConverterTests.cs index d5ccca5aa..aa5306ef5 100644 --- a/test/WorkerExtensionTests/EventGrid/EventGridEventConverterTests.cs +++ b/test/WorkerExtensionTests/EventGrid/EventGridEventConverterTests.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. -using System; using System.Threading.Tasks; using Azure.Messaging.EventGrid; using Microsoft.Azure.Functions.Worker; @@ -25,30 +24,20 @@ public EventGridEventConverterTests() } [Fact] - public async Task ConvertAsync_SourceAsObject_ReturnsUnhandled() + public async Task ConvertAsync_Source_IsNotAString_ReturnsUnhandled() { var context = new TestConverterContext(typeof(EventGridEvent), new object()); var conversionResult = await _eventGridConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Equal("Context source must be a non-null string", conversionResult.Error.Message); } [Fact] - public async Task ConvertAsync_Returns_Success() + public async Task ConvertAsync_UnsupportedTargetType_ReturnsUnhandled() { - var context = new TestConverterContext(typeof(EventGridEvent), "{\"id\":\"'1\",\"topic\":\"hello\",\"subject\":\"yoursubject\",\"eventType\":\"yourEventType\",\"eventTime\":\"2018-01-23T17:02:19.6069787Z\",\"data\":\"test\",\"dataVersion\":\"test\"}"); - - var conversionResult = await _eventGridConverter.ConvertAsync(context); - - Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); - Assert.True(conversionResult.Value is EventGridEvent); - } - - [Fact] - public async Task ConvertAsync_Returns_Unhandled_For_Unsupported_Type() - { - var context = new TestConverterContext(typeof(string), "{\"id\":\"'1\",\"topic\":\"hello\",\"subject\":\"yoursubject\",\"eventType\":\"yourEventType\",\"eventTime\":\"2018-01-23T17:02:19.6069787Z\",\"data\":\"test\",\"dataVersion\":\"test\"}"); + var context = new TestConverterContext(typeof(string), ""); var conversionResult = await _eventGridConverter.ConvertAsync(context); @@ -56,55 +45,48 @@ public async Task ConvertAsync_Returns_Unhandled_For_Unsupported_Type() } [Fact] - public async Task ConvertAsync_Returns_Failed_Bad_Source() + public async Task ConvertAsync_InvalidJson_ThrowsJsonException_ReturnsFailed() { - var context = new TestConverterContext(typeof(EventGridEvent), "{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"lol test\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"some song\"}}"); + var context = new TestConverterContext(typeof(EventGridEvent), @"{""invalid"" :json""}"); var conversionResult = await _eventGridConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Contains("Binding parameters to complex objects uses JSON serialization", conversionResult.Error.Message); } [Fact] - public async Task ConvertAsync__EventGridCollectible_SourceAsObject_ReturnsUnhandled() + public async Task ConvertAsync_InvalidData_Throws_ReturnsFailed() { - var context = new TestConverterContext(typeof(EventGridEvent[]), new object()); + var context = new TestConverterContext(typeof(EventGridEvent), EventGridTestHelper.GetEventGridJsonData()); var conversionResult = await _eventGridConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Equal("Value cannot be null. (Parameter 'EventType')", conversionResult.Error.Message); } [Fact] - public async Task ConvertAsync__EventGridCollectible_Returns_Success() + public async Task ConvertAsync_SingleEventGridEvent_ReturnsSuccess() { - var context = new TestConverterContext(typeof(EventGridEvent[]), "[{\"id\":\"'1\",\"topic\":\"hello\",\"subject\":\"yoursubject\",\"eventType\":\"yourEventType\",\"eventTime\":\"2018-01-23T17:02:19.6069787Z\",\"data\":\"test\",\"dataVersion\":\"test\"},{\"id\":\"'1\",\"topic\":\"hello\",\"subject\":\"yoursubject\",\"eventType\":\"yourEventType\",\"eventTime\":\"2018-01-23T17:02:19.6069787Z\",\"data\":\"lmao\",\"dataVersion\":\"test\"}]"); + var context = new TestConverterContext(typeof(EventGridEvent), EventGridTestHelper.GetEventGridEventJsonData()); var conversionResult = await _eventGridConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); - Assert.True(conversionResult.Value is EventGridEvent[]); - Assert.Equal(2, ((EventGridEvent[])conversionResult.Value).Length); - } - - [Fact] - public async Task ConvertAsync_EventGridCollectible_Returns_Unhandled_For_Unsupported_Type() - { - var context = new TestConverterContext(typeof(string), "{\"id\":\"'1\",\"topic\":\"hello\",\"subject\":\"yoursubject\",\"eventType\":\"yourEventType\",\"eventTime\":\"2018-01-23T17:02:19.6069787Z\",\"data\":\"test\",\"dataVersion\":\"test\"}"); - - var conversionResult = await _eventGridConverter.ConvertAsync(context); - - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); + Assert.True(conversionResult.Value is EventGridEvent); } [Fact] - public async Task ConvertAsync__EventGridCollectible_Returns_Failed_Bad_Source() + public async Task ConvertAsync_EventGridArray_ReturnsSuccess() { - var context = new TestConverterContext(typeof(EventGridEvent[]), "{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"lol test\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"some song\"}}"); + var context = new TestConverterContext(typeof(EventGridEvent[]), EventGridTestHelper.GetEventGridEventJsonDataArray()); var conversionResult = await _eventGridConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); + Assert.True(conversionResult.Value is EventGridEvent[]); + Assert.Equal(2, ((EventGridEvent[])conversionResult.Value).Length); } } } diff --git a/test/WorkerExtensionTests/EventGrid/EventGridStringArrayConverterTests.cs b/test/WorkerExtensionTests/EventGrid/EventGridStringArrayConverterTests.cs index 574c1ef94..1ed4d1716 100644 --- a/test/WorkerExtensionTests/EventGrid/EventGridStringArrayConverterTests.cs +++ b/test/WorkerExtensionTests/EventGrid/EventGridStringArrayConverterTests.cs @@ -19,41 +19,53 @@ public EventGridStringArrayConverterTests() } [Fact] - public async Task ConvertAsync_SourceAsObject_ReturnsUnhandled() + public async Task ConvertAsync_Source_IsNotAString_ReturnsUnhandled() { var context = new TestConverterContext(typeof(string[]), new object()); var conversionResult = await _eventGridConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Equal("Context source must be a non-null string", conversionResult.Error.Message); } [Fact] - public async Task ConvertAsync_Returns_Success() + public async Task ConvertAsync_UnsupportedTargetType_ReturnsUnhandled() { - var context = new TestConverterContext(typeof(string[]), "[{\"specversion\":\"1.0\",\"id\":\"b85d631a-101e-005a-02f2-cee7aa06f148\",\"type\":\"zohan.music.request\",\"source\":\"https://zohan.dev/music/\",\"subject\":\"zohan/music/requests/4322\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"Gerardo\",\"song\":\"Rico Suave\"}},{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"life is very lit\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"life is lit\"}}]"); + var context = new TestConverterContext(typeof(byte[]), ""); var conversionResult = await _eventGridConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); - Assert.True(conversionResult.Value is string[]); - Assert.Equal(2, ((string[])conversionResult.Value).Length); + Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); } [Fact] - public async Task ConvertAsync_Returns_Unhandled_For_Unsupported_Type() + public async Task ConvertAsync_InvalidJson_ThrowsJsonException_ReturnsFailed() { - var context = new TestConverterContext(typeof(string), "[{\"specversion\":\"1.0\",\"id\":\"b85d631a-101e-005a-02f2-cee7aa06f148\",\"type\":\"zohan.music.request\",\"source\":\"https://zohan.dev/music/\",\"subject\":\"zohan/music/requests/4322\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"Gerardo\",\"song\":\"Rico Suave\"}},{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"life is very lit\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"life is lit\"}}]"); + var context = new TestConverterContext(typeof(string[]), @"{""invalid"" :json""}"); var conversionResult = await _eventGridConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); + Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Contains("Binding parameters to complex objects uses JSON serialization", conversionResult.Error.Message); + } + + [Fact] + public async Task ConvertAsync_StringArray_ReturnsSuccess() + { + var context = new TestConverterContext(typeof(string[]), EventGridTestHelper.GetEventGridJsonDataArray()); + + var conversionResult = await _eventGridConverter.ConvertAsync(context); + + Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); + Assert.True(conversionResult.Value is string[]); + Assert.Equal(2, ((string[])conversionResult.Value).Length); } [Fact] - public async Task ConvertAsync_SingleElement_Returns_Success() + public async Task ConvertAsync_StringArray_SingleElement_Returns_Success() { - var context = new TestConverterContext(typeof(string[]), "[{\"specversion\":\"1.0\",\"id\":\"2947780a-356b-c5a5-feb4-f5261fb2f155\",\"type\":\"test\",\"source\":\"moo\",\"subject\":\"lol test\",\"time\":\"2020-09-14T10:00:00Z\",\"data\":{\"artist\":\"wooo\",\"song\":\"some song\"}}]"); + var context = new TestConverterContext(typeof(string[]), $"[{EventGridTestHelper.GetEventGridJsonData()}]"); var conversionResult = await _eventGridConverter.ConvertAsync(context); diff --git a/test/WorkerExtensionTests/EventGrid/EventGridTestHelper.cs b/test/WorkerExtensionTests/EventGrid/EventGridTestHelper.cs new file mode 100644 index 000000000..72931d6f3 --- /dev/null +++ b/test/WorkerExtensionTests/EventGrid/EventGridTestHelper.cs @@ -0,0 +1,54 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +using System; +using Google.Protobuf; +using Microsoft.Azure.Functions.Worker.Grpc.Messages; + +namespace Microsoft.Azure.Functions.WorkerExtension.Tests +{ + internal static class EventGridTestHelper + { + public static string GetEventGridJsonData(string id = "2947780a-356b-c5a5-feb4-f5261fb2f155", string song = "Vampire") + { + return $@"{{ + ""specversion"" : ""1.0"", + ""id"" : ""{id}"", + ""type"" : ""UnitTestData"", + ""source"" : ""UnitTest"", + ""subject"" : ""Song"", + ""time"" : ""2020-09-14T10:00:00Z"", + ""data"" : {{ ""artist"":""Olivia Rodrigo"",""song"":""{song}"" }} + }}"; + } + + public static string GetEventGridJsonDataArray() + { + return $@"[ + {GetEventGridJsonData("2947780a-356b-c5a5-feb4-f5261fb2f155", "Driver's License")}, + {GetEventGridJsonData("b85d631a-101e-005a-02f2-cee7aa06f148", "Deja Vu")} + ]"; + } + + public static string GetEventGridEventJsonData(string id = "2947780a-356b-c5a5-feb4-f5261fb2f155", string song = "Vampire") + { + return $@"{{ + ""id"" : ""{id}"", + ""topic"" : ""UnitTestData"", + ""subject"" : ""Song"", + ""eventType"" : ""MyEvent"", + ""eventTime"" : ""2020-09-14T10:00:00Z"", + ""data"" : {{ ""artist"":""Olivia Rodrigo"",""song"":""{song}"" }}, + ""dataVersion"" : ""1.0"" + }}"; + } + + public static string GetEventGridEventJsonDataArray() + { + return $@"[ + {GetEventGridEventJsonData("2947780a-356b-c5a5-feb4-f5261fb2f155", "Driver's License")}, + {GetEventGridEventJsonData("b85d631a-101e-005a-02f2-cee7aa06f148", "Deja Vu")} + ]"; + } + } +} \ No newline at end of file diff --git a/test/WorkerExtensionTests/EventHubs/EventDataConverterTests.cs b/test/WorkerExtensionTests/EventHubs/EventDataConverterTests.cs index 00b2ecc13..1be6d4237 100644 --- a/test/WorkerExtensionTests/EventHubs/EventDataConverterTests.cs +++ b/test/WorkerExtensionTests/EventHubs/EventDataConverterTests.cs @@ -86,7 +86,7 @@ public async Task ConvertAsync_ReturnsFailure_WrongContentType() Assert.Equal(ConversionStatus.Failed, result.Status); var output = result.Value as EventData; Assert.Null(output); - Assert.IsType(result.Error); + Assert.Equal("Unexpected content-type. Only 'application/octet-stream' is supported.", result.Error.Message); } [Fact] @@ -113,7 +113,7 @@ public async Task ConvertAsync_Batch_ReturnsFailure_WrongContentType() Assert.Equal(ConversionStatus.Failed, result.Status); var output = result.Value as EventData[]; Assert.Null(output); - Assert.IsType(result.Error); + Assert.Equal("Unexpected content-type. Only 'application/octet-stream' is supported.", result.Error.Message); } [Fact] @@ -135,7 +135,7 @@ public async Task ConvertAsync_ReturnsFailure_WrongSource() Assert.Equal(ConversionStatus.Failed, result.Status); var output = result.Value as EventData; Assert.Null(output); - Assert.IsType(result.Error); + Assert.Equal("Unexpected binding source. Only 'AzureEventHubsEventData' is supported.", result.Error.Message); } [Fact] @@ -162,7 +162,7 @@ public async Task ConvertAsync_Batch_ReturnsFailure_WrongSource() Assert.Equal(ConversionStatus.Failed, result.Status); var output = result.Value as EventData[]; Assert.Null(output); - Assert.IsType(result.Error); + Assert.Equal("Unexpected binding source. Only 'AzureEventHubsEventData' is supported.", result.Error.Message); } private static void AssertEventData(EventData output) diff --git a/test/WorkerExtensionTests/Queue/QueueMessageBinaryDataConverterTests.cs b/test/WorkerExtensionTests/Queue/QueueMessageBinaryDataConverterTests.cs index e1eca7bc1..9ed29f19b 100644 --- a/test/WorkerExtensionTests/Queue/QueueMessageBinaryDataConverterTests.cs +++ b/test/WorkerExtensionTests/Queue/QueueMessageBinaryDataConverterTests.cs @@ -55,7 +55,7 @@ public async Task ConvertAsync_ModelBindingData_Null_ReturnsUnhandled() } [Fact] - public async Task ConvertAsync_ModelBindingDataSource_NotQueueStorageExtension_ReturnsUnhandled() + public async Task ConvertAsync_ModelBindingDataSource_NotQueueStorageExtension_ReturnsFailed() { var grpcModelBindingData = QueuesTestHelper.GetTestGrpcModelBindingData(source: "anotherExtensions"); var context = new TestConverterContext(typeof(BinaryData), grpcModelBindingData); @@ -63,7 +63,8 @@ public async Task ConvertAsync_ModelBindingDataSource_NotQueueStorageExtension_R var queueMessageConverter = new QueueMessageBinaryDataConverter(); var conversionResult = await queueMessageConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); + Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Equal("Unexpected binding source. Only 'AzureStorageQueues' is supported.", conversionResult.Error.Message); } [Fact] @@ -76,7 +77,7 @@ public async Task ConvertAsync_ModelBindingDataContentType_Unsupported_ReturnsFa var conversionResult = await queueMessageConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); - Assert.Equal("Unexpected content-type. Currently only 'application/json' is supported.", conversionResult.Error.Message); + Assert.Equal("Unexpected content-type. Only 'application/json' is supported.", conversionResult.Error.Message); } } } diff --git a/test/WorkerExtensionTests/Queue/QueueMessageConverterTests.cs b/test/WorkerExtensionTests/Queue/QueueMessageConverterTests.cs index 5e57974ce..0c547e287 100644 --- a/test/WorkerExtensionTests/Queue/QueueMessageConverterTests.cs +++ b/test/WorkerExtensionTests/Queue/QueueMessageConverterTests.cs @@ -56,7 +56,7 @@ public async Task ConvertAsync_ModelBindingData_Null_ReturnsUnhandled() } [Fact] - public async Task ConvertAsync_ModelBindingDataSource_NotQueueStorageExtension_ReturnsUnhandled() + public async Task ConvertAsync_ModelBindingDataSource_NotQueueStorageExtension_ReturnsFailed() { var grpcModelBindingData = QueuesTestHelper.GetTestGrpcModelBindingData(source: "anotherExtensions"); var context = new TestConverterContext(typeof(QueueMessage), grpcModelBindingData); @@ -64,7 +64,8 @@ public async Task ConvertAsync_ModelBindingDataSource_NotQueueStorageExtension_R var queueMessageConverter = new QueueMessageConverter(); var conversionResult = await queueMessageConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); + Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Equal("Unexpected binding source. Only 'AzureStorageQueues' is supported.", conversionResult.Error.Message); } [Fact] @@ -77,7 +78,7 @@ public async Task ConvertAsync_ModelBindingDataContentType_Unsupported_ReturnsFa var conversionResult = await queueMessageConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); - Assert.Equal("Unexpected content-type. Currently only 'application/json' is supported.", conversionResult.Error.Message); + Assert.Equal("Unexpected content-type. Only 'application/json' is supported.", conversionResult.Error.Message); } } } diff --git a/test/WorkerExtensionTests/ServiceBus/ServiceBusReceivedMessageConverterTests.cs b/test/WorkerExtensionTests/ServiceBus/ServiceBusReceivedMessageConverterTests.cs index 23455a4a7..ad1c79e92 100644 --- a/test/WorkerExtensionTests/ServiceBus/ServiceBusReceivedMessageConverterTests.cs +++ b/test/WorkerExtensionTests/ServiceBus/ServiceBusReceivedMessageConverterTests.cs @@ -89,7 +89,7 @@ public async Task ConvertAsync_ReturnsFailure_WrongContentType() Assert.Equal(ConversionStatus.Failed, result.Status); var output = result.Value as ServiceBusReceivedMessage; Assert.Null(output); - Assert.IsType(result.Error); + Assert.Equal("Unexpected content-type. Only 'application/octet-stream' is supported.", result.Error.Message); } [Fact] @@ -117,7 +117,7 @@ public async Task ConvertAsync_Batch_ReturnsFailure_WrongContentType() Assert.Equal(ConversionStatus.Failed, result.Status); var output = result.Value as ServiceBusReceivedMessage[]; Assert.Null(output); - Assert.IsType(result.Error); + Assert.Equal("Unexpected content-type. Only 'application/octet-stream' is supported.", result.Error.Message); } [Fact] @@ -140,7 +140,7 @@ public async Task ConvertAsync_ReturnsFailure_WrongSource() Assert.Equal(ConversionStatus.Failed, result.Status); var output = result.Value as ServiceBusReceivedMessage; Assert.Null(output); - Assert.IsType(result.Error); + Assert.Equal("Unexpected binding source. Only 'AzureServiceBusReceivedMessage' is supported.", result.Error.Message); } [Fact] @@ -168,7 +168,7 @@ public async Task ConvertAsync_Batch_ReturnsFailure_WrongSource() Assert.Equal(ConversionStatus.Failed, result.Status); var output = result.Value as ServiceBusReceivedMessage[]; Assert.Null(output); - Assert.IsType(result.Error); + Assert.Equal("Unexpected binding source. Only 'AzureServiceBusReceivedMessage' is supported.", result.Error.Message); } private static void AssertReceivedMessage(ServiceBusReceivedMessage output, Guid lockToken) diff --git a/test/WorkerExtensionTests/Table/TableClientConverterTests.cs b/test/WorkerExtensionTests/Table/TableClientConverterTests.cs index c3f48c2fa..a85bcdb78 100644 --- a/test/WorkerExtensionTests/Table/TableClientConverterTests.cs +++ b/test/WorkerExtensionTests/Table/TableClientConverterTests.cs @@ -4,15 +4,12 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Azure; using Azure.Data.Tables; -using Google.Protobuf; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Extensions.Tables.Config; using Microsoft.Azure.Functions.Worker.Extensions.Tables; using Microsoft.Azure.Functions.Worker.Extensions.Tables.TypeConverters; using Microsoft.Azure.Functions.Worker.Converters; -using Microsoft.Azure.Functions.Worker.Grpc.Messages; using Microsoft.Azure.Functions.Worker.Tests.Converters; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -49,20 +46,9 @@ public TableClientConverterTests() } [Fact] - public async Task ConvertAsync_SourceAsObject_ReturnsUnhandled() + public async Task ConvertAsync_SingleTableClient_ReturnsSuccess() { - var context = new TestConverterContext(typeof(string), new object()); - - var conversionResult = await _tableConverter.ConvertAsync(context); - - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); - } - - - [Fact] - public async Task ConvertAsync_SourceAsModelBindingData_ReturnsSuccess() - { - object source = GetTestGrpcModelBindingData(GetTableClientBinaryData()); + object source = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetTableClientBinaryData()); var result = new Mock(); var context = new TestConverterContext(typeof(TableClient), source); @@ -73,62 +59,23 @@ public async Task ConvertAsync_SourceAsModelBindingData_ReturnsSuccess() var conversionResult = await _tableConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); - } [Fact] - public async Task ConvertAsync_SourceAsCollectionModelBindingData_ReturnsSuccess() + public async Task ConvertAsync_CollectionTableClient_ReturnsUnhandled() { - object source = GetTestGrpcModelBindingData(GetTableEntityBinaryData()); - var context = new TestConverterContext(typeof(IEnumerable), source); - var mockResponse = new Mock(); - var tableClient = new Mock(); - - tableClient - .Setup(c => c.GetEntityAsync(It.IsAny(), It.IsAny(), null, default)) - .ReturnsAsync(Response.FromValue(new TableEntity(It.IsAny(), It.IsAny()), mockResponse.Object)); - - _mockTableServiceClient - .Setup(c => c.GetTableClient(Constants.TableName)) - .Returns(tableClient.Object); - - var expectedOutput = Page.FromValues(new List{ new TableEntity("partitionKey", "rowKey") }, continuationToken: null, mockResponse.Object); - - tableClient - .Setup(c => c.QueryAsync(It.IsAny(), null, null, default)) - .Returns(AsyncPageable.FromPages(new List> { expectedOutput })); + object source = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetTableEntityBinaryData()); + var context = new TestConverterContext(typeof(IEnumerable), source); var conversionResult = await _tableConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); } - - - [Fact] - public async Task ConvertAsync_SourceAsCollectionModelBindingData_TableEntity_ReturnsSuccess() - { - object source = GetTestGrpcModelBindingData(GetTableEntityBinaryData()); - var context = new TestConverterContext(typeof(TableEntity), source); - var mockResponse = new Mock(); - var tableClient = new Mock(); - - tableClient - .Setup(c => c.GetEntityAsync(It.IsAny(), It.IsAny(), null, default)) - .ReturnsAsync(Response.FromValue(new TableEntity(It.IsAny(), It.IsAny()), mockResponse.Object)); - - _mockTableServiceClient - .Setup(c => c.GetTableClient(Constants.TableName)) - .Returns(tableClient.Object); - - var conversionResult = await _tableConverter.ConvertAsync(context); - - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); - } [Fact] - public async Task ConvertAsync_SourceAsModelBindingData_ReturnsFailed() + public async Task ConvertAsync_GetTableClient_Throws_ReturnsFailed() { - object source = GetTestGrpcModelBindingData(GetTableClientBinaryData()); + object source = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetTableClientBinaryData()); var result = new Mock(); var context = new TestConverterContext(typeof(TableClient), source); @@ -142,9 +89,9 @@ public async Task ConvertAsync_SourceAsModelBindingData_ReturnsFailed() } [Fact] - public async Task ConvertAsync_WrongModelBindingData_ReturnsFailed() + public async Task ConvertAsync_InvalidModelBindingData_ReturnsFailed() { - object source = GetTestGrpcModelBindingData(GetWrongBinaryData()); + object source = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetWrongBinaryData()); var result = new Mock(); var context = new TestConverterContext(typeof(TableClient), source); @@ -177,86 +124,28 @@ public async Task ConvertAsync_ModelBindingData_Null_ReturnsUnhandled() Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); } - [Fact] // Should we fail if the result is ever null? - public async Task ConvertAsync_ResultIsNull_ReturnsUnhandled() - { - var grpcModelBindingData = GetTestGrpcModelBindingData(GetTableClientBinaryData()); - var context = new TestConverterContext(typeof(TableClient), grpcModelBindingData); - - _mockTableServiceClient - .Setup(c => c.GetTableClient(Constants.TableName)) - .Returns((TableClient)null); - - var conversionResult = await _tableConverter.ConvertAsync(context); - - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); - } - [Fact] - public async Task ConvertAsync_ModelBindingDataSource_NotCosmosExtension_ReturnsUnhandled() + public async Task ConvertAsync_ModelBindingDataSource_NotTableExtension_ReturnsUnhandled() { - var grpcModelBindingData = GetTestGrpcModelBindingData(GetTableClientBinaryData(), source: "anotherExtensions"); + var grpcModelBindingData = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetTableClientBinaryData(), source: "anotherExtensions"); var context = new TestConverterContext(typeof(TableClient), grpcModelBindingData); var conversionResult = await _tableConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); + Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Equal("Unexpected binding source. Only 'AzureStorageTables' is supported.", conversionResult.Error.Message); } [Fact] public async Task ConvertAsync_ModelBindingDataContentType_Unsupported_ReturnsFailed() { - var grpcModelBindingData = GetTestGrpcModelBindingData(GetTableClientBinaryData(), contentType: "binary"); + var grpcModelBindingData = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetTableClientBinaryData(), contentType: "binary"); var context = new TestConverterContext(typeof(TableClient), grpcModelBindingData); var conversionResult = await _tableConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); - Assert.Equal("Unexpected content-type. Currently only 'application/json' is supported.", conversionResult.Error.Message); - } - - - private BinaryData GetWrongBinaryData() - { - return new BinaryData("{" + "\"Connection\" : \"Connection\"" + "}"); - } - - private BinaryData GetTableClientBinaryData() - { - return new BinaryData("{" + - "\"TableName\" : \"TableName\"" + - "}"); - } - - private BinaryData GetTableEntityBinaryData() - { - return new BinaryData("{" + - "\"Connection\" : \"Connection\"," + - "\"TableName\" : \"TableName\"," + - "\"PartitionKey\" : \"PartitionKey\"," + - "\"RowKey\" : \"RowKey\"" + - "}"); - } - - private BinaryData GetBadEntityBinaryData() - { - return new BinaryData("{" + - "\"Connection\" : \"Connection\"," + - "\"TableName\" : \"TableName\"," + - "\"PartitionKey\" : \"PartitionKey\"" + - "}"); - } - - - private GrpcModelBindingData GetTestGrpcModelBindingData(BinaryData binaryData, string source = "AzureStorageTables", string contentType = "application/json") - { - return new GrpcModelBindingData(new ModelBindingData() - { - Version = "1.0", - Source = "AzureStorageTables", - Content = ByteString.CopyFrom(binaryData), - ContentType = contentType - }); + Assert.Equal("Unexpected content-type. Only 'application/json' is supported.", conversionResult.Error.Message); } } } diff --git a/test/WorkerExtensionTests/Table/TableEntityConverterTests.cs b/test/WorkerExtensionTests/Table/TableEntityConverterTests.cs index 91f20b32a..2fec913e6 100644 --- a/test/WorkerExtensionTests/Table/TableEntityConverterTests.cs +++ b/test/WorkerExtensionTests/Table/TableEntityConverterTests.cs @@ -6,13 +6,11 @@ using System.Threading.Tasks; using Azure; using Azure.Data.Tables; -using Google.Protobuf; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Extensions.Tables.Config; using Microsoft.Azure.Functions.Worker.Extensions.Tables; using Microsoft.Azure.Functions.Worker.Extensions.Tables.TypeConverters; using Microsoft.Azure.Functions.Worker.Converters; -using Microsoft.Azure.Functions.Worker.Grpc.Messages; using Microsoft.Azure.Functions.Worker.Tests.Converters; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -49,94 +47,49 @@ public TableEntityConverterTests() } [Fact] - public async Task ConvertAsync_SourceAsObject_ReturnsUnhandled() + public async Task ConvertAsync_SingleTableEntity_ReturnsSuccess() { - var context = new TestConverterContext(typeof(string), new object()); - - var conversionResult = await _tableConverter.ConvertAsync(context); - - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); - } - - - [Fact] - public async Task ConvertAsync_SourceAsModelBindingData_ReturnsUnhandled() - { - object source = GetTestGrpcModelBindingData(GetTableClientBinaryData()); - var result = new Mock(); - var context = new TestConverterContext(typeof(TableClient), source); - - _mockTableServiceClient - .Setup(c => c.GetTableClient(Constants.TableName)) - .Returns((TableClient)result.Object); - - var conversionResult = await _tableConverter.ConvertAsync(context); - - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); - - } - - [Fact] - public async Task ConvertAsync_SourceAsCollectionModelBindingData_ReturnsSuccess() - { - object source = GetTestGrpcModelBindingData(GetTableEntityBinaryData()); - var context = new TestConverterContext(typeof(IEnumerable), source); + object source = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetTableEntityBinaryData()); + var context = new TestConverterContext(typeof(TableEntity), source); var mockResponse = new Mock(); var tableClient = new Mock(); tableClient - .Setup(c => c.GetEntityAsync(It.IsAny(), It.IsAny(), null, default)) - .ReturnsAsync(Response.FromValue(new TableEntity(It.IsAny(), It.IsAny()), mockResponse.Object)); + .Setup(c => c.GetEntityAsync(It.IsAny(), It.IsAny(), null, default)) + .ReturnsAsync(Response.FromValue(new TableEntity(It.IsAny(), It.IsAny()), mockResponse.Object)); _mockTableServiceClient .Setup(c => c.GetTableClient(Constants.TableName)) .Returns(tableClient.Object); - var expectedOutput = Page.FromValues(new List { new TableEntity("partitionKey", "rowKey") }, continuationToken: null, mockResponse.Object); - - tableClient - .Setup(c => c.QueryAsync(It.IsAny(), null, null, default)) - .Returns(AsyncPageable.FromPages(new List> { expectedOutput })); - var conversionResult = await _tableConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); + Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); + Assert.Equal(typeof(TableEntity), conversionResult.Value.GetType()); } - [Fact] - public async Task ConvertAsync_SourceAsCollectionModelBindingData_TableEntity_ReturnsSuccess() + public async Task ConvertAsync_CollectionTableEntity_ReturnsUnhandled() { - object source = GetTestGrpcModelBindingData(GetTableEntityBinaryData()); - var context = new TestConverterContext(typeof(TableEntity), source); - var mockResponse = new Mock(); - var tableClient = new Mock(); - - tableClient - .Setup(c => c.GetEntityAsync(It.IsAny(), It.IsAny(), null, default)) - .ReturnsAsync(Response.FromValue(new TableEntity(It.IsAny(), It.IsAny()), mockResponse.Object)); - - _mockTableServiceClient - .Setup(c => c.GetTableClient(Constants.TableName)) - .Returns(tableClient.Object); + object source = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetTableEntityBinaryData()); + var context = new TestConverterContext(typeof(IEnumerable), source); var conversionResult = await _tableConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); - Assert.Equal(typeof(TableEntity), conversionResult.Value.GetType()); + Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); } [Fact] - public async Task ConvertAsync_SourceAsCollectionModelBindingData_BadTableEntity_ReturnsSuccess() + public async Task ConvertAsync_BadTableEntity_ReturnsFailed() { - object source = GetTestGrpcModelBindingData(GetBadEntityBinaryData()); + object source = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetBadEntityBinaryData()); var context = new TestConverterContext(typeof(TableEntity), source); var mockResponse = new Mock(); var tableClient = new Mock(); tableClient - .Setup(c => c.GetEntityAsync(It.IsAny(), It.IsAny(), null, default)) - .ReturnsAsync(Response.FromValue(new TableEntity(It.IsAny(), It.IsAny()), mockResponse.Object)); + .Setup(c => c.GetEntityAsync(It.IsAny(), It.IsAny(), null, default)) + .ReturnsAsync(Response.FromValue(new TableEntity(It.IsAny(), It.IsAny()), mockResponse.Object)); _mockTableServiceClient .Setup(c => c.GetTableClient(Constants.TableName)) @@ -167,93 +120,28 @@ public async Task ConvertAsync_ModelBindingData_Null_ReturnsUnhandled() Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); } - [Fact] // Should we fail if the result is ever null? - public async Task ConvertAsync_ResultIsNull_ReturnsUnhandled() - { - var grpcModelBindingData = GetTestGrpcModelBindingData(GetTableEntityBinaryData()); - var context = new TestConverterContext(typeof(TableEntity), grpcModelBindingData); - - var tableClient = new Mock(); - var mockResponse = new Mock(); - - tableClient - .Setup(c => c.GetEntityAsync(It.IsAny(), It.IsAny(), null, default)) - .ReturnsAsync(Response.FromValue((TableEntity)null, mockResponse.Object)); - - _mockTableServiceClient - .Setup(c => c.GetTableClient(Constants.TableName)) - .Returns(tableClient.Object); - - var conversionResult = await _tableConverter.ConvertAsync(context); - - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); - } - [Fact] - public async Task ConvertAsync_ModelBindingDataSource_NotCosmosExtension_ReturnsUnhandled() + public async Task ConvertAsync_ModelBindingDataSource_NotTableExtension_ReturnsUnhandled() { - var grpcModelBindingData = GetTestGrpcModelBindingData(GetTableEntityBinaryData(), source: "anotherExtensions"); + var grpcModelBindingData = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetTableEntityBinaryData(), source: "anotherExtensions"); var context = new TestConverterContext(typeof(TableEntity), grpcModelBindingData); var conversionResult = await _tableConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); + Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Equal("Unexpected binding source. Only 'AzureStorageTables' is supported.", conversionResult.Error.Message); } [Fact] public async Task ConvertAsync_ModelBindingDataContentType_Unsupported_ReturnsFailed() { - var grpcModelBindingData = GetTestGrpcModelBindingData(GetTableEntityBinaryData(), contentType: "binary"); + var grpcModelBindingData = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetTableEntityBinaryData(), contentType: "binary"); var context = new TestConverterContext(typeof(TableEntity), grpcModelBindingData); var conversionResult = await _tableConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); - Assert.Equal("Unexpected content-type. Currently only 'application/json' is supported.", conversionResult.Error.Message); - } - - - private BinaryData GetWrongBinaryData() - { - return new BinaryData("{" + "\"Connection\" : \"Connection\"" + "}"); - } - - private BinaryData GetTableClientBinaryData() - { - return new BinaryData("{" + - "\"TableName\" : \"TableName\"" + - "}"); - } - - private BinaryData GetTableEntityBinaryData() - { - return new BinaryData("{" + - "\"Connection\" : \"Connection\"," + - "\"TableName\" : \"TableName\"," + - "\"PartitionKey\" : \"PartitionKey\"," + - "\"RowKey\" : \"RowKey\"" + - "}"); - } - - private BinaryData GetBadEntityBinaryData() - { - return new BinaryData("{" + - "\"Connection\" : \"Connection\"," + - "\"TableName\" : \"TableName\"," + - "\"PartitionKey\" : \"PartitionKey\"" + - "}"); - } - - - private GrpcModelBindingData GetTestGrpcModelBindingData(BinaryData binaryData, string source = "AzureStorageTables", string contentType = "application/json") - { - return new GrpcModelBindingData(new ModelBindingData() - { - Version = "1.0", - Source = source, - Content = ByteString.CopyFrom(binaryData), - ContentType = contentType - }); + Assert.Equal("Unexpected content-type. Only 'application/json' is supported.", conversionResult.Error.Message); } } } diff --git a/test/WorkerExtensionTests/Table/TableEntityEnumerableConverterTests.cs b/test/WorkerExtensionTests/Table/TableEntityEnumerableConverterTests.cs index d179df8c7..6a3d78425 100644 --- a/test/WorkerExtensionTests/Table/TableEntityEnumerableConverterTests.cs +++ b/test/WorkerExtensionTests/Table/TableEntityEnumerableConverterTests.cs @@ -49,44 +49,28 @@ public TableEntityEnumerableConverterTests() } [Fact] - public async Task ConvertAsync_SourceAsObject_ReturnsUnhandled() + public async Task ConvertAsync_SingleTableEntity_ReturnsUnhandled() { - var context = new TestConverterContext(typeof(string), new object()); - - var conversionResult = await _tableConverter.ConvertAsync(context); - - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); - } - - - [Fact] - public async Task ConvertAsync_SourceAsModelBindingData_ReturnsUnhandled() - { - object source = GetTestGrpcModelBindingData(GetTableClientBinaryData()); + object source = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetTableClientBinaryData()); var result = new Mock(); - var context = new TestConverterContext(typeof(TableClient), source); - - _mockTableServiceClient - .Setup(c => c.GetTableClient(Constants.TableName)) - .Returns((TableClient)result.Object); + var context = new TestConverterContext(typeof(TableEntity), source); var conversionResult = await _tableConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); - } [Fact] - public async Task ConvertAsync_SourceAsCollectionModelBindingData_ReturnsSuccess() + public async Task ConvertAsync_CollectionTableEntity_ReturnsSuccess() { - object source = GetTestGrpcModelBindingData(GetTableEntityBinaryData()); + object source = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetTableEntityBinaryData()); var context = new TestConverterContext(typeof(IEnumerable), source); var mockResponse = new Mock(); var tableClient = new Mock(); tableClient - .Setup(c => c.GetEntityAsync(It.IsAny(), It.IsAny(), null, default)) - .ReturnsAsync(Response.FromValue(new TableEntity(It.IsAny(), It.IsAny()), mockResponse.Object)); + .Setup(c => c.GetEntityAsync(It.IsAny(), It.IsAny(), null, default)) + .ReturnsAsync(Response.FromValue(new TableEntity(It.IsAny(), It.IsAny()), mockResponse.Object)); _mockTableServiceClient .Setup(c => c.GetTableClient(Constants.TableName)) @@ -103,39 +87,17 @@ public async Task ConvertAsync_SourceAsCollectionModelBindingData_ReturnsSuccess Assert.Equal(ConversionStatus.Succeeded, conversionResult.Status); } - [Fact] - public async Task ConvertAsync_SourceAsCollectionModelBindingData_TableEntity_ReturnsSuccess() + public async Task ConvertAsync_BadTableEntity_ReturnsFailed() { - object source = GetTestGrpcModelBindingData(GetTableEntityBinaryData()); - var context = new TestConverterContext(typeof(TableEntity), source); - var mockResponse = new Mock(); - var tableClient = new Mock(); - - tableClient - .Setup(c => c.GetEntityAsync(It.IsAny(), It.IsAny(), null, default)) - .ReturnsAsync(Response.FromValue(new TableEntity(It.IsAny(), It.IsAny()), mockResponse.Object)); - - _mockTableServiceClient - .Setup(c => c.GetTableClient(Constants.TableName)) - .Returns(tableClient.Object); - - var conversionResult = await _tableConverter.ConvertAsync(context); - - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); - } - - [Fact] - public async Task ConvertAsync_SourceAsCollectionModelBindingData_BadTableEntity_ReturnsSuccess() - { - object source = GetTestGrpcModelBindingData(GetBadEntityBinaryData()); - var context = new TestConverterContext(typeof(TableEntity), source); + object source = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetBadEntityBinaryData()); + var context = new TestConverterContext(typeof(IEnumerable), source); var mockResponse = new Mock(); var tableClient = new Mock(); tableClient - .Setup(c => c.GetEntityAsync(It.IsAny(), It.IsAny(), null, default)) - .ReturnsAsync(Response.FromValue(new TableEntity(It.IsAny(), It.IsAny()), mockResponse.Object)); + .Setup(c => c.GetEntityAsync(It.IsAny(), It.IsAny(), null, default)) + .ReturnsAsync(Response.FromValue(new TableEntity(It.IsAny(), It.IsAny()), mockResponse.Object)); _mockTableServiceClient .Setup(c => c.GetTableClient(Constants.TableName)) @@ -143,7 +105,7 @@ public async Task ConvertAsync_SourceAsCollectionModelBindingData_BadTableEntity var conversionResult = await _tableConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); + Assert.Equal(ConversionStatus.Failed, conversionResult.Status); } [Fact] @@ -167,64 +129,27 @@ public async Task ConvertAsync_ModelBindingData_Null_ReturnsUnhandled() } [Fact] - public async Task ConvertAsync_ModelBindingDataSource_NotCosmosExtension_ReturnsUnhandled() + public async Task ConvertAsync_ModelBindingDataSource_NotTableExtension_ReturnsUnhandled() { - var grpcModelBindingData = GetTestGrpcModelBindingData(GetTableEntityBinaryData(), source: "anotherExtensions"); + var grpcModelBindingData = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetTableEntityBinaryData(), source: "anotherExtensions"); var context = new TestConverterContext(typeof(IEnumerable), grpcModelBindingData); var conversionResult = await _tableConverter.ConvertAsync(context); - Assert.Equal(ConversionStatus.Unhandled, conversionResult.Status); + Assert.Equal(ConversionStatus.Failed, conversionResult.Status); + Assert.Equal("Unexpected binding source. Only 'AzureStorageTables' is supported.", conversionResult.Error.Message); } [Fact] public async Task ConvertAsync_ModelBindingDataContentType_Unsupported_ReturnsFailed() { - var grpcModelBindingData = GetTestGrpcModelBindingData(GetTableEntityBinaryData(), contentType: "binary"); + var grpcModelBindingData = TableTestHelper.GetTestGrpcModelBindingData(TableTestHelper.GetTableEntityBinaryData(), contentType: "binary"); var context = new TestConverterContext(typeof(IEnumerable), grpcModelBindingData); var conversionResult = await _tableConverter.ConvertAsync(context); Assert.Equal(ConversionStatus.Failed, conversionResult.Status); - Assert.Equal("Unexpected content-type. Currently only 'application/json' is supported.", conversionResult.Error.Message); - } - - private BinaryData GetTableClientBinaryData() - { - return new BinaryData("{" + - "\"TableName\" : \"TableName\"" + - "}"); - } - - private BinaryData GetTableEntityBinaryData() - { - return new BinaryData("{" + - "\"Connection\" : \"Connection\"," + - "\"TableName\" : \"TableName\"," + - "\"PartitionKey\" : \"PartitionKey\"," + - "\"RowKey\" : \"RowKey\"" + - "}"); - } - - private BinaryData GetBadEntityBinaryData() - { - return new BinaryData("{" + - "\"Connection\" : \"Connection\"," + - "\"TableName\" : \"TableName\"," + - "\"PartitionKey\" : \"PartitionKey\"" + - "}"); - } - - - private GrpcModelBindingData GetTestGrpcModelBindingData(BinaryData binaryData, string source = "AzureStorageTables", string contentType = "application/json") - { - return new GrpcModelBindingData(new ModelBindingData() - { - Version = "1.0", - Source = source, - Content = ByteString.CopyFrom(binaryData), - ContentType = contentType - }); + Assert.Equal("Unexpected content-type. Only 'application/json' is supported.", conversionResult.Error.Message); } } } diff --git a/test/WorkerExtensionTests/Table/TableTestHelper.cs b/test/WorkerExtensionTests/Table/TableTestHelper.cs new file mode 100644 index 000000000..878ad7c8f --- /dev/null +++ b/test/WorkerExtensionTests/Table/TableTestHelper.cs @@ -0,0 +1,55 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +using System; +using Google.Protobuf; +using Microsoft.Azure.Functions.Worker.Grpc.Messages; + +namespace Microsoft.Azure.Functions.WorkerExtension.Tests +{ + internal static class TableTestHelper + { + public static BinaryData GetWrongBinaryData() + { + return new BinaryData("{" + "\"Connection\" : \"Connection\"" + "}"); + } + + public static BinaryData GetTableClientBinaryData() + { + return new BinaryData("{" + + "\"TableName\" : \"TableName\"" + + "}"); + } + + public static BinaryData GetTableEntityBinaryData() + { + return new BinaryData("{" + + "\"Connection\" : \"Connection\"," + + "\"TableName\" : \"TableName\"," + + "\"PartitionKey\" : \"PartitionKey\"," + + "\"RowKey\" : \"RowKey\"" + + "}"); + } + + public static BinaryData GetBadEntityBinaryData() + { + return new BinaryData("{" + + "\"Connection\" : \"Connection\"," + + "\"TableName\" : \"TableName\"," + + "\"PartitionKey\" : \"PartitionKey\"" + + "}"); + } + + + public static GrpcModelBindingData GetTestGrpcModelBindingData(BinaryData binaryData, string source = "AzureStorageTables", string contentType = "application/json") + { + return new GrpcModelBindingData(new ModelBindingData() + { + Version = "1.0", + Source = source, + Content = ByteString.CopyFrom(binaryData), + ContentType = contentType + }); + } + } +} \ No newline at end of file