|
2 | 2 | // Licensed under the MIT license. |
3 | 3 |
|
4 | 4 | using System; |
| 5 | +using System.Collections.Generic; |
5 | 6 | using System.Globalization; |
6 | 7 | using System.IO; |
7 | 8 | using System.Text; |
@@ -87,6 +88,122 @@ public void ReusingSettingsWithNewWriterStartsANewInlineReferenceCount() |
87 | 88 | Assert.DoesNotContain("$ref", secondOutput.ToString()); |
88 | 89 | } |
89 | 90 |
|
| 91 | + [Theory] |
| 92 | + [InlineData(OpenApiSpecVersion.OpenApi3_0)] |
| 93 | + [InlineData(OpenApiSpecVersion.OpenApi3_1)] |
| 94 | + public void SerializeMediaTypeReferenceUsesInlineReferenceCount(OpenApiSpecVersion specVersion) |
| 95 | + { |
| 96 | + var document = new OpenApiDocument |
| 97 | + { |
| 98 | + Components = new OpenApiComponents |
| 99 | + { |
| 100 | + MediaTypes = new Dictionary<string, IOpenApiMediaType> |
| 101 | + { |
| 102 | + ["shared"] = new OpenApiMediaType |
| 103 | + { |
| 104 | + Schema = new OpenApiSchema { Type = JsonSchemaType.String } |
| 105 | + } |
| 106 | + } |
| 107 | + } |
| 108 | + }; |
| 109 | + document.Workspace.RegisterComponents(document); |
| 110 | + var reference = new OpenApiMediaTypeReference("shared", document); |
| 111 | + using var output = new StringWriter(CultureInfo.InvariantCulture); |
| 112 | + var writer = new OpenApiJsonWriter(output, CreateWriterSettings(0)); |
| 113 | + |
| 114 | + Assert.Throws<OpenApiWriterException>(() => Serialize(reference, writer, specVersion)); |
| 115 | + } |
| 116 | + |
| 117 | + [Fact] |
| 118 | + public void ConvertRequestBodyReferenceToV2ParameterUsesInlineReferenceCount() |
| 119 | + { |
| 120 | + var document = CreateDocumentWithRequestBodyComponent(); |
| 121 | + var reference = new OpenApiRequestBodyReference("shared", document); |
| 122 | + using var output = new StringWriter(CultureInfo.InvariantCulture); |
| 123 | + var writer = new OpenApiJsonWriter(output, CreateWriterSettings(0)); |
| 124 | + |
| 125 | + Assert.Throws<OpenApiWriterException>(() => reference.ConvertToBodyParameter(writer)); |
| 126 | + Assert.Throws<OpenApiWriterException>(() => reference.ConvertToFormDataParameters(writer)); |
| 127 | + } |
| 128 | + |
| 129 | + [Fact] |
| 130 | + public void SerializeV2HeaderSchemaReferenceUsesInlineReferenceCount() |
| 131 | + { |
| 132 | + var document = CreateDocumentWithSchemaComponent(); |
| 133 | + var header = new OpenApiHeader |
| 134 | + { |
| 135 | + Schema = new OpenApiSchemaReference("shared", document) |
| 136 | + }; |
| 137 | + using var output = new StringWriter(CultureInfo.InvariantCulture); |
| 138 | + var writer = new OpenApiJsonWriter(output, CreateWriterSettings(0)); |
| 139 | + |
| 140 | + Assert.Throws<OpenApiWriterException>(() => header.SerializeAsV2(writer)); |
| 141 | + } |
| 142 | + |
| 143 | + [Fact] |
| 144 | + public void SerializeV2ParameterSchemaReferenceUsesInlineReferenceCount() |
| 145 | + { |
| 146 | + var document = CreateDocumentWithSchemaComponent(); |
| 147 | + var parameter = new OpenApiParameter |
| 148 | + { |
| 149 | + Name = "value", |
| 150 | + In = ParameterLocation.Query, |
| 151 | + Schema = new OpenApiSchemaReference("shared", document) |
| 152 | + }; |
| 153 | + using var output = new StringWriter(CultureInfo.InvariantCulture); |
| 154 | + var writer = new OpenApiJsonWriter(output, CreateWriterSettings(0)); |
| 155 | + |
| 156 | + Assert.Throws<OpenApiWriterException>(() => parameter.SerializeAsV2(writer)); |
| 157 | + } |
| 158 | + |
| 159 | + private static OpenApiDocument CreateDocumentWithRequestBodyComponent() |
| 160 | + { |
| 161 | + var document = new OpenApiDocument |
| 162 | + { |
| 163 | + Components = new OpenApiComponents |
| 164 | + { |
| 165 | + RequestBodies = new Dictionary<string, IOpenApiRequestBody> |
| 166 | + { |
| 167 | + ["shared"] = new OpenApiRequestBody |
| 168 | + { |
| 169 | + Content = new Dictionary<string, IOpenApiMediaType> |
| 170 | + { |
| 171 | + ["application/x-www-form-urlencoded"] = new OpenApiMediaType |
| 172 | + { |
| 173 | + Schema = new OpenApiSchema |
| 174 | + { |
| 175 | + Type = JsonSchemaType.Object, |
| 176 | + Properties = new Dictionary<string, IOpenApiSchema> |
| 177 | + { |
| 178 | + ["value"] = new OpenApiSchema { Type = JsonSchemaType.String } |
| 179 | + } |
| 180 | + } |
| 181 | + } |
| 182 | + } |
| 183 | + } |
| 184 | + } |
| 185 | + } |
| 186 | + }; |
| 187 | + document.Workspace.RegisterComponents(document); |
| 188 | + return document; |
| 189 | + } |
| 190 | + |
| 191 | + private static OpenApiDocument CreateDocumentWithSchemaComponent() |
| 192 | + { |
| 193 | + var document = new OpenApiDocument |
| 194 | + { |
| 195 | + Components = new OpenApiComponents |
| 196 | + { |
| 197 | + Schemas = new Dictionary<string, IOpenApiSchema> |
| 198 | + { |
| 199 | + ["shared"] = new OpenApiSchema { Type = JsonSchemaType.String } |
| 200 | + } |
| 201 | + } |
| 202 | + }; |
| 203 | + document.Workspace.RegisterComponents(document); |
| 204 | + return document; |
| 205 | + } |
| 206 | + |
90 | 207 | private static string CreateDocumentWithRepeatedReferences(int levels) |
91 | 208 | { |
92 | 209 | var schemas = new StringBuilder(); |
@@ -147,23 +264,23 @@ private static string CreateDocumentWithRepeatedReferences(int levels) |
147 | 264 | } |
148 | 265 |
|
149 | 266 | private static void Serialize( |
150 | | - OpenApiDocument document, |
| 267 | + IOpenApiSerializable serializable, |
151 | 268 | IOpenApiWriter writer, |
152 | 269 | OpenApiSpecVersion specVersion) |
153 | 270 | { |
154 | 271 | switch (specVersion) |
155 | 272 | { |
156 | 273 | case OpenApiSpecVersion.OpenApi2_0: |
157 | | - document.SerializeAsV2(writer); |
| 274 | + serializable.SerializeAsV2(writer); |
158 | 275 | break; |
159 | 276 | case OpenApiSpecVersion.OpenApi3_0: |
160 | | - document.SerializeAsV3(writer); |
| 277 | + serializable.SerializeAsV3(writer); |
161 | 278 | break; |
162 | 279 | case OpenApiSpecVersion.OpenApi3_1: |
163 | | - document.SerializeAsV31(writer); |
| 280 | + serializable.SerializeAsV31(writer); |
164 | 281 | break; |
165 | 282 | case OpenApiSpecVersion.OpenApi3_2: |
166 | | - document.SerializeAsV32(writer); |
| 283 | + serializable.SerializeAsV32(writer); |
167 | 284 | break; |
168 | 285 | default: |
169 | 286 | throw new ArgumentOutOfRangeException(nameof(specVersion), specVersion, null); |
|
0 commit comments