From c517b94d9136884e03aa08d4a6c2bcd3646db045 Mon Sep 17 00:00:00 2001 From: Tiago Araujo Date: Wed, 24 Jan 2024 21:45:18 +0000 Subject: [PATCH] feat: Add new SessionFake with samples --- .../Extensions/ContextExtensions.cs | 216 +++++++++--------- src/HttpContextMoq/SessionFake.cs | 30 +++ .../HttpContextMoq.Samples/SessionSamples.cs | 53 +++++ 3 files changed, 195 insertions(+), 104 deletions(-) create mode 100644 src/HttpContextMoq/SessionFake.cs create mode 100644 tests/HttpContextMoq.Samples/SessionSamples.cs diff --git a/src/HttpContextMoq/Extensions/ContextExtensions.cs b/src/HttpContextMoq/Extensions/ContextExtensions.cs index 4387722..3600ac5 100644 --- a/src/HttpContextMoq/Extensions/ContextExtensions.cs +++ b/src/HttpContextMoq/Extensions/ContextExtensions.cs @@ -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(); - requestFeature.Setup(x => x.RawTarget).Returns(uri.PathAndQuery); - httpContextMock.FeaturesMock.Mock.Setup(x => x.Get()).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(); + requestFeature.Setup(x => x.RawTarget).Returns(uri.PathAndQuery); + httpContextMock.FeaturesMock.Mock.Setup(x => x.Get()).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 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 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 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 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 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()).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(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 headers) + { + httpContextMock.ResponseMock.SetHeaders(new HeaderDictionaryFake(headers)); - public static HttpContextMock SetupRequestService(this HttpContextMock httpContextMock, Func 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()).Returns(new SessionFeatureFake() { Session = session }); + + return httpContextMock; + } + + public static HttpContextMock SetupSession(this HttpContextMock httpContextMock) where T : ISession, new() + { + var session = new T(); + httpContextMock.Session = session; + httpContextMock.FeaturesMock.Mock.Setup(x => x.Get()).Returns(new SessionFeatureFake() { Session = session }); + + return httpContextMock; + } + + public static HttpContextMock SetupRequestService(this HttpContextMock httpContextMock, TService instance) + { + httpContextMock.RequestServicesMock.Mock.Setup(x => x.GetService(typeof(TService))).Returns(instance); + + return httpContextMock; + } + + public static HttpContextMock SetupRequestService(this HttpContextMock httpContextMock, Func factory) + { + httpContextMock.RequestServicesMock.Mock.Setup(x => x.GetService(typeof(TService))).Returns(() => (object)factory()); + + return httpContextMock; } } diff --git a/src/HttpContextMoq/SessionFake.cs b/src/HttpContextMoq/SessionFake.cs new file mode 100644 index 0000000..acff264 --- /dev/null +++ b/src/HttpContextMoq/SessionFake.cs @@ -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 data = new(StringComparer.OrdinalIgnoreCase); + + public bool IsAvailable => true; + + public string Id { get; } = Guid.NewGuid().ToString(); + + public IEnumerable 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); +} diff --git a/tests/HttpContextMoq.Samples/SessionSamples.cs b/tests/HttpContextMoq.Samples/SessionSamples.cs new file mode 100644 index 0000000..ea76d31 --- /dev/null +++ b/tests/HttpContextMoq.Samples/SessionSamples.cs @@ -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(). e.g. context.SetupSession(). + /// + + // Arrange + var context = new HttpContextMock(); + context.SetupSession(); + + context.Session.SetString("Name", "Mike"); + + // Act + var result = context.Session.GetString("Name"); + + // Assert + result.Should().Be("Mike"); + } +}