File: Utils\MockHttpMessageHandler.cs
Web Access
Project: src\tests\Aspire.Cli.Tests\Aspire.Cli.Tests.csproj (Aspire.Cli.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
namespace Aspire.Cli.Tests.Utils;
 
/// <summary>
/// Mock HTTP message handler for testing HTTP client interactions.
/// Supports returning fixed responses, dynamic responses via factory, throwing exceptions, and request validation.
/// </summary>
internal sealed class MockHttpMessageHandler : HttpMessageHandler
{
    private readonly Func<HttpRequestMessage, HttpResponseMessage>? _responseFactory;
    private readonly HttpResponseMessage? _response;
    private readonly Exception? _exception;
    private readonly Action<HttpRequestMessage>? _requestValidator;
 
    /// <summary>
    /// Gets a value indicating whether the request validator was invoked.
    /// </summary>
    public bool RequestValidated { get; private set; }
 
    /// <summary>
    /// Creates a handler that returns the specified response.
    /// </summary>
    /// <param name="response">The HTTP response to return.</param>
    /// <param name="requestValidator">Optional action to validate the request.</param>
    public MockHttpMessageHandler(HttpResponseMessage response, Action<HttpRequestMessage>? requestValidator = null)
    {
        _response = response;
        _requestValidator = requestValidator;
    }
 
    /// <summary>
    /// Creates a handler that generates responses dynamically using the provided factory.
    /// </summary>
    /// <param name="responseFactory">A function that creates responses based on the request.</param>
    public MockHttpMessageHandler(Func<HttpRequestMessage, HttpResponseMessage> responseFactory)
    {
        _responseFactory = responseFactory;
    }
 
    /// <summary>
    /// Creates a handler that throws the specified exception.
    /// </summary>
    /// <param name="exception">The exception to throw.</param>
    public MockHttpMessageHandler(Exception exception)
    {
        _exception = exception;
    }
 
    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        if (_exception is not null)
        {
            throw _exception;
        }
 
        if (_requestValidator is not null)
        {
            _requestValidator(request);
            RequestValidated = true;
        }
 
        if (_responseFactory is not null)
        {
            return Task.FromResult(_responseFactory(request));
        }
 
        return Task.FromResult(_response!);
    }
}