From 43351ca0532227da7b5a6ddbb18aaf101e0a8e02 Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Wed, 2 Oct 2024 13:26:35 +0300 Subject: [PATCH 1/6] If the reference is a url identifier, serialize it as is --- src/Microsoft.OpenApi/Models/OpenApiReference.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Microsoft.OpenApi/Models/OpenApiReference.cs b/src/Microsoft.OpenApi/Models/OpenApiReference.cs index fd2317803..18ca57fa9 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiReference.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiReference.cs @@ -95,6 +95,10 @@ public string ReferenceV3 { return Id; } + if (Id.StartsWith("https")) + { + return Id; + } return "#/components/" + Type.GetDisplayName() + "/" + Id; } @@ -236,6 +240,11 @@ private string GetExternalReferenceV3() return ExternalResource + "#" + Id; } + if (Id.StartsWith("https")) + { + return Id; + } + return ExternalResource + "#/components/" + Type.GetDisplayName() + "/" + Id; } From e8275986af7ac97f0ba4b5b33ea18eb9a5cc6a7d Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Wed, 2 Oct 2024 13:27:41 +0300 Subject: [PATCH 2/6] Clean up logic for determining whether a locator or identifier references an external resource --- .../Reader/V31/OpenApiV31Deserializer.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs index a56590bf1..d6c9d0fcf 100644 --- a/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs +++ b/src/Microsoft.OpenApi/Reader/V31/OpenApiV31Deserializer.cs @@ -157,9 +157,11 @@ private static (string, string) GetReferenceIdAndExternalResource(string pointer string refId = !pointer.Contains('#') ? pointer : refSegments.Last(); var isExternalResource = !refSegments.First().StartsWith("#"); - string externalResource = isExternalResource - ? $"{refSegments.First()}/{refSegments[1].TrimEnd('#')}" - : null; + string externalResource = null; + if (isExternalResource && pointer.Contains('#')) + { + externalResource = $"{refSegments.First()}/{refSegments[1].TrimEnd('#')}"; + } return (refId, externalResource); } From ec420d78af4e5f57c730d17c2d508a926a6697ba Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Wed, 2 Oct 2024 13:28:29 +0300 Subject: [PATCH 3/6] Remove unnecessary usings --- .../Models/References/OpenApiSchemaReference.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs index 4ee1c3fbd..66fb0fa1e 100644 --- a/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs +++ b/src/Microsoft.OpenApi/Models/References/OpenApiSchemaReference.cs @@ -1,12 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Writers; using System; using System.Collections.Generic; -using System.Runtime; using System.Text.Json.Nodes; namespace Microsoft.OpenApi.Models.References From ee880e2ba9f05ed6b1ad8bed65bcc259c536792c Mon Sep 17 00:00:00 2001 From: Maggiekimani1 Date: Wed, 2 Oct 2024 13:28:38 +0300 Subject: [PATCH 4/6] Add test to validate --- .../Microsoft.OpenApi.Tests.csproj | 8 +-- .../Models/OpenApiDocumentTests.cs | 49 +++++++++++++++++++ .../Models/Samples/docWithDollarId.yaml | 39 +++++++++++++++ 3 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 test/Microsoft.OpenApi.Tests/Models/Samples/docWithDollarId.yaml diff --git a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj index 81991fd63..e1f54a276 100644 --- a/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj +++ b/test/Microsoft.OpenApi.Tests/Microsoft.OpenApi.Tests.csproj @@ -42,14 +42,14 @@ OpenApiCallbackReferenceTests.cs + + PreserveNewest + + PreserveNewest - - - - \ No newline at end of file diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs index c6927fcfb..56dc228e0 100644 --- a/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs +++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiDocumentTests.cs @@ -1642,5 +1642,54 @@ public void SerializeV31DocumentWithRefsInWebhooksWorks() var actual = stringWriter.ToString(); actual.MakeLineBreaksEnvironmentNeutral().Should().BeEquivalentTo(expected.MakeLineBreaksEnvironmentNeutral()); } + + [Fact] + public void SerializeDocWithDollarIdInDollarRefSucceeds() + { + var expected = @"openapi: '3.1.0' +info: + title: Simple API + version: 1.0.0 +paths: + /box: + get: + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: https://foo.bar/Box + /circle: + get: + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: https://foo.bar/Circle +components: + schemas: + Box: + $id: https://foo.bar/Box + type: object + properties: + width: + type: number + height: + type: number + Circle: + $id: https://foo.bar/Circle + type: object + properties: + radius: + type: number +"; + var doc = OpenApiDocument.Load("Models/Samples/docWithDollarId.yaml").OpenApiDocument; + + var actual = doc.SerializeAsYaml(OpenApiSpecVersion.OpenApi3_1); + actual.MakeLineBreaksEnvironmentNeutral().Should().BeEquivalentTo(expected.MakeLineBreaksEnvironmentNeutral()); + } } } diff --git a/test/Microsoft.OpenApi.Tests/Models/Samples/docWithDollarId.yaml b/test/Microsoft.OpenApi.Tests/Models/Samples/docWithDollarId.yaml new file mode 100644 index 000000000..e8916f895 --- /dev/null +++ b/test/Microsoft.OpenApi.Tests/Models/Samples/docWithDollarId.yaml @@ -0,0 +1,39 @@ +openapi: 3.1.0 +info: + title: Simple API + version: 1.0.0 +paths: + /box: + get: + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: https://foo.bar/Box + /circle: + get: + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: https://foo.bar/Circle +components: + schemas: + Box: + $id: https://foo.bar/Box + type: object + properties: + width: + type: number + height: + type: number + Circle: + $id: https://foo.bar/Circle + type: object + properties: + radius: + type: number From 2a955473d5ad48d68036fd4217f0a5e038de4349 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 2 Oct 2024 17:46:00 +0300 Subject: [PATCH 5/6] Update src/Microsoft.OpenApi/Models/OpenApiReference.cs Co-authored-by: Darrel --- src/Microsoft.OpenApi/Models/OpenApiReference.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiReference.cs b/src/Microsoft.OpenApi/Models/OpenApiReference.cs index 18ca57fa9..29c936265 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiReference.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiReference.cs @@ -95,7 +95,7 @@ public string ReferenceV3 { return Id; } - if (Id.StartsWith("https")) + if (Id.StartsWith("http")) { return Id; } From 66fb5994a10738c8a311041345cbf17a77512374 Mon Sep 17 00:00:00 2001 From: Maggie Kimani Date: Wed, 2 Oct 2024 17:46:10 +0300 Subject: [PATCH 6/6] Update src/Microsoft.OpenApi/Models/OpenApiReference.cs Co-authored-by: Darrel --- src/Microsoft.OpenApi/Models/OpenApiReference.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi/Models/OpenApiReference.cs b/src/Microsoft.OpenApi/Models/OpenApiReference.cs index 29c936265..1fc206bd3 100644 --- a/src/Microsoft.OpenApi/Models/OpenApiReference.cs +++ b/src/Microsoft.OpenApi/Models/OpenApiReference.cs @@ -240,7 +240,7 @@ private string GetExternalReferenceV3() return ExternalResource + "#" + Id; } - if (Id.StartsWith("https")) + if (Id.StartsWith("http")) { return Id; }