diff --git a/src/Kiota.Builder/Extensions/OpenApiSchemaExtensions.cs b/src/Kiota.Builder/Extensions/OpenApiSchemaExtensions.cs index 9e834047d5..7d316743e1 100644 --- a/src/Kiota.Builder/Extensions/OpenApiSchemaExtensions.cs +++ b/src/Kiota.Builder/Extensions/OpenApiSchemaExtensions.cs @@ -34,21 +34,21 @@ public static string GetSchemaTitle(this OpenApiSchema schema) { public static IEnumerable GetSchemaReferenceIds(this OpenApiSchema schema, HashSet visitedSchemas = null) { if(visitedSchemas == null) visitedSchemas = new(); - if(!visitedSchemas.Contains(schema)) { + if(schema != null && !visitedSchemas.Contains(schema)) { visitedSchemas.Add(schema); var result = new List(); if(!string.IsNullOrEmpty(schema.Reference?.Id)) result.Add(schema.Reference.Id); if(!string.IsNullOrEmpty(schema.Items?.Reference?.Id)) result.Add(schema.Items.Reference.Id); - if(schema.Properties != null) - result.AddRange(schema.Properties.Values.SelectMany(x => x.GetSchemaReferenceIds(visitedSchemas))); - if(schema.AnyOf != null) - result.AddRange(schema.AnyOf.SelectMany(x => x.GetSchemaReferenceIds(visitedSchemas))); - if(schema.AllOf != null) - result.AddRange(schema.AllOf.SelectMany(x => x.GetSchemaReferenceIds(visitedSchemas))); - if(schema.OneOf != null) - result.AddRange(schema.OneOf.SelectMany(x => x.GetSchemaReferenceIds(visitedSchemas))); + var subSchemaReferences = (schema.Properties?.Values ?? Enumerable.Empty()) + .Union(schema.AnyOf ?? Enumerable.Empty()) + .Union(schema.AllOf ?? Enumerable.Empty()) + .Union(schema.OneOf ?? Enumerable.Empty()) + .SelectMany(x => x.GetSchemaReferenceIds(visitedSchemas)) + .ToList();// this to list is important otherwise the any marks the schemas as visited and add range doesn't find anything + if(subSchemaReferences.Any()) + result.AddRange(subSchemaReferences); return result; } else return Enumerable.Empty(); diff --git a/tests/Kiota.Builder.Tests/Extensions/OpenApiSchemaExtensionsTests.cs b/tests/Kiota.Builder.Tests/Extensions/OpenApiSchemaExtensionsTests.cs index 69d94cf5b4..8fd7ac0f5d 100644 --- a/tests/Kiota.Builder.Tests/Extensions/OpenApiSchemaExtensionsTests.cs +++ b/tests/Kiota.Builder.Tests/Extensions/OpenApiSchemaExtensionsTests.cs @@ -5,6 +5,30 @@ namespace Kiota.Builder.Extensions.Tests { public class OpenApiSchemaExtensionsTests { + [Fact] + public void Defensive() { + Assert.Empty(OpenApiSchemaExtensions.GetSchemaReferenceIds(null)); + var schema = new OpenApiSchema{ + AnyOf = null + }; + Assert.Null(schema.AnyOf); + Assert.Empty(schema.GetSchemaReferenceIds()); + schema = new() { + AllOf = null + }; + Assert.Null(schema.AllOf); + Assert.Empty(schema.GetSchemaReferenceIds()); + schema = new() { + OneOf = null + }; + Assert.Null(schema.OneOf); + Assert.Empty(schema.GetSchemaReferenceIds()); + schema = new() { + Properties = null + }; + Assert.Null(schema.Properties); + Assert.Empty(schema.GetSchemaReferenceIds()); + } [Fact] public void GetSchemaTitleAllOf() { var schema = new OpenApiSchema { @@ -18,8 +42,8 @@ public void GetSchemaTitleAllOf() { } }; var names = schema.GetSchemaTitles(); - Assert.Equal("microsoft.graph.entity", names.First()); - Assert.Equal("microsoft.graph.user", names.Last()); + Assert.Contains("microsoft.graph.entity", names); + Assert.Contains("microsoft.graph.user", names); Assert.Equal("microsoft.graph.user", schema.GetSchemaTitle()); } [Fact] @@ -39,8 +63,8 @@ public void GetSchemaTitleAllOfNested() { } }; var names = schema.GetSchemaTitles(); - Assert.Equal("microsoft.graph.entity", names.First()); - Assert.Equal("microsoft.graph.user", names.Last()); + Assert.Contains("microsoft.graph.entity", names); + Assert.Contains("microsoft.graph.user", names); Assert.Equal("microsoft.graph.user", schema.GetSchemaTitle()); } [Fact] @@ -56,8 +80,8 @@ public void GetSchemaTitleAnyOf() { } }; var names = schema.GetSchemaTitles(); - Assert.Equal("microsoft.graph.entity", names.First()); - Assert.Equal("microsoft.graph.user", names.Last()); + Assert.Contains("microsoft.graph.entity", names); + Assert.Contains("microsoft.graph.user", names); Assert.Equal("microsoft.graph.user", schema.GetSchemaTitle()); } [Fact] @@ -73,8 +97,8 @@ public void GetSchemaTitleOneOf() { } }; var names = schema.GetSchemaTitles(); - Assert.Equal("microsoft.graph.entity", names.First()); - Assert.Equal("microsoft.graph.user", names.Last()); + Assert.Contains("microsoft.graph.entity", names); + Assert.Contains("microsoft.graph.user", names); Assert.Equal("microsoft.graph.user", schema.GetSchemaTitle()); } [Fact] @@ -85,7 +109,7 @@ public void GetSchemaTitleItems() { }, }; var names = schema.GetSchemaTitles(); - Assert.Equal("microsoft.graph.entity", names.First()); + Assert.Contains("microsoft.graph.entity", names); Assert.Equal("microsoft.graph.entity", schema.GetSchemaTitle()); Assert.Single(names); } @@ -95,7 +119,7 @@ public void GetSchemaTitleTitle() { Title = "microsoft.graph.entity" }; var names = schema.GetSchemaTitles(); - Assert.Equal("microsoft.graph.entity", names.First()); + Assert.Contains("microsoft.graph.entity", names); Assert.Equal("microsoft.graph.entity", schema.GetSchemaTitle()); Assert.Single(names); } @@ -124,8 +148,8 @@ public void GetReferenceIdsAllOf() { } }; var names = schema.GetSchemaReferenceIds(); - Assert.Equal("microsoft.graph.entity", names.First()); - Assert.Equal("microsoft.graph.user", names.Last()); + Assert.Contains("microsoft.graph.entity", names); + Assert.Contains("microsoft.graph.user", names); } [Fact] public void GetReferenceIdsAllOfNested() { @@ -148,8 +172,8 @@ public void GetReferenceIdsAllOfNested() { } }; var names = schema.GetSchemaReferenceIds(); - Assert.Equal("microsoft.graph.entity", names.First()); - Assert.Equal("microsoft.graph.user", names.Last()); + Assert.Contains("microsoft.graph.entity", names); + Assert.Contains("microsoft.graph.user", names); } [Fact] public void GetReferenceIdsAnyOf() { @@ -168,8 +192,8 @@ public void GetReferenceIdsAnyOf() { } }; var names = schema.GetSchemaReferenceIds(); - Assert.Equal("microsoft.graph.entity", names.First()); - Assert.Equal("microsoft.graph.user", names.Last()); + Assert.Contains("microsoft.graph.entity", names); + Assert.Contains("microsoft.graph.user", names); } [Fact] public void GetReferenceIdsOneOf() { @@ -188,8 +212,8 @@ public void GetReferenceIdsOneOf() { } }; var names = schema.GetSchemaReferenceIds(); - Assert.Equal("microsoft.graph.entity", names.First()); - Assert.Equal("microsoft.graph.user", names.Last()); + Assert.Contains("microsoft.graph.entity", names); + Assert.Contains("microsoft.graph.user", names); } [Fact] public void GetReferenceIdsItems() { @@ -201,7 +225,7 @@ public void GetReferenceIdsItems() { }, }; var names = schema.GetSchemaReferenceIds(); - Assert.Equal("microsoft.graph.entity", names.First()); + Assert.Contains("microsoft.graph.entity", names); Assert.Single(names); } [Fact] @@ -212,7 +236,7 @@ public void GetReferenceIdsTitle() { } }; var names = schema.GetSchemaReferenceIds(); - Assert.Equal("microsoft.graph.entity", names.First()); + Assert.Contains("microsoft.graph.entity", names); Assert.Single(names); } [Fact]