From 6f5bc5ecb81a4ac87ae6ff8388aeda0a75949cef Mon Sep 17 00:00:00 2001 From: Michael Pizzo Date: Tue, 3 Dec 2024 16:32:26 -0800 Subject: [PATCH] Don't require entityset when writing responses (#3137) * Don't require entityset when writing responses * Clean up code to remove throwIfMissing and address review comments. --- .../ConventionalODataEntityMetadataBuilder.cs | 5 ++ .../ODataConventionalEntityMetadataBuilder.cs | 15 ++++-- .../ODataConventionalIdMetadataBuilder.cs | 6 +-- .../Evaluation/ODataMetadataContext.cs | 3 +- .../Json/ODataJsonWriter.cs | 2 +- .../ODataContextUriBuilder.cs | 41 +++++++++----- .../ODataContextUrlInfo.cs | 6 ++- .../ODataResourceTypeContext.cs | 53 ++++--------------- src/Microsoft.OData.Core/ODataWriterCore.cs | 17 ++---- .../UriParser/Parsers/ODataPathParser.cs | 2 +- ...tePayloadMetadataInJsonIntegrationTests.cs | 6 +-- .../Json/ODataJsonWriterIntegrationTests.cs | 8 +-- ...DataJsonWriterShortSpanIntegrationTests.cs | 27 +++++----- .../Json/ODataJsonResourceSerializerTests.cs | 12 ++--- .../ODataContextUriBuilderTests.cs | 35 ++++++------ .../ODataNavigationLinkTests.cs | 2 +- .../ODataOperationTests.cs | 2 +- .../ODataReaderDerivedTypeConstraintTests.cs | 4 +- .../ODataResourceTests.cs | 2 +- .../ODataResourceTypeContextTests.cs | 36 ++++--------- .../ODataStreamReferenceValueTests.cs | 2 +- ...JsonInheritComplexCollectionWriterTests.cs | 4 +- 22 files changed, 128 insertions(+), 162 deletions(-) diff --git a/src/Microsoft.OData.Client/ConventionalODataEntityMetadataBuilder.cs b/src/Microsoft.OData.Client/ConventionalODataEntityMetadataBuilder.cs index 558c55db8d..b9bf92ddef 100644 --- a/src/Microsoft.OData.Client/ConventionalODataEntityMetadataBuilder.cs +++ b/src/Microsoft.OData.Client/ConventionalODataEntityMetadataBuilder.cs @@ -68,6 +68,11 @@ internal ConventionalODataEntityMetadataBuilder(UriResolver resolver, string ent /// internal override Uri GetEditLink() { + if(this.entitySetName == null) + { + return null; + } + Uri entitySetUri = this.uriBuilder.BuildEntitySetUri(this.baseUri, this.entitySetName); Uri editLink = this.uriBuilder.BuildEntityInstanceUri(entitySetUri, this.entityInstance); return editLink; diff --git a/src/Microsoft.OData.Core/Evaluation/ODataConventionalEntityMetadataBuilder.cs b/src/Microsoft.OData.Core/Evaluation/ODataConventionalEntityMetadataBuilder.cs index 5f8a2b50b1..53aa5c200c 100644 --- a/src/Microsoft.OData.Core/Evaluation/ODataConventionalEntityMetadataBuilder.cs +++ b/src/Microsoft.OData.Core/Evaluation/ODataConventionalEntityMetadataBuilder.cs @@ -393,6 +393,12 @@ internal override string GetOperationTitle(string operationName) /// internal override bool TryGetIdForSerialization(out Uri id) { + if(this.ResourceMetadataContext.TypeContext.NavigationSourceName == null) + { + id = null; + return false; + } + id = this.ResourceMetadataContext.Resource.IsTransient ? null : this.GetId(); return true; } @@ -405,10 +411,13 @@ private Uri ComputeEditLink() { Uri uri = this.ResourceMetadataContext.Resource.HasNonComputedId ? this.ResourceMetadataContext.Resource.NonComputedId : this.ComputedId; - Debug.Assert(this.ResourceMetadataContext != null && this.ResourceMetadataContext.TypeContext != null, "this.resourceMetadataContext != null && this.resourceMetadataContext.TypeContext != null"); - if (this.ResourceMetadataContext.ActualResourceTypeName != this.ResourceMetadataContext.TypeContext.NavigationSourceEntityTypeName) + if (uri != null) { - uri = this.UriBuilder.AppendTypeSegment(uri, this.ResourceMetadataContext.ActualResourceTypeName); + Debug.Assert(this.ResourceMetadataContext != null && this.ResourceMetadataContext.TypeContext != null, "this.resourceMetadataContext != null && this.resourceMetadataContext.TypeContext != null"); + if (this.ResourceMetadataContext.ActualResourceTypeName != this.ResourceMetadataContext.TypeContext.NavigationSourceEntityTypeName) + { + uri = this.UriBuilder.AppendTypeSegment(uri, this.ResourceMetadataContext.ActualResourceTypeName); + } } return uri; diff --git a/src/Microsoft.OData.Core/Evaluation/ODataConventionalIdMetadataBuilder.cs b/src/Microsoft.OData.Core/Evaluation/ODataConventionalIdMetadataBuilder.cs index 7fb55cb562..f4926dc193 100644 --- a/src/Microsoft.OData.Core/Evaluation/ODataConventionalIdMetadataBuilder.cs +++ b/src/Microsoft.OData.Core/Evaluation/ODataConventionalIdMetadataBuilder.cs @@ -131,11 +131,11 @@ private void ComputeAndCacheId() case EdmNavigationSourceKind.Singleton: uri = this.ComputeIdForSingleton(); break; + // Treat UnknownEntitySet as a containment + case EdmNavigationSourceKind.UnknownEntitySet: case EdmNavigationSourceKind.ContainedEntitySet: uri = this.ComputeIdForContainment(); break; - case EdmNavigationSourceKind.UnknownEntitySet: - throw new ODataException(Strings.ODataMetadataBuilder_UnknownEntitySet(this.ResourceMetadataContext.TypeContext.NavigationSourceName)); default: uri = this.ComputeId(); break; @@ -152,7 +152,7 @@ private void ComputeAndCacheId() /// private Uri ComputeId() { - if (this.ResourceMetadataContext.KeyProperties.Any()) + if (this.ResourceMetadataContext.TypeContext.NavigationSourceName != null && this.ResourceMetadataContext.KeyProperties.Any()) { Uri uri = this.UriBuilder.BuildBaseUri(); uri = this.UriBuilder.BuildEntitySetUri(uri, this.ResourceMetadataContext.TypeContext.NavigationSourceName); diff --git a/src/Microsoft.OData.Core/Evaluation/ODataMetadataContext.cs b/src/Microsoft.OData.Core/Evaluation/ODataMetadataContext.cs index 50002300e6..796fe03b69 100644 --- a/src/Microsoft.OData.Core/Evaluation/ODataMetadataContext.cs +++ b/src/Microsoft.OData.Core/Evaluation/ODataMetadataContext.cs @@ -267,8 +267,7 @@ public ODataResourceMetadataBuilder GetResourceMetadataBuilderForReader(IODataJs IEdmEntityType navigationSourceElementType = this.edmTypeResolver.GetElementType(navigationSource); IODataResourceTypeContext typeContext = ODataResourceTypeContext.Create( /*serializationInfo*/ - null, navigationSource, navigationSourceElementType, resourceState.ResourceTypeFromMetadata ?? resourceState.ResourceType, - /*throwIfMissingTypeInfo*/ true); + null, navigationSource, navigationSourceElementType, resourceState.ResourceTypeFromMetadata ?? resourceState.ResourceType); IODataResourceMetadataContext resourceMetadataContext = ODataResourceMetadataContext.Create( resource, diff --git a/src/Microsoft.OData.Core/Json/ODataJsonWriter.cs b/src/Microsoft.OData.Core/Json/ODataJsonWriter.cs index 36957e5d2a..22267b5959 100644 --- a/src/Microsoft.OData.Core/Json/ODataJsonWriter.cs +++ b/src/Microsoft.OData.Core/Json/ODataJsonWriter.cs @@ -1838,7 +1838,7 @@ await this.WriteV4DeletedEntryContentsAsync(resource) string expectedNavigationSource = deltaResourceSetScope?.NavigationSource?.Name; string currentNavigationSource = resource.SerializationInfo?.NavigationSourceName ?? resourceScope.NavigationSource?.Name; - if (String.IsNullOrEmpty(currentNavigationSource) || currentNavigationSource != expectedNavigationSource) + if (!String.IsNullOrEmpty(currentNavigationSource) && currentNavigationSource != expectedNavigationSource) { Debug.Assert(this.ScopeLevel <= 3, "Writing a nested deleted resource of the wrong type should already have been caught."); diff --git a/src/Microsoft.OData.Core/ODataContextUriBuilder.cs b/src/Microsoft.OData.Core/ODataContextUriBuilder.cs index 7843430580..e1d20c9c24 100644 --- a/src/Microsoft.OData.Core/ODataContextUriBuilder.cs +++ b/src/Microsoft.OData.Core/ODataContextUriBuilder.cs @@ -172,25 +172,40 @@ private Uri CreateFromContextUrlInfo(ODataContextUrlInfo info) } else { - // No path information - switch (info.DeltaKind) - { - case ODataDeltaKind.ResourceSet: - return new Uri(ODataConstants.ContextUriFragmentIndicator + ODataConstants.DeltaResourceSet, UriKind.Relative); - case ODataDeltaKind.DeletedEntry: - return new Uri(ODataConstants.ContextUriFragmentIndicator + ODataConstants.DeletedEntry, UriKind.Relative); - case ODataDeltaKind.Link: - return new Uri(ODataConstants.ContextUriFragmentIndicator + ODataConstants.DeltaLink, UriKind.Relative); - case ODataDeltaKind.DeletedLink: - return new Uri(ODataConstants.ContextUriFragmentIndicator + ODataConstants.DeletedLink, UriKind.Relative); - } - if (!string.IsNullOrEmpty(info.TypeName)) { // #TypeName builder.Append(info.TypeName); + + switch (info.DeltaKind) + { + case ODataDeltaKind.ResourceSet: + builder.Append(ODataConstants.UriSegmentSeparatorChar + ODataConstants.DeltaResourceSet); + break; + case ODataDeltaKind.DeletedEntry: + builder.Append(ODataConstants.UriSegmentSeparatorChar + ODataConstants.DeletedEntry); + break; + case ODataDeltaKind.Link: + builder.Append(ODataConstants.UriSegmentSeparatorChar + ODataConstants.DeltaLink); + break; + case ODataDeltaKind.DeletedLink: + builder.Append(ODataConstants.UriSegmentSeparatorChar + ODataConstants.DeletedLink); + break; + } } else { + switch (info.DeltaKind) + { + case ODataDeltaKind.ResourceSet: + return new Uri(ODataConstants.ContextUriFragmentIndicator + ODataConstants.DeltaResourceSet, UriKind.Relative); + case ODataDeltaKind.DeletedEntry: + return new Uri(ODataConstants.ContextUriFragmentIndicator + ODataConstants.DeletedEntry, UriKind.Relative); + case ODataDeltaKind.Link: + return new Uri(ODataConstants.ContextUriFragmentIndicator + ODataConstants.DeltaLink, UriKind.Relative); + case ODataDeltaKind.DeletedLink: + return new Uri(ODataConstants.ContextUriFragmentIndicator + ODataConstants.DeletedLink, UriKind.Relative); + } + return null; } } diff --git a/src/Microsoft.OData.Core/ODataContextUrlInfo.cs b/src/Microsoft.OData.Core/ODataContextUrlInfo.cs index a7a61f13b9..29469d9dd1 100644 --- a/src/Microsoft.OData.Core/ODataContextUrlInfo.cs +++ b/src/Microsoft.OData.Core/ODataContextUrlInfo.cs @@ -238,12 +238,14 @@ internal static ODataContextUrlInfo Create(ODataResourceTypeContext typeContext, { Debug.Assert(typeContext != null, "typeContext != null"); + string typeName = typeContext.NavigationSourceEntityTypeName ?? typeContext.ExpectedResourceTypeName; + ODataContextUrlInfo contextUriInfo = new ODataContextUrlInfo() { IsUnknownEntitySet = typeContext.NavigationSourceKind == EdmNavigationSourceKind.UnknownEntitySet, NavigationSource = typeContext.NavigationSourceName, - TypeCast = typeContext.NavigationSourceEntityTypeName == typeContext.ExpectedResourceTypeName ? null : typeContext.ExpectedResourceTypeName, - TypeName = typeContext.NavigationSourceEntityTypeName, + TypeCast = typeName == typeContext.ExpectedResourceTypeName ? null : typeContext.ExpectedResourceTypeName, + TypeName = EdmLibraryExtensions.GetCollectionTypeName(typeName), IncludeFragmentItemSelector = kind == ODataDeltaKind.Resource && typeContext.NavigationSourceKind != EdmNavigationSourceKind.Singleton, DeltaKind = kind, NavigationPath = ComputeNavigationPath(typeContext.NavigationSourceKind, null, typeContext.NavigationSourceName), diff --git a/src/Microsoft.OData.Core/ODataResourceTypeContext.cs b/src/Microsoft.OData.Core/ODataResourceTypeContext.cs index 07b7e82c30..005002a1f8 100644 --- a/src/Microsoft.OData.Core/ODataResourceTypeContext.cs +++ b/src/Microsoft.OData.Core/ODataResourceTypeContext.cs @@ -25,54 +25,36 @@ internal class ODataResourceTypeContext : IODataResourceTypeContext /// protected string expectedResourceTypeName; - /// - /// If true, throw if any of the set or type name cannot be determined; if false, return null when any of the set or type name cannot determined. - /// - private readonly bool throwIfMissingTypeInfo; - /// /// Constructs an instance of . /// - /// If true, throw if any of the set or type name cannot be determined; if false, return null when any of the set or type name cannot determined. - private ODataResourceTypeContext(bool throwIfMissingTypeInfo) + private ODataResourceTypeContext() { - this.throwIfMissingTypeInfo = throwIfMissingTypeInfo; } /// /// Constructs an instance of . /// /// The expected resource type of resource set or resource. - /// If true, throw if any of the set or type name cannot be determined; if false, return null when any of the set or type name cannot determined. - private ODataResourceTypeContext(IEdmStructuredType expectedResourceType, bool throwIfMissingTypeInfo) + private ODataResourceTypeContext(IEdmStructuredType expectedResourceType) { this.expectedResourceType = expectedResourceType; - this.throwIfMissingTypeInfo = throwIfMissingTypeInfo; } /// /// The navigation source name of the resource set or resource. /// - public virtual string NavigationSourceName - { - get { return this.ValidateAndReturn(default(string)); } - } + public virtual string NavigationSourceName { get; } /// /// The entity type name of the navigation source of the resource set or resource. /// - public virtual string NavigationSourceEntityTypeName - { - get { return this.ValidateAndReturn(default(string)); } - } + public virtual string NavigationSourceEntityTypeName { get; } /// /// The full type name of the navigation source of the resource set or resource. /// - public virtual string NavigationSourceFullTypeName - { - get { return this.ValidateAndReturn(default(string)); } - } + public virtual string NavigationSourceFullTypeName { get; } /// /// The kind of the navigation source of the resource set or resource. @@ -133,9 +115,8 @@ public virtual bool IsMediaLinkEntry /// The navigation source of the resource set or resource. /// The entity type of the navigation source. /// The expected structured type of the resource set or resource. - /// If true, throw if any of the set or type name cannot be determined; if false, return null when any of the set or type name cannot determined. /// A new instance of . - internal static ODataResourceTypeContext Create(ODataResourceSerializationInfo serializationInfo, IEdmNavigationSource navigationSource, IEdmEntityType navigationSourceEntityType, IEdmStructuredType expectedResourceType, bool throwIfMissingTypeInfo) + internal static ODataResourceTypeContext Create(ODataResourceSerializationInfo serializationInfo, IEdmNavigationSource navigationSource, IEdmEntityType navigationSourceEntityType, IEdmStructuredType expectedResourceType) { if (serializationInfo != null) { @@ -154,23 +135,7 @@ internal static ODataResourceTypeContext Create(ODataResourceSerializationInfo s return new ODataResourceTypeContextWithModel(navigationSource, navigationSourceEntityType, expectedResourceType); } - return new ODataResourceTypeContext(expectedResourceType, throwIfMissingTypeInfo); - } - - /// - /// Validate and return the given value. - /// - /// The type of the value to validate. - /// The value to validate. - /// The return value. - private T ValidateAndReturn(T value) where T : class - { - if (this.throwIfMissingTypeInfo && value == null) - { - throw new ODataException(Strings.ODataResourceTypeContext_MetadataOrSerializationInfoMissing); - } - - return value; + return new ODataResourceTypeContext(expectedResourceType); } /// @@ -188,7 +153,7 @@ internal sealed class ODataResourceTypeContextWithoutModel : ODataResourceTypeCo /// /// The serialization info from the resource set or resource instance. internal ODataResourceTypeContextWithoutModel(ODataResourceSerializationInfo serializationInfo) - : base(/*throwIfMissingTypeInfo*/false) + : base() { Debug.Assert(serializationInfo != null, "serializationInfo != null"); this.serializationInfo = serializationInfo; @@ -327,7 +292,7 @@ internal sealed class ODataResourceTypeContextWithModel : ODataResourceTypeConte /// The entity type of the navigation source. /// The expected resource type of the resource set or resource. internal ODataResourceTypeContextWithModel(IEdmNavigationSource navigationSource, IEdmEntityType navigationSourceEntityType, IEdmStructuredType expectedResourceType) - : base(expectedResourceType, /*throwIfMissingTypeInfo*/false) + : base(expectedResourceType) { Debug.Assert(expectedResourceType != null, "expectedResourceType != null"); Debug.Assert(navigationSource != null diff --git a/src/Microsoft.OData.Core/ODataWriterCore.cs b/src/Microsoft.OData.Core/ODataWriterCore.cs index 15f006c9cf..bb19412e98 100644 --- a/src/Microsoft.OData.Core/ODataWriterCore.cs +++ b/src/Microsoft.OData.Core/ODataWriterCore.cs @@ -4101,17 +4101,11 @@ internal ODataResourceTypeContext GetOrCreateTypeContext(bool writingResponse) { if (this.typeContext == null) { - // For Entity, currently we check the navigation source. - // For Complex, we don't have navigation source, So we shouldn't check it. - // If ResourceType is not provided, serialization info or navigation source info should be provided. - bool throwIfMissingTypeInfo = writingResponse && (this.ResourceType == null || this.ResourceType.TypeKind == EdmTypeKind.Entity); - this.typeContext = ODataResourceTypeContext.Create( this.serializationInfo, this.NavigationSource, EdmTypeWriterResolver.Instance.GetElementType(this.NavigationSource), - this.ResourceType, - throwIfMissingTypeInfo); + this.ResourceType); } return this.typeContext; @@ -4270,15 +4264,11 @@ public ODataResourceTypeContext GetOrCreateTypeContext(bool writingResponse) { IEdmStructuredType expectedResourceType = this.ResourceTypeFromMetadata ?? this.ResourceType; - // For entity, we will check the navigation source info - bool throwIfMissingTypeInfo = writingResponse && (expectedResourceType == null || expectedResourceType.TypeKind == EdmTypeKind.Entity); - this.typeContext = ODataResourceTypeContext.Create( this.serializationInfo, this.NavigationSource, EdmTypeWriterResolver.Instance.GetElementType(this.NavigationSource), - expectedResourceType, - throwIfMissingTypeInfo); + expectedResourceType); } return this.typeContext; @@ -4379,8 +4369,7 @@ public ODataResourceTypeContext GetOrCreateTypeContext(bool writingResponse = tr this.serializationInfo, this.NavigationSource, EdmTypeWriterResolver.Instance.GetElementType(this.NavigationSource), - this.fakeEntityType, - writingResponse); + this.fakeEntityType); } return this.typeContext; diff --git a/src/Microsoft.OData.Core/UriParser/Parsers/ODataPathParser.cs b/src/Microsoft.OData.Core/UriParser/Parsers/ODataPathParser.cs index 5814a77ff1..45e84f9c54 100644 --- a/src/Microsoft.OData.Core/UriParser/Parsers/ODataPathParser.cs +++ b/src/Microsoft.OData.Core/UriParser/Parsers/ODataPathParser.cs @@ -1516,7 +1516,7 @@ private void CreatePropertySegment(ODataPathSegment previous, IEdmProperty prope segment.TargetKind = RequestTargetKind.Enum; break; default: - Debug.Assert(property.Type.IsPrimitive() || property.Type.IsTypeDefinition(), "must be primitive type or type definition property"); + Debug.Assert(property.Type.IsPrimitive() || property.Type.IsTypeDefinition() || property.Type.IsUntyped(), "must be primitive type or type definition property"); segment.TargetKind = RequestTargetKind.Primitive; break; } diff --git a/test/FunctionalTests/Microsoft.OData.Core.Tests/IntegrationTests/Evaluation/AutoComputePayloadMetadataInJsonIntegrationTests.cs b/test/FunctionalTests/Microsoft.OData.Core.Tests/IntegrationTests/Evaluation/AutoComputePayloadMetadataInJsonIntegrationTests.cs index 60f2c06391..575ccfcfd6 100644 --- a/test/FunctionalTests/Microsoft.OData.Core.Tests/IntegrationTests/Evaluation/AutoComputePayloadMetadataInJsonIntegrationTests.cs +++ b/test/FunctionalTests/Microsoft.OData.Core.Tests/IntegrationTests/Evaluation/AutoComputePayloadMetadataInJsonIntegrationTests.cs @@ -2084,7 +2084,7 @@ public void WritingInFullMetadataModeWithExpandWithContainedElementShouldThrowEx } [Fact] - public void WritingInFullMetadataModeForNavigationPropertyWithoutBindingShouldThrowODataResourceTypeContext_MetadataOrSerializationInfoMissingException() + public void WritingInFullMetadataModeForNavigationPropertyWithoutBindingShouldPass() { ODataItem[] itemsToWrite = new ODataItem[] { @@ -2095,8 +2095,8 @@ public void WritingInFullMetadataModeForNavigationPropertyWithoutBindingShouldTh const string selectClause = "UnknownCollectionNavProp"; const string expandClause = "ExpandedNavLink($expand=UnknownCollectionNavProp)"; - Action test = () => this.GetWriterOutputForContentTypeAndKnobValue("application/json;odata.metadata=full", true, itemsToWrite, Model, EntitySet, EntityType, selectClause, expandClause); - test.Throws(Strings.ODataMetadataBuilder_UnknownEntitySet("UnknownCollectionNavProp")); + this.GetWriterOutputForContentTypeAndKnobValue("application/json;odata.metadata=full", true, itemsToWrite, Model, EntitySet, EntityType, selectClause, expandClause); + Assert.Equal(new Uri("http://example.com/EntitySet(123)/UnknownCollectionNavProp(234)"),this.entryWithOnlyData2.Id); } [Fact] diff --git a/test/FunctionalTests/Microsoft.OData.Core.Tests/IntegrationTests/Writer/Json/ODataJsonWriterIntegrationTests.cs b/test/FunctionalTests/Microsoft.OData.Core.Tests/IntegrationTests/Writer/Json/ODataJsonWriterIntegrationTests.cs index 7199014327..96c5ef31b7 100644 --- a/test/FunctionalTests/Microsoft.OData.Core.Tests/IntegrationTests/Writer/Json/ODataJsonWriterIntegrationTests.cs +++ b/test/FunctionalTests/Microsoft.OData.Core.Tests/IntegrationTests/Writer/Json/ODataJsonWriterIntegrationTests.cs @@ -37,12 +37,14 @@ public void ShouldBeAbleToWriteEntryInRequestWithoutSpecifyingEntitySetOrMetadat } [Fact] - public void ShouldNotBeAbleToWriteEntryInResponseWithoutSpecifyingEntitySet() + public void ShouldBeAbleToWriteEntryInResponseWithoutSpecifyingEntitySet() { IEdmEntityType entityType = GetEntityType(); IEdmEntitySet entitySet = GetEntitySet(entityType); - Action writeEmptyEntry = () => WriteJsonEntry(false, new Uri("http://temp.org/"), false, new ODataResource(), entitySet, entityType); - writeEmptyEntry.Throws(ErrorStrings.ODataResourceTypeContext_MetadataOrSerializationInfoMissing); + var resource = new ODataResource { Properties = new ODataProperty[] { new ODataProperty { Name = "Key", Value = new ODataPrimitiveValue("abc") } } }; + const string expected = "{\"@odata.context\":\"http://temp.org/$metadata#Fake.Type\",\"Key\":\"abc\"}"; + var actual = WriteJsonEntry(false, new Uri("http://temp.org/"), false, resource, entitySet, entityType); + Assert.Equal(expected, actual); } [Fact] diff --git a/test/FunctionalTests/Microsoft.OData.Core.Tests/IntegrationTests/Writer/Json/ODataJsonWriterShortSpanIntegrationTests.cs b/test/FunctionalTests/Microsoft.OData.Core.Tests/IntegrationTests/Writer/Json/ODataJsonWriterShortSpanIntegrationTests.cs index d4d728d264..52f644620e 100644 --- a/test/FunctionalTests/Microsoft.OData.Core.Tests/IntegrationTests/Writer/Json/ODataJsonWriterShortSpanIntegrationTests.cs +++ b/test/FunctionalTests/Microsoft.OData.Core.Tests/IntegrationTests/Writer/Json/ODataJsonWriterShortSpanIntegrationTests.cs @@ -145,10 +145,9 @@ public void ShouldWriteContextUriForFeedResponseWithoutUserModel() } [Fact] - public void ShouldThrowWhenWritingFeedResponseWithoutUserModelAndWithoutSetName() + public void ShouldWriteContextUriWhenWritingFeedResponseWithoutUserModelAndWithoutSetName() { - Action action = () => this.WriteNestedItemsAndValidatePayload(entitySetFullName: null, derivedEntityTypeFullName: "NS.MyDerivedEntityType", nestedItemToWrite: new[] { new ODataResourceSet() }, expectedPayload: "{\"@odata.context\":\"http://odata.org/test/$metadata#MySet/NS.MyDerivedEntityType\",\"value\":[]}", writingResponse: true); - action.Throws(Strings.ODataResourceTypeContext_MetadataOrSerializationInfoMissing); + this.WriteNestedItemsAndValidatePayload(entitySetFullName: null, derivedEntityTypeFullName: "NS.MyDerivedEntityType", nestedItemToWrite: new[] { new ODataResourceSet() }, expectedPayload: "{\"@odata.context\":\"http://odata.org/test/$metadata#Collection(NS.MyDerivedEntityType)\",\"value\":[]}", writingResponse: true); } [Fact] @@ -170,10 +169,9 @@ public void ShouldWriteContextUriForEntryResponseWithoutUserModel() } [Fact] - public void ShouldThrowWhenWritingEntryResponseWithoutUserModelAndWithoutSetName() + public void ShouldWriteContextUriForEntryResponseWithoutUserModelAndWithoutSetName() { - Action action = () => this.WriteNestedItemsAndValidatePayload(entitySetFullName: null, derivedEntityTypeFullName: "NS.MyDerivedEntityType", nestedItemToWrite: new[] { new ODataResource() }, expectedPayload: "{\"@odata.context\":\"http://odata.org/test/$metadata#MySet/NS.MyDerivedEntityType/$entity\"}", writingResponse: true); - action.Throws(Strings.ODataResourceTypeContext_MetadataOrSerializationInfoMissing); + this.WriteNestedItemsAndValidatePayload(entitySetFullName: null, derivedEntityTypeFullName: "NS.MyDerivedEntityType", nestedItemToWrite: new[] { new ODataResource() }, expectedPayload: "{\"@odata.context\":\"http://odata.org/test/$metadata#NS.MyDerivedEntityType\"}", writingResponse: true); } [Fact] @@ -195,10 +193,9 @@ public void ShouldWriteContextUriForFeedResponseWithUserModel() } [Fact] - public void ShouldThrowWhenWritingFeedResponseWithUserModelAndWithoutSet() + public void ShouldWriteContextUriWhenWritingFeedResponseWithUserModelAndWithoutSet() { - Action action = () => this.WriteNestedItemsAndValidatePayload(/*entitySet*/ null, this.derivedEntityType, nestedItemToWrite: new[] { new ODataResourceSet() }, expectedPayload: "{\"@odata.context\":\"http://odata.org/test/$metadata#MySet/NS.MyDerivedEntityType\",\"value\":[]}", writingResponse: true); - action.Throws(Strings.ODataResourceTypeContext_MetadataOrSerializationInfoMissing); + this.WriteNestedItemsAndValidatePayload(/*entitySet*/ null, this.derivedEntityType, nestedItemToWrite: new[] { new ODataResourceSet() }, expectedPayload: "{\"@odata.context\":\"http://odata.org/test/$metadata#Collection(NS.MyDerivedEntityType)\",\"value\":[]}", writingResponse: true); } [Fact] @@ -214,10 +211,9 @@ public void ShouldWriteContextUriForEntryResponseWithUserModel() } [Fact] - public void ShouldThrowWhenWritingEntryResponseWithUserModelAndWithoutSet() + public void ShouldWirteContextUriForEntryResponseWithUserModelAndWithoutSet() { - Action action = () => this.WriteNestedItemsAndValidatePayload(/*entitySet*/ null, this.derivedEntityType, nestedItemToWrite: new[] { new ODataResource() }, expectedPayload: "{\"@odata.context\":\"http://odata.org/test/$metadata#MySet/NS.MyDerivedEntityType/$entity\"}", writingResponse: true); - action.Throws(Strings.ODataResourceTypeContext_MetadataOrSerializationInfoMissing); + this.WriteNestedItemsAndValidatePayload(/*entitySet*/ null, this.derivedEntityType, nestedItemToWrite: new[] { new ODataResource() }, expectedPayload: "{\"@odata.context\":\"http://odata.org/test/$metadata#NS.MyDerivedEntityType\"}", writingResponse: true); } #endregion Context Uri tests @@ -1203,9 +1199,12 @@ private void WriteNestedItemsAndValidatePayload(string entitySetFullName, string ODataItem topLevelItem = nestedItemToWrite[0]; ODataResourceSet topLevelFeed = topLevelItem as ODataResourceSet; - if (entitySetFullName != null) + if (entitySetFullName != null || derivedEntityTypeFullName != null) { - ODataResourceSerializationInfo serializationInfo = entitySetFullName == null ? null : new ODataResourceSerializationInfo { NavigationSourceName = entitySetFullName, NavigationSourceEntityTypeName = "NS.MyEntityType", ExpectedTypeName = derivedEntityTypeFullName ?? "NS.MyEntityType", NavigationSourceKind = EdmNavigationSourceKind.EntitySet }; + ODataResourceSerializationInfo serializationInfo = entitySetFullName == null ? + new ODataResourceSerializationInfo { ExpectedTypeName = derivedEntityTypeFullName, IsFromCollection = true } : + new ODataResourceSerializationInfo { NavigationSourceName = entitySetFullName, NavigationSourceEntityTypeName = "NS.MyEntityType", ExpectedTypeName = derivedEntityTypeFullName ?? "NS.MyEntityType", NavigationSourceKind = EdmNavigationSourceKind.EntitySet }; + if (topLevelFeed != null) { topLevelFeed.SetSerializationInfo(serializationInfo); diff --git a/test/FunctionalTests/Microsoft.OData.Core.Tests/Json/ODataJsonResourceSerializerTests.cs b/test/FunctionalTests/Microsoft.OData.Core.Tests/Json/ODataJsonResourceSerializerTests.cs index 11a6b7183e..5a546d1476 100644 --- a/test/FunctionalTests/Microsoft.OData.Core.Tests/Json/ODataJsonResourceSerializerTests.cs +++ b/test/FunctionalTests/Microsoft.OData.Core.Tests/Json/ODataJsonResourceSerializerTests.cs @@ -325,8 +325,7 @@ public async Task WriteNestedResourceInfoContextUrlAsync_WritesNestedResourceInf CreateCategorySerializationInfo(), /* navigationSource */ null, /* navigationSourceEntityType */ null, - /* expectedResourceType */ null, - /* throwIfMissingTypeInfo */ true); + /* expectedResourceType */ null); var contextUrlInfo = ODataContextUrlInfo.Create( typeContext, this.messageWriterSettings.Version ?? ODataVersion.V4, @@ -417,8 +416,7 @@ public async Task WriteDeltaContextUriAsync_WritesDeltaContextUri() /* serializationInfo */ null, this.categoriesEntitySet, this.categoryEntityType, - this.categoryEntityType, - /* throwIfMissingTypeInfo */ true); + this.categoryEntityType); var result = await SetupJsonResourceSerializerAndRunTestAsync( (jsonResourceSerializer) => @@ -439,8 +437,7 @@ public async Task WriteResourceContextUriAsync_WritesResourceContextUri() CreateCategorySerializationInfo(), /* navigationSource */ null, /* navigationSourceEntityType */ null, - /* expectedResourceType */ null, - /* throwIfMissingTypeInfo */ true); + /* expectedResourceType */ null); var result = await SetupJsonResourceSerializerAndRunTestAsync( (jsonResourceSerializer) => @@ -460,8 +457,7 @@ public async Task WriteResourceSetContextUriAsync_WritesResourceSetContextUri() CreateCategorySerializationInfo(), /* navigationSource */ null, /* navigationSourceEntityType */ null, - /* expectedResourceType */ null, - /* throwIfMissingTypeInfo */ true); + /* expectedResourceType */ null); var result = await SetupJsonResourceSerializerAndRunTestAsync( (jsonResourceSerializer) => diff --git a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataContextUriBuilderTests.cs b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataContextUriBuilderTests.cs index 75a8c06c60..f42343a187 100644 --- a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataContextUriBuilderTests.cs +++ b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataContextUriBuilderTests.cs @@ -19,8 +19,8 @@ public class ODataContextUriBuilderTests { private const string ServiceDocumentUriString = "http://odata.org/service/"; private const string MetadataDocumentUriString = "http://odata.org/service/$metadata"; - private static readonly ODataResourceTypeContext ResponseTypeContextWithoutTypeInfo = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null, throwIfMissingTypeInfo: true); - private static readonly ODataResourceTypeContext RequestTypeContextWithoutTypeInfo = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null, throwIfMissingTypeInfo: false); + private static readonly ODataResourceTypeContext ResponseTypeContextWithoutTypeInfo = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null); + private static readonly ODataResourceTypeContext RequestTypeContextWithoutTypeInfo = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null); private static readonly ODataVersion[] Versions = new ODataVersion[] { ODataVersion.V4, ODataVersion.V401 }; private Uri metadataDocumentBaseUri; @@ -393,12 +393,12 @@ public void ShouldWriteFeedContextUriWithTypecast() } [Fact] - public void ShouldThrowIfEntitySetIsMissingWithoutSerializationInfoOnFeedResponse() + public void ShouldThrowIfEntitySetAndTypeInfoIsMissingWithoutSerializationInfoOnFeedResponse() { foreach (ODataVersion version in Versions) { Action test = () => this.CreateFeedContextUri(ResponseTypeContextWithoutTypeInfo, version); - test.Throws(Strings.ODataResourceTypeContext_MetadataOrSerializationInfoMissing); + test.Throws(Strings.ODataContextUriBuilder_NavigationSourceOrTypeNameMissingForResourceOrResourceSet); } } @@ -427,8 +427,7 @@ public void ShouldWriteIfSerializationInfoWithoutNavigationSourceButUnknownSetOn }, navigationSource: null, navigationSourceEntityType: null, - expectedResourceType: null, - throwIfMissingTypeInfo: true), + expectedResourceType: null), version, isResponse: true); } @@ -455,12 +454,12 @@ public void ShouldWriteEntryContextUriWithTypecast() } [Fact] - public void ShouldThrowIfEntitySetIsMissingOnEntryResponse() + public void ShouldThrowIfEntitySetAndTypeInfoIsMissingOnEntryResponse() { foreach (ODataVersion version in Versions) { Action test = () => this.CreateEntryContextUri(ResponseTypeContextWithoutTypeInfo, version); - test.Throws(Strings.ODataResourceTypeContext_MetadataOrSerializationInfoMissing); + test.Throws(Strings.ODataContextUriBuilder_NavigationSourceOrTypeNameMissingForResourceOrResourceSet); } } @@ -478,7 +477,7 @@ public void ShouldNotIncludeFragmentItemSelectorOnSingleton() { foreach (ODataVersion version in Versions) { - var singletonTypeContextWithModel = ODataResourceTypeContext.Create( /*serializationInfo*/null, this.singletonCity, this.cityType, this.cityType, throwIfMissingTypeInfo: true); + var singletonTypeContextWithModel = ODataResourceTypeContext.Create( /*serializationInfo*/null, this.singletonCity, this.cityType, this.cityType); Assert.Equal(this.CreateEntryContextUri(singletonTypeContextWithModel, version).OriginalString, BuildExpectedContextUri("#SingletonCity", false)); } } @@ -487,7 +486,7 @@ public void ShouldNotIncludeFragmentItemSelectorOnSingleton() public void ShouldNotIncludeEntityOnSingletonWithoutModel() { ODataResourceSerializationInfo serializationInfo = new ODataResourceSerializationInfo() { ExpectedTypeName = "People", NavigationSourceEntityTypeName = "People", NavigationSourceName = "Boss", NavigationSourceKind = EdmNavigationSourceKind.Singleton, }; - var requestSingletonTypeContextWithoutModel = ODataResourceTypeContext.Create(serializationInfo, /*navigationSource*/null, /*navigationSourceEntityType*/null, /*expectedEntityType*/null, true); + var requestSingletonTypeContextWithoutModel = ODataResourceTypeContext.Create(serializationInfo, /*navigationSource*/null, /*navigationSourceEntityType*/null, /*expectedEntityType*/null); foreach (ODataVersion version in Versions) { Assert.Equal(this.CreateEntryContextUri(requestSingletonTypeContextWithoutModel, version).OriginalString, BuildExpectedContextUri("#Boss", false)); @@ -570,7 +569,7 @@ public void BuildPropertyContextUriForSpatialPropertyValue() public void BuildResourceContextUriForComplexResource() { var typeContext = ODataResourceTypeContext.Create( /*serializationInfo*/null, - null, null, this.addressType, throwIfMissingTypeInfo: false); + null, null, this.addressType); ODataResource value = new ODataResource { TypeName = "TestModel.Address" }; foreach (ODataVersion version in Versions) { @@ -594,7 +593,7 @@ public void BuildPropertyContextUriForCollectionPropertyValue() public void BuildResourceContextUriForComplexWithNullAnnotation() { var typeContext = ODataResourceTypeContext.Create( /*serializationInfo*/null, - null, null, this.addressType, throwIfMissingTypeInfo: true); + null, null, this.addressType); ODataResource value = new ODataResource { TypeName = "TestModel.Address" }; value.TypeAnnotation = new ODataTypeAnnotation(); foreach (ODataVersion version in Versions) @@ -783,7 +782,7 @@ public void FeedContextUriShouldNotBeWrittenIfNotProvided() var serializationInfo = new ODataResourceSerializationInfo { NavigationSourceName = "MyContainer.MyCities", NavigationSourceEntityTypeName = "TestModel.MyCity", ExpectedTypeName = "TestModel.MyCity" }; foreach (ODataVersion version in Versions) { - var typeContext = ODataResourceTypeContext.Create(serializationInfo, null, null, null, true); + var typeContext = ODataResourceTypeContext.Create(serializationInfo, null, null, null); Assert.Null(this.builderWithNoMetadataDocumentUri.BuildContextUri(ODataPayloadKind.ResourceSet, ODataContextUrlInfo.Create(typeContext, version, false))); } } @@ -794,7 +793,7 @@ public void EntryContextUriShouldNotBeWrittenIfNotProvided() var serializationInfo = new ODataResourceSerializationInfo { NavigationSourceName = "MyContainer.MyCities", NavigationSourceEntityTypeName = "TestModel.MyCity", ExpectedTypeName = "TestModel.MyCity" }; foreach (ODataVersion version in Versions) { - var typeContext = ODataResourceTypeContext.Create(serializationInfo, null, null, null, true); + var typeContext = ODataResourceTypeContext.Create(serializationInfo, null, null, null); Assert.Null(this.builderWithNoMetadataDocumentUri.BuildContextUri(ODataPayloadKind.Resource, ODataContextUrlInfo.Create(typeContext, version, true))); } } @@ -899,8 +898,8 @@ private void InitializeEdmModel() private void InitializeTypeContext() { - this.responseCityTypeContextWithoutSerializationInfo = ODataResourceTypeContext.Create( /*serializationInfo*/null, this.citySet, this.cityType, this.cityType, throwIfMissingTypeInfo: true); - this.responseCapitolCityTypeContextWithoutSerializationInfo = ODataResourceTypeContext.Create( /*serializationInfo*/null, this.citySet, this.cityType, this.capitolCityType, throwIfMissingTypeInfo: true); + this.responseCityTypeContextWithoutSerializationInfo = ODataResourceTypeContext.Create( /*serializationInfo*/null, this.citySet, this.cityType, this.cityType); + this.responseCapitolCityTypeContextWithoutSerializationInfo = ODataResourceTypeContext.Create( /*serializationInfo*/null, this.citySet, this.cityType, this.capitolCityType); } private Uri CreateCollectionContextUri(ODataCollectionStartSerializationInfo serializationInfo, IEdmTypeReference itemTypeReference) @@ -954,7 +953,7 @@ private Uri CreateFeedContextUri(string selectClause, string expandClause, strin } - ODataResourceTypeContext typeContext = ODataResourceTypeContext.Create( /*serializationInfo*/null, this.citySet, this.cityType, this.cityType, true); + ODataResourceTypeContext typeContext = ODataResourceTypeContext.Create( /*serializationInfo*/null, this.citySet, this.cityType, this.cityType); ODataUri odataUri = new ODataUri() { SelectAndExpand = selectExpandClause, Apply = applyClause, Compute = computeClause }; ODataContextUrlInfo info = ODataContextUrlInfo.Create(typeContext, version, false, odataUri); Uri contextUrl = this.responseContextUriBuilder.BuildContextUri(ODataPayloadKind.ResourceSet, info); @@ -964,7 +963,7 @@ private Uri CreateFeedContextUri(string selectClause, string expandClause, strin private Uri CreateEntryContextUri(string selectClause, string expandClause, ODataVersion version) { SelectExpandClause selectExpandClause = new ODataQueryOptionParser(edmModel, this.cityType, this.citySet, new Dictionary { { "$expand", expandClause }, { "$select", selectClause } }).ParseSelectAndExpand(); - ODataResourceTypeContext typeContext = ODataResourceTypeContext.Create( /*serializationInfo*/null, this.citySet, this.cityType, this.cityType, true); + ODataResourceTypeContext typeContext = ODataResourceTypeContext.Create( /*serializationInfo*/null, this.citySet, this.cityType, this.cityType); ODataContextUrlInfo info = ODataContextUrlInfo.Create(typeContext, version, true, new ODataUri() { SelectAndExpand = selectExpandClause }); Uri contextUrl = this.responseContextUriBuilder.BuildContextUri(ODataPayloadKind.ResourceSet, info); return contextUrl; diff --git a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataNavigationLinkTests.cs b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataNavigationLinkTests.cs index 1cc6c036dd..f11a04dc9f 100644 --- a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataNavigationLinkTests.cs +++ b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataNavigationLinkTests.cs @@ -34,7 +34,7 @@ public ODataNavigationLinkTests() }; var serializationInfo = new ODataResourceSerializationInfo { NavigationSourceName = "Set", NavigationSourceEntityTypeName = "ns.BaseType", ExpectedTypeName = "ns.BaseType" }; - var typeContext = ODataResourceTypeContext.Create(serializationInfo, null, null, null, true); + var typeContext = ODataResourceTypeContext.Create(serializationInfo, null, null, null); var metadataContext = new TestMetadataContext(); var entryMetadataContext = ODataResourceMetadataContext.Create(entry, typeContext, serializationInfo, null, metadataContext, new SelectedPropertiesNode(SelectedPropertiesNode.SelectionType.EntireSubtree), null); var metadataBuilder = new ODataConventionalEntityMetadataBuilder(entryMetadataContext, metadataContext, diff --git a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataOperationTests.cs b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataOperationTests.cs index 882762bcab..eb5f820865 100644 --- a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataOperationTests.cs +++ b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataOperationTests.cs @@ -41,7 +41,7 @@ public ODataOperationTests() }; var serializationInfo = new ODataResourceSerializationInfo { NavigationSourceName = "Set", NavigationSourceEntityTypeName = "ns.BaseType", ExpectedTypeName = "ns.BaseType" }; - var typeContext = ODataResourceTypeContext.Create(serializationInfo, null, null, null, true); + var typeContext = ODataResourceTypeContext.Create(serializationInfo, null, null, null); var metadataContext = new TestMetadataContext(); var entryMetadataContext = ODataResourceMetadataContext.Create(entry, typeContext, serializationInfo, null, metadataContext, new SelectedPropertiesNode(SelectedPropertiesNode.SelectionType.EntireSubtree), null); var fullMetadataBuilder = new ODataConventionalEntityMetadataBuilder(entryMetadataContext, metadataContext, diff --git a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataReaderDerivedTypeConstraintTests.cs b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataReaderDerivedTypeConstraintTests.cs index e910ee9041..121a8fc805 100644 --- a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataReaderDerivedTypeConstraintTests.cs +++ b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataReaderDerivedTypeConstraintTests.cs @@ -320,7 +320,7 @@ public void ReadingSingleNavigationProppertyWithSameTypeAsNavigationPropertyType Assert.Equal(5, resource.Properties.OfType().Single().Value); ODataNestedResourceInfo nestedResourceInfo = Assert.IsType(ms.Pop()); // FriendCustomer Nested resource info - Assert.Throws(() => nestedResourceInfo.Url); + Assert.Equal(new Uri("http://example.com/Customers(7)/FriendCustomer/FriendCustomer"), nestedResourceInfo.Url); Assert.Equal("FriendCustomer", nestedResourceInfo.Name); }; @@ -364,7 +364,7 @@ public void ReadingSingleNavigationProppertyWithAllowedTypeAsNavigationPropertyT Assert.Equal("NS.VipCustomer", resource.TypeName); ODataNestedResourceInfo nestedResourceInfo = Assert.IsType(ms.Pop()); // FriendCustomer Nested resource info - Assert.Throws(() => nestedResourceInfo.Url); + Assert.Equal(new Uri("http://example.com/Customers(7)/FriendCustomer/NS.VipCustomer/FriendCustomer"), nestedResourceInfo.Url); Assert.Equal("FriendCustomer", nestedResourceInfo.Name); }; diff --git a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataResourceTests.cs b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataResourceTests.cs index eec2c1a07c..3b7c66864f 100644 --- a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataResourceTests.cs +++ b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataResourceTests.cs @@ -33,7 +33,7 @@ public ODataResourceTests() } }; var serializationInfo = new ODataResourceSerializationInfo { NavigationSourceName = "Set", NavigationSourceEntityTypeName = "ns.BaseType", ExpectedTypeName = "ns.BaseType" }; - var typeContext = ODataResourceTypeContext.Create(serializationInfo, null, null, null, true); + var typeContext = ODataResourceTypeContext.Create(serializationInfo, null, null, null); var metadataContext = new TestMetadataContext(); var entryMetadataContext = ODataResourceMetadataContext.Create(this.odataEntryWithFullBuilder, typeContext, serializationInfo, null, metadataContext, new SelectedPropertiesNode(SelectedPropertiesNode.SelectionType.EntireSubtree), null); this.odataEntryWithFullBuilder.MetadataBuilder = diff --git a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataResourceTypeContextTests.cs b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataResourceTypeContextTests.cs index 411e931b32..23101255a2 100644 --- a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataResourceTypeContextTests.cs +++ b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataResourceTypeContextTests.cs @@ -47,17 +47,17 @@ static ODataResourceTypeContextTests() SerializationInfo = new ODataResourceSerializationInfo { NavigationSourceName = "MyCustomers", NavigationSourceEntityTypeName = "ns.MyCustomer", ExpectedTypeName = "ns.MyVipCustomer" }; SerializationInfoWithEdmUnknowEntitySet = new ODataResourceSerializationInfo() { NavigationSourceName = null, NavigationSourceEntityTypeName = "ns.MyCustomer", ExpectedTypeName = "ns.MyVipCustomer", NavigationSourceKind = EdmNavigationSourceKind.UnknownEntitySet }; - TypeContextWithoutModel = ODataResourceTypeContext.Create(SerializationInfo, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null, throwIfMissingTypeInfo: true); - TypeContextWithModel = ODataResourceTypeContext.Create(/*serializationInfo*/null, EntitySet, EntitySetElementType, ExpectedEntityType, throwIfMissingTypeInfo: true); - TypeContextWithEdmUnknowEntitySet = ODataResourceTypeContext.Create(SerializationInfoWithEdmUnknowEntitySet, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null, throwIfMissingTypeInfo: true); - BaseTypeContextThatThrows = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null, throwIfMissingTypeInfo: true); - BaseTypeContextThatWillNotThrow = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null, throwIfMissingTypeInfo: false); + TypeContextWithoutModel = ODataResourceTypeContext.Create(SerializationInfo, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null); + TypeContextWithModel = ODataResourceTypeContext.Create(/*serializationInfo*/null, EntitySet, EntitySetElementType, ExpectedEntityType); + TypeContextWithEdmUnknowEntitySet = ODataResourceTypeContext.Create(SerializationInfoWithEdmUnknowEntitySet, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null); + BaseTypeContextThatThrows = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null); + BaseTypeContextThatWillNotThrow = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null); } [Fact] public void ShouldCreateSubclassWithoutModelWhenSerializationInfoIsGiven() { - var typeContext = ODataResourceTypeContext.Create(SerializationInfo, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null, throwIfMissingTypeInfo: true); + var typeContext = ODataResourceTypeContext.Create(SerializationInfo, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null); Assert.NotNull(typeContext); Assert.EndsWith("WithoutModel", typeContext.GetType().Name); } @@ -65,7 +65,7 @@ public void ShouldCreateSubclassWithoutModelWhenSerializationInfoIsGiven() [Fact] public void ShouldCreateSubclassWithModelWhenMetadataIsGiven() { - var typeContext = ODataResourceTypeContext.Create(/*serializationInfo*/null, EntitySet, EntitySetElementType, ExpectedEntityType, throwIfMissingTypeInfo: true); + var typeContext = ODataResourceTypeContext.Create(/*serializationInfo*/null, EntitySet, EntitySetElementType, ExpectedEntityType); Assert.NotNull(typeContext); Assert.EndsWith("WithModel", typeContext.GetType().Name); } @@ -74,7 +74,7 @@ public void ShouldCreateSubclassWithModelWhenMetadataIsGiven() public void ShouldCreateSubclassWithModelWhenExpectedTypeisGiven() { var typeContext = ODataResourceTypeContext.Create(null, navigationSource: null, - navigationSourceEntityType: null, expectedResourceType: ComplexType, throwIfMissingTypeInfo: false); + navigationSourceEntityType: null, expectedResourceType: ComplexType); Assert.NotNull(typeContext); Assert.EndsWith("WithModel", typeContext.GetType().Name); } @@ -82,7 +82,7 @@ public void ShouldCreateSubclassWithModelWhenExpectedTypeisGiven() [Fact] public void ShouldCreateSubclassWithoutModelWhenBothSerializationInfoAndMetadataAreGiven() { - var typeContext = ODataResourceTypeContext.Create(SerializationInfo, EntitySet, EntitySetElementType, ExpectedEntityType, throwIfMissingTypeInfo: true); + var typeContext = ODataResourceTypeContext.Create(SerializationInfo, EntitySet, EntitySetElementType, ExpectedEntityType); Assert.NotNull(typeContext); Assert.EndsWith("WithoutModel", typeContext.GetType().Name); } @@ -90,14 +90,14 @@ public void ShouldCreateSubclassWithoutModelWhenBothSerializationInfoAndMetadata [Fact] public void ShouldCreateBaseClassWhenSerializationInfoAndUserModelAreBothMissingAndThrowIfMissingTypeInfoIsTrue() { - var typeContext = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null, throwIfMissingTypeInfo: true); + var typeContext = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null); Assert.IsType(typeContext); } [Fact] public void ShouldCreateBaseClassWhenSerializationInfoAndUserModelAreBothMissingAndThrowIfMissingTypeInfoIsFalse() { - var typeContext = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null, throwIfMissingTypeInfo: false); + var typeContext = ODataResourceTypeContext.Create(serializationInfo: null, navigationSource: null, navigationSourceEntityType: null, expectedResourceType: null); Assert.IsType(typeContext); } @@ -154,20 +154,6 @@ public void TypeContextWithMetadataShouldReturnIsMediaLinkEntry() #endregion TypeContextWithModel #region BaseTypeContextThatThrows - [Fact] - public void BaseTypeContextThatThrowsShouldThrowForEntitySetName() - { - Action test = () => Assert.Null(BaseTypeContextThatThrows.NavigationSourceName); - test.Throws(Strings.ODataResourceTypeContext_MetadataOrSerializationInfoMissing); - } - - [Fact] - public void BaseTypeContextThatThrowsShouldThrowForEntitySetElementTypeName() - { - Action test = () => Assert.Null(BaseTypeContextThatThrows.NavigationSourceEntityTypeName); - test.Throws(Strings.ODataResourceTypeContext_MetadataOrSerializationInfoMissing); - } - [Fact] public void BaseTypeContextThatThrowsShouldReturnNullExpectedEntityTypeName() { diff --git a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataStreamReferenceValueTests.cs b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataStreamReferenceValueTests.cs index 6c5bac5979..7bece76444 100644 --- a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataStreamReferenceValueTests.cs +++ b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataStreamReferenceValueTests.cs @@ -35,7 +35,7 @@ public ODataStreamReferenceValueTests() }; var serializationInfo = new ODataResourceSerializationInfo { NavigationSourceName = "Set", NavigationSourceEntityTypeName = "ns.BaseType", ExpectedTypeName = "ns.BaseType" }; - var typeContext = ODataResourceTypeContext.Create(serializationInfo, null, null, null, true); + var typeContext = ODataResourceTypeContext.Create(serializationInfo, null, null, null); var metadataContext = new TestMetadataContext(); var entryMetadataContext = ODataResourceMetadataContext.Create(entry, typeContext, serializationInfo, null, metadataContext, new SelectedPropertiesNode(SelectedPropertiesNode.SelectionType.EntireSubtree), null); var fullMetadataBuilder = new ODataConventionalEntityMetadataBuilder(entryMetadataContext, metadataContext, diff --git a/test/FunctionalTests/Microsoft.OData.Core.Tests/ScenarioTests/Writer/Json/ODataJsonInheritComplexCollectionWriterTests.cs b/test/FunctionalTests/Microsoft.OData.Core.Tests/ScenarioTests/Writer/Json/ODataJsonInheritComplexCollectionWriterTests.cs index 9ae4c845a4..3eb804c2c1 100644 --- a/test/FunctionalTests/Microsoft.OData.Core.Tests/ScenarioTests/Writer/Json/ODataJsonInheritComplexCollectionWriterTests.cs +++ b/test/FunctionalTests/Microsoft.OData.Core.Tests/ScenarioTests/Writer/Json/ODataJsonInheritComplexCollectionWriterTests.cs @@ -117,7 +117,7 @@ public void ShouldThrowForComplexCollectionResponseWithoutUserModelAndWithoutIte { Action sync = () => WriteAndValidateSync(/*itemTypeReference*/ null, this.collectionStartWithoutSerializationInfo, items, "", writingResponse: true); // Action async = () => WriteAndValidateAsync(/*itemTypeReference*/ null, this.collectionStartWithoutSerializationInfo, items, "", writingResponse: true); - sync.Throws(Strings.ODataResourceTypeContext_MetadataOrSerializationInfoMissing); + sync.Throws(Strings.ODataContextUriBuilder_NavigationSourceOrTypeNameMissingForResourceOrResourceSet); // Assert.Throws(async); } @@ -186,7 +186,7 @@ public void ShouldThrowForComplexCollectionResponseWithoutUserModelAndWithoutIte { Action sync = () => WriteAndValidateSync(/*itemTypeReference*/ null, this.collectionStartWithoutSerializationInfo, derivedItems, "", writingResponse: true); //Action async = () => WriteAndValidateAsync(/*itemTypeReference*/ null, this.collectionStartWithoutSerializationInfo, derivedItems, "", writingResponse: true); - sync.Throws(Strings.ODataResourceTypeContext_MetadataOrSerializationInfoMissing); + sync.Throws(Strings.ODataContextUriBuilder_NavigationSourceOrTypeNameMissingForResourceOrResourceSet); //Assert.Throws(async); }