add the schema test cases
This commit is contained in:
parent
e366220190
commit
25654147ac
|
@ -47,9 +47,7 @@ namespace Microsoft.OpenApi.OData
|
|||
|
||||
Paths = model.CreatePaths(),
|
||||
|
||||
Components = model.CreateComponents(),
|
||||
|
||||
ExternalDocs = null
|
||||
Components = model.CreateComponents()
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,6 +15,26 @@ namespace Microsoft.OpenApi.OData
|
|||
/// </summary>
|
||||
internal static class OpenApiParameterGenerator
|
||||
{
|
||||
// 4.6.2 Field parameters in components
|
||||
public static IDictionary<string, OpenApiParameter> CreateParameters(this IEdmModel model)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw Error.ArgumentNull(nameof(model));
|
||||
}
|
||||
|
||||
// It allows defining query options and headers that can be reused across operations of the service.
|
||||
// The value of parameters is a map of Parameter Objects
|
||||
return new Dictionary<string, OpenApiParameter>
|
||||
{
|
||||
{ "top", CreateTop() },
|
||||
{ "skip", CreateSkip() },
|
||||
{ "count", CreateCount() },
|
||||
{ "filter", CreateFilter() },
|
||||
{ "search", CreateSearch() },
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create key parameters for the <see cref="IEdmEntityType"/>.
|
||||
/// </summary>
|
||||
|
@ -143,26 +163,6 @@ namespace Microsoft.OpenApi.OData
|
|||
return parameter;
|
||||
}
|
||||
|
||||
// 4.6.2 Field parameters in components
|
||||
public static IDictionary<string, OpenApiParameter> CreateParameters(this IEdmModel model)
|
||||
{
|
||||
if (model == null)
|
||||
{
|
||||
throw Error.ArgumentNull(nameof(model));
|
||||
}
|
||||
|
||||
// It allows defining query options and headers that can be reused across operations of the service.
|
||||
// The value of parameters is a map of Parameter Objects
|
||||
return new Dictionary<string, OpenApiParameter>
|
||||
{
|
||||
{ "top", CreateTop() },
|
||||
{ "skip", CreateSkip() },
|
||||
{ "count", CreateCount() },
|
||||
{ "filter", CreateFilter() },
|
||||
{ "search", CreateSearch() },
|
||||
};
|
||||
}
|
||||
|
||||
// #top
|
||||
private static OpenApiParameter CreateTop()
|
||||
{
|
||||
|
|
|
@ -154,9 +154,9 @@ namespace Microsoft.OpenApi.OData
|
|||
// structure properties
|
||||
foreach (var property in structuredType.DeclaredStructuralProperties())
|
||||
{
|
||||
OpenApiSchema propertySchema = property.Type.CreateSchema();
|
||||
propertySchema.Default = property.DefaultValueString != null ? new OpenApiString(property.DefaultValueString) : null;
|
||||
properties.Add(property.Name, propertySchema);
|
||||
// OpenApiSchema propertySchema = property.Type.CreateSchema();
|
||||
// propertySchema.Default = property.DefaultValueString != null ? new OpenApiString(property.DefaultValueString) : null;
|
||||
properties.Add(property.Name, property.CreateSchema());
|
||||
}
|
||||
|
||||
// navigation properties
|
||||
|
@ -168,5 +168,70 @@ namespace Microsoft.OpenApi.OData
|
|||
|
||||
return properties;
|
||||
}
|
||||
|
||||
public static OpenApiSchema CreateSchema(this IEdmStructuralProperty property)
|
||||
{
|
||||
if (property == null)
|
||||
{
|
||||
throw Error.ArgumentNull(nameof(property));
|
||||
}
|
||||
|
||||
OpenApiSchema schema = property.Type.CreateSchema();
|
||||
schema.Default = property.CreateDefault();
|
||||
|
||||
return schema;
|
||||
}
|
||||
|
||||
private static IOpenApiAny CreateDefault(this IEdmStructuralProperty property)
|
||||
{
|
||||
if (property == null ||
|
||||
property.DefaultValueString == null ||
|
||||
!property.Type.IsPrimitive())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
IEdmPrimitiveTypeReference primitiveTypeReference = property.Type.AsPrimitive();
|
||||
switch(primitiveTypeReference.PrimitiveKind())
|
||||
{
|
||||
case EdmPrimitiveTypeKind.Boolean:
|
||||
{
|
||||
bool result;
|
||||
if (Boolean.TryParse(property.DefaultValueString, out result))
|
||||
{
|
||||
return new OpenApiBoolean(result);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case EdmPrimitiveTypeKind.Int16:
|
||||
case EdmPrimitiveTypeKind.Int32:
|
||||
{
|
||||
int result;
|
||||
if (Int32.TryParse(property.DefaultValueString, out result))
|
||||
{
|
||||
return new OpenApiInteger(result);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case EdmPrimitiveTypeKind.Int64:
|
||||
break;
|
||||
|
||||
// The type 'System.Double' is not supported in Open API document.
|
||||
case EdmPrimitiveTypeKind.Double:
|
||||
/*
|
||||
{
|
||||
double result;
|
||||
if (Double.TryParse(property.DefaultValueString, out result))
|
||||
{
|
||||
return new OpenApiDouble((float)result);
|
||||
}
|
||||
}*/
|
||||
break;
|
||||
}
|
||||
|
||||
return new OpenApiString(property.DefaultValueString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -230,51 +230,55 @@ namespace Microsoft.OpenApi.OData
|
|||
schema.Format = "time";
|
||||
schema.Pattern = "^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]([.][0-9]{1,12})?$";
|
||||
break;
|
||||
|
||||
case EdmPrimitiveTypeKind.Geography:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.Geography");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeographyPoint:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeographyPoint");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeographyLineString:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeographyLineString");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeographyPolygon:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeographyPolygon");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeographyCollection:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeographyCollection");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeographyMultiPolygon:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeographyMultiPolygon");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeographyMultiLineString:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryCollection");
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeographyMultiLineString");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeographyMultiPoint:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryCollection");
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeographyMultiPoint");
|
||||
break;
|
||||
|
||||
case EdmPrimitiveTypeKind.Geometry: // Geometry
|
||||
schema.Type = "object";
|
||||
schema.AnyOf = new List<OpenApiSchema>
|
||||
{
|
||||
new OpenApiSchema { Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryPoint")},
|
||||
new OpenApiSchema { Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryLineString")},
|
||||
new OpenApiSchema { Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryPolygon")},
|
||||
new OpenApiSchema { Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryMultiPoint")},
|
||||
new OpenApiSchema { Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryMultiLineString")},
|
||||
new OpenApiSchema { Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryMultiPolygon")},
|
||||
new OpenApiSchema { Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryCollection")},
|
||||
};
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.Geometry");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeometryPoint:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryPoint");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeometryLineString:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryLineString");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeometryPolygon:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryPolygon");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeometryCollection:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryCollection");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeometryMultiPolygon:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryMultiPolygon");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeometryMultiLineString:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryMultiLineString");
|
||||
break;
|
||||
case EdmPrimitiveTypeKind.GeometryMultiPoint:
|
||||
schema.Pointer = new OpenApiReference(_externalResource, "definitions/Edm.GeometryMultiPoint");
|
||||
break;
|
||||
|
||||
case EdmPrimitiveTypeKind.None:
|
||||
|
|
|
@ -8,6 +8,8 @@ using System;
|
|||
using System.IO;
|
||||
using Microsoft.OpenApi.Interfaces;
|
||||
using Microsoft.OpenApi.Writers;
|
||||
using Microsoft.OpenApi.Models;
|
||||
using Xunit;
|
||||
|
||||
namespace Microsoft.OpenApi.OData.Tests
|
||||
{
|
||||
|
@ -97,5 +99,27 @@ namespace Microsoft.OpenApi.OData.Tests
|
|||
stream.Position = 0;
|
||||
return new StreamReader(stream).ReadToEnd();
|
||||
}
|
||||
|
||||
internal static string SerializeAsJson<T>(this T element)
|
||||
where T : OpenApiElement
|
||||
{
|
||||
return element.Serialize(OpenApiFormat.Json);
|
||||
}
|
||||
|
||||
internal static string SerializeAsYaml<T>(this T element)
|
||||
where T : OpenApiElement
|
||||
{
|
||||
return element.Serialize(OpenApiFormat.Yaml);
|
||||
}
|
||||
|
||||
internal static string Serialize<T>(this T element, OpenApiFormat format)
|
||||
where T : OpenApiElement
|
||||
{
|
||||
Assert.NotNull(element);
|
||||
MemoryStream stream = new MemoryStream();
|
||||
element.Serialize(stream, OpenApiSpecVersion.OpenApi3_0, format);
|
||||
stream.Position = 0;
|
||||
return new StreamReader(stream).ReadToEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,131 @@
|
|||
// ------------------------------------------------------------
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.
|
||||
// ------------------------------------------------------------
|
||||
|
||||
using Microsoft.OData.Edm;
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
namespace Microsoft.OpenApi.OData.Tests
|
||||
{
|
||||
public class OpenApiSchemaGeneratorTest
|
||||
{
|
||||
private ITestOutputHelper _output;
|
||||
public OpenApiSchemaGeneratorTest(ITestOutputHelper output)
|
||||
{
|
||||
_output = output;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void NonNullableBooleanPropertyWithDefaultValueWorks()
|
||||
{
|
||||
// Arrange
|
||||
EdmEntityType entitType = new EdmEntityType("NS", "Entity");
|
||||
IEdmStructuralProperty property = new EdmStructuralProperty(
|
||||
entitType, "BooleanValue", EdmCoreModel.Instance.GetBoolean(false), "false");
|
||||
|
||||
// Act
|
||||
var schema = property.CreateSchema();
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(schema);
|
||||
Assert.Equal("boolean", schema.Type);
|
||||
|
||||
string json = schema.SerializeAsJson();
|
||||
Assert.Equal(@"{
|
||||
""type"": ""boolean"",
|
||||
""default"": false
|
||||
}".Replace(), json);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void NonNullableBinaryPropertyWithBothMaxLengthAndDefaultValueWorks()
|
||||
{
|
||||
// Arrange
|
||||
EdmEntityType entitType = new EdmEntityType("NS", "Entity");
|
||||
var binaryType = new EdmBinaryTypeReference(EdmCoreModel.Instance.GetPrimitiveType(EdmPrimitiveTypeKind.Binary),
|
||||
false, false, 44);
|
||||
IEdmStructuralProperty property = new EdmStructuralProperty(
|
||||
entitType, "BinaryValue", binaryType, "T0RhdGE");
|
||||
|
||||
// Act
|
||||
var schema = property.CreateSchema();
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(schema);
|
||||
Assert.Equal("string", schema.Type);
|
||||
|
||||
string json = schema.SerializeAsJson();
|
||||
Assert.Equal(@"{
|
||||
""maxLength"": 44,
|
||||
""type"": ""string"",
|
||||
""format"": ""base64url"",
|
||||
""default"": ""T0RhdGE""
|
||||
}".Replace(), json);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void NonNullableIntegerPropertyWithDefaultValueWorks()
|
||||
{
|
||||
// Arrange
|
||||
EdmEntityType entitType = new EdmEntityType("NS", "Entity");
|
||||
IEdmStructuralProperty property = new EdmStructuralProperty(
|
||||
entitType, "IntegerValue", EdmCoreModel.Instance.GetInt32(false), "-128");
|
||||
|
||||
// Act
|
||||
var schema = property.CreateSchema();
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(schema);
|
||||
Assert.Equal("integer", schema.Type);
|
||||
|
||||
string json = schema.SerializeAsJson();
|
||||
Assert.Equal(@"{
|
||||
""maximum"": 2147483647,
|
||||
""minimum"": -2147483648,
|
||||
""type"": ""integer"",
|
||||
""format"": ""int32"",
|
||||
""default"": -128
|
||||
}".Replace(), json);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void NonNullableDoublePropertyWithDefaultStringWorks()
|
||||
{
|
||||
// Arrange
|
||||
EdmEntityType entitType = new EdmEntityType("NS", "Entity");
|
||||
IEdmStructuralProperty property = new EdmStructuralProperty(
|
||||
entitType, "DoubleValue", EdmCoreModel.Instance.GetDouble(false), "3.1415926535897931");
|
||||
|
||||
// Act
|
||||
var schema = property.CreateSchema();
|
||||
|
||||
// Assert
|
||||
Assert.NotNull(schema);
|
||||
Assert.Null(schema.Type);
|
||||
|
||||
string json = schema.SerializeAsJson();
|
||||
|
||||
Assert.Equal(@"{
|
||||
""oneOf"": [
|
||||
{
|
||||
""type"": ""number""
|
||||
},
|
||||
{
|
||||
""type"": ""string""
|
||||
},
|
||||
{
|
||||
""enum"": [
|
||||
""-INF"",
|
||||
""INF"",
|
||||
""NaN""
|
||||
]
|
||||
}
|
||||
],
|
||||
""format"": ""double"",
|
||||
""default"": ""3.1415926535897931""
|
||||
}".Replace(), json);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue