public void OnAuthorization_ShouldFail_When_CommandPublisherIsNull()
        {
            // Arrange
            var serviceProviderMock = new Mock <IServiceProvider>(MockBehavior.Strict);

            serviceProviderMock.Setup(x => x.GetService(It.Is <Type>(y => y == typeof(ICommandPublisher)))).Returns(null);
            serviceProviderMock.Setup(x => x.GetService(It.Is <Type>(y => y == typeof(ILoggerFactory)))).Returns(new LoggerFactory());

            var httpContextMock = new Mock <HttpContext>();

            httpContextMock.Setup(x => x.RequestServices).Returns(serviceProviderMock.Object);

            // HttpContext isn't virtual; Can't mock AuthrizationFilterContex...
            var filterContext = new AuthorizationFilterContext(
                new ActionContext(
                    httpContextMock.Object,
                    new Microsoft.AspNetCore.Routing.RouteData(),
                    new ActionDescriptor()
                    ),
                new List <IFilterMetadata>()
                );

            var jwtInRole = new JwtInRole("Gebruikert", "Klantje");

            // Act
            jwtInRole.OnAuthorization(filterContext);

            // Assert
            serviceProviderMock.VerifyAll();
            Assert.IsNotNull(filterContext.Result);
            Assert.IsInstanceOfType(filterContext.Result, typeof(StatusCodeResult));
            Assert.AreEqual((int)HttpStatusCode.Unauthorized, ((StatusCodeResult)filterContext.Result).StatusCode);
        }
        public void OnAuthorization_ShouldSucceed()
        {
            // Arrange
            ValidateCommand resultCommand = null;

            var commandPublisherMock = new Mock <ICommandPublisher>(MockBehavior.Strict);

            commandPublisherMock.Setup(x => x.Publish <bool>(It.IsAny <ValidateCommand>())).Returns(Task.FromResult(true))
            .Callback <ValidateCommand>(cmd =>
            {
                resultCommand = cmd;
            });

            var serviceProviderMock = new Mock <IServiceProvider>(MockBehavior.Strict);

            serviceProviderMock.Setup(x => x.GetService(It.Is <Type>(y => y == typeof(ICommandPublisher)))).Returns(commandPublisherMock.Object);
            serviceProviderMock.Setup(x => x.GetService(It.Is <Type>(y => y == typeof(ILoggerFactory)))).Returns(new LoggerFactory());

            StringValues headerDictionaryResult;
            var          headerDictionaryMock = new Mock <IHeaderDictionary>(MockBehavior.Strict);

            headerDictionaryMock.Setup(x => x.TryGetValue("Authorization", out headerDictionaryResult)).Returns(true)
            .Callback(new TryGetValueCallback((string s, out StringValues sv) => sv = new StringValues("Bearer " + jwtStringWithRolesGebruikertAndKlantje)));

            var httpRequestMock = new Mock <HttpRequest>();

            httpRequestMock.Setup(x => x.Headers).Returns(headerDictionaryMock.Object);

            var httpContextMock = new Mock <HttpContext>();

            httpContextMock.Setup(x => x.RequestServices).Returns(serviceProviderMock.Object);
            httpContextMock.Setup(x => x.Request).Returns(httpRequestMock.Object);

            // HttpContext isn't virtual; Can't mock AuthrizationFilterContex...
            var filterContext = new AuthorizationFilterContext(
                new ActionContext(
                    httpContextMock.Object,
                    new Microsoft.AspNetCore.Routing.RouteData(),
                    new ActionDescriptor()
                    ),
                new List <IFilterMetadata>()
                );

            var jwtInRole = new JwtInRole("Gebruikert", "Klantje");

            // Act
            jwtInRole.OnAuthorization(filterContext);

            // Assert
            commandPublisherMock.VerifyAll();
            serviceProviderMock.VerifyAll();
            headerDictionaryMock.VerifyAll();
            Assert.IsNotNull(resultCommand);
            Assert.AreEqual(jwtStringWithRolesGebruikertAndKlantje, resultCommand.JwtToken);
            Assert.AreEqual(NameConstants.AuthenticationServiceValidateCommand, resultCommand.RoutingKey);
        }
        public void OnAuthorization_ShouldFail_When_MultipleAuthorizationHeaders()
        {
            // Arrange
            var commandPublisherMock = new Mock <ICommandPublisher>(MockBehavior.Strict);
            var serviceProviderMock  = new Mock <IServiceProvider>(MockBehavior.Strict);

            serviceProviderMock.Setup(x => x.GetService(It.Is <Type>(y => y == typeof(ICommandPublisher)))).Returns(commandPublisherMock.Object);
            serviceProviderMock.Setup(x => x.GetService(It.Is <Type>(y => y == typeof(ILoggerFactory)))).Returns(new LoggerFactory());

            var strings = new string[2];

            strings[0] = "Val1";
            strings[1] = "Val1";

            StringValues headerDictionaryResult;
            var          headerDictionaryMock = new Mock <IHeaderDictionary>(MockBehavior.Strict);

            headerDictionaryMock.Setup(x => x.TryGetValue("Authorization", out headerDictionaryResult)).Returns(true)
            .Callback(new TryGetValueCallback((string s, out StringValues sv) => sv = new StringValues(strings)));

            var httpRequestMock = new Mock <HttpRequest>();

            httpRequestMock.Setup(x => x.Headers).Returns(headerDictionaryMock.Object);

            var httpContextMock = new Mock <HttpContext>();

            httpContextMock.Setup(x => x.RequestServices).Returns(serviceProviderMock.Object);
            httpContextMock.Setup(x => x.Request).Returns(httpRequestMock.Object);

            // HttpContext isn't virtual; Can't mock AuthrizationFilterContex...
            var filterContext = new AuthorizationFilterContext(
                new ActionContext(
                    httpContextMock.Object,
                    new Microsoft.AspNetCore.Routing.RouteData(),
                    new ActionDescriptor()
                    ),
                new List <IFilterMetadata>()
                );

            var jwtInRole = new JwtInRole("Gebruikert", "Klantje");

            // Act
            jwtInRole.OnAuthorization(filterContext);

            // Assert
            commandPublisherMock.VerifyAll();
            serviceProviderMock.VerifyAll();
            headerDictionaryMock.VerifyAll();
            Assert.IsNotNull(filterContext.Result);
            Assert.IsInstanceOfType(filterContext.Result, typeof(StatusCodeResult));
            Assert.AreEqual((int)HttpStatusCode.Unauthorized, ((StatusCodeResult)filterContext.Result).StatusCode);
        }