Skip to content

Commit

Permalink
[AppConfiguration] Implemented SettingFieldsExtensions
Browse files Browse the repository at this point in the history
  • Loading branch information
kinelski committed Sep 25, 2023
1 parent f845b51 commit 2e581a4
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,7 @@ public virtual AsyncPageable<ConfigurationSetting> GetConfigurationSettingsAsync
var label = selector.LabelFilter;

RequestContext context = CreateRequestContext(ErrorOptions.Default, cancellationToken);
IEnumerable<string> fieldsString = selector.Fields == SettingFields.All ? null : selector.Fields.ToString().ToLowerInvariant().Replace("isreadonly", "locked").Split(',');
IEnumerable<string> fieldsString = selector.Fields.Split();

HttpMessage FirstPageRequest(int? pageSizeHint) => CreateGetConfigurationSettingsRequest(key, label, null, dateTime, fieldsString, null, null, context);
HttpMessage NextPageRequest(int? pageSizeHint, string nextLink) => CreateGetConfigurationSettingsNextPageRequest(nextLink, key, label, null, dateTime, fieldsString, null, null, context);
Expand All @@ -672,7 +672,7 @@ public virtual Pageable<ConfigurationSetting> GetConfigurationSettings(SettingSe
var dateTime = selector.AcceptDateTime?.UtcDateTime.ToString(AcceptDateTimeFormat, CultureInfo.InvariantCulture);

RequestContext context = CreateRequestContext(ErrorOptions.Default, cancellationToken);
IEnumerable<string> fieldsString = selector.Fields == SettingFields.All ? null : selector.Fields.ToString().ToLowerInvariant().Replace("isreadonly", "locked").Split(',');
IEnumerable<string> fieldsString = selector.Fields.Split();

HttpMessage FirstPageRequest(int? pageSizeHint) => CreateGetConfigurationSettingsRequest(key, label, null, dateTime, fieldsString, null, null, context);
HttpMessage NextPageRequest(int? pageSizeHint, string nextLink) => CreateGetConfigurationSettingsNextPageRequest(nextLink, key, label, null, dateTime, fieldsString, null, null, context);
Expand Down Expand Up @@ -724,7 +724,7 @@ public virtual AsyncPageable<ConfigurationSetting> GetConfigurationSettingsForSn
Argument.AssertNotNullOrEmpty(snapshotName, nameof(snapshotName));

RequestContext context = CreateRequestContext(ErrorOptions.Default, cancellationToken);
IEnumerable<string> fieldsString = fields == SettingFields.All ? null : fields.ToString().ToLowerInvariant().Replace("isreadonly", "locked").Split(',');
IEnumerable<string> fieldsString = fields.Split();

HttpMessage FirstPageRequest(int? pageSizeHint) => CreateGetConfigurationSettingsRequest(null, null, null, null, fieldsString, snapshotName, null, context);
HttpMessage NextPageRequest(int? pageSizeHint, string nextLink) => CreateGetConfigurationSettingsNextPageRequest(nextLink, null, null, null, null, fieldsString, snapshotName, null, context);
Expand All @@ -742,7 +742,7 @@ public virtual Pageable<ConfigurationSetting> GetConfigurationSettingsForSnapsho
Argument.AssertNotNullOrEmpty(snapshotName, nameof(snapshotName));

RequestContext context = CreateRequestContext(ErrorOptions.Default, cancellationToken);
IEnumerable<string> fieldsString = fields == SettingFields.All ? null : fields.ToString().ToLowerInvariant().Replace("isreadonly", "locked").Split(',');
IEnumerable<string> fieldsString = fields.Split();

HttpMessage FirstPageRequest(int? pageSizeHint) => CreateGetConfigurationSettingsRequest(null, null, null, null, fieldsString, snapshotName, null, context);
HttpMessage NextPageRequest(int? pageSizeHint, string nextLink) => CreateGetConfigurationSettingsNextPageRequest(nextLink, null, null, null, null, fieldsString, snapshotName, null, context);
Expand Down Expand Up @@ -1243,7 +1243,7 @@ public virtual AsyncPageable<ConfigurationSetting> GetRevisionsAsync(SettingSele
var label = selector.LabelFilter;
var dateTime = selector.AcceptDateTime?.UtcDateTime.ToString(AcceptDateTimeFormat, CultureInfo.InvariantCulture);
RequestContext context = CreateRequestContext(ErrorOptions.Default, cancellationToken);
IEnumerable<string> fieldsString = selector.Fields == SettingFields.All ? null : selector.Fields.ToString().ToLowerInvariant().Replace("isreadonly", "locked").Split(',');
IEnumerable<string> fieldsString = selector.Fields.Split();

HttpMessage FirstPageRequest(int? pageSizeHint) => CreateGetRevisionsRequest(key, label, null, dateTime, fieldsString, context);
HttpMessage NextPageRequest(int? pageSizeHint, string nextLink) => CreateGetRevisionsNextPageRequest(nextLink, key, label, null, dateTime, fieldsString, context);
Expand All @@ -1262,7 +1262,7 @@ public virtual Pageable<ConfigurationSetting> GetRevisions(SettingSelector selec
var label = selector.LabelFilter;
var dateTime = selector.AcceptDateTime?.UtcDateTime.ToString(AcceptDateTimeFormat, CultureInfo.InvariantCulture);
RequestContext context = CreateRequestContext(ErrorOptions.Default, cancellationToken);
IEnumerable<string> fieldsString = selector.Fields == SettingFields.All ? null : selector.Fields.ToString().ToLowerInvariant().Replace("isreadonly", "locked").Split(',');
IEnumerable<string> fieldsString = selector.Fields.Split();

HttpMessage FirstPageRequest(int? pageSizeHint) => CreateGetRevisionsRequest(key, label, null, dateTime, fieldsString, context);
HttpMessage NextPageRequest(int? pageSizeHint, string nextLink) => CreateGetRevisionsNextPageRequest(nextLink, key, label, null, dateTime, fieldsString, context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the MIT License.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
Expand Down Expand Up @@ -63,9 +64,11 @@ internal static void BuildBatchQuery(RequestUriBuilder builder, SettingSelector
builder.AppendQuery(LabelQueryFilter, selector.LabelFilter);
}

if (selector.Fields != SettingFields.All)
IEnumerable<string> splitFields = selector.Fields.Split();

if (splitFields != null)
{
var filter = selector.Fields.ToString().ToLowerInvariant().Replace("isreadonly", "locked");
string filter = string.Join(",", splitFields);
builder.AppendQuery(FieldsQueryFilter, filter);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System.Collections.Generic;

namespace Azure.Data.AppConfiguration
{
internal static class SettingFieldsExtensions
{
/// <summary>
/// Maps a SettingFields member to its corresponding service name in accordance with the REST API specification.
/// </summary>
private static readonly IReadOnlyDictionary<SettingFields, string> s_serviceNameMap = new Dictionary<SettingFields, string>()
{
{ SettingFields.Key , "key" },
{ SettingFields.Label , "label" },
{ SettingFields.Value , "value" },
{ SettingFields.ContentType , "content_type" },
{ SettingFields.ETag , "etag" },
{ SettingFields.LastModified, "last_modified" },
{ SettingFields.IsReadOnly , "locked" },
{ SettingFields.Tags , "tags" }
};

public static IEnumerable<string> Split(this SettingFields fields)
{
if (fields == SettingFields.All)
{
return null;
}

var splitFields = new List<string>();

foreach (SettingFields currentField in s_serviceNameMap.Keys)
{
if ((fields & currentField) == currentField)
{
splitFields.Add(s_serviceNameMap[currentField]);
}
}

return splitFields;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ public void SettingSomeFields()

ConfigurationClient.BuildBatchQuery(builder, selector, null);

Assert.AreEqual($"http://localhost/?key=key&$select=key%2C%20value", builder.ToUri().AbsoluteUri);
Assert.AreEqual($"http://localhost/?key=key&$select=key%2Cvalue", builder.ToUri().AbsoluteUri);
}

[Test]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;

namespace Azure.Data.AppConfiguration.Tests
{
public class SettingFieldsExtensionsTests
{
[Test]
public void SplitReturnsNullForAll()
{
Assert.IsNull(SettingFields.All.Split());
}

[Test]
[TestCase(SettingFields.Key, "key")]
[TestCase(SettingFields.Label, "label")]
[TestCase(SettingFields.Value, "value")]
[TestCase(SettingFields.ContentType, "content_type")]
[TestCase(SettingFields.ETag, "etag")]
[TestCase(SettingFields.LastModified, "last_modified")]
[TestCase(SettingFields.IsReadOnly, "locked")]
[TestCase(SettingFields.Tags, "tags")]
public void SplitWithSingleField(SettingFields fields, string expectedFieldString)
{
IEnumerable<string> splitFields = fields.Split();
string fieldString = splitFields.Single();

Assert.AreEqual(fieldString, expectedFieldString);
}

[Test]
public void SplitWithMultipleFields()
{
SettingFields fields = SettingFields.Key | SettingFields.ContentType | SettingFields.LastModified | SettingFields.IsReadOnly;
IEnumerable<string> splitFields = fields.Split();

Assert.AreEqual(splitFields.Count(), 4);
CollectionAssert.Contains(splitFields, "key");
CollectionAssert.Contains(splitFields, "content_type");
CollectionAssert.Contains(splitFields, "last_modified");
CollectionAssert.Contains(splitFields, "locked");
}

[Test]
public void SplitSupportsAllPossibleSettingFields()
{
foreach (SettingFields fields in Enum.GetValues(typeof(SettingFields)))
{
if (fields == SettingFields.All)
{
continue;
}

IEnumerable<string> splitFields = fields.Split();

// If this assertion fails, it's likely that a new enum value has been added to SettingFields
// but a corresponding entry has not been added to s_serviceNameMap in SettingFieldsExtensions.
Assert.AreEqual(splitFields.Count(), 1, $"{nameof(SettingFields)} enum value {fields} could not be mapped to a string.");
}
}
}
}

0 comments on commit 2e581a4

Please sign in to comment.