OpenAPI.NET.OData/test/Microsoft.OpenAPI.OData.Reader.Tests/Edm/ODataPathTests.cs

276 lines
11 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 Microsoft.OData.Edm;
using Microsoft.OpenApi.OData.Properties;
using Xunit;
namespace Microsoft.OpenApi.OData.Edm.Tests
{
public class ODataPathTests
{
private IEdmEntityType _simpleKeyEntityType;
private IEdmEntitySet _simpleKeyEntitySet;
private IEdmEntityType _compositeKeyEntityType;
private IEdmEntitySet _compositeKeyEntitySet;
public ODataPathTests()
{
// Single key entity type
EdmEntityType entityType = new EdmEntityType("NS", "Order");
entityType.AddKeys(entityType.AddStructuralProperty("Id", EdmPrimitiveTypeKind.Int32));
_simpleKeyEntityType = entityType;
EdmEntityContainer container = new EdmEntityContainer("NS", "Default");
EdmEntitySet entitySet = new EdmEntitySet(container, "Orders", entityType);
_simpleKeyEntitySet = entitySet;
// Multiple keys entity type
entityType = new EdmEntityType("NS", "Customer");
entityType.AddKeys(entityType.AddStructuralProperty("FirstName", EdmPrimitiveTypeKind.String),
entityType.AddStructuralProperty("LastName", EdmPrimitiveTypeKind.String));
_compositeKeyEntityType = entityType;
entitySet = new EdmEntitySet(container, "Customers", entityType);
_compositeKeyEntitySet = entitySet;
}
[Fact]
public void ODataPathConstructorThrowsArgumentNull()
{
Assert.Throws<ArgumentNullException>("source", () => new ODataPath(null));
}
[Fact]
public void ODataPathPopThrowsForEmptyPath()
{
// Arrange
ODataPath path = new ODataPath();
// Act
Action text = () => path.Pop();
// Assert
var exception = Assert.Throws<InvalidOperationException>(text);
Assert.Equal(SRResource.ODataPathPopInvalid, exception.Message);
}
[Fact]
public void ODataPathPushWorks()
{
// Arrange
ODataPath path = new ODataPath();
Assert.Empty(path); // guard
// Act
path.Push(new ODataNavigationSourceSegment(_simpleKeyEntitySet));
// Assert
Assert.Single(path);
Assert.Equal(1, path.Count);
}
[Fact]
public void ODataPathFirstSegmentWorks()
{
// Arrange
ODataNavigationSourceSegment nsSegment = new ODataNavigationSourceSegment(_simpleKeyEntitySet);
ODataKeySegment keySegment = new ODataKeySegment(_simpleKeyEntityType);
ODataPath path = new ODataPath(nsSegment, keySegment);
// Act
var segment = path.FirstSegment;
// Assert
Assert.Same(nsSegment, segment);
}
[Fact]
public void ODataPathLastSegmentWorks()
{
// Arrange
ODataNavigationSourceSegment nsSegment = new ODataNavigationSourceSegment(_simpleKeyEntitySet);
ODataKeySegment keySegment = new ODataKeySegment(_simpleKeyEntityType);
ODataPath path = new ODataPath(nsSegment, keySegment);
// Act
var segment = path.LastSegment;
// Assert
Assert.Same(keySegment, segment);
}
[Fact]
public void KindPropertyReturnsUnknown()
{
// Arrange
ODataKeySegment keySegment = new ODataKeySegment(_simpleKeyEntityType);
ODataPath path = new ODataPath(keySegment);
// Act & Assert
Assert.Equal(ODataPathKind.Unknown, path.Kind);
}
[Fact]
public void KindPropertyReturnsEntity()
{
// Arrange
ODataNavigationSourceSegment nsSegment = new ODataNavigationSourceSegment(_simpleKeyEntitySet);
ODataKeySegment keySegment = new ODataKeySegment(_simpleKeyEntityType);
ODataPath path = new ODataPath(nsSegment, keySegment);
// Act & Assert
Assert.Equal(ODataPathKind.Entity, path.Kind);
}
[Fact]
public void KindPropertyReturnsSingleton()
{
// Arrange
EdmEntityContainer container = new EdmEntityContainer("NS", "Default");
EdmSingleton me = new EdmSingleton(container, "Me", _simpleKeyEntityType);
ODataNavigationSourceSegment nsSegment = new ODataNavigationSourceSegment(me);
ODataPath path = new ODataPath(nsSegment);
// Act & Assert
Assert.Equal(ODataPathKind.Singleton, path.Kind);
}
[Fact]
public void KindPropertyReturnsEntitySet()
{
// Arrange
ODataNavigationSourceSegment nsSegment = new ODataNavigationSourceSegment(_compositeKeyEntitySet);
ODataPath path = new ODataPath(nsSegment);
// Act & Assert
Assert.Equal(ODataPathKind.EntitySet, path.Kind);
}
[Fact]
public void KindPropertyReturnsOperation()
{
// Arrange
ODataNavigationSourceSegment nsSegment = new ODataNavigationSourceSegment(_simpleKeyEntitySet);
EdmAction action = new EdmAction("NS", "MyAction", null, isBound: true, entitySetPathExpression: null);
ODataOperationSegment opSegment = new ODataOperationSegment(action);
ODataPath path = new ODataPath(nsSegment, opSegment);
// Act & Assert
Assert.Equal(ODataPathKind.Operation, path.Kind);
}
[Fact]
public void KindPropertyReturnsNavigationProperty()
{
// Arrange
EdmNavigationPropertyInfo propertyInfo = new EdmNavigationPropertyInfo
{
Name = "Nav",
TargetMultiplicity = EdmMultiplicity.One,
Target = _compositeKeyEntityType
};
var property = EdmNavigationProperty.CreateNavigationProperty(_simpleKeyEntityType, propertyInfo);
ODataNavigationPropertySegment npSegment = new ODataNavigationPropertySegment(property);
ODataNavigationSourceSegment nsSegment = new ODataNavigationSourceSegment(_simpleKeyEntitySet);
ODataKeySegment keySegment = new ODataKeySegment(_simpleKeyEntityType);
ODataPath path = new ODataPath(nsSegment, keySegment, npSegment);
// Act & Assert
Assert.Equal(ODataPathKind.NavigationProperty, path.Kind);
}
[Fact]
public void KindPropertyReturnsOperationImport()
{
// Arrange
IEdmEntityContainer container = new EdmEntityContainer("NS", "default");
IEdmAction action = new EdmAction("NS", "MyAction", null);
var operationImport = new EdmActionImport(container, "MyAction", action);
ODataOperationImportSegment segment = new ODataOperationImportSegment(operationImport);
ODataPath path = new ODataPath(segment);
// Act & Assert
Assert.Equal(ODataPathKind.OperationImport, path.Kind);
}
[Fact]
public void KindPropertyReturnsStreamProperty()
{
// Arrange
ODataNavigationSourceSegment nsSegment = new ODataNavigationSourceSegment(_simpleKeyEntitySet);
ODataKeySegment keySegment = new ODataKeySegment(_simpleKeyEntityType);
ODataStreamPropertySegment streamPropSegment = new ODataStreamPropertySegment("Logo");
ODataPath path = new ODataPath(nsSegment, keySegment, streamPropSegment);
// Act & Assert
Assert.Equal(ODataPathKind.MediaEntity, path.Kind);
}
[Fact]
public void KindPropertyReturnsStreamContent()
{
// Arrange
ODataNavigationSourceSegment nsSegment = new ODataNavigationSourceSegment(_simpleKeyEntitySet);
ODataKeySegment keySegment = new ODataKeySegment(_simpleKeyEntityType);
ODataStreamContentSegment streamContSegment = new ODataStreamContentSegment();
ODataPath path = new ODataPath(nsSegment, keySegment, streamContSegment);
// Act & Assert
Assert.Equal(ODataPathKind.MediaEntity, path.Kind);
}
[Theory]
[InlineData(true, true, "/Orders/{Order-Id}")]
[InlineData(true, false, "/Orders/{Id}")]
[InlineData(false, true, "/Orders({Order-Id})")]
[InlineData(false, false, "/Orders({Id})")]
public void GetPathItemNameReturnsCorrectWithSingleKeySegment(bool keyAsSegment, bool prefix, string expected)
{
// Arrange
ODataNavigationSourceSegment nsSegment = new ODataNavigationSourceSegment(_simpleKeyEntitySet);
ODataKeySegment keySegment = new ODataKeySegment(_simpleKeyEntityType);
ODataPath path = new ODataPath(nsSegment, keySegment);
OpenApiConvertSettings settings = new OpenApiConvertSettings
{
EnableKeyAsSegment = keyAsSegment,
PrefixEntityTypeNameBeforeKey = prefix
};
// Act
string pathItemName = path.GetPathItemName(settings);
// Assert
Assert.Equal(expected, pathItemName);
}
[Theory]
[InlineData(true, true, "/Customers/FirstName='{FirstName}',LastName='{LastName}'")]
[InlineData(true, false, "/Customers/FirstName='{FirstName}',LastName='{LastName}'")]
[InlineData(false, true, "/Customers(FirstName='{FirstName}',LastName='{LastName}')")]
[InlineData(false, false, "/Customers(FirstName='{FirstName}',LastName='{LastName}')")]
public void GetPathItemNameReturnsCorrectStringWithMultipleKeySegment(bool keyAsSegment, bool prefix, string expected)
{
// Arrange
ODataNavigationSourceSegment nsSegment = new ODataNavigationSourceSegment(_compositeKeyEntitySet);
ODataKeySegment keySegment = new ODataKeySegment(_compositeKeyEntityType);
ODataPath path = new ODataPath(nsSegment, keySegment);
OpenApiConvertSettings settings = new OpenApiConvertSettings
{
EnableKeyAsSegment = keyAsSegment,
PrefixEntityTypeNameBeforeKey = prefix
};
// Act
string pathItemName = path.GetPathItemName(settings);
// Assert
Assert.Equal(expected, pathItemName);
}
}
}