public async void SelectorResultNullWhenNoQueryParameterOrCookie()
        {
            // Arrange
            var queryCollection = new QueryCollection(); // No Query Parameter
            var requestCookies  = new RequestCookies();  // No Cookie
            var responseCookies = new ResponseCookies();

            var mockContext = new Mock <HttpContext>();

            mockContext.Setup(p => p.User.IsInRole(SwitcherooThemeSelector.RequiredRole)).Returns(true);
            mockContext.SetupGet(p => p.Request.Query).Returns(queryCollection);
            mockContext.SetupGet(p => p.Request.Cookies).Returns(requestCookies);
            mockContext.SetupGet(p => p.Response.Cookies).Returns(responseCookies);

            var mockContextAccessor = new Mock <IHttpContextAccessor>();

            mockContextAccessor.SetupGet(p => p.HttpContext).Returns(mockContext.Object);

            var mockThemeService = new Mock <ISiteThemeService>();

            mockThemeService.Setup(p => p.GetCurrentThemeNameAsync()).ReturnsAsync(CurrentActiveTheme);

            IThemeSelector selector = new SwitcherooThemeSelector(mockThemeService.Object, mockContextAccessor.Object);

            // Act
            var result = await selector.GetThemeAsync();

            // Assert
            Assert.Null(result);
            Assert.Empty(responseCookies.Cookies);
        }
        public async void OnlyRequiredRoleCanChangeTheme(string userRole)
        {
            // Arrange
            const string selectedThemeName = "TheAgencyTheme";

            var queryCollection = new QueryCollection(new Dictionary <string, StringValues>
            {
                { SwitcherooThemeSelector.QueryStringKey, new StringValues(selectedThemeName) }
            });
            var requestCookies  = new RequestCookies();
            var responseCookies = new ResponseCookies();

            var mockContext = new Mock <HttpContext>();

            mockContext.Setup(p => p.User.IsInRole(userRole))
            .Returns((string p) => p.Equals(SwitcherooThemeSelector.RequiredRole));
            mockContext.SetupGet(p => p.Request.Query).Returns(queryCollection);
            mockContext.SetupGet(p => p.Request.Cookies).Returns(requestCookies);
            mockContext.SetupGet(p => p.Response.Cookies).Returns(responseCookies);

            var mockContextAccessor = new Mock <IHttpContextAccessor>();

            mockContextAccessor.SetupGet(p => p.HttpContext).Returns(mockContext.Object);

            var mockThemeService = new Mock <ISiteThemeService>();

            mockThemeService.Setup(p => p.GetCurrentThemeNameAsync()).ReturnsAsync(CurrentActiveTheme);

            IThemeSelector selector = new SwitcherooThemeSelector(mockThemeService.Object, mockContextAccessor.Object);

            // Act
            var result = await selector.GetThemeAsync();

            // Assert
            if (userRole.Equals(SwitcherooThemeSelector.RequiredRole))
            {
                Assert.NotNull(result);
                Assert.Equal(selectedThemeName, result.ThemeName);
                Assert.Equal(SwitcherooThemeSelector.Priority, result.Priority);
                Assert.Single(responseCookies.Cookies);
                Assert.Equal(SwitcherooThemeSelector.CookieName, responseCookies.Cookies.First().Key);
                Assert.Equal(selectedThemeName, responseCookies.Cookies.First().Value);
            }
            else
            {
                Assert.Null(result);
                Assert.Empty(responseCookies.Cookies);
            }
        }
        public async void QueryTakesPrecedenceOverCookie(string selectedThemeName)
        {
            // Arrange
            var queryCollection = new QueryCollection(new Dictionary <string, StringValues>
            {
                { SwitcherooThemeSelector.QueryStringKey, new StringValues(selectedThemeName) }
            });
            var requestCookies = new RequestCookies(new Dictionary <string, string>
            {
                { SwitcherooThemeSelector.CookieName, "AnyThemeName" }
            });
            var responseCookies = new ResponseCookies();

            var mockContext = new Mock <HttpContext>();

            mockContext.Setup(p => p.User.IsInRole(SwitcherooThemeSelector.RequiredRole)).Returns(true);
            mockContext.SetupGet(p => p.Request.Query).Returns(queryCollection);
            mockContext.SetupGet(p => p.Request.Cookies).Returns(requestCookies);
            mockContext.SetupGet(p => p.Response.Cookies).Returns(responseCookies);

            var mockContextAccessor = new Mock <IHttpContextAccessor>();

            mockContextAccessor.SetupGet(p => p.HttpContext).Returns(mockContext.Object);

            var mockThemeService = new Mock <ISiteThemeService>();

            mockThemeService.Setup(p => p.GetCurrentThemeNameAsync()).ReturnsAsync(CurrentActiveTheme);

            IThemeSelector selector = new SwitcherooThemeSelector(mockThemeService.Object, mockContextAccessor.Object);

            // Act
            var result = await selector.GetThemeAsync();

            // Assert
            Assert.NotNull(result);
            Assert.Equal(selectedThemeName, result.ThemeName);
            Assert.Equal(SwitcherooThemeSelector.Priority, result.Priority);
            Assert.Single(responseCookies.Cookies);
            Assert.Equal(SwitcherooThemeSelector.CookieName, responseCookies.Cookies.First().Key);
            Assert.Equal(selectedThemeName, responseCookies.Cookies.First().Value);
        }