206 lines
6.9 KiB
C#
206 lines
6.9 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.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Xml;
|
|
using Microsoft.OData.Edm;
|
|
using Microsoft.OData.Edm.Csdl;
|
|
using Microsoft.OData.Edm.Validation;
|
|
using Microsoft.OpenApi.OData.Tests;
|
|
using Xunit;
|
|
|
|
namespace Microsoft.OpenApi.OData.Edm.Tests
|
|
{
|
|
public class ODataPathProviderTests
|
|
{
|
|
[Fact]
|
|
public void GetPathsForEmptyEdmModelReturnsEmptyPaths()
|
|
{
|
|
// Arrange
|
|
IEdmModel model = new EdmModel();
|
|
ODataPathProvider provider = new ODataPathProvider();
|
|
|
|
// Act
|
|
var paths = provider.GetPaths(model);
|
|
|
|
// Assert
|
|
Assert.NotNull(paths);
|
|
Assert.Empty(paths);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetPathsForGraphBetaModelReturnsAllPaths()
|
|
{
|
|
// Arrange
|
|
IEdmModel model = EdmModelHelper.GraphBetaModel;
|
|
ODataPathProvider provider = new ODataPathProvider();
|
|
|
|
// Act
|
|
var paths = provider.GetPaths(model);
|
|
|
|
// Assert
|
|
Assert.NotNull(paths);
|
|
Assert.Equal(4399, paths.Count());
|
|
}
|
|
|
|
[Fact]
|
|
public void GetPathsForSingleEntitySetWorks()
|
|
{
|
|
// Arrange
|
|
IEdmModel model = GetEdmModel("", "");
|
|
ODataPathProvider provider = new ODataPathProvider();
|
|
|
|
// Act
|
|
var paths = provider.GetPaths(model);
|
|
|
|
// Assert
|
|
Assert.NotNull(paths);
|
|
Assert.Equal(2, paths.Count());
|
|
Assert.Equal(new[] { "/Customers", "/Customers({ID})" }, paths.Select(p => p.GetPathItemName()));
|
|
}
|
|
|
|
[Fact]
|
|
public void GetPathsWithSingletonWorks()
|
|
{
|
|
// Arrange
|
|
IEdmModel model = GetEdmModel("", @"<Singleton Name=""Me"" Type=""NS.Customer"" />");
|
|
ODataPathProvider provider = new ODataPathProvider();
|
|
|
|
// Act
|
|
var paths = provider.GetPaths(model);
|
|
|
|
// Assert
|
|
Assert.NotNull(paths);
|
|
Assert.Equal(3, paths.Count());
|
|
Assert.Contains("/Me", paths.Select(p => p.GetPathItemName()));
|
|
}
|
|
|
|
[Fact]
|
|
public void GetPathsWithBoundFunctionOperationWorks()
|
|
{
|
|
// Arrange
|
|
string boundFunction =
|
|
@"<Function Name=""delta"" IsBound=""true"">
|
|
<Parameter Name=""bindingParameter"" Type=""Collection(NS.Customer)"" />
|
|
<ReturnType Type=""Collection(NS.Customer)"" />
|
|
</Function>";
|
|
IEdmModel model = GetEdmModel(boundFunction, "");
|
|
ODataPathProvider provider = new ODataPathProvider();
|
|
|
|
// Act
|
|
var paths = provider.GetPaths(model);
|
|
|
|
// Assert
|
|
Assert.NotNull(paths);
|
|
Assert.Equal(3, paths.Count());
|
|
Assert.Contains("/Customers/NS.delta()", paths.Select(p => p.GetPathItemName()));
|
|
}
|
|
|
|
[Fact]
|
|
public void GetPathsWithBoundActionOperationWorks()
|
|
{
|
|
// Arrange
|
|
string boundAction =
|
|
@"<Action Name=""renew"" IsBound=""true"">
|
|
<Parameter Name=""bindingParameter"" Type=""NS.Customer"" />
|
|
<ReturnType Type=""Edm.Boolean"" />
|
|
</Action>";
|
|
IEdmModel model = GetEdmModel(boundAction, "");
|
|
ODataPathProvider provider = new ODataPathProvider();
|
|
|
|
// Act
|
|
var paths = provider.GetPaths(model);
|
|
|
|
// Assert
|
|
Assert.NotNull(paths);
|
|
Assert.Equal(3, paths.Count());
|
|
Assert.Contains("/Customers({ID})/NS.renew", paths.Select(p => p.GetPathItemName()));
|
|
}
|
|
|
|
[Fact]
|
|
public void GetPathsWithUnboundOperationImportWorks()
|
|
{
|
|
// Arrange
|
|
string boundAction =
|
|
@"<Function Name=""GetNearestCustomers"">
|
|
<ReturnType Type=""NS.Customer"" />
|
|
</Function >
|
|
<Action Name=""ResetDataSource"" />";
|
|
|
|
string unbounds = @"
|
|
<FunctionImport Name=""GetNearestCustomers"" Function=""NS.GetNearestCustomers"" EntitySet=""Customers"" />
|
|
<ActionImport Name =""ResetDataSource"" Action =""NS.ResetDataSource"" />";
|
|
IEdmModel model = GetEdmModel(boundAction, unbounds);
|
|
|
|
ODataPathProvider provider = new ODataPathProvider();
|
|
|
|
// Act
|
|
var paths = provider.GetPaths(model);
|
|
|
|
// Assert
|
|
Assert.NotNull(paths);
|
|
Assert.Equal(4, paths.Count());
|
|
Assert.Contains("/GetNearestCustomers()", paths.Select(p => p.GetPathItemName()));
|
|
Assert.Contains("/ResetDataSource", paths.Select(p => p.GetPathItemName()));
|
|
}
|
|
|
|
[Fact]
|
|
public void GetPathsWithNavigationPropertytWorks()
|
|
{
|
|
// Arrange
|
|
string entityType =
|
|
@"<EntityType Name=""Order"">
|
|
<Key>
|
|
<PropertyRef Name=""id"" />
|
|
</Key>
|
|
<NavigationProperty Name=""MultipleCustomers"" Type=""Collection(NS.Customer)"" />
|
|
<NavigationProperty Name=""SingleCustomers"" Type=""NS.Customer"" />
|
|
</EntityType>";
|
|
|
|
string entitySet = @"<EntitySet Name=""Orders"" EntityType=""NS.Order"" />";
|
|
IEdmModel model = GetEdmModel(entityType, entitySet);
|
|
|
|
ODataPathProvider provider = new ODataPathProvider();
|
|
|
|
// Act
|
|
var paths = provider.GetPaths(model);
|
|
|
|
// Assert
|
|
Assert.NotNull(paths);
|
|
Assert.Equal(7, paths.Count());
|
|
Assert.Contains("/Orders({id})/MultipleCustomers", paths.Select(p => p.GetPathItemName()));
|
|
Assert.Contains("/Orders({id})/MultipleCustomers({ID})", paths.Select(p => p.GetPathItemName()));
|
|
Assert.Contains("/Orders({id})/SingleCustomers", paths.Select(p => p.GetPathItemName()));
|
|
}
|
|
|
|
private static IEdmModel GetEdmModel(string schemaElement, string containerElement)
|
|
{
|
|
string template = @"<?xml version=""1.0"" encoding=""utf-16""?>
|
|
<Schema Namespace=""NS"" xmlns=""http://docs.oasis-open.org/odata/ns/edm"">
|
|
<EntityType Name=""Customer"">
|
|
<Key>
|
|
<PropertyRef Name=""ID"" />
|
|
</Key>
|
|
<Property Name=""ID"" Type=""Edm.Int32"" Nullable=""false"" />
|
|
</EntityType>
|
|
{0}
|
|
<EntityContainer Name =""Default"">
|
|
<EntitySet Name=""Customers"" EntityType=""NS.Customer"" />
|
|
{1}
|
|
</EntityContainer>
|
|
</Schema>";
|
|
string schema = String.Format(template, schemaElement, containerElement);
|
|
IEdmModel parsedModel;
|
|
IEnumerable<EdmError> errors;
|
|
bool parsed = SchemaReader.TryParse(new XmlReader[] { XmlReader.Create(new StringReader(schema)) }, out parsedModel, out errors);
|
|
Assert.True(parsed);
|
|
return parsedModel;
|
|
}
|
|
}
|
|
}
|