diff --git a/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs b/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs index abf945258..1a9ab3014 100644 --- a/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs +++ b/src/Microsoft.OpenApi/Properties/SRResource.Designer.cs @@ -124,7 +124,7 @@ internal static string InvalidReferenceId { } /// - /// Looks up a localized string similar to Invalid Reference Type.. + /// Looks up a localized string similar to Invalid Reference Type '{0}'.. /// internal static string InvalidReferenceType { get { @@ -340,7 +340,7 @@ internal static string Validation_PathItemMustBeginWithSlash { } /// - /// Looks up a localized string similar to The path signature '{0}' MUST begin be unique.. + /// Looks up a localized string similar to The path signature '{0}' MUST be unique.. /// internal static string Validation_PathSignatureMustBeUnique { get { diff --git a/src/Microsoft.OpenApi/Properties/SRResource.resx b/src/Microsoft.OpenApi/Properties/SRResource.resx index 38c4763d4..f0bb497d3 100644 --- a/src/Microsoft.OpenApi/Properties/SRResource.resx +++ b/src/Microsoft.OpenApi/Properties/SRResource.resx @@ -139,7 +139,7 @@ Invalid Reference identifier '{0}'. - Invalid Reference Type. + Invalid Reference Type '{0}'. Local reference must have type specified. diff --git a/src/Microsoft.OpenApi/Services/OpenApiReferenceResolver.cs b/src/Microsoft.OpenApi/Services/OpenApiReferenceResolver.cs index dd98b4317..00c069f30 100644 --- a/src/Microsoft.OpenApi/Services/OpenApiReferenceResolver.cs +++ b/src/Microsoft.OpenApi/Services/OpenApiReferenceResolver.cs @@ -259,6 +259,13 @@ private void ResolveTags(IList tags) { try { + var referencedObject = typeof(T).Name; + var referenceType = reference?.Type.ToString(); + if (referenceType is not null && !referencedObject.Contains(referenceType)) + { + throw new OpenApiException(string.Format(Properties.SRResource.InvalidReferenceType, referenceType)); + } + return _currentDocument.ResolveReference(reference, false) as T; } catch (OpenApiException ex) diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs index a9401897b..d67c0054f 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/OpenApiDocumentTests.cs @@ -9,8 +9,10 @@ using System.Threading; using FluentAssertions; using Microsoft.OpenApi.Any; +using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; +using Microsoft.OpenApi.Readers.Interface; using Microsoft.OpenApi.Validations; using Microsoft.OpenApi.Validations.Rules; using Microsoft.OpenApi.Writers; @@ -1355,5 +1357,15 @@ public void ValidateExampleShouldNotHaveDataTypeMismatch() var warnings = diagnostic.Warnings; Assert.False(warnings.Any()); } + + [Fact] + public void ParseDocumetWithWrongReferenceTypeShouldReturnADiagnosticError() + { + using var stream = Resources.GetStream(Path.Combine(SampleFolderPath, "docWithWrongRef.json")); + _ = new OpenApiStreamReader().Read(stream, out var diagnostic); + + diagnostic.Errors.Should().BeEquivalentTo(new List { + new( new OpenApiException("Invalid Reference Type 'Schema'.")) }); + } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDocument/docWithWrongRef.json b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDocument/docWithWrongRef.json new file mode 100644 index 000000000..6edf46be8 --- /dev/null +++ b/test/Microsoft.OpenApi.Readers.Tests/V3Tests/Samples/OpenApiDocument/docWithWrongRef.json @@ -0,0 +1,27 @@ +{ + "openapi":"3.0.0", + "info":{ + "title":"some api", + "description":"some description", + "version": "1" + }, + "servers":[{"url":"https://localhost"}], + "paths":{ + "/count":{ + "get":{ + "responses":{ + "200":{ + "$ref":"#/components/schemas/count" + }, + }, + } + } + }, + "components":{ + "schemas":{ + "count":{ + "type": "number" + } + } + } +} \ No newline at end of file