1
0
Files
common/AMWD.Common.Moq/HttpMessageHandlerMoq.cs

131 lines
3.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading;
using System.Threading.Tasks;
using Moq;
using Moq.Protected;
namespace AMWD.Common.Moq
{
/// <summary>
/// Wrapps the <see cref="Mock{HttpMessageHandler}"/> including the setup.
/// </summary>
public class HttpMessageHandlerMoq
{
/// <summary>
/// Initializes a new instance of the <see cref="HttpMessageHandlerMoq"/> class.
/// </summary>
public HttpMessageHandlerMoq()
{
Response = new() { StatusCode = HttpStatusCode.OK };
Callbacks = new();
Mock = new();
Mock.Protected()
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
.Callback<HttpRequestMessage, CancellationToken>(async (req, _) =>
{
var callback = new HttpMessageRequestCallback
{
Headers = req.Headers,
Method = req.Method,
Properties = req.Properties,
RequestUri = req.RequestUri,
Version = req.Version
};
if (req.Content != null)
{
callback.ContentBytes = await req.Content.ReadAsByteArrayAsync();
callback.ContentString = await req.Content.ReadAsStringAsync();
}
Callbacks.Add(callback);
})
.ReturnsAsync(Response);
}
/// <summary>
/// Gets the mocked <see cref="HttpMessageHandler"/>.
/// </summary>
public Mock<HttpMessageHandler> Mock { get; }
/// <summary>
/// Gets the placed request.
/// </summary>
public List<HttpMessageRequestCallback> Callbacks { get; private set; }
/// <summary>
/// Gets the HTTP response, that should be "sent".
/// </summary>
public HttpResponseMessage Response { get; private set; }
/// <summary>
/// Disposes and resets the <see cref="Response"/> and <see cref="Callbacks"/>.
/// </summary>
public void Reset()
{
Response.Dispose();
Response = new() { StatusCode = HttpStatusCode.OK };
Callbacks.Clear();
}
/// <summary>
/// Verifies the number of calls to the HTTP request.
/// </summary>
/// <param name="times"></param>
public void Verify(Times times)
=> Mock.Protected().Verify("SendAsync", times, ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>());
/// <summary>
/// Represents the placed HTTP request.
/// </summary>
public class HttpMessageRequestCallback
{
/// <summary>
/// Gets the contents of the HTTP message.
/// </summary>
public byte[] ContentBytes { get; internal set; }
/// <summary>
/// Gets the contents of the HTTP message.
/// </summary>
public string ContentString { get; internal set; }
/// <summary>
/// Gets the collection of HTTP request headers.
/// </summary>
public HttpRequestHeaders Headers { get; internal set; }
/// <summary>
/// Gets the HTTP method used by the HTTP request message.
/// </summary>
public HttpMethod Method { get; internal set; }
/// <summary>
/// Gets of properties for the HTTP request.
/// </summary>
public IDictionary<string, object> Properties { get; internal set; }
/// <summary>
/// Gets the <see cref="Uri"/> used for the HTTP request.
/// </summary>
public Uri RequestUri { get; internal set; }
/// <summary>
/// Gets the <see cref="RequestUri"/> string representation.
/// </summary>
public string RequestUrl => RequestUri?.ToString();
/// <summary>
/// Gets the HTTP message version.
/// </summary>
public Version Version { get; internal set; }
}
}
}