Files
mic-check/tests/client/MicCheck.Client.Tests.Unit/FeatureClientTests.cs
T
James Wampler 3eebef56a0 Add MicCheck.Client library with FeatureClient.IsEnabledAsync
Client-side SDK for checking feature flag state against the flags API,
with unit tests mocking HttpMessageHandler.
2026-07-09 12:48:21 -07:00

80 lines
2.6 KiB
C#

using System.Net;
using System.Text;
using Moq;
using Moq.Protected;
using NUnit.Framework;
namespace MicCheck.Client.Tests.Unit;
[TestFixture]
public class FeatureClientTests
{
[Test]
public async Task WhenFeatureIsEnabled_ThenIsEnabledAsyncReturnsTrue()
{
var client = CreateClient(HttpStatusCode.OK, """
[{"id":1,"feature":{"id":1,"name":"my-feature","type":"STANDARD"},"enabled":true,"featureStateValue":null}]
""");
var result = await client.IsEnabledAsync("my-feature");
Assert.That(result, Is.True);
}
[Test]
public async Task WhenFeatureIsDisabled_ThenIsEnabledAsyncReturnsFalse()
{
var client = CreateClient(HttpStatusCode.OK, """
[{"id":1,"feature":{"id":1,"name":"my-feature","type":"STANDARD"},"enabled":false,"featureStateValue":null}]
""");
var result = await client.IsEnabledAsync("my-feature");
Assert.That(result, Is.False);
}
[Test]
public async Task WhenFeatureNameDiffersOnlyByCase_ThenIsEnabledAsyncStillMatches()
{
var client = CreateClient(HttpStatusCode.OK, """
[{"id":1,"feature":{"id":1,"name":"My-Feature","type":"STANDARD"},"enabled":true,"featureStateValue":null}]
""");
var result = await client.IsEnabledAsync("my-feature");
Assert.That(result, Is.True);
}
[Test]
public async Task WhenFeatureIsNotFound_ThenIsEnabledAsyncReturnsProvidedDefaultValue()
{
var client = CreateClient(HttpStatusCode.OK, "[]");
var result = await client.IsEnabledAsync("missing-feature", defaultValue: true);
Assert.That(result, Is.True);
}
[Test]
public void WhenFeatureNameIsEmpty_ThenIsEnabledAsyncThrowsArgumentException()
{
var client = CreateClient(HttpStatusCode.OK, "[]");
Assert.That(async () => await client.IsEnabledAsync(" "), Throws.ArgumentException);
}
private static FeatureClient CreateClient(HttpStatusCode responseStatus, string responseBody)
{
var handler = new Mock<HttpMessageHandler>();
handler.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage(responseStatus)
{
Content = new StringContent(responseBody, Encoding.UTF8, "application/json")
});
var httpClient = new HttpClient(handler.Object) { BaseAddress = new Uri("https://example.com") };
return new FeatureClient(httpClient);
}
}