* Introduce setting hidden from UI, such that openApiSpec version 2 has the nullable references properly serialized. AnyOf does not exist in v2, and those references are currently lost. * Updating existing tests for nullable/schema areas where v2 and v3 differ Making them theories to properly test both openApi specifications Adding relevant yaml, json test files Modifying code to ensure enums and entities also generate openApi with no anyOf for openApi v2 (not supported) * Fix "Succeeded" typo in output for util Fix tab spacing in util Add version setting in util with documentation * Remove tabs * Refactor tests to take SpecVersion directly in InlineData Modify 2 existing tests to test json schema generation by passed spec version
261 lines
9.6 KiB
C#
261 lines
9.6 KiB
C#
// ------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.
|
|
// ------------------------------------------------------------
|
|
|
|
using System;
|
|
using System.IO;
|
|
using Microsoft.OData.Edm;
|
|
using Microsoft.OpenApi.Extensions;
|
|
using Xunit;
|
|
using Xunit.Abstractions;
|
|
|
|
namespace Microsoft.OpenApi.OData.Tests
|
|
{
|
|
public class EdmModelOpenApiExtensionsTest
|
|
{
|
|
private ITestOutputHelper _output;
|
|
|
|
public EdmModelOpenApiExtensionsTest(ITestOutputHelper output)
|
|
{
|
|
_output = output;
|
|
}
|
|
|
|
[Fact]
|
|
public void ConvertToOpenApiThrowsArgumentNullModel()
|
|
{
|
|
// Arrange
|
|
IEdmModel model = null;
|
|
|
|
// Act & Assert
|
|
Assert.Throws<ArgumentNullException>("model", () => model.ConvertToOpenApi());
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
public void EmptyEdmModelToOpenApiJsonWorks(OpenApiSpecVersion specVersion)
|
|
{
|
|
// Arrange
|
|
IEdmModel model = EdmModelHelper.EmptyModel;
|
|
var openApiConvertSettings = new OpenApiConvertSettings();
|
|
openApiConvertSettings.OpenApiSpecVersion = specVersion;
|
|
|
|
// Act
|
|
string json = WriteEdmModelAsOpenApi(model, OpenApiFormat.Json, openApiConvertSettings);
|
|
_output.WriteLine(json);
|
|
|
|
// Assert
|
|
if (specVersion == OpenApiSpecVersion.OpenApi2_0)
|
|
{
|
|
Assert.Equal(Resources.GetString("Empty.OpenApi.V2.json").ChangeLineBreaks(), json);
|
|
}
|
|
else
|
|
{
|
|
Assert.Equal(Resources.GetString("Empty.OpenApi.json").ChangeLineBreaks(), json);
|
|
}
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
public void EmptyEdmModelToOpenApiYamlWorks(OpenApiSpecVersion specVersion)
|
|
{
|
|
// Arrange
|
|
IEdmModel model = EdmModelHelper.EmptyModel;
|
|
var openApiConvertSettings = new OpenApiConvertSettings();
|
|
openApiConvertSettings.OpenApiSpecVersion = specVersion;
|
|
|
|
// Act
|
|
string yaml = WriteEdmModelAsOpenApi(model, OpenApiFormat.Yaml, openApiConvertSettings);
|
|
_output.WriteLine(yaml);
|
|
|
|
// Assert
|
|
if (specVersion == OpenApiSpecVersion.OpenApi2_0)
|
|
{
|
|
Assert.Equal(Resources.GetString("Empty.OpenApi.V2.yaml").ChangeLineBreaks(), yaml);
|
|
}
|
|
else
|
|
{
|
|
Assert.Equal(Resources.GetString("Empty.OpenApi.yaml").ChangeLineBreaks(), yaml);
|
|
}
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
public void BasicEdmModelToOpenApiJsonWorks(OpenApiSpecVersion specVersion)
|
|
{
|
|
// Arrange
|
|
IEdmModel model = EdmModelHelper.BasicEdmModel;
|
|
var openApiConvertSettings = new OpenApiConvertSettings();
|
|
openApiConvertSettings.OpenApiSpecVersion = specVersion;
|
|
|
|
// Act
|
|
string json = WriteEdmModelAsOpenApi(model, OpenApiFormat.Json, openApiConvertSettings);
|
|
_output.WriteLine(json);
|
|
|
|
// Assert
|
|
if (specVersion == OpenApiSpecVersion.OpenApi2_0)
|
|
{
|
|
Assert.Equal(Resources.GetString("Basic.OpenApi.V2.json").ChangeLineBreaks(), json);
|
|
}
|
|
else
|
|
{
|
|
Assert.Equal(Resources.GetString("Basic.OpenApi.json").ChangeLineBreaks(), json);
|
|
}
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
public void BasicEdmModelToOpenApiYamlWorks(OpenApiSpecVersion specVersion)
|
|
{
|
|
// Arrange
|
|
IEdmModel model = EdmModelHelper.BasicEdmModel;
|
|
var openApiConvertSettings = new OpenApiConvertSettings();
|
|
openApiConvertSettings.OpenApiSpecVersion = specVersion;
|
|
|
|
// Act
|
|
string yaml = WriteEdmModelAsOpenApi(model, OpenApiFormat.Yaml, openApiConvertSettings);
|
|
_output.WriteLine(yaml);
|
|
|
|
// Assert
|
|
if (specVersion == OpenApiSpecVersion.OpenApi2_0)
|
|
{
|
|
Assert.Equal(Resources.GetString("Basic.OpenApi.V2.yaml").ChangeLineBreaks(), yaml);
|
|
}
|
|
else
|
|
{
|
|
Assert.Equal(Resources.GetString("Basic.OpenApi.yaml").ChangeLineBreaks(), yaml);
|
|
}
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
public void MultipleSchemasEdmModelToOpenApiJsonWorks(OpenApiSpecVersion specVersion)
|
|
{
|
|
// Arrange
|
|
IEdmModel model = EdmModelHelper.MultipleSchemasEdmModel;
|
|
var openApiConvertSettings = new OpenApiConvertSettings();
|
|
openApiConvertSettings.OpenApiSpecVersion = specVersion;
|
|
|
|
// Act
|
|
string json = WriteEdmModelAsOpenApi(model, OpenApiFormat.Json, openApiConvertSettings);
|
|
_output.WriteLine(json);
|
|
|
|
// Assert
|
|
if (specVersion == OpenApiSpecVersion.OpenApi2_0)
|
|
{
|
|
Assert.Equal(Resources.GetString("Multiple.Schema.OpenApi.V2.json").ChangeLineBreaks(), json);
|
|
}
|
|
else
|
|
{
|
|
Assert.Equal(Resources.GetString("Multiple.Schema.OpenApi.json").ChangeLineBreaks(), json);
|
|
}
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
public void MultipleSchemasEdmModelToOpenApiYamlWorks(OpenApiSpecVersion specVersion)
|
|
{
|
|
// Arrange
|
|
IEdmModel model = EdmModelHelper.MultipleSchemasEdmModel;
|
|
var openApiConvertSettings = new OpenApiConvertSettings();
|
|
openApiConvertSettings.OpenApiSpecVersion = specVersion;
|
|
|
|
// Act
|
|
string yaml = WriteEdmModelAsOpenApi(model, OpenApiFormat.Yaml, openApiConvertSettings);
|
|
_output.WriteLine(yaml);
|
|
|
|
// Assert
|
|
if (specVersion == OpenApiSpecVersion.OpenApi2_0)
|
|
{
|
|
Assert.Equal(Resources.GetString("Multiple.Schema.OpenApi.V2.yaml").ChangeLineBreaks(), yaml);
|
|
}
|
|
else
|
|
{
|
|
Assert.Equal(Resources.GetString("Multiple.Schema.OpenApi.yaml").ChangeLineBreaks(), yaml);
|
|
}
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
public void TripServiceMetadataToOpenApiJsonWorks(OpenApiSpecVersion specVersion)
|
|
{
|
|
// Arrange
|
|
IEdmModel model = EdmModelHelper.TripServiceModel;
|
|
OpenApiConvertSettings settings = new OpenApiConvertSettings
|
|
{
|
|
EnableKeyAsSegment = true,
|
|
Version = new Version(1, 0, 1),
|
|
ServiceRoot = new Uri("http://services.odata.org/TrippinRESTierService"),
|
|
IEEE754Compatible = true,
|
|
OpenApiSpecVersion = specVersion
|
|
};
|
|
// Act
|
|
string json = WriteEdmModelAsOpenApi(model, OpenApiFormat.Json, settings);
|
|
_output.WriteLine(json);
|
|
|
|
// Assert
|
|
if (specVersion == OpenApiSpecVersion.OpenApi2_0)
|
|
{
|
|
Assert.Equal(Resources.GetString("TripService.OpenApi.V2.json").ChangeLineBreaks(), json);
|
|
}
|
|
else
|
|
{
|
|
Assert.Equal(Resources.GetString("TripService.OpenApi.json").ChangeLineBreaks(), json);
|
|
}
|
|
}
|
|
|
|
[Theory]
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
public void TripServiceMetadataToOpenApiYamlWorks(OpenApiSpecVersion specVersion)
|
|
{
|
|
// Arrange
|
|
IEdmModel model = EdmModelHelper.TripServiceModel;
|
|
|
|
OpenApiConvertSettings settings = new OpenApiConvertSettings
|
|
{
|
|
EnableKeyAsSegment = true,
|
|
Version = new Version(1, 0, 1),
|
|
ServiceRoot = new Uri("http://services.odata.org/TrippinRESTierService"),
|
|
IEEE754Compatible = true,
|
|
OpenApiSpecVersion = specVersion
|
|
};
|
|
|
|
// Act
|
|
string yaml = WriteEdmModelAsOpenApi(model, OpenApiFormat.Yaml, settings);
|
|
_output.WriteLine(yaml);
|
|
|
|
// Assert
|
|
if (specVersion == OpenApiSpecVersion.OpenApi2_0)
|
|
{
|
|
Assert.Equal(Resources.GetString("TripService.OpenApi.V2.yaml").ChangeLineBreaks(), yaml);
|
|
}
|
|
else
|
|
{
|
|
Assert.Equal(Resources.GetString("TripService.OpenApi.yaml").ChangeLineBreaks(), yaml);
|
|
}
|
|
}
|
|
|
|
private static string WriteEdmModelAsOpenApi(IEdmModel model, OpenApiFormat target,
|
|
OpenApiConvertSettings settings = null)
|
|
{
|
|
settings = settings ?? new OpenApiConvertSettings();
|
|
var document = model.ConvertToOpenApi(settings);
|
|
Assert.NotNull(document); // guard
|
|
|
|
MemoryStream stream = new MemoryStream();
|
|
document.Serialize(stream, settings.OpenApiSpecVersion, target);
|
|
stream.Flush();
|
|
stream.Position = 0;
|
|
return new StreamReader(stream).ReadToEnd();
|
|
}
|
|
}
|
|
}
|