add the schema test cases

This commit is contained in:
Sam Xu 2017-11-15 19:22:08 -08:00
parent e366220190
commit 25654147ac
6 changed files with 261 additions and 39 deletions

View file

@ -47,9 +47,7 @@ namespace Microsoft.OpenApi.OData
Paths = model.CreatePaths(),
Components = model.CreateComponents(),
ExternalDocs = null
Components = model.CreateComponents()
};
}
}

View file

@ -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()
{

View file

@ -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);
}
}
}

View file

@ -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:

View file

@ -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();
}
}
}

View file

@ -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);
}
}
}