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