2017-11-16 20:16:12 +01:00
|
|
|
|
// ------------------------------------------------------------
|
|
|
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
|
|
// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.
|
|
|
|
|
// ------------------------------------------------------------
|
2017-10-19 23:39:57 +02:00
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using Microsoft.OData.Edm;
|
2017-11-20 19:46:18 +01:00
|
|
|
|
using Microsoft.OpenApi.Extensions;
|
2017-10-19 23:39:57 +02:00
|
|
|
|
using Xunit;
|
2017-11-15 01:54:03 +01:00
|
|
|
|
using Xunit.Abstractions;
|
2017-10-19 23:39:57 +02:00
|
|
|
|
|
2017-11-11 01:14:41 +01:00
|
|
|
|
namespace Microsoft.OpenApi.OData.Tests
|
2017-10-19 23:39:57 +02:00
|
|
|
|
{
|
|
|
|
|
public class EdmModelOpenApiExtensionsTest
|
|
|
|
|
{
|
2017-11-15 01:54:03 +01:00
|
|
|
|
private ITestOutputHelper _output;
|
2017-12-06 03:28:34 +01:00
|
|
|
|
|
2017-11-15 01:54:03 +01:00
|
|
|
|
public EdmModelOpenApiExtensionsTest(ITestOutputHelper output)
|
|
|
|
|
{
|
|
|
|
|
_output = output;
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-06 03:28:34 +01:00
|
|
|
|
[Fact]
|
|
|
|
|
public void ConvertToOpenApiThrowsArgumentNullModel()
|
|
|
|
|
{
|
|
|
|
|
// Arrange
|
|
|
|
|
IEdmModel model = null;
|
|
|
|
|
|
|
|
|
|
// Act & Assert
|
|
|
|
|
Assert.Throws<ArgumentNullException>("model", () => model.ConvertToOpenApi());
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-19 23:27:48 +02:00
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
|
|
|
public void EmptyEdmModelToOpenApiJsonWorks(OpenApiSpecVersion specVersion)
|
2017-10-19 23:39:57 +02:00
|
|
|
|
{
|
|
|
|
|
// Arrange
|
|
|
|
|
IEdmModel model = EdmModelHelper.EmptyModel;
|
2019-06-19 23:27:48 +02:00
|
|
|
|
var openApiConvertSettings = new OpenApiConvertSettings();
|
|
|
|
|
openApiConvertSettings.OpenApiSpecVersion = specVersion;
|
2017-10-19 23:39:57 +02:00
|
|
|
|
|
|
|
|
|
// Act
|
2019-06-19 23:27:48 +02:00
|
|
|
|
string json = WriteEdmModelAsOpenApi(model, OpenApiFormat.Json, openApiConvertSettings);
|
2017-11-15 01:54:03 +01:00
|
|
|
|
_output.WriteLine(json);
|
2017-10-19 23:39:57 +02:00
|
|
|
|
|
|
|
|
|
// Assert
|
2019-06-19 23:27:48 +02:00
|
|
|
|
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);
|
|
|
|
|
}
|
2017-10-19 23:39:57 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-19 23:27:48 +02:00
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
|
|
|
public void EmptyEdmModelToOpenApiYamlWorks(OpenApiSpecVersion specVersion)
|
2017-10-19 23:39:57 +02:00
|
|
|
|
{
|
|
|
|
|
// Arrange
|
|
|
|
|
IEdmModel model = EdmModelHelper.EmptyModel;
|
2019-06-19 23:27:48 +02:00
|
|
|
|
var openApiConvertSettings = new OpenApiConvertSettings();
|
|
|
|
|
openApiConvertSettings.OpenApiSpecVersion = specVersion;
|
2017-10-19 23:39:57 +02:00
|
|
|
|
|
|
|
|
|
// Act
|
2019-06-19 23:27:48 +02:00
|
|
|
|
string yaml = WriteEdmModelAsOpenApi(model, OpenApiFormat.Yaml, openApiConvertSettings);
|
2017-11-15 01:54:03 +01:00
|
|
|
|
_output.WriteLine(yaml);
|
2017-10-19 23:39:57 +02:00
|
|
|
|
|
|
|
|
|
// Assert
|
2019-06-19 23:27:48 +02:00
|
|
|
|
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);
|
|
|
|
|
}
|
2017-10-19 23:39:57 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-19 23:27:48 +02:00
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
|
|
|
public void BasicEdmModelToOpenApiJsonWorks(OpenApiSpecVersion specVersion)
|
2017-10-19 23:39:57 +02:00
|
|
|
|
{
|
|
|
|
|
// Arrange
|
|
|
|
|
IEdmModel model = EdmModelHelper.BasicEdmModel;
|
2020-07-21 16:54:50 +02:00
|
|
|
|
var openApiConvertSettings = new OpenApiConvertSettings
|
|
|
|
|
{
|
|
|
|
|
OpenApiSpecVersion = specVersion,
|
|
|
|
|
ShowSchemaExamples = true // test for schema examples
|
|
|
|
|
};
|
2017-10-19 23:39:57 +02:00
|
|
|
|
|
|
|
|
|
// Act
|
2019-06-19 23:27:48 +02:00
|
|
|
|
string json = WriteEdmModelAsOpenApi(model, OpenApiFormat.Json, openApiConvertSettings);
|
2017-11-15 01:54:03 +01:00
|
|
|
|
_output.WriteLine(json);
|
2017-10-19 23:39:57 +02:00
|
|
|
|
|
|
|
|
|
// Assert
|
2019-06-19 23:27:48 +02:00
|
|
|
|
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);
|
|
|
|
|
}
|
2017-10-19 23:39:57 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-19 23:27:48 +02:00
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
|
|
|
public void BasicEdmModelToOpenApiYamlWorks(OpenApiSpecVersion specVersion)
|
2017-10-19 23:39:57 +02:00
|
|
|
|
{
|
|
|
|
|
// Arrange
|
|
|
|
|
IEdmModel model = EdmModelHelper.BasicEdmModel;
|
2020-07-21 16:54:50 +02:00
|
|
|
|
var openApiConvertSettings = new OpenApiConvertSettings
|
|
|
|
|
{
|
|
|
|
|
OpenApiSpecVersion = specVersion,
|
|
|
|
|
ShowSchemaExamples = true
|
|
|
|
|
};
|
2017-10-19 23:39:57 +02:00
|
|
|
|
|
|
|
|
|
// Act
|
2019-06-19 23:27:48 +02:00
|
|
|
|
string yaml = WriteEdmModelAsOpenApi(model, OpenApiFormat.Yaml, openApiConvertSettings);
|
2017-11-15 01:54:03 +01:00
|
|
|
|
_output.WriteLine(yaml);
|
2017-10-19 23:39:57 +02:00
|
|
|
|
|
|
|
|
|
// Assert
|
2019-06-19 23:27:48 +02:00
|
|
|
|
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);
|
|
|
|
|
}
|
2017-10-19 23:39:57 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-19 23:27:48 +02:00
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
|
|
|
public void MultipleSchemasEdmModelToOpenApiJsonWorks(OpenApiSpecVersion specVersion)
|
2019-05-10 19:42:10 +02:00
|
|
|
|
{
|
|
|
|
|
// Arrange
|
|
|
|
|
IEdmModel model = EdmModelHelper.MultipleSchemasEdmModel;
|
2020-07-21 16:54:50 +02:00
|
|
|
|
var openApiConvertSettings = new OpenApiConvertSettings
|
|
|
|
|
{
|
|
|
|
|
OpenApiSpecVersion = specVersion,
|
|
|
|
|
ShowLinks = true, // test Links
|
|
|
|
|
ShowSchemaExamples = true
|
|
|
|
|
};
|
2019-05-10 19:42:10 +02:00
|
|
|
|
|
|
|
|
|
// Act
|
2019-06-19 23:27:48 +02:00
|
|
|
|
string json = WriteEdmModelAsOpenApi(model, OpenApiFormat.Json, openApiConvertSettings);
|
2019-05-10 19:42:10 +02:00
|
|
|
|
_output.WriteLine(json);
|
|
|
|
|
|
|
|
|
|
// Assert
|
2019-06-19 23:27:48 +02:00
|
|
|
|
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);
|
|
|
|
|
}
|
2019-05-10 19:42:10 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-19 23:27:48 +02:00
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
|
|
|
public void MultipleSchemasEdmModelToOpenApiYamlWorks(OpenApiSpecVersion specVersion)
|
2019-05-10 19:42:10 +02:00
|
|
|
|
{
|
|
|
|
|
// Arrange
|
|
|
|
|
IEdmModel model = EdmModelHelper.MultipleSchemasEdmModel;
|
2020-07-21 16:54:50 +02:00
|
|
|
|
var openApiConvertSettings = new OpenApiConvertSettings
|
|
|
|
|
{
|
|
|
|
|
OpenApiSpecVersion = specVersion,
|
|
|
|
|
ShowLinks = true, // test Links
|
|
|
|
|
ShowSchemaExamples = true
|
|
|
|
|
};
|
2019-05-10 19:42:10 +02:00
|
|
|
|
|
|
|
|
|
// Act
|
2019-06-19 23:27:48 +02:00
|
|
|
|
string yaml = WriteEdmModelAsOpenApi(model, OpenApiFormat.Yaml, openApiConvertSettings);
|
2019-05-10 19:42:10 +02:00
|
|
|
|
_output.WriteLine(yaml);
|
|
|
|
|
|
|
|
|
|
// Assert
|
2019-06-19 23:27:48 +02:00
|
|
|
|
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);
|
|
|
|
|
}
|
2019-05-10 19:42:10 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-19 23:27:48 +02:00
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
|
|
|
public void TripServiceMetadataToOpenApiJsonWorks(OpenApiSpecVersion specVersion)
|
2017-10-19 23:39:57 +02:00
|
|
|
|
{
|
|
|
|
|
// Arrange
|
|
|
|
|
IEdmModel model = EdmModelHelper.TripServiceModel;
|
2017-11-21 23:47:38 +01:00
|
|
|
|
OpenApiConvertSettings settings = new OpenApiConvertSettings
|
2017-10-19 23:39:57 +02:00
|
|
|
|
{
|
2018-08-21 23:42:55 +02:00
|
|
|
|
EnableKeyAsSegment = true,
|
2017-11-21 23:47:38 +01:00
|
|
|
|
Version = new Version(1, 0, 1),
|
2017-12-08 20:50:35 +01:00
|
|
|
|
ServiceRoot = new Uri("http://services.odata.org/TrippinRESTierService"),
|
2019-06-19 23:27:48 +02:00
|
|
|
|
IEEE754Compatible = true,
|
|
|
|
|
OpenApiSpecVersion = specVersion
|
2017-10-19 23:39:57 +02:00
|
|
|
|
};
|
|
|
|
|
// Act
|
2017-11-21 23:47:38 +01:00
|
|
|
|
string json = WriteEdmModelAsOpenApi(model, OpenApiFormat.Json, settings);
|
2017-11-15 01:54:03 +01:00
|
|
|
|
_output.WriteLine(json);
|
2017-10-19 23:39:57 +02:00
|
|
|
|
|
|
|
|
|
// Assert
|
2019-06-19 23:27:48 +02:00
|
|
|
|
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);
|
|
|
|
|
}
|
2017-10-19 23:39:57 +02:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-19 23:27:48 +02:00
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
|
|
|
|
|
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
|
|
|
|
|
public void TripServiceMetadataToOpenApiYamlWorks(OpenApiSpecVersion specVersion)
|
2017-10-19 23:39:57 +02:00
|
|
|
|
{
|
|
|
|
|
// Arrange
|
|
|
|
|
IEdmModel model = EdmModelHelper.TripServiceModel;
|
2017-11-21 23:47:38 +01:00
|
|
|
|
|
|
|
|
|
OpenApiConvertSettings settings = new OpenApiConvertSettings
|
2017-10-19 23:39:57 +02:00
|
|
|
|
{
|
2018-08-21 23:42:55 +02:00
|
|
|
|
EnableKeyAsSegment = true,
|
2017-11-21 23:47:38 +01:00
|
|
|
|
Version = new Version(1, 0, 1),
|
2017-12-08 20:50:35 +01:00
|
|
|
|
ServiceRoot = new Uri("http://services.odata.org/TrippinRESTierService"),
|
2019-06-19 23:27:48 +02:00
|
|
|
|
IEEE754Compatible = true,
|
|
|
|
|
OpenApiSpecVersion = specVersion
|
2017-10-19 23:39:57 +02:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Act
|
2017-11-21 23:47:38 +01:00
|
|
|
|
string yaml = WriteEdmModelAsOpenApi(model, OpenApiFormat.Yaml, settings);
|
2017-11-15 01:54:03 +01:00
|
|
|
|
_output.WriteLine(yaml);
|
2017-10-19 23:39:57 +02:00
|
|
|
|
|
|
|
|
|
// Assert
|
2019-06-19 23:27:48 +02:00
|
|
|
|
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);
|
|
|
|
|
}
|
2017-10-19 23:39:57 +02:00
|
|
|
|
}
|
|
|
|
|
|
2017-11-15 01:54:03 +01:00
|
|
|
|
private static string WriteEdmModelAsOpenApi(IEdmModel model, OpenApiFormat target,
|
2017-11-21 23:47:38 +01:00
|
|
|
|
OpenApiConvertSettings settings = null)
|
2017-10-19 23:39:57 +02:00
|
|
|
|
{
|
2018-09-18 23:35:57 +02:00
|
|
|
|
settings = settings ?? new OpenApiConvertSettings();
|
2017-11-21 23:47:38 +01:00
|
|
|
|
var document = model.ConvertToOpenApi(settings);
|
2017-12-06 03:28:34 +01:00
|
|
|
|
Assert.NotNull(document); // guard
|
|
|
|
|
|
2017-10-19 23:39:57 +02:00
|
|
|
|
MemoryStream stream = new MemoryStream();
|
2019-06-19 23:27:48 +02:00
|
|
|
|
document.Serialize(stream, settings.OpenApiSpecVersion, target);
|
2017-10-19 23:39:57 +02:00
|
|
|
|
stream.Flush();
|
|
|
|
|
stream.Position = 0;
|
|
|
|
|
return new StreamReader(stream).ReadToEnd();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|