Skip to content

Commit

Permalink
feat: Add new SessionFake with samples
Browse files Browse the repository at this point in the history
  • Loading branch information
tiagodaraujo committed Jan 24, 2024
1 parent 523b9bc commit c517b94
Show file tree
Hide file tree
Showing 3 changed files with 195 additions and 104 deletions.
216 changes: 112 additions & 104 deletions src/HttpContextMoq/Extensions/ContextExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,143 +8,151 @@
using Microsoft.Extensions.Primitives;
using Moq;

namespace HttpContextMoq.Extensions
namespace HttpContextMoq.Extensions;

public static class ContextExtensions
{
public static class ContextExtensions
public static HttpContextMock SetupUrl(this HttpContextMock httpContextMock, string url)
{
public static HttpContextMock SetupUrl(this HttpContextMock httpContextMock, string url)
var uri = new Uri(url);

httpContextMock.RequestMock.Mock.Setup(x => x.Protocol).Returns("HTTP/1.1");
httpContextMock.RequestMock.Mock.Setup(x => x.IsHttps).Returns(uri.Scheme == "https");
httpContextMock.RequestMock.Mock.Setup(x => x.Scheme).Returns(uri.Scheme);
if ((uri.Scheme == "https" && uri.Port != 443) || (uri.Scheme == "http" && uri.Port != 80))
{
var uri = new Uri(url);

httpContextMock.RequestMock.Mock.Setup(x => x.Protocol).Returns("HTTP/1.1");
httpContextMock.RequestMock.Mock.Setup(x => x.IsHttps).Returns(uri.Scheme == "https");
httpContextMock.RequestMock.Mock.Setup(x => x.Scheme).Returns(uri.Scheme);
if ((uri.Scheme == "https" && uri.Port != 443) || (uri.Scheme == "http" && uri.Port != 80))
{
httpContextMock.RequestMock.Mock.Setup(x => x.Host).Returns(new HostString(uri.Host, uri.Port));
}
else
{
httpContextMock.RequestMock.Mock.Setup(x => x.Host).Returns(new HostString(uri.Host));
}

httpContextMock.RequestMock.Mock.Setup(x => x.PathBase).Returns(string.Empty);
httpContextMock.RequestMock.Mock.Setup(x => x.Path).Returns(uri.AbsolutePath);

var queryString = QueryString.FromUriComponent(uri);
httpContextMock.RequestMock.Mock.Setup(x => x.QueryString).Returns(queryString);

var queryDictionary = QueryHelpers.ParseQuery(queryString.ToString());
httpContextMock.RequestMock.Query = new QueryCollectionFake(queryDictionary);

var requestFeature = new Mock<IHttpRequestFeature>();
requestFeature.Setup(x => x.RawTarget).Returns(uri.PathAndQuery);
httpContextMock.FeaturesMock.Mock.Setup(x => x.Get<IHttpRequestFeature>()).Returns(requestFeature.Object);

return httpContextMock;
httpContextMock.RequestMock.Mock.Setup(x => x.Host).Returns(new HostString(uri.Host, uri.Port));
}

public static HttpContextMock SetupRequestMethod(this HttpContextMock httpContextMock, string method)
else
{
httpContextMock.RequestMock.Mock.Setup(x => x.Method).Returns(method);

return httpContextMock;
httpContextMock.RequestMock.Mock.Setup(x => x.Host).Returns(new HostString(uri.Host));
}

public static HttpContextMock SetupRequestBody(this HttpContextMock httpContextMock, Stream stream)
{
httpContextMock.RequestMock.Mock.Setup(x => x.Body).Returns(stream);
httpContextMock.RequestMock.Mock.Setup(x => x.PathBase).Returns(string.Empty);
httpContextMock.RequestMock.Mock.Setup(x => x.Path).Returns(uri.AbsolutePath);

return httpContextMock;
}
var queryString = QueryString.FromUriComponent(uri);
httpContextMock.RequestMock.Mock.Setup(x => x.QueryString).Returns(queryString);

public static HttpContextMock SetupRequestContentType(this HttpContextMock httpContextMock, string contentType)
{
httpContextMock.RequestMock.Mock.Setup(x => x.ContentType).Returns(contentType);
var queryDictionary = QueryHelpers.ParseQuery(queryString.ToString());
httpContextMock.RequestMock.Query = new QueryCollectionFake(queryDictionary);

return httpContextMock;
}
var requestFeature = new Mock<IHttpRequestFeature>();
requestFeature.Setup(x => x.RawTarget).Returns(uri.PathAndQuery);
httpContextMock.FeaturesMock.Mock.Setup(x => x.Get<IHttpRequestFeature>()).Returns(requestFeature.Object);

public static HttpContextMock SetupRequestContentLength(this HttpContextMock httpContextMock, long? contentLength)
{
httpContextMock.RequestMock.Mock.Setup(x => x.ContentLength).Returns(contentLength);
return httpContextMock;
}

return httpContextMock;
}
public static HttpContextMock SetupRequestMethod(this HttpContextMock httpContextMock, string method)
{
httpContextMock.RequestMock.Mock.Setup(x => x.Method).Returns(method);

public static HttpContextMock SetupRequestHeaders(this HttpContextMock httpContextMock, IDictionary<string, StringValues> headers)
{
httpContextMock.RequestMock.SetHeaders(new HeaderDictionaryFake(headers));
return httpContextMock;
}

return httpContextMock;
}
public static HttpContextMock SetupRequestBody(this HttpContextMock httpContextMock, Stream stream)
{
httpContextMock.RequestMock.Mock.Setup(x => x.Body).Returns(stream);

public static HttpContextMock SetupRequestCookies(this HttpContextMock httpContextMock, IDictionary<string, string> cookies)
{
httpContextMock.RequestMock.Cookies = new RequestCookieCollectionFake(cookies);
return httpContextMock;
}

return httpContextMock;
}
public static HttpContextMock SetupRequestContentType(this HttpContextMock httpContextMock, string contentType)
{
httpContextMock.RequestMock.Mock.Setup(x => x.ContentType).Returns(contentType);

return httpContextMock;
}

public static HttpContextMock SetupResponseStatusCode(this HttpContextMock httpContextMock, HttpStatusCode statusCode) => SetupResponseStatusCode(httpContextMock, (int) statusCode);
public static HttpContextMock SetupRequestContentLength(this HttpContextMock httpContextMock, long? contentLength)
{
httpContextMock.RequestMock.Mock.Setup(x => x.ContentLength).Returns(contentLength);

public static HttpContextMock SetupResponseStatusCode(this HttpContextMock httpContextMock, int statusCode)
{
httpContextMock.ResponseMock.Mock.Setup(x => x.StatusCode).Returns(statusCode);
return httpContextMock;
}

return httpContextMock;
}
public static HttpContextMock SetupRequestHeaders(this HttpContextMock httpContextMock, IDictionary<string, StringValues> headers)
{
httpContextMock.RequestMock.SetHeaders(new HeaderDictionaryFake(headers));

public static HttpContextMock SetupResponseBody(this HttpContextMock httpContextMock, Stream stream)
{
httpContextMock.ResponseMock.Mock.Setup(x => x.Body).Returns(stream);
return httpContextMock;
}

return httpContextMock;
}
public static HttpContextMock SetupRequestCookies(this HttpContextMock httpContextMock, IDictionary<string, string> cookies)
{
httpContextMock.RequestMock.Cookies = new RequestCookieCollectionFake(cookies);

public static HttpContextMock SetupResponseContentType(this HttpContextMock httpContextMock, string contentType)
{
httpContextMock.ResponseMock.Mock.Setup(x => x.ContentType).Returns(contentType);
return httpContextMock;
}

return httpContextMock;
}

public static HttpContextMock SetupResponseHeaders(this HttpContextMock httpContextMock, IDictionary<string, StringValues> headers)
{
httpContextMock.ResponseMock.SetHeaders(new HeaderDictionaryFake(headers));
public static HttpContextMock SetupResponseStatusCode(this HttpContextMock httpContextMock, HttpStatusCode statusCode) => SetupResponseStatusCode(httpContextMock, (int)statusCode);

return httpContextMock;
}
public static HttpContextMock SetupResponseStatusCode(this HttpContextMock httpContextMock, int statusCode)
{
httpContextMock.ResponseMock.Mock.Setup(x => x.StatusCode).Returns(statusCode);

public static HttpContextMock SetupResponseContentLength(this HttpContextMock httpContextMock, long? contentLength)
{
httpContextMock.ResponseMock.Mock.Setup(x => x.ContentLength).Returns(contentLength);
return httpContextMock;
}

return httpContextMock;
}
public static HttpContextMock SetupResponseBody(this HttpContextMock httpContextMock, Stream stream)
{
httpContextMock.ResponseMock.Mock.Setup(x => x.Body).Returns(stream);

public static HttpContextMock SetupSession(this HttpContextMock httpContextMock)
{
var session = new SessionMock();
httpContextMock.SessionMock = session;
httpContextMock.FeaturesMock.Mock.Setup(x => x.Get<ISessionFeature>()).Returns(new SessionFeatureFake() { Session = session });
return httpContextMock;
}

return httpContextMock;
}
public static HttpContextMock SetupResponseContentType(this HttpContextMock httpContextMock, string contentType)
{
httpContextMock.ResponseMock.Mock.Setup(x => x.ContentType).Returns(contentType);

public static HttpContextMock SetupRequestService<TService>(this HttpContextMock httpContextMock, TService instance)
{
httpContextMock.RequestServicesMock.Mock.Setup(x => x.GetService(typeof(TService))).Returns(instance);
return httpContextMock;
}

return httpContextMock;
}
public static HttpContextMock SetupResponseHeaders(this HttpContextMock httpContextMock, IDictionary<string, StringValues> headers)
{
httpContextMock.ResponseMock.SetHeaders(new HeaderDictionaryFake(headers));

public static HttpContextMock SetupRequestService<TService>(this HttpContextMock httpContextMock, Func<TService> factory)
{
httpContextMock.RequestServicesMock.Mock.Setup(x => x.GetService(typeof(TService))).Returns(() => (object)factory());
return httpContextMock;
}

return httpContextMock;
}
public static HttpContextMock SetupResponseContentLength(this HttpContextMock httpContextMock, long? contentLength)
{
httpContextMock.ResponseMock.Mock.Setup(x => x.ContentLength).Returns(contentLength);

return httpContextMock;
}

public static HttpContextMock SetupSession(this HttpContextMock httpContextMock)
{
var session = new SessionMock();
httpContextMock.SessionMock = session;
httpContextMock.FeaturesMock.Mock.Setup(x => x.Get<ISessionFeature>()).Returns(new SessionFeatureFake() { Session = session });

return httpContextMock;
}

public static HttpContextMock SetupSession<T>(this HttpContextMock httpContextMock) where T : ISession, new()
{
var session = new T();
httpContextMock.Session = session;
httpContextMock.FeaturesMock.Mock.Setup(x => x.Get<ISessionFeature>()).Returns(new SessionFeatureFake() { Session = session });

return httpContextMock;
}

public static HttpContextMock SetupRequestService<TService>(this HttpContextMock httpContextMock, TService instance)
{
httpContextMock.RequestServicesMock.Mock.Setup(x => x.GetService(typeof(TService))).Returns(instance);

return httpContextMock;
}

public static HttpContextMock SetupRequestService<TService>(this HttpContextMock httpContextMock, Func<TService> factory)
{
httpContextMock.RequestServicesMock.Mock.Setup(x => x.GetService(typeof(TService))).Returns(() => (object)factory());

return httpContextMock;
}
}
30 changes: 30 additions & 0 deletions src/HttpContextMoq/SessionFake.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
namespace HttpContextMoq;

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;

public class SessionFake : ISession
{
private readonly Dictionary<string, byte[]> data = new(StringComparer.OrdinalIgnoreCase);

public bool IsAvailable => true;

public string Id { get; } = Guid.NewGuid().ToString();

public IEnumerable<string> Keys => this.data.Keys;

public void Clear() => this.data.Clear();

public Task CommitAsync(CancellationToken cancellationToken = default) => Task.CompletedTask;

public Task LoadAsync(CancellationToken cancellationToken = default) => Task.CompletedTask;

public void Remove(string key) => this.data.Remove(key);

public void Set(string key, byte[] value) => this.data.Add(key, value);

public bool TryGetValue(string key, out byte[] value) => this.data.TryGetValue(key, out value);
}
53 changes: 53 additions & 0 deletions tests/HttpContextMoq.Samples/SessionSamples.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using System.Text;
using FluentAssertions;
using HttpContextMoq.Extensions;
using Microsoft.AspNetCore.Http;
using Xunit;

namespace HttpContextMoq.Samples;

public class SessionSamples
{
[Fact]
public void SetupSession_WhenIfCalledWithMock_ShouldReturnValue()
{
///
/// Default setup using the SessionMock. You can mock any Method or Property from the ISession interface.
/// In this sample, TryGetValue is mocked to return a byte[].
///

// Arrange
var context = new HttpContextMock();
context.SetupSession();

var value = Encoding.UTF8.GetBytes("Mike");
context.SessionMock.Mock.Setup(x => x.TryGetValue("Name", out value)).Returns(true);

// Act
var result = context.Session.GetString("Name");

// Assert
result.Should().Be("Mike");
}

[Fact]
public void SetupSession_IfCalledWithFake_ShouldReturnValue()
{
///
/// Use the SessionFake to mock your session with a Fake implementation. Every method or extension for ISession works.
/// You can also create your own ISession implementaion and use it in the SetupSession<T>(). e.g. context.SetupSession<MyOwnSessionFake>().
///

// Arrange
var context = new HttpContextMock();
context.SetupSession<SessionFake>();

context.Session.SetString("Name", "Mike");

// Act
var result = context.Session.GetString("Name");

// Assert
result.Should().Be("Mike");
}
}

0 comments on commit c517b94

Please sign in to comment.