public void InitTest() { this.navigationLink = new ODataNavigationLink(); var entry = new ODataEntry { TypeName = "ns.DerivedType", Properties = new[] { new ODataProperty{Name = "Id", Value = 1, SerializationInfo = new ODataPropertySerializationInfo{PropertyKind = ODataPropertyKind.Key}}, new ODataProperty{Name = "Name", Value = "Bob", SerializationInfo = new ODataPropertySerializationInfo{PropertyKind = ODataPropertyKind.ETag}} } }; var serializationInfo = new ODataFeedAndEntrySerializationInfo { NavigationSourceName = "Set", NavigationSourceEntityTypeName = "ns.BaseType", ExpectedTypeName = "ns.BaseType" }; var typeContext = ODataFeedAndEntryTypeContext.Create(serializationInfo, null, null, null, EdmCoreModel.Instance, true); var metadataContext = new TestMetadataContext(); var entryMetadataContext = ODataEntryMetadataContext.Create(entry, typeContext, serializationInfo, null, metadataContext, SelectedPropertiesNode.EntireSubtree); var metadataBuilder = new ODataConventionalEntityMetadataBuilder(entryMetadataContext, metadataContext, new ODataConventionalUriBuilder(ServiceUri, UrlConvention.CreateWithExplicitValue(false))); this.navigationLinkWithFullBuilder = new ODataNavigationLink { Name = "NavProp" }; this.navigationLinkWithFullBuilder.MetadataBuilder = metadataBuilder; this.navigationLinkWithNoOpBuilder = new ODataNavigationLink { Name = "NavProp" }; this.navigationLinkWithNoOpBuilder.MetadataBuilder = new NoOpEntityMetadataBuilder(entry); this.navigationLinkWithNullBuilder = new ODataNavigationLink { Name = "NavProp" }; this.navigationLinkWithNullBuilder.MetadataBuilder = ODataEntityMetadataBuilder.Null; }
/// <summary> /// Compute id for containment scenario. /// </summary> /// <returns> /// The <see cref="Uri"/> of @odata.id. /// </returns> private Uri ComputeIdForContainment() { Uri uri; // check if has parent ODataConventionalEntityMetadataBuilder parent = this.ParentMetadataBuilder as ODataConventionalEntityMetadataBuilder; if (parent != null) { // $expand scenario. Get the parent id uri = parent.GetId(); // And append cast (if needed). // A cast segment if the navigation property is defined on a type derived from the entity // type declared for the entity set IODataFeedAndEntryTypeContext typeContext = parent.entryMetadataContext.TypeContext; if (typeContext.NavigationSourceEntityTypeName != typeContext.ExpectedEntityTypeName) { // Do not append type cast if we know that the navigation property is in base type, not in derived type. ODataFeedAndEntryTypeContext.ODataFeedAndEntryTypeContextWithModel typeContextWithModel = typeContext as ODataFeedAndEntryTypeContext.ODataFeedAndEntryTypeContextWithModel; if (typeContextWithModel == null || typeContextWithModel.NavigationSourceEntityType.FindProperty(this.entryMetadataContext.TypeContext.NavigationSourceName) == null) { uri = new Uri(Core.UriUtils.EnsureTaillingSlash(uri), parent.entryMetadataContext.ActualEntityTypeName); } } } else { // direct access scenario. uri = this.uriBuilder.BuildBaseUri(); ODataUri odataUri = this.ODataUri ?? this.metadataContext.ODataUri; uri = this.GetContainingEntitySetUri(uri, odataUri); } // A path segment for the containment navigation property uri = this.uriBuilder.BuildEntitySetUri(uri, this.entryMetadataContext.TypeContext.NavigationSourceName); if (this.entryMetadataContext.TypeContext.IsFromCollection) { uri = this.uriBuilder.BuildEntityInstanceUri( uri, this.ComputedKeyProperties, this.entryMetadataContext.ActualEntityTypeName); } return(uri); }
public ODataStreamReferenceValueTests() { this.testSubject = new ODataStreamReferenceValue(); var entry = new ODataEntry { TypeName = "ns.DerivedType", Properties = new[] { new ODataProperty{Name = "Id", Value = 1, SerializationInfo = new ODataPropertySerializationInfo{PropertyKind = ODataPropertyKind.Key}}, new ODataProperty{Name = "Name", Value = "Bob", SerializationInfo = new ODataPropertySerializationInfo{PropertyKind = ODataPropertyKind.ETag}} } }; var serializationInfo = new ODataFeedAndEntrySerializationInfo { NavigationSourceName = "Set", NavigationSourceEntityTypeName = "ns.BaseType", ExpectedTypeName = "ns.BaseType" }; var typeContext = ODataFeedAndEntryTypeContext.Create(serializationInfo, null, null, null, EdmCoreModel.Instance, true); var metadataContext = new TestMetadataContext(); var entryMetadataContext = ODataEntryMetadataContext.Create(entry, typeContext, serializationInfo, null, metadataContext, SelectedPropertiesNode.EntireSubtree); var fullMetadataBuilder = new ODataConventionalEntityMetadataBuilder(entryMetadataContext, metadataContext, new ODataConventionalUriBuilder(ServiceUri, UrlConvention.CreateWithExplicitValue(false))); this.streamWithFullBuilder = new ODataStreamReferenceValue(); this.streamWithFullBuilder.SetMetadataBuilder(fullMetadataBuilder, "Stream"); }
public void ETagShouldBeCorrectForLDMFWithManyConcurrencyTokens() { var values = new[] { new KeyValuePair<string, object>("ETagLong", 1L), new KeyValuePair<string, object>("ETagFloat", 1.0F), new KeyValuePair<string, object>("ETagDouble", 1.0D), new KeyValuePair<string, object>("ETagDecimal", 1.0M) }; var testSubject = new ODataConventionalEntityMetadataBuilder(new TestEntryMetadataContext { Entry = new ODataEntry(), ETagProperties = values }, this.metadataContext, this.uriBuilder); testSubject.GetETag().Should().Be(@"W/""1,1,1.0,1.0"""); }
public void ETagShouldBeCorrectForTypeWithManyConcurrencyTokens() { var values = new[] { new KeyValuePair<string, object>("ETag1", 1.2345e+45), new KeyValuePair<string, object>("ETag2", new byte[] { 1, 2, 3 }), new KeyValuePair<string, object>("ETag3", 2.3M) }; var testSubject = new ODataConventionalEntityMetadataBuilder(new TestEntryMetadataContext { Entry = new ODataEntry(), ETagProperties = values }, this.metadataContext, this.uriBuilder); testSubject.GetETag().Should().Be(@"W/""1.2345E%2B45,binary'AQID',2.3"""); }
public void ETagShouldBeCorrectForNullConcurrencyToken() { var testSubject = new ODataConventionalEntityMetadataBuilder(new TestEntryMetadataContext { Entry = new ODataEntry(), ETagProperties = new[] { new KeyValuePair<string, object>("ETag", default(string)) } }, this.metadataContext, this.uriBuilder); testSubject.GetETag().Should().Be(@"W/""null"""); }
public void EtagShouldBeUriEscaped() { // if this fails System.Uri has changed its behavior and we may need to adjust how we encode our strings for JsonLight // .net 45 changed this behavior initially to escape ' to a value, but was changed. below test // validates that important uri literal values that OData uses don't change, and that we escape characters when // producing the etag for JsonLight var escapedStrings = Uri.EscapeUriString(@".:''-"); escapedStrings.Should().Be(@".:''-"); var testSubject = new ODataConventionalEntityMetadataBuilder(new TestEntryMetadataContext { Entry = new ODataEntry(), ETagProperties = new[] { new KeyValuePair<string, object>("ETag", "Value ") } }, this.metadataContext, this.uriBuilder); testSubject.GetETag().Should().Be(@"W/""'Value%20'"""); }
public void ETagShouldBeNullForTypeWithoutConcurrencyTokens() { var testSubject = new ODataConventionalEntityMetadataBuilder(new TestEntryMetadataContext { Entry = new ODataEntry(), ETagProperties = new KeyValuePair<string, object>[0] }, this.metadataContext, this.uriBuilder); testSubject.GetETag().Should().Be((string)null); }
public ODataConventionalEntityMetadataBuilderTests() { #region Product Entry this.productEntry = new ODataEntry(); this.sinlgeKeyCollection = new Dictionary<string, object>() { { "Id", 42 } }; this.multiKeysCollection = new Dictionary<string, object>() { { "KeyA", "keya" }, { "KeyB", 1 } }; TestFeedAndEntryTypeContext productTypeContext = new TestFeedAndEntryTypeContext { NavigationSourceName = EntitySetName, NavigationSourceEntityTypeName = EntityTypeName, ExpectedEntityTypeName = EntityTypeName, IsMediaLinkEntry = false, UrlConvention = UrlConvention.CreateWithExplicitValue(/*generateKeyAsSegment*/ false), IsFromCollection = false, NavigationSourceKind = EdmNavigationSourceKind.EntitySet }; TestEntryMetadataContext productEntryMetadataContext = new TestEntryMetadataContext { TypeContext = productTypeContext, Entry = this.productEntry, ETagProperties = new[] { new KeyValuePair<string, object>("Name", "Value") }, KeyProperties = this.sinlgeKeyCollection, ActualEntityTypeName = EntityTypeName, SelectedBindableOperations = new IEdmOperation[0], SelectedNavigationProperties = new IEdmNavigationProperty[0], SelectedStreamProperties = new Dictionary<string, IEdmStructuralProperty>() }; this.productConventionalEntityMetadataBuilder = new ODataConventionalEntityMetadataBuilder(productEntryMetadataContext, this.metadataContext, this.uriBuilder); this.productEntry.MetadataBuilder = this.productConventionalEntityMetadataBuilder; #endregion Product Entry #region Derived, MultiKey, Multi ETag, MLE Entry var action = new EdmAction("TestModel", "Action", /*returnType*/ null, /*isBindable*/ true, /*entitySet*/ null); var actionImport = new EdmActionImport(TestModel.Container, "Action", action); var function = new EdmFunction("TestModel", "Function", /*returnType*/ EdmCoreModel.Instance.GetInt32(true), /*isBindable*/ true, /*entitySet*/ null, false /*isComposable*/); var functionImport = new EdmFunctionImport(TestModel.Container, "Function", function); this.derivedMultiKeyMultiEtagMleEntry = new ODataEntry(); TestFeedAndEntryTypeContext derivedMultiKeyMultiEtagMleTypeContext = new TestFeedAndEntryTypeContext { NavigationSourceName = EntitySetName, NavigationSourceEntityTypeName = EntityTypeName, ExpectedEntityTypeName = DerivedEntityTypeName, IsMediaLinkEntry = true, UrlConvention = UrlConvention.CreateWithExplicitValue(/*generateKeyAsSegment*/ false), IsFromCollection = false }; TestEntryMetadataContext derivedProductMleEntryMetadataContext = new TestEntryMetadataContext { TypeContext = derivedMultiKeyMultiEtagMleTypeContext, Entry = this.derivedMultiKeyMultiEtagMleEntry, ETagProperties = new[] { new KeyValuePair<string, object>("ETag1", "ETagValue1"), new KeyValuePair<string, object>("ETag2", "ETagValue2") }, KeyProperties = this.multiKeysCollection, ActualEntityTypeName = DerivedMleEntityTypeName, SelectedBindableOperations = new IEdmOperation[] { action, function }, SelectedNavigationProperties = TestModel.ProductWithNavPropsType.NavigationProperties(), SelectedStreamProperties = new Dictionary<string, IEdmStructuralProperty> { {"Photo", new EdmStructuralProperty(TestModel.ProductType, "Photo", EdmCoreModel.Instance.GetStream( /*isNullable*/true))} }, }; this.derivedMultiKeyMultiEtagMleConventionalEntityMetadataBuilder = new ODataConventionalEntityMetadataBuilder(derivedProductMleEntryMetadataContext, this.metadataContext, this.uriBuilder); this.derivedMultiKeyMultiEtagMleEntry.MetadataBuilder = this.derivedMultiKeyMultiEtagMleConventionalEntityMetadataBuilder; #endregion Derived, MultiKey, Multi ETag, MLE Entry #region Contained Product Entry this.containedCollectionProductEntry = new ODataEntry(); this.containedSinlgeKeyCollection = new Dictionary<string, object>() { { "Id", 43 } }; this.containedMultiKeysCollection = new Dictionary<string, object>() { { "KeyA", "keya" }, { "KeyB", 2 } }; TestFeedAndEntryTypeContext containedCollectionProductTypeContext = new TestFeedAndEntryTypeContext { NavigationSourceName = EntitySetName, NavigationSourceEntityTypeName = EntityTypeName, ExpectedEntityTypeName = EntityTypeName, IsMediaLinkEntry = false, UrlConvention = UrlConvention.CreateWithExplicitValue(/*generateKeyAsSegment*/ false), NavigationSourceKind = EdmNavigationSourceKind.ContainedEntitySet, IsFromCollection = true }; TestEntryMetadataContext containedCollectionProductEntryMetadataContext = new TestEntryMetadataContext { TypeContext = containedCollectionProductTypeContext, Entry = this.containedCollectionProductEntry, ETagProperties = new[] { new KeyValuePair<string, object>("Name", "Value") }, KeyProperties = this.containedSinlgeKeyCollection, ActualEntityTypeName = EntityTypeName, SelectedBindableOperations = new IEdmOperation[0], SelectedNavigationProperties = new IEdmNavigationProperty[0], SelectedStreamProperties = new Dictionary<string, IEdmStructuralProperty>() }; this.containedCollectionProductConventionalEntityMetadataBuilder = new ODataConventionalEntityMetadataBuilder(containedCollectionProductEntryMetadataContext, this.metadataContext, this.uriBuilder); this.containedCollectionProductEntry.MetadataBuilder = this.containedCollectionProductConventionalEntityMetadataBuilder; this.containedCollectionProductEntry.MetadataBuilder.ParentMetadataBuilder = this.productConventionalEntityMetadataBuilder; this.containedProductEntry = new ODataEntry(); this.containedSinlgeKeyCollection = new Dictionary<string, object>() { { "Id", 43 } }; this.containedMultiKeysCollection = new Dictionary<string, object>() { { "KeyA", "keya" }, { "KeyB", 2 } }; TestFeedAndEntryTypeContext containedProductTypeContext = new TestFeedAndEntryTypeContext { NavigationSourceName = EntitySetName, NavigationSourceEntityTypeName = EntityTypeName, ExpectedEntityTypeName = EntityTypeName, IsMediaLinkEntry = false, UrlConvention = UrlConvention.CreateWithExplicitValue(/*generateKeyAsSegment*/ false), NavigationSourceKind = EdmNavigationSourceKind.ContainedEntitySet, IsFromCollection = false }; TestEntryMetadataContext containedProductEntryMetadataContext = new TestEntryMetadataContext { TypeContext = containedProductTypeContext, Entry = this.containedCollectionProductEntry, ETagProperties = new[] { new KeyValuePair<string, object>("Name", "Value") }, KeyProperties = this.containedSinlgeKeyCollection, ActualEntityTypeName = EntityTypeName, SelectedBindableOperations = new IEdmOperation[0], SelectedNavigationProperties = new IEdmNavigationProperty[0], SelectedStreamProperties = new Dictionary<string, IEdmStructuralProperty>() }; this.containedProductConventionalEntityMetadataBuilder = new ODataConventionalEntityMetadataBuilder(containedProductEntryMetadataContext, this.metadataContext, this.uriBuilder); this.containedProductEntry.MetadataBuilder = this.containedProductConventionalEntityMetadataBuilder; this.containedProductEntry.MetadataBuilder.ParentMetadataBuilder = this.productConventionalEntityMetadataBuilder; #endregion }
public void TestSingletonIdAndEditLink() { var singletonEntryTypeContext = new TestFeedAndEntryTypeContext { NavigationSourceName = "Boss", NavigationSourceEntityTypeName = "BossType", ExpectedEntityTypeName = "BossType", UrlConvention = UrlConvention.CreateWithExplicitValue(/*generateKeyAsSegment*/ false), NavigationSourceKind = EdmNavigationSourceKind.Singleton, }; var singletonEntryMetadataContext = new TestEntryMetadataContext { TypeContext = singletonEntryTypeContext, Entry = new ODataEntry(), ETagProperties = new[] { new KeyValuePair<string, object>("Name", "Value") }, KeyProperties = this.sinlgeKeyCollection, ActualEntityTypeName = "BossType", SelectedBindableOperations = new IEdmOperation[0], SelectedNavigationProperties = new IEdmNavigationProperty[0], SelectedStreamProperties = new Dictionary<string, IEdmStructuralProperty>(), }; var singletonEntityMetadataBuilder = new ODataConventionalEntityMetadataBuilder(singletonEntryMetadataContext, this.metadataContext, this.uriBuilder); singletonEntityMetadataBuilder.GetId().Should().Be(new Uri("http://odata.org/base/Boss")); singletonEntityMetadataBuilder.GetEditLink().Should().Be(new Uri("http://odata.org/base/Boss")); singletonEntityMetadataBuilder.GetReadLink().Should().Be(new Uri("http://odata.org/base/Boss")); }