Skip to content

Commit d970e8e

Browse files
authored
Merge pull request #579 from microsoft/copilot/fix-enum-array-compile-error
feat: Add SetContentFromEnumCollection method to RequestInformation class
1 parent c10b583 commit d970e8e

2 files changed

Lines changed: 45 additions & 0 deletions

File tree

src/abstractions/RequestInformation.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.ComponentModel;
99
using System.Diagnostics;
1010
using System.IO;
11+
using System.Linq;
1112
using System.Reflection;
1213
using System.Runtime.Serialization;
1314
using Microsoft.Kiota.Abstractions.Extensions;
@@ -513,5 +514,29 @@ public void SetContentFromEnum<T>(IRequestAdapter requestAdapter, string content
513514
Headers.TryAdd(ContentTypeHeader, contentType);
514515
Content = writer.GetSerializedContent();
515516
}
517+
518+
/// <summary>
519+
/// Sets the request body from a collection of enum values with the specified content type.
520+
/// </summary>
521+
/// <param name="requestAdapter">The core service to get the serialization writer from.</param>
522+
/// <param name="items">The enum values to serialize.</param>
523+
/// <param name="contentType">The content type to set.</param>
524+
/// <typeparam name="T">The enum type to serialize.</typeparam>
525+
#if NET5_0_OR_GREATER
526+
public void SetContentFromEnumCollection<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] T>(IRequestAdapter requestAdapter, string contentType, IEnumerable<T?> items) where T : struct, Enum
527+
#else
528+
public void SetContentFromEnumCollection<T>(IRequestAdapter requestAdapter, string contentType, IEnumerable<T?> items) where T : struct, Enum
529+
#endif
530+
{
531+
using var activity = _activitySource?.StartActivity(nameof(SetContentFromEnumCollection));
532+
using var writer = GetSerializationWriter(requestAdapter, contentType, items);
533+
534+
var firstNonNullItem = items.FirstOrDefault(static x => x is not null);
535+
536+
SetRequestType(firstNonNullItem, activity);
537+
writer.WriteCollectionOfEnumValues(null, items);
538+
Headers.TryAdd(ContentTypeHeader, contentType);
539+
Content = writer.GetSerializedContent();
540+
}
516541
}
517542
}

tests/abstractions/RequestInformationTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,26 @@ public void SetsEnumContent()
497497
serializationWriterMock.Verify(x => x.WriteCollectionOfEnumValues(It.IsAny<string>(), It.IsAny<IEnumerable<TestEnum?>>()), Times.Never);
498498
}
499499
[Fact]
500+
public void SetsEnumCollectionContent()
501+
{
502+
var requestAdapterMock = new Mock<IRequestAdapter>();
503+
var serializationWriterMock = new Mock<ISerializationWriter>();
504+
var serializationWriterFactoryMock = new Mock<ISerializationWriterFactory>();
505+
serializationWriterFactoryMock.Setup(x => x.GetSerializationWriter(It.IsAny<string>())).Returns(serializationWriterMock.Object);
506+
requestAdapterMock.SetupGet(x => x.SerializationWriterFactory).Returns(serializationWriterFactoryMock.Object);
507+
var requestInfo = new RequestInformation
508+
{
509+
HttpMethod = Method.POST,
510+
UrlTemplate = "{+baseurl}/users{?%24count}"
511+
};
512+
513+
requestInfo.SetContentFromEnumCollection<TestEnum>(requestAdapterMock.Object, "application/json", new TestEnum?[] { TestEnum.First, TestEnum.Second });
514+
515+
// Assert we now have an option
516+
serializationWriterMock.Verify(x => x.WriteEnumValue<TestEnum>(It.IsAny<string>(), It.IsAny<TestEnum>()), Times.Never);
517+
serializationWriterMock.Verify(x => x.WriteCollectionOfEnumValues(It.IsAny<string>(), It.IsAny<IEnumerable<TestEnum?>>()), Times.Once);
518+
}
519+
[Fact]
500520
public void SetsScalarCollectionContent()
501521
{
502522
var requestAdapterMock = new Mock<IRequestAdapter>();

0 commit comments

Comments
 (0)