From 9fd0b6e0700885edc799d9fd5cb7dd0ea0e62d09 Mon Sep 17 00:00:00 2001 From: Hwangwoosam Date: Thu, 7 Sep 2023 11:34:48 +0900 Subject: [PATCH 1/5] Get Underlying type when nested Collection --- .../Extensions/TypeExtensions.cs | 4 ++-- .../Get_ApplicationJson_ArrayObject_Tests.cs | 2 ++ .../Get_ApplicationJson_ArrayObject_HttpTrigger.cs | 2 ++ .../Models/ArrayObjectModel.cs | 3 +++ .../Extensions/TypeExtensionsTests.cs | 3 ++- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/TypeExtensions.cs b/src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/TypeExtensions.cs index cf2a7b6f..28575cfa 100644 --- a/src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/TypeExtensions.cs +++ b/src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/TypeExtensions.cs @@ -460,8 +460,8 @@ public static Type GetUnderlyingType(this Type type) } if (type.IsOpenApiArray()) - { - underlyingType = type.GetElementType() ?? type.GetGenericArguments()[0]; + { + underlyingType = type.GetElementType() ?? (type.GetGenericArguments() != null && type.GetGenericArguments().Length > 0 ? type.GetGenericArguments()[0] : type.BaseType.GetGenericArguments()[0]) ; } if (type.IsOpenApiDictionary()) diff --git a/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.Document.Tests/Get_ApplicationJson_ArrayObject_Tests.cs b/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.Document.Tests/Get_ApplicationJson_ArrayObject_Tests.cs index da6a5a37..c2dffcd0 100644 --- a/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.Document.Tests/Get_ApplicationJson_ArrayObject_Tests.cs +++ b/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.Document.Tests/Get_ApplicationJson_ArrayObject_Tests.cs @@ -76,6 +76,7 @@ public void Given_OpenApiDocument_Then_It_Should_Return_ComponentSchema(string @ [DataRow("arrayObjectModel", "object", "decimalValue", "array")] [DataRow("arrayObjectModel", "object", "stringObjectValue", "array")] [DataRow("arrayObjectModel", "object", "objectArrayValue", "array")] + [DataRow("arrayObjectModel", "object", "nestedCollectionValue", "array")] public void Given_OpenApiDocument_Then_It_Should_Return_ComponentSchemaProperty(string @ref, string refType, string propertyName, string propertyType) { var properties = this._doc["components"]["schemas"][@ref]["properties"]; @@ -107,6 +108,7 @@ public void Given_OpenApiDocument_Then_It_Should_Return_ComponentSchemaPropertyI [DataTestMethod] [DataRow("arrayObjectModel", "object", "stringObjectValue", "array", "stringObjectModel")] [DataRow("arrayObjectModel", "object", "objectArrayValue", "array", "list_object")] + [DataRow("arrayObjectModel", "object", "nestedCollectionValue", "array", "collection_int32")] public void Given_OpenApiDocument_Then_It_Should_Return_ComponentSchemaPropertyItemReference(string @ref, string refType, string propertyName, string propertyType, string itemRef) { var items = this._doc["components"]["schemas"][@ref]["properties"][propertyName]["items"]; diff --git a/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Get_ApplicationJson_ArrayObject_HttpTrigger.cs b/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Get_ApplicationJson_ArrayObject_HttpTrigger.cs index db47e2f1..1d522e12 100644 --- a/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Get_ApplicationJson_ArrayObject_HttpTrigger.cs +++ b/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Get_ApplicationJson_ArrayObject_HttpTrigger.cs @@ -24,5 +24,7 @@ public static async Task Get_ApplicationJson_ArrayObject( return await Task.FromResult(result).ConfigureAwait(false); } + } + } diff --git a/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Models/ArrayObjectModel.cs b/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Models/ArrayObjectModel.cs index f7a0674b..d3efa43e 100644 --- a/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Models/ArrayObjectModel.cs +++ b/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Models/ArrayObjectModel.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Collections.ObjectModel; namespace Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp.Models { @@ -14,5 +15,7 @@ public class ArrayObjectModel public ISet StringObjectValue { get; set; } public List ObjectArrayValue { get; set; } + + public Collection> NestedCollectionValue { get; set; } } } diff --git a/test/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests/Extensions/TypeExtensionsTests.cs b/test/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests/Extensions/TypeExtensionsTests.cs index 0d6a81d7..70559782 100644 --- a/test/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests/Extensions/TypeExtensionsTests.cs +++ b/test/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests/Extensions/TypeExtensionsTests.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; - +using System.Collections.ObjectModel; using FluentAssertions; using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Abstractions; @@ -119,6 +119,7 @@ public void Given_NullableType_When_GetUnderlyingType_Invoked_Then_It_Should_Ret [DataRow(typeof(List), typeof(int))] [DataRow(typeof(List), typeof(bool))] [DataRow(typeof(List), typeof(FakeModel))] + [DataRow(typeof(Collection>), typeof(Collection))] public void Given_ListType_When_GetUnderlyingType_Invoked_Then_It_Should_Return_Result(Type type, Type expected) { var result = TypeExtensions.GetUnderlyingType(type); From b0066f281277ead11dbc88a1d39e3ad263d48fe1 Mon Sep 17 00:00:00 2001 From: Hwangwoosam Date: Thu, 7 Sep 2023 13:03:40 +0900 Subject: [PATCH 2/5] Get Nested Collection SubType --- .../Extensions/TypeExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/TypeExtensions.cs b/src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/TypeExtensions.cs index 28575cfa..681fa605 100644 --- a/src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/TypeExtensions.cs +++ b/src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/TypeExtensions.cs @@ -557,7 +557,7 @@ public static Type GetOpenApiSubType(this Type type) if (type.IsArrayType()) { - return type.GetGenericArguments()[0]; + return type.GetGenericArguments() != null && type.GetGenericArguments().Length > 0 ? type.GetGenericArguments()[0] : type.BaseType.GetGenericArguments()[0] ; } return null; From 2c620edb45aaf5dc42e7ed09940d787fbeb561b3 Mon Sep 17 00:00:00 2001 From: Hwangwoosam Date: Thu, 7 Sep 2023 13:37:47 +0900 Subject: [PATCH 3/5] add Nested Collection TestCase --- .../Get_ApplicationJson_ArrayObject_Tests.cs | 2 +- .../Models/ArrayObjectModel.cs | 6 +++++- .../FakeAliasInheritanceModel.cs | 12 ++++++++++++ .../Extensions/TypeExtensionsTests.cs | 2 +- 4 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 test/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests.Fakes/FakeAliasInheritanceModel.cs diff --git a/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.Document.Tests/Get_ApplicationJson_ArrayObject_Tests.cs b/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.Document.Tests/Get_ApplicationJson_ArrayObject_Tests.cs index c2dffcd0..8b53ed96 100644 --- a/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.Document.Tests/Get_ApplicationJson_ArrayObject_Tests.cs +++ b/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.Document.Tests/Get_ApplicationJson_ArrayObject_Tests.cs @@ -108,7 +108,7 @@ public void Given_OpenApiDocument_Then_It_Should_Return_ComponentSchemaPropertyI [DataTestMethod] [DataRow("arrayObjectModel", "object", "stringObjectValue", "array", "stringObjectModel")] [DataRow("arrayObjectModel", "object", "objectArrayValue", "array", "list_object")] - [DataRow("arrayObjectModel", "object", "nestedCollectionValue", "array", "collection_int32")] + [DataRow("arrayObjectModel", "object", "nestedCollectionValue", "array", "collection_userDefine")] public void Given_OpenApiDocument_Then_It_Should_Return_ComponentSchemaPropertyItemReference(string @ref, string refType, string propertyName, string propertyType, string itemRef) { var items = this._doc["components"]["schemas"][@ref]["properties"][propertyName]["items"]; diff --git a/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Models/ArrayObjectModel.cs b/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Models/ArrayObjectModel.cs index d3efa43e..2e06f3a9 100644 --- a/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Models/ArrayObjectModel.cs +++ b/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Models/ArrayObjectModel.cs @@ -16,6 +16,10 @@ public class ArrayObjectModel public List ObjectArrayValue { get; set; } - public Collection> NestedCollectionValue { get; set; } + public Collection_Udf NestedCollectionValue { get; set; } } + + public class UserDefine { } + + public class Collection_Udf : Collection> { } } diff --git a/test/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests.Fakes/FakeAliasInheritanceModel.cs b/test/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests.Fakes/FakeAliasInheritanceModel.cs new file mode 100644 index 00000000..b6f09bf4 --- /dev/null +++ b/test/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests.Fakes/FakeAliasInheritanceModel.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Text; + +namespace Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests.Fakes +{ + public class FakeAliasInheritanceModel : Collection> + { + + } +} diff --git a/test/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests/Extensions/TypeExtensionsTests.cs b/test/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests/Extensions/TypeExtensionsTests.cs index 70559782..04a76796 100644 --- a/test/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests/Extensions/TypeExtensionsTests.cs +++ b/test/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Tests/Extensions/TypeExtensionsTests.cs @@ -119,7 +119,7 @@ public void Given_NullableType_When_GetUnderlyingType_Invoked_Then_It_Should_Ret [DataRow(typeof(List), typeof(int))] [DataRow(typeof(List), typeof(bool))] [DataRow(typeof(List), typeof(FakeModel))] - [DataRow(typeof(Collection>), typeof(Collection))] + [DataRow(typeof(FakeAliasInheritanceModel), typeof(Collection))] public void Given_ListType_When_GetUnderlyingType_Invoked_Then_It_Should_Return_Result(Type type, Type expected) { var result = TypeExtensions.GetUnderlyingType(type); From aa43802a4b09efd8651b74a9385a61977cae379d Mon Sep 17 00:00:00 2001 From: Hwangwoosam Date: Thu, 7 Sep 2023 13:54:49 +0900 Subject: [PATCH 4/5] . --- .../Get_ApplicationJson_ArrayObject_HttpTrigger.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Get_ApplicationJson_ArrayObject_HttpTrigger.cs b/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Get_ApplicationJson_ArrayObject_HttpTrigger.cs index 1d522e12..db47e2f1 100644 --- a/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Get_ApplicationJson_ArrayObject_HttpTrigger.cs +++ b/test-integration/Microsoft.Azure.WebJobs.Extensions.OpenApi.TestApp/Get_ApplicationJson_ArrayObject_HttpTrigger.cs @@ -24,7 +24,5 @@ public static async Task Get_ApplicationJson_ArrayObject( return await Task.FromResult(result).ConfigureAwait(false); } - } - } From ae55270b3e12dfc55a312e61280b263a64ddc77b Mon Sep 17 00:00:00 2001 From: Hwangwoosam Date: Tue, 3 Oct 2023 19:02:22 +0900 Subject: [PATCH 5/5] Getunderlying Type when type is IEnuberable --- .../Extensions/TypeExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/TypeExtensions.cs b/src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/TypeExtensions.cs index 681fa605..dc819056 100644 --- a/src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/TypeExtensions.cs +++ b/src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/TypeExtensions.cs @@ -461,7 +461,7 @@ public static Type GetUnderlyingType(this Type type) if (type.IsOpenApiArray()) { - underlyingType = type.GetElementType() ?? (type.GetGenericArguments() != null && type.GetGenericArguments().Length > 0 ? type.GetGenericArguments()[0] : type.BaseType.GetGenericArguments()[0]) ; + underlyingType = type.GetElementType() ?? (type.GetGenericArguments() != null && type.GetGenericArguments().Length > 0 ? type.GetGenericArguments()[0] : (type.BaseType.GetGenericArguments() != null && type.BaseType.GetGenericArguments().Length > 0 ? type.BaseType.GetGenericArguments()[0] :type.GetInterfaces()[0].GetGenericArguments()[0])) ; } if (type.IsOpenApiDictionary()) @@ -557,7 +557,7 @@ public static Type GetOpenApiSubType(this Type type) if (type.IsArrayType()) { - return type.GetGenericArguments() != null && type.GetGenericArguments().Length > 0 ? type.GetGenericArguments()[0] : type.BaseType.GetGenericArguments()[0] ; + return type.GetGenericArguments() != null && type.GetGenericArguments().Length > 0 ? type.GetGenericArguments()[0] : (type.BaseType.GetGenericArguments() != null && type.BaseType.GetGenericArguments().Length > 0 ? type.BaseType.GetGenericArguments()[0] : type.GetInterfaces()[0].GetGenericArguments()[0]); } return null;