Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions src/abstractions/RequestInformation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -513,5 +513,37 @@ public void SetContentFromEnum<T>(IRequestAdapter requestAdapter, string content
Headers.TryAdd(ContentTypeHeader, contentType);
Content = writer.GetSerializedContent();
}

/// <summary>
/// Sets the request body from a collection of enum values with the specified content type.
/// </summary>
/// <param name="requestAdapter">The core service to get the serialization writer from.</param>
/// <param name="items">The enum values to serialize.</param>
/// <param name="contentType">The content type to set.</param>
/// <typeparam name="T">The enum type to serialize.</typeparam>
#if NET5_0_OR_GREATER
public void SetContentFromEnumCollection<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] T>(IRequestAdapter requestAdapter, string contentType, IEnumerable<T?> items) where T : struct, Enum
#else
public void SetContentFromEnumCollection<T>(IRequestAdapter requestAdapter, string contentType, IEnumerable<T?> items) where T : struct, Enum
#endif
{
using var activity = _activitySource?.StartActivity(nameof(SetContentFromEnumCollection));
using var writer = GetSerializationWriter(requestAdapter, contentType, items);

T? firstNonNullItem = null;
foreach(var item in items)
{
if(item != null)
{
firstNonNullItem = item;
break;
}
}
Comment thread
baywet marked this conversation as resolved.
Outdated

SetRequestType(firstNonNullItem, activity);
writer.WriteCollectionOfEnumValues(null, items);
Headers.TryAdd(ContentTypeHeader, contentType);
Content = writer.GetSerializedContent();
}
}
}
20 changes: 20 additions & 0 deletions tests/abstractions/RequestInformationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,26 @@ public void SetsEnumContent()
serializationWriterMock.Verify(x => x.WriteCollectionOfEnumValues(It.IsAny<string>(), It.IsAny<IEnumerable<TestEnum?>>()), Times.Never);
}
[Fact]
public void SetsEnumCollectionContent()
{
var requestAdapterMock = new Mock<IRequestAdapter>();
var serializationWriterMock = new Mock<ISerializationWriter>();
var serializationWriterFactoryMock = new Mock<ISerializationWriterFactory>();
serializationWriterFactoryMock.Setup(x => x.GetSerializationWriter(It.IsAny<string>())).Returns(serializationWriterMock.Object);
requestAdapterMock.SetupGet(x => x.SerializationWriterFactory).Returns(serializationWriterFactoryMock.Object);
var requestInfo = new RequestInformation
{
HttpMethod = Method.POST,
UrlTemplate = "{+baseurl}/users{?%24count}"
};

requestInfo.SetContentFromEnumCollection<TestEnum>(requestAdapterMock.Object, "application/json", new TestEnum?[] { TestEnum.First, TestEnum.Second });

// Assert we now have an option
serializationWriterMock.Verify(x => x.WriteEnumValue<TestEnum>(It.IsAny<string>(), It.IsAny<TestEnum>()), Times.Never);
serializationWriterMock.Verify(x => x.WriteCollectionOfEnumValues(It.IsAny<string>(), It.IsAny<IEnumerable<TestEnum?>>()), Times.Once);
}
[Fact]
public void SetsScalarCollectionContent()
{
var requestAdapterMock = new Mock<IRequestAdapter>();
Expand Down