public void TargetOnEntitySetReturnsCorrectNavigationRestrictionsValue(EdmVocabularyAnnotationSerializationLocation location) { // Arrange const string outOfLineTemplate = @" <Annotations Target=""NS.Default/Calendars""> {0} </Annotations>"; string navigationAnnotation = @" <Annotation Term=""Org.OData.Capabilities.V1.NavigationRestrictions"" > <Record> <PropertyValue Property=""Navigability"" > <EnumMember>Org.OData.Capabilities.V1.NavigationType/Recursive</EnumMember> </PropertyValue> <PropertyValue Property=""RestrictedProperties"" > <Collection> <Record> <PropertyValue Property=""Navigability"" > <EnumMember>Org.OData.Capabilities.V1.NavigationType/Single</EnumMember> </PropertyValue> <PropertyValue Property=""NavigationProperty"" NavigationPropertyPath=""abc"" /> </Record> <Record> <PropertyValue Property=""Navigability"" > <EnumMember>Org.OData.Capabilities.V1.NavigationType/None</EnumMember> </PropertyValue> <PropertyValue Property=""NavigationProperty"" NavigationPropertyPath=""xyz"" /> </Record> </Collection> </PropertyValue> </Record> </Annotation>"; IEdmModel model; if (location == EdmVocabularyAnnotationSerializationLocation.OutOfLine) { navigationAnnotation = string.Format(outOfLineTemplate, navigationAnnotation); model = CapabilitiesModelHelper.GetEdmModelOutline(navigationAnnotation); } else { model = CapabilitiesModelHelper.GetEdmModelTypeInline(navigationAnnotation); } IEdmEntitySet calendars = model.EntityContainer.FindEntitySet("Calendars"); // Act NavigationRestrictions navigation = new NavigationRestrictions(); bool result = navigation.Load(model, calendars); // Assert Assert.True(result); VerifyNavigationRestrictions(navigation); NavigationPropertyRestriction navRestriction = navigation.RestrictedProperties.Last(); Assert.NotNull(navRestriction.Navigability); Assert.Equal(NavigationType.None, navRestriction.Navigability.Value); Assert.Equal("xyz", navRestriction.NavigationProperty); Assert.True(navigation.IsRestrictedProperty("xyz")); }
public void TargetWithUnknownEnumMemberDoesnotReturnsNavigationRestrictionsValue() { // Arrange const string navigationAnnotation = @" <Annotations Target=""NS.Calendar"" > <Annotation Term=""Org.OData.Capabilities.V1.NavigationRestrictions""> <Record> <PropertyValue Property=""Navigability"" > <EnumMember>Org.OData.Capabilities.V1.NavigationType/Unknown</EnumMember> </PropertyValue> </Record> </Annotation> </Annotations>"; IEdmModel model = CapabilitiesModelHelper.GetEdmModelOutline(navigationAnnotation); IEdmEntityType calendar = model.SchemaElements.OfType<IEdmEntityType>().First(c => c.Name == "Calendar"); // Act NavigationRestrictions navigation = new NavigationRestrictions(); bool result = navigation.Load(model, calendar); // Assert Assert.True(result); Assert.Null(navigation.Navigability); Assert.Null(navigation.RestrictedProperties); }
public void KindPropertyReturnsNavigationRestrictionsEnumMember() { // Arrange & Act NavigationRestrictions navigation = new NavigationRestrictions(); // Assert Assert.Equal(CapabilitesTermKind.NavigationRestrictions, navigation.Kind); }
/// <inheritdoc/> protected override void SetOperations(OpenApiPathItem item) { IEdmEntitySet entitySet = NavigationSource as IEdmEntitySet; IEdmVocabularyAnnotatable target = entitySet; if (target == null) { target = NavigationSource as IEdmSingleton; } string navigationPropertyPath = String.Join("/", Path.Segments.OfType <ODataNavigationPropertySegment>().Select(e => e.NavigationProperty.Name)); // contaiment: Get / (Post - Collection | Patch - Single) // non-containment: only Get NavigationRestrictions navigation = Context.Model.GetNavigationRestrictions(target); if (navigation == null || !navigation.IsRestrictedProperty(navigationPropertyPath)) { AddOperation(item, OperationType.Get); } if (NavigationProperty.ContainsTarget) { if (NavigationProperty.TargetMultiplicity() == EdmMultiplicity.Many) { if (LastSegmentIsKeySegment) { // Need to check this scenario is valid or not? UpdateRestrictions update = Context.Model.GetUpdateRestrictions(target); if (update == null || !update.IsNonUpdatableNavigationProperty(navigationPropertyPath)) { AddOperation(item, OperationType.Patch); } } else { InsertRestrictions insert = Context.Model.GetInsertRestrictions(target); if (insert == null || !insert.IsNonInsertableNavigationProperty(navigationPropertyPath)) { AddOperation(item, OperationType.Post); } } } else { UpdateRestrictions update = Context.Model.GetUpdateRestrictions(target); if (update == null || !update.IsNonUpdatableNavigationProperty(navigationPropertyPath)) { AddOperation(item, OperationType.Patch); } } } }
public void UnknownAnnotatableTargetReturnsDefaultPropertyValues() { // Arrange NavigationRestrictions navigation = new NavigationRestrictions(); EdmEntityType entityType = new EdmEntityType("NS", "Entity"); // Act bool result = navigation.Load(EdmCoreModel.Instance, entityType); // Assert Assert.False(result); Assert.True(navigation.IsNavigable); Assert.Null(navigation.Navigability); Assert.Null(navigation.RestrictedProperties); }
// <summary> /// Create $select parameter for the <see cref="IEdmNavigationSource"/>. /// </summary> /// <param name="context">The OData context.</param> /// <param name="navigationSource">The Edm navigation source.</param> /// <returns>The created <see cref="OpenApiParameter"/> or null.</returns> public static OpenApiParameter CreateSelect(this ODataContext context, IEdmVocabularyAnnotatable target, IEdmEntityType entityType) { Utils.CheckArgumentNull(context, nameof(context)); Utils.CheckArgumentNull(target, nameof(target)); Utils.CheckArgumentNull(entityType, nameof(entityType)); NavigationRestrictions navigation = context.Model.GetNavigationRestrictions(target); if (navigation != null && !navigation.IsNavigable) { return(null); } IList <IOpenApiAny> selectItems = new List <IOpenApiAny>(); foreach (var property in entityType.StructuralProperties()) { selectItems.Add(new OpenApiString(property.Name)); } foreach (var property in entityType.NavigationProperties()) { if (navigation != null && navigation.IsRestrictedProperty(property.Name)) { continue; } selectItems.Add(new OpenApiString(property.Name)); } return(new OpenApiParameter { Name = "$select", In = ParameterLocation.Query, Description = "Select properties to be returned", Schema = new OpenApiSchema { Type = "array", UniqueItems = true, Items = new OpenApiSchema { Type = "string", Enum = selectItems } }, Style = ParameterStyle.Simple }); }
/// <inheritdoc/> protected override void SetOperations(OpenApiPathItem item) { NavigationRestrictions navigation = Context.Model.GetNavigationRestrictions(EntitySet); if (navigation == null || navigation.IsNavigable) { AddOperation(item, OperationType.Get); } InsertRestrictions insert = Context.Model.GetInsertRestrictions(EntitySet); if (insert == null || insert.IsInsertable) { AddOperation(item, OperationType.Post); } }
private static void VerifyNavigationRestrictions(NavigationRestrictions navigation) { Assert.NotNull(navigation); Assert.True(navigation.IsNavigable); Assert.NotNull(navigation.Navigability); Assert.Equal(NavigationType.Recursive, navigation.Navigability.Value); Assert.NotNull(navigation.RestrictedProperties); Assert.Equal(2, navigation.RestrictedProperties.Count); NavigationPropertyRestriction navRestriction = navigation.RestrictedProperties.First(); Assert.NotNull(navRestriction.Navigability); Assert.Equal(NavigationType.Single, navRestriction.Navigability.Value); Assert.Equal("abc", navRestriction.NavigationProperty); Assert.False(navigation.IsRestrictedProperty("abc")); }
/// <inheritdoc/> protected override void SetOperations(OpenApiPathItem item) { // Retrieve a singleton. NavigationRestrictions navigation = Context.Model.GetNavigationRestrictions(Singleton); if (navigation == null || navigation.IsNavigable) { AddOperation(item, OperationType.Get); } // Update a singleton UpdateRestrictions update = Context.Model.GetUpdateRestrictions(Singleton); if (update == null || update.IsUpdatable) { AddOperation(item, OperationType.Patch); } }