/// <summary> /// Initializes a new instance of the <see cref="PathTemplateSegmentTemplate"/> class. /// </summary> /// <param name="segment">The path template segment to be parsed as a template.</param> public PathTemplateSegmentTemplate(PathTemplateSegment segment) { if (segment == null) { throw Error.ArgumentNull("segment"); } TemplateSegment = segment; string value; SegmentName = segment.TranslatePathTemplateSegment(out value); PropertyName = value; TreatPropertyNameAsParameterName = false; if (RoutingConventionHelpers.IsRouteParameter(PropertyName)) { PropertyName = PropertyName.Substring(1, PropertyName.Length - 2); TreatPropertyNameAsParameterName = true; if (String.IsNullOrEmpty(PropertyName)) { Error.Format(SRResources.EmptyParameterAlias, PropertyName, segment.LiteralText); } } }
/// <summary> /// Handle a PropertySegment /// </summary> /// <param name="segment">the segment to handle</param> public override void Handle(PathTemplateSegment segment) { Contract.Assert(segment != null); _navigationSource = null; _pathUriLiteral.Add(segment.LiteralText); }
public void TryTranslatePathTemplateSegmentTemplate_ReturnsDynamicPathSegment() { // Arrange RouteValueDictionary routeValueDictionary = new RouteValueDictionary(new { dynamicproperty = "Dynamic" }); ODataTemplateTranslateContext context = new ODataTemplateTranslateContext { RouteValues = routeValueDictionary }; context.Segments.Add(new MySegment(_entityType)); PathTemplateSegment segment = new PathTemplateSegment("{dynamicproperty}"); PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment); // Act Assert.True(pathSegment.TryTranslate(context)); // Assert Assert.Equal(2, context.Segments.Count); // 1 - MySegment, 2 - Property Segment Assert.Collection(context.Segments, e => { Assert.IsType <MySegment>(e); }, e => { DynamicPathSegment dynamicSegment = Assert.IsType <DynamicPathSegment>(e); Assert.Equal("Dynamic", dynamicSegment.Identifier); }); }
public async Task VisitAsync(ODataPath path) { NotFound = false; BadRequest = false; Result = null; ResultType = null; PropertySetter = null; Index = 0; foreach (var segment in path) { await(segment switch { TypeSegment typeSegment => VisitAsync(typeSegment), NavigationPropertySegment navigationPropertySegment => VisitAsync(navigationPropertySegment), EntitySetSegment entitySetSegment => VisitAsync(entitySetSegment), SingletonSegment singletonSegment => VisitAsync(singletonSegment), KeySegment keySegment => VisitAsync(keySegment), PropertySegment propertySegment => VisitAsync(propertySegment), AnnotationSegment annotationSegment => VisitAsync(annotationSegment), OperationImportSegment operationImportSegment => VisitAsync(operationImportSegment), OperationSegment operationSegment => VisitAsync(operationSegment), DynamicPathSegment dynamicPathSegment => VisitAsync(dynamicPathSegment), CountSegment countSegment => VisitAsync(countSegment), FilterSegment filterSegment => VisitAsync(filterSegment), ReferenceSegment referenceSegment => VisitAsync(referenceSegment), EachSegment eachSegment => VisitAsync(eachSegment), NavigationPropertyLinkSegment navigationPropertyLinkSegment => VisitAsync(navigationPropertyLinkSegment), ValueSegment valueSegment => VisitAsync(valueSegment), BatchSegment batchSegment => VisitAsync(batchSegment), BatchReferenceSegment batchReferenceSegment => VisitAsync(batchReferenceSegment), MetadataSegment metadataSegment => VisitAsync(metadataSegment), PathTemplateSegment pathTemplateSegment => VisitAsync(pathTemplateSegment), _ => throw new NotSupportedException() });
public static string TranslatePathTemplateSegment(this PathTemplateSegment pathTemplatesegment, out string value) { if (pathTemplatesegment == null) { throw Error.ArgumentNull("pathTemplatesegment"); } string pathTemplateSegmentLiteralText = pathTemplatesegment.LiteralText; if (pathTemplateSegmentLiteralText == null) { throw new ODataException(Error.Format(SRResources.InvalidAttributeRoutingTemplateSegment, String.Empty)); } if (pathTemplateSegmentLiteralText.StartsWith("{", StringComparison.Ordinal) && pathTemplateSegmentLiteralText.EndsWith("}", StringComparison.Ordinal)) { string[] keyValuePair = pathTemplateSegmentLiteralText.Substring(1, pathTemplateSegmentLiteralText.Length - 2).Split(':'); if (keyValuePair.Length != 2) { throw new ODataException(Error.Format( SRResources.InvalidAttributeRoutingTemplateSegment, pathTemplateSegmentLiteralText)); } value = "{" + keyValuePair[0] + "}"; return(keyValuePair[1]); } value = String.Empty; return(String.Empty); }
public void TryTranslatePathTemplateSegmentTemplate_ReturnsNavigationPropertySegment() { // Arrange RouteValueDictionary routeValueDictionary = new RouteValueDictionary(new { property = "RelatedCustomers" }); ODataTemplateTranslateContext context = new ODataTemplateTranslateContext { RouteValues = routeValueDictionary }; context.Segments.Add(new MySegment(_entityType)); PathTemplateSegment segment = new PathTemplateSegment("{property}"); PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment); // Act Assert.True(pathSegment.TryTranslate(context)); // Assert Assert.Equal(2, context.Segments.Count); // 1 - MySegment, 2 - Property Segment Assert.Collection(context.Segments, e => { Assert.IsType <MySegment>(e); }, e => { NavigationPropertySegment propertySegment = Assert.IsType <NavigationPropertySegment>(e); Assert.Equal("RelatedCustomers", propertySegment.NavigationProperty.Name); }); }
/// <summary> /// Handle a PropertySegment /// </summary> /// <param name="segment">the segment to handle</param> public override void Handle(PathTemplateSegment segment) { _navigationSource = null; _pathTemplate.Add(ODataSegmentKinds.Property); // path template _pathUriLiteral.Add(segment.LiteralText); }
public void Ctor_FailedWithWrongPathTemplateString() { // Arrange PathTemplateSegment segment = new PathTemplateSegment("{pName:dynamic:test}"); // Act & Assert ExceptionAssert.Throws <ODataException>(() => new PathTemplateSegmentTemplate(segment), string.Format("The attribute routing template contains invalid segment '{0}'.", "{pName:dynamic:test}")); }
public static string ToUriLiteral(this PathTemplateSegment segment) { if (segment == null) { throw Error.ArgumentNull("segment"); } return(segment.LiteralText); }
public void TryTranslatePathTemplateSegmentTemplate_ThrowsArgumentNull_Context() { // Arrange PathTemplateSegment segment = new PathTemplateSegment("{any}"); PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment); // Act & Assert ExceptionAssert.ThrowsArgumentNull(() => pathSegment.TryTranslate(null), "context"); }
[InlineData("{dynamicproperty}")] // false because no previous segment in the context public void TryTranslatePathTemplateSegmentTemplate_ReturnsFalse_NotSupportedTemplate(string template) { // Arrange PathTemplateSegment segment = new PathTemplateSegment(template); PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment); ODataTemplateTranslateContext context = new ODataTemplateTranslateContext(); // Act & Assert Assert.False(pathSegment.TryTranslate(context)); }
public void CtorPathTemplateSegmentTemplate_ThrowsODataException_EmptyTemplate() { // Arrange PathTemplateSegment segment = new PathTemplateSegment("{}"); // Act & Assert ODataException exception = ExceptionAssert.Throws <ODataException>(() => new PathTemplateSegmentTemplate(segment)); Assert.Equal("The route template in path template '{}' is empty.", exception.Message); }
public void CtorPathTemplateSegmentTemplate_SetsProperties() { // Arrange & Act PathTemplateSegment segment = new PathTemplateSegment("{any}"); PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment); // Assert Assert.Equal("any", pathSegment.ParameterName); Assert.Same(segment, pathSegment.Segment); }
public void CtorPathTemplateSegmentTemplate_ThrowsODataException_WrongTemplate() { // Arrange PathTemplateSegment segment = new PathTemplateSegment("property"); // Act & Assert ODataException exception = ExceptionAssert.Throws <ODataException>(() => new PathTemplateSegmentTemplate(segment)); Assert.Equal("The attribute routing template contains invalid segment 'property'. The template string does not start with '{' or ends with '}'.", exception.Message); }
public void GetTemplatesPathTemplateSegmentTemplate_ReturnsTemplates() { // Arrange PathTemplateSegment segment = new PathTemplateSegment("{any}"); PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment); // Act & Assert IEnumerable <string> templates = pathSegment.GetTemplates(); string template = Assert.Single(templates); Assert.Equal("/{any}", template); }
public void Ctor_SetPropertiesCorrectly() { // Arrange PathTemplateSegment segment = new PathTemplateSegment("{pName:dynamicproperty}"); // Act PathTemplateSegmentTemplate template = new PathTemplateSegmentTemplate(segment); // Assert Assert.Equal("pName", template.PropertyName); Assert.Equal("dynamicproperty", template.SegmentName); }
public void TryMatch_DifferentType() { // Arrange PathTemplateSegment pathTemplateSegment = new PathTemplateSegment("{pName:dynamicproperty}"); PathTemplateSegmentTemplate template = new PathTemplateSegmentTemplate(pathTemplateSegment); // Act Dictionary <string, object> values = new Dictionary <string, object>(); bool result = template.TryMatch(MetadataSegment.Instance, values); // Assert Assert.False(result); }
public void ODataPathSegmentHandler_Handles_PathTemplateSegment() { // Arrange ODataPathSegmentHandler handler = new ODataPathSegmentHandler(); PathTemplateSegment segment = new PathTemplateSegment("{any}"); // Act handler.Handle(segment); // Assert Assert.Equal("{any}", handler.PathLiteral); Assert.Null(handler.NavigationSource); }
public void TryTranslatePathTemplateSegmentTemplate_ReturnsFalse_PreviousSegmentNotStructuredType(string template) { // Arrange MySegment previousSegment = new MySegment(EdmCoreModel.Instance.GetString(false).Definition); PathTemplateSegment segment = new PathTemplateSegment(template); PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment); ODataTemplateTranslateContext context = new ODataTemplateTranslateContext(); context.Segments.Add(previousSegment); // Act & Assert Assert.False(pathSegment.TryTranslate(context)); }
public void ODataPathSegmentToTemplateHandler_Handles_PathTemplate() { // Arrange ODataPathSegmentToTemplateHandler handler = new ODataPathSegmentToTemplateHandler(null); PathTemplateSegment segment = new PathTemplateSegment("{any}"); // Act handler.Handle(segment); // Assert ODataSegmentTemplate segmentTemplate = Assert.Single(handler.Templates); Assert.IsType <PathTemplateSegmentTemplate>(segmentTemplate); }
public void Translate_PathTemplateSegment_To_DynamicPropertyPathSegment_Works() { // Arrange PathTemplateSegment segment = new PathTemplateSegment("{pName:dynamicproperty}"); // Act IEnumerable <ODataPathSegment> segments = _translator.Translate(segment); // Assert ODataPathSegment pathSegment = Assert.Single(segments); DynamicPropertyPathSegment dynamicSegment = Assert.IsType <DynamicPropertyPathSegment>(pathSegment); Assert.Equal("{pName}", dynamicSegment.PropertyName); }
/// <summary> /// Handle a PropertySegment /// </summary> /// <param name="segment">the segment to handle</param> public override void Handle(PathTemplateSegment segment) { string value; switch (segment.TranslatePathTemplateSegment(out value)) { case ODataSegmentKinds.DynamicProperty: break; default: throw new ODataException(Error.Format( SRResources.InvalidAttributeRoutingTemplateSegment, segment.LiteralText)); } }
public void TryTranslatePathTemplateSegmentTemplate_ReturnsFalse_NoCorrectRouteData(string template) { // Arrange PathTemplateSegment segment = new PathTemplateSegment(template); PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment); ODataTemplateTranslateContext context = new ODataTemplateTranslateContext { RouteValues = new RouteValueDictionary() }; context.Segments.Add(new MySegment(_entityType)); // Act & Assert Assert.False(pathSegment.TryTranslate(context)); }
public void TryMatch_RetrunsTrue() { // Arrange PathTemplateSegment pathTemplateSegment = new PathTemplateSegment("{pName:dynamicproperty}"); PathTemplateSegmentTemplate template = new PathTemplateSegmentTemplate(pathTemplateSegment); DynamicPathSegment segment = new DynamicPathSegment("property"); // Act Dictionary <string, object> values = new Dictionary <string, object>(); bool result = template.TryMatch(segment, values); // Assert Assert.True(result); Assert.True(values.ContainsKey("pName")); Assert.Equal("property", values["pName"]); }
/// <summary> /// Translate a PathTemplateSegment /// </summary> /// <param name="segment">the segment to Translate</param> /// <returns>Translated WebApi path segment.</returns> public override IEnumerable <ODataPathSegment> Translate(PathTemplateSegment segment) { string value = String.Empty; switch (TranslatePathTemplateSegment(segment.LiteralText, out value)) { case ODataSegmentKinds._DynamicProperty: yield return(new DynamicPropertyPathSegment(value)); break; default: throw new ODataException(Error.Format( SRResources.InvalidAttributeRoutingTemplateSegment, segment.LiteralText)); } }
/// <summary> /// Initializes a new instance of the <see cref="PathTemplateSegmentTemplate"/> class. /// </summary> /// <param name="segment">The path template segment to be parsed as a template.</param> public PathTemplateSegmentTemplate(PathTemplateSegment segment) { Segment = segment ?? throw new ArgumentNullException(nameof(segment)); if (!IsRouteParameter(segment.LiteralText)) { throw new ODataException(Error.Format(SRResources.InvalidAttributeRoutingTemplateSegment, segment.LiteralText)); } // ParameterName = property or dynamicproperty ParameterName = segment.LiteralText.Substring(1, segment.LiteralText.Length - 2); if (string.IsNullOrEmpty(ParameterName)) { throw new ODataException(Error.Format(SRResources.EmptyPathTemplate, segment.LiteralText)); } }
public void TryTranslatePathTemplateSegmentTemplate_ReturnsFalse_DynamicPathSegmentWithKnowProperty() { // Arrange RouteValueDictionary routeValueDictionary = new RouteValueDictionary(new { dynamicproperty = "Name" }); ODataTemplateTranslateContext context = new ODataTemplateTranslateContext { RouteValues = routeValueDictionary }; context.Segments.Add(new MySegment(_entityType)); PathTemplateSegment segment = new PathTemplateSegment("{dynamicproperty}"); PathTemplateSegmentTemplate pathSegment = new PathTemplateSegmentTemplate(segment); // Act & Assert Assert.False(pathSegment.TryTranslate(context)); }
/// <summary> /// Initializes a new instance of the <see cref="PathTemplateSegmentTemplate"/> class. /// </summary> /// <param name="segment">The path template segment to be parsed as a template.</param> public PathTemplateSegmentTemplate(PathTemplateSegment segment) { Segment = segment ?? throw new ArgumentNullException(nameof(segment)); string value; SegmentName = segment.TranslatePathTemplateSegment(out value); PropertyName = value; TreatPropertyNameAsParameterName = false; if (IsRouteParameter(PropertyName)) { PropertyName = PropertyName.Substring(1, PropertyName.Length - 2); TreatPropertyNameAsParameterName = true; if (string.IsNullOrEmpty(PropertyName)) { Error.Format(SRResources.EmptyParameterAlias, PropertyName, segment.LiteralText); } } }
/// <summary> /// Translate a PathTemplateSegment /// </summary> /// <param name="segment">the segment to Translate</param> /// <returns>Translated odata path segment.</returns> public override ODataPathSegment Translate(PathTemplateSegment segment) { return(segment); }
public void Translate_PathTemplateSegment_To_DynamicPropertyPathSegment_Works() { // Arrange PathTemplateSegment segment = new PathTemplateSegment("{pName:dynamicproperty}"); // Act IEnumerable<ODataPathSegment> segments = _translator.Translate(segment); // Assert ODataPathSegment pathSegment = Assert.Single(segments); DynamicPropertyPathSegment dynamicSegment = Assert.IsType<DynamicPropertyPathSegment>(pathSegment); Assert.Equal("{pName}", dynamicSegment.PropertyName); }
/// <summary> /// Handle a PropertySegment /// </summary> /// <param name="segment">the segment to handle</param> public override ODataSegmentTemplate Translate(PathTemplateSegment segment) { return(new PathTemplateSegmentTemplate(segment)); }
/// <summary> /// Handle a PathTemplateSegment /// </summary> /// <param name="segment">the segment to Handle</param> public virtual void Handle(PathTemplateSegment segment) { throw new NotImplementedException(); }