public void ReadEditLinkShouldBeOmittedWhenNeitherSetInAtom() { DateTimeOffset updatedTime = DateTimeOffset.UtcNow; var entry = new ODataEntry { Id = new Uri("http://test.org/EntitySet('1')") }; entry.SetAnnotation(new AtomEntryMetadata() { Updated = updatedTime }); string actual = this.WriteAtomEntry(entry); string expected = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:d=\"http://docs.oasis-open.org/odata/ns/data\" xmlns:m=\"http://docs.oasis-open.org/odata/ns/metadata\" xmlns:georss=\"http://www.georss.org/georss\" xmlns:gml=\"http://www.opengis.net/gml\" m:context=\"http://temp.org/$metadata#EntitySet/$entity\">" + "<id>http://test.org/EntitySet('1')</id>" + "<title />" + "<updated>" + ODataAtomConvert.ToAtomString(updatedTime) + "</updated>" + "<author>" + "<name />" + "</author>" + "<content type=\"application/xml\" />" + "</entry>"; Assert.Equal(expected, actual); }
public void FlagsEnumAsEntityProperty_NullAsValue_NoTypeName() { DateTimeOffset updatedTime = DateTimeOffset.UtcNow; string payload = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:d=\"http://docs.oasis-open.org/odata/ns/data\" xmlns:m=\"http://docs.oasis-open.org/odata/ns/metadata\" xmlns:georss=\"http://www.georss.org/georss\" xmlns:gml=\"http://www.opengis.net/gml\">" + "<category term=\"#NS.MyEntityType\" scheme=\"http://docs.oasis-open.org/odata/ns/scheme\" />" + "<id />" + "<title />" + "<updated>" + ODataAtomConvert.ToAtomString(updatedTime) + "</updated>" + "<author>" + "<name />" + "</author>" + "<content type=\"application/xml\">" + "<m:properties>" + "<d:Color m:null=\"true\" />" + "</m:properties>" + "</content>" + "</entry>"; ODataEntry expectedEntry = new ODataEntry { TypeName = "NS.MyEntityType", Properties = new[] { new ODataProperty { Name = "Color", Value = null } } }; this.ReadEntryPayloadAndVerify(payload, expectedEntry); }
public void FlagsEnumAsEntityProperty_NullAsValue_ButNonNullable_GetNullError() { DateTimeOffset updatedTime = DateTimeOffset.UtcNow; Func <ODataEntry> entryClone = () => { var tmp = new ODataEntry { TypeName = "NS.MyEntityType", Properties = new[] { new ODataProperty { Name = "ColorFlags", Value = null } }, SerializationInfo = MySerializationInfo }; tmp.SetAnnotation(new AtomEntryMetadata() { Updated = updatedTime }); return(tmp); }; string fullName = this.entityType.FindProperty("ColorFlags").Type.FullName(); // model-request Action action = () => this.WriteRequestWithModelAndValidatePayload(nestedItemToWrite: new[] { entryClone() }, expectedPayload: ""); action.ShouldThrow <ODataException>().WithMessage(Strings.WriterValidationUtils_NonNullablePropertiesMustNotHaveNullValue("ColorFlags", fullName)); // model-reseponse action = () => this.WriteResponseWithModelAndValidatePayload(nestedItemToWrite: new[] { entryClone() }, expectedPayload: ""); action.ShouldThrow <ODataException>().WithMessage(Strings.WriterValidationUtils_NonNullablePropertiesMustNotHaveNullValue("ColorFlags", fullName)); // NoModel-request string expectedPayload = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:d=\"http://docs.oasis-open.org/odata/ns/data\" xmlns:m=\"http://docs.oasis-open.org/odata/ns/metadata\" " + "xmlns:georss=\"http://www.georss.org/georss\" xmlns:gml=\"http://www.opengis.net/gml\" m:context=\"http://odata.org/test/$metadata#MySet/$entity\">" + "<category term=\"#NS.MyEntityType\" scheme=\"http://docs.oasis-open.org/odata/ns/scheme\" />" + "<id />" + "<title />" + "<updated>" + ODataAtomConvert.ToAtomString(updatedTime) + "</updated>" + "<author><name /></author>" + "<content type=\"application/xml\">" + "<m:properties>" + "<d:ColorFlags m:null=\"true\" />" + "</m:properties>" + "</content>" + "</entry>"; this.WriteRequestWithoutModelAndValidatePayload(nestedItemToWrite: new[] { entryClone() }, expectedPayload: expectedPayload); // NoModel-response this.WriteResponseWithoutModelAndValidatePayload(nestedItemToWrite: new[] { entryClone() }, expectedPayload: expectedPayload); }
public void FlagsEnumAsEntityProperty_StrAsValue_StrAsTypeName() { DateTimeOffset updatedTime = DateTimeOffset.UtcNow; Func <ODataEntry> entryClone = () => { var tmp = new ODataEntry { TypeName = "NS.MyEntityType", Properties = new[] { new ODataProperty { Name = "ColorFlags", Value = new ODataEnumValue( (ColorFlags.Green | ColorFlags.Red).ToString(CultureInfo.InvariantCulture), "NS.MyEnumTypeName") // type name } }, SerializationInfo = MySerializationInfo }; tmp.SetAnnotation(new AtomEntryMetadata() { Updated = updatedTime }); return(tmp); }; // model-request string expectedPayload = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:d=\"http://docs.oasis-open.org/odata/ns/data\" xmlns:m=\"http://docs.oasis-open.org/odata/ns/metadata\" " + "xmlns:georss=\"http://www.georss.org/georss\" xmlns:gml=\"http://www.opengis.net/gml\" m:context=\"http://odata.org/test/$metadata#MySet/$entity\">" + "<category term=\"#NS.MyEntityType\" scheme=\"http://docs.oasis-open.org/odata/ns/scheme\" />" + "<id />" + "<title />" + "<updated>" + ODataAtomConvert.ToAtomString(updatedTime) + "</updated>" + "<author><name /></author>" + "<content type=\"application/xml\">" + "<m:properties>" + "<d:ColorFlags m:type=\"#NS.MyEnumTypeName\">Red, Green</d:ColorFlags>" + "</m:properties>" + "</content>" + "</entry>"; this.WriteRequestWithModelAndValidatePayload(nestedItemToWrite: new[] { entryClone() }, expectedPayload: expectedPayload); // model-reseponse this.WriteResponseWithModelAndValidatePayload(nestedItemToWrite: new[] { entryClone() }, expectedPayload: expectedPayload); // NoModel-request this.WriteRequestWithoutModelAndValidatePayload(nestedItemToWrite: new[] { entryClone() }, expectedPayload: expectedPayload); // NoModel-response this.WriteResponseWithoutModelAndValidatePayload(nestedItemToWrite: new[] { entryClone() }, expectedPayload: expectedPayload); }
public void FlagsEnumAsComplexProperty_StrAsValue_StrAsTypeName() { DateTimeOffset updatedTime = DateTimeOffset.UtcNow; string payload = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:d=\"http://docs.oasis-open.org/odata/ns/data\" xmlns:m=\"http://docs.oasis-open.org/odata/ns/metadata\" xmlns:georss=\"http://www.georss.org/georss\" xmlns:gml=\"http://www.opengis.net/gml\">" + "<category term=\"#NS.MyEntityType\" scheme=\"http://docs.oasis-open.org/odata/ns/scheme\" />" + "<id />" + "<title />" + "<updated>" + ODataAtomConvert.ToAtomString(updatedTime) + "</updated>" + "<author>" + "<name />" + "</author>" + "<content type=\"application/xml\">" + "<m:properties>" + "<d:FloatId m:type=\"Single\">12.3</d:FloatId>" + "<d:Color m:type=\"#NS.Color\">Green</d:Color>" + "<d:MyComplexType m:type=\"#NS.MyComplexType\">" + "<d:MyColorFlags m:type=\"#NS.ColorFlags\">Red</d:MyColorFlags>" + "<d:Height m:type=\"Double\">98.6</d:Height>" + "</d:MyComplexType>" + "</m:properties>" + "</content>" + "</entry>"; ODataEntry expectedEntry = new ODataEntry { TypeName = "NS.MyEntityType", Properties = new[] { new ODataProperty { Name = "FloatId", Value = new ODataPrimitiveValue(12.3F) }, new ODataProperty { Name = "Color", Value = new ODataEnumValue(Color.Green.ToString(), /*reader will get TypeName from model*/ "NS.Color") }, new ODataProperty { Name = "MyComplexType", Value = new ODataComplexValue { TypeName = "NS.MyComplexType", Properties = new[] { new ODataProperty { Name = "MyColorFlags", Value = new ODataEnumValue(ColorFlags.Red.ToString(), "NS.ColorFlags") }, new ODataProperty { Name = "Height", Value = 98.6 } } } } } }; this.ReadEntryPayloadAndVerify(payload, expectedEntry); }
public void FlagsEnumAsEntityProperty_IntAsValue_NoTypeName_Error() { DateTimeOffset updatedTime = DateTimeOffset.UtcNow; string payload = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:d=\"http://docs.oasis-open.org/odata/ns/data\" xmlns:m=\"http://docs.oasis-open.org/odata/ns/metadata\" xmlns:georss=\"http://www.georss.org/georss\" xmlns:gml=\"http://www.opengis.net/gml\">" + "<category term=\"#NS.MyEntityType\" scheme=\"http://docs.oasis-open.org/odata/ns/scheme\" />" + "<id />" + "<title />" + "<updated>" + ODataAtomConvert.ToAtomString(updatedTime) + "</updated>" + "<author>" + "<name />" + "</author>" + "<content type=\"application/xml\">" + "<m:properties>" + "<d:Color m:type=\"Int32\">16</d:Color>" + "</m:properties>" + "</content>" + "</entry>"; ODataEntry expectedEntry = null; Action parse = () => this.ReadEntryPayloadAndVerify(payload, expectedEntry); parse.ShouldThrow <ODataException>().WithMessage(Microsoft.OData.Core.Strings.ValidationUtils_IncorrectTypeKind("Edm.Int32", "Enum", "Primitive")); }
public void FlagsEnumAsEntityProperty_NullAsValue_NoNullable_Error() { DateTimeOffset updatedTime = DateTimeOffset.UtcNow; string payload = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:d=\"http://docs.oasis-open.org/odata/ns/data\" xmlns:m=\"http://docs.oasis-open.org/odata/ns/metadata\" xmlns:georss=\"http://www.georss.org/georss\" xmlns:gml=\"http://www.opengis.net/gml\">" + "<category term=\"#NS.MyEntityType\" scheme=\"http://docs.oasis-open.org/odata/ns/scheme\" />" + "<id />" + "<title />" + "<updated>" + ODataAtomConvert.ToAtomString(updatedTime) + "</updated>" + "<author>" + "<name />" + "</author>" + "<content type=\"application/xml\">" + "<m:properties>" + "<d:ColorFlags m:null=\"true\" />" + "</m:properties>" + "</content>" + "</entry>"; ODataEntry expectedEntry = null; Action parse = () => this.ReadEntryPayloadAndVerify(payload, expectedEntry); string fullName = this.entityType.FindProperty("ColorFlags").Type.FullName(); parse.ShouldThrow <ODataException>().WithMessage(Microsoft.OData.Core.Strings.ReaderValidationUtils_NullNamedValueForNonNullableType("ColorFlags", fullName)); }
/// <summary>Converts the specified value to a serializable string in ATOM format.</summary> /// <param name="value">Non-null value to convert.</param> /// <param name="result">The specified value converted to an ATOM string.</param> /// <returns>boolean value indicating conversion successful conversion</returns> internal static bool TryConvertPrimitiveToString(object value, out string result) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(value != null, "value != null"); result = null; TypeCode typeCode = PlatformHelper.GetTypeCode(value.GetType()); switch (typeCode) { case TypeCode.Boolean: result = ODataAtomConvert.ToString((bool)value); break; case TypeCode.Byte: result = ODataAtomConvert.ToString((byte)value); break; case TypeCode.DateTime: result = ODataAtomConvert.ToString((DateTime)value); break; case TypeCode.Decimal: result = ODataAtomConvert.ToString((decimal)value); break; case TypeCode.Double: result = ODataAtomConvert.ToString((double)value); break; case TypeCode.Int16: result = ODataAtomConvert.ToString((Int16)value); break; case TypeCode.Int32: result = ODataAtomConvert.ToString((Int32)value); break; case TypeCode.Int64: result = ODataAtomConvert.ToString((Int64)value); break; case TypeCode.SByte: result = ODataAtomConvert.ToString((SByte)value); break; case TypeCode.String: result = (string)value; break; case TypeCode.Single: result = ODataAtomConvert.ToString((Single)value); break; default: byte[] bytes = value as byte[]; if (bytes != null) { result = ODataAtomConvert.ToString(bytes); break; } if (value is DateTimeOffset) { result = ODataAtomConvert.ToString((DateTimeOffset)value); break; } if (value is Guid) { result = ODataAtomConvert.ToString((Guid)value); break; } if (value is TimeSpan) { // Edm.Time result = ODataAtomConvert.ToString((TimeSpan)value); break; } return(false); } Debug.Assert(result != null, "result != null"); return(true); }
public void FlagsEnumAsCollectionElement_StrAsValue_StrAsTypeName() { DateTimeOffset updatedTime = DateTimeOffset.UtcNow; Func <ODataEntry> entryClone = () => { var tmp = new ODataEntry { TypeName = "NS.MyEntityType", Properties = new[] { new ODataProperty { Name = "FloatId", Value = new ODataPrimitiveValue(12.3D) }, new ODataProperty { Name = "Color", Value = new ODataEnumValue(Color.Green.ToString(), "NS.Color") }, new ODataProperty { Name = "MyCollectionType", Value = new ODataCollectionValue { Items = new[] { new ODataEnumValue(Color.Red.ToString(), "NS.EnumUndefinedTypename"), new ODataEnumValue(Color.Green.ToString(), "NS.EnumUndefinedTypename") } } } }, SerializationInfo = MySerializationInfo }; tmp.SetAnnotation(new AtomEntryMetadata() { Updated = updatedTime }); return(tmp); }; // model-request string expectedPayload = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:d=\"http://docs.oasis-open.org/odata/ns/data\" xmlns:m=\"http://docs.oasis-open.org/odata/ns/metadata\" xmlns:georss=\"http://www.georss.org/georss\" xmlns:gml=\"http://www.opengis.net/gml\" m:context=\"http://odata.org/test/$metadata#MySet/$entity\">" + "<category term=\"#NS.MyEntityType\" scheme=\"http://docs.oasis-open.org/odata/ns/scheme\" />" + "<id />" + "<title />" + "<updated>" + ODataAtomConvert.ToAtomString(updatedTime) + "</updated>" + "<author>" + "<name />" + "</author>" + "<content type=\"application/xml\">" + "<m:properties>" + "<d:FloatId m:type=\"Double\">12.3</d:FloatId>" + "<d:Color m:type=\"#NS.Color\">Green</d:Color>" + "<d:MyCollectionType m:type=\"#Collection(NS.ColorFlags)\">" + "<m:element m:type=\"#NS.EnumUndefinedTypename\">Red</m:element>" + "<m:element m:type=\"#NS.EnumUndefinedTypename\">Green</m:element>" + "</d:MyCollectionType>" + "</m:properties>" + "</content>" + "</entry>"; this.WriteRequestWithModelAndValidatePayload(nestedItemToWrite: new[] { entryClone() }, expectedPayload: expectedPayload); // model-reseponse this.WriteResponseWithModelAndValidatePayload(nestedItemToWrite: new[] { entryClone() }, expectedPayload: expectedPayload); // NoModel-request expectedPayload = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:d=\"http://docs.oasis-open.org/odata/ns/data\" xmlns:m=\"http://docs.oasis-open.org/odata/ns/metadata\" xmlns:georss=\"http://www.georss.org/georss\" xmlns:gml=\"http://www.opengis.net/gml\" m:context=\"http://odata.org/test/$metadata#MySet/$entity\">" + "<category term=\"#NS.MyEntityType\" scheme=\"http://docs.oasis-open.org/odata/ns/scheme\" />" + "<id />" + "<title />" + "<updated>" + ODataAtomConvert.ToAtomString(updatedTime) + "</updated>" + "<author>" + "<name />" + "</author>" + "<content type=\"application/xml\">" + "<m:properties>" + "<d:FloatId m:type=\"Double\">12.3</d:FloatId>" + "<d:Color m:type=\"#NS.Color\">Green</d:Color>" + "<d:MyCollectionType>" + "<m:element m:type=\"#NS.EnumUndefinedTypename\">Red</m:element>" + "<m:element m:type=\"#NS.EnumUndefinedTypename\">Green</m:element>" + "</d:MyCollectionType>" + "</m:properties>" + "</content>" + "</entry>"; this.WriteRequestWithoutModelAndValidatePayload(nestedItemToWrite: new[] { entryClone() }, expectedPayload: expectedPayload); // NoModel-response this.WriteResponseWithoutModelAndValidatePayload(nestedItemToWrite: new[] { entryClone() }, expectedPayload: expectedPayload); }
internal static bool TryConvertPrimitiveToString(object value, out string result) { result = null; switch (Microsoft.Data.OData.PlatformHelper.GetTypeCode(value.GetType())) { case TypeCode.Boolean: result = ODataAtomConvert.ToString((bool)value); break; case TypeCode.SByte: result = ((sbyte)value).ToString(); break; case TypeCode.Byte: result = ODataAtomConvert.ToString((byte)value); break; case TypeCode.Int16: result = ((short)value).ToString(); break; case TypeCode.Int32: result = ((int)value).ToString(); break; case TypeCode.Int64: result = ((long)value).ToString(); break; case TypeCode.Single: result = ((float)value).ToString(); break; case TypeCode.Double: result = ((double)value).ToString(); break; case TypeCode.Decimal: result = ODataAtomConvert.ToString((decimal)value); break; case TypeCode.DateTime: result = ((DateTime)value).ToString(); break; case TypeCode.String: result = (string)value; break; default: { byte[] bytes = value as byte[]; if (bytes != null) { result = bytes.ToString(); } else if (value is DateTimeOffset) { result = ODataAtomConvert.ToString((DateTimeOffset)value); } else if (value is Guid) { result = ((Guid)value).ToString(); } else if (value is TimeSpan) { result = ((TimeSpan)value).ToString(); } else { return(false); } break; } } return(true); }