// ------------------------------------------------------------
// 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("", @"");
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 =
@"
";
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 =
@"
";
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 =
@"
";
string unbounds = @"
";
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 =
@"
";
string entitySet = @"";
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 = @"
{0}
{1}
";
string schema = String.Format(template, schemaElement, containerElement);
IEdmModel parsedModel;
IEnumerable errors;
bool parsed = SchemaReader.TryParse(new XmlReader[] { XmlReader.Create(new StringReader(schema)) }, out parsedModel, out errors);
Assert.True(parsed);
return parsedModel;
}
}
}