// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. using System.Collections.Generic; using System.Collections.Specialized; using System.Web.Configuration; using Moq; using Xunit; namespace System.Web.WebPages.Test { public class BrowserHelpersTest { [Fact] public void GetOverriddenUserAgentGetsUserAgentFromHttpContext() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); string testUserAgent = "testUserAgent"; // Act context.Object.SetOverriddenBrowser(testUserAgent); Assert.Equal(testUserAgent, context.Object.GetOverriddenUserAgent()); context.Object.Response.Cookies.Clear(); context.Object.Request.Cookies.Clear(); // Assert Assert.Equal(testUserAgent, context.Object.GetOverriddenUserAgent()); } [Fact] public void GetOverriddenUserAgentFallsBackToStoreUserAgent() { // Arrange string testUserAgent = "testUserAgent"; HttpCookie existingOverrideCookie = new HttpCookie(CookieBrowserOverrideStore.BrowserOverrideCookieName, testUserAgent); HttpContextBase context = CookieBrowserOverrideStoreTest.CreateCookieContext(requestCookie: existingOverrideCookie).Object; // Act & Assert Assert.Equal(testUserAgent, context.GetOverriddenUserAgent()); } [Fact] public void GetOverriddenUserAgentDefaultsToRequestUserAgent() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); context.Setup(c => c.Request.UserAgent).Returns("requestUserAgent"); // Act & Assert Assert.Equal("requestUserAgent", context.Object.GetOverriddenUserAgent()); } [Fact] public void SetOverriddenBrowserWithBrowserOverrideSetBrowserMobile() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); context.Setup(c => c.Request.Browser.IsMobileDevice).Returns(false); // Act context.Object.SetOverriddenBrowser(BrowserOverride.Mobile); // Assert Assert.True(context.Object.GetOverriddenBrowser(CreateBrowserThroughFactory).IsMobileDevice); } [Fact] public void SetOverriddenBrowserWithUnsupportedBrowserOverrideClearsBrowser() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); Mock requestBrowser = new Mock(); context.Setup(c => c.Request.Browser).Returns(requestBrowser.Object); // Act & Assert context.Object.SetOverriddenBrowser(BrowserOverride.Mobile); Assert.NotSame(requestBrowser.Object, context.Object.GetOverriddenBrowser(CreateBrowserThroughFactory)); context.Object.SetOverriddenBrowser((BrowserOverride)(-1)); Assert.Same(requestBrowser.Object, context.Object.GetOverriddenBrowser(CreateBrowserThroughFactory)); } [Fact] public void SetOverriddenBrowserWithBrowserOverrideSetBrowserDesktop() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); context.Setup(c => c.Request.Browser.IsMobileDevice).Returns(true); // Act context.Object.SetOverriddenBrowser(BrowserOverride.Desktop); // Assert Assert.False(context.Object.GetOverriddenBrowser(CreateBrowserThroughFactory).IsMobileDevice); } [Fact] public void SetOverriddenBrowserWithStringOverrideSetBrowser() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); context.Setup(c => c.Request.Browser.IsMobileDevice).Returns(false); // Act context.Object.SetOverriddenBrowser("Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16"); // Assert Assert.True(context.Object.GetOverriddenBrowser(CreateBrowserThroughFactory).IsMobileDevice); } [Fact] public void SetOverriddenBrowserClearsCachedBrowser() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); context.Setup(c => c.Request.UserAgent).Returns("testUserAgent"); // Act context.Object.SetOverriddenBrowser(BrowserOverride.Mobile); context.Object.GetOverriddenBrowser(CreateBrowserThroughFactory); // If the browser is generated this will throw an exception because we are going through the provider. // We must be getting the cached overridden browser. context.Object.GetOverriddenBrowser(); context.Object.SetOverriddenBrowser("testUserAgent"); // Assert // The browser has been cleared from HttpContext and the user agent has been set to the original user agent. // Otherwise we will either get the cached browser or an exception when trying to generate the browser from the // mobile user agent. Assert.Null(context.Object.GetOverriddenBrowser()); } [Fact] public void SetOverridenBrowserInSameOverrideClassClearsOverridenBrowser() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); context.Setup(c => c.Request.Browser.IsMobileDevice).Returns(true); context.Setup(c => c.Request.UserAgent).Returns("sampleUserAgent"); // Act context.Object.SetOverriddenBrowser(BrowserOverride.Desktop); context.Object.SetOverriddenBrowser(BrowserOverride.Mobile); // Assert Assert.Equal("sampleUserAgent", context.Object.GetOverriddenUserAgent()); } [Fact] public void GetOverriddenBrowserGetsBrowserFromHttpContext() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); // Act context.Object.SetOverriddenBrowser(BrowserOverride.Mobile); context.Object.GetOverriddenBrowser(CreateBrowserThroughFactory); // Assert // If the browser is generated this will throw an exception because we are going through the provider. // We must be getting the cached overridden browser. Assert.True(context.Object.GetOverriddenBrowser().IsMobileDevice); } [Fact] public void GetOverriddenBrowserWithStoredBrowserAndNoBrowserInContext() { // Arrange string mobileUserAgent = "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16"; HttpCookie existingOverrideCookie = new HttpCookie(CookieBrowserOverrideStore.BrowserOverrideCookieName, mobileUserAgent); HttpContextBase context = CookieBrowserOverrideStoreTest.CreateCookieContext(requestCookie: existingOverrideCookie).Object; // Act & Assert Assert.True(context.GetOverriddenBrowser(CreateBrowserThroughFactory).IsMobileDevice); } [Fact] public void GetOverriddenBrowserDefaultsToRequestBrowser() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); Mock currentBrowser = new Mock(); context.Setup(c => c.Request.Browser).Returns(currentBrowser.Object); // Act & Assert Assert.Same(currentBrowser.Object, context.Object.GetOverriddenBrowser()); } [Fact] public void ClearOverriddenBrowserClearsSetBrowser() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); Mock requestBrowser = new Mock(); context.Setup(c => c.Request.Browser).Returns(requestBrowser.Object); // Act & Assert context.Object.SetOverriddenBrowser(BrowserOverride.Mobile); Assert.NotSame(requestBrowser.Object, context.Object.GetOverriddenBrowser(CreateBrowserThroughFactory)); context.Object.ClearOverriddenBrowser(); Assert.Same(requestBrowser.Object, context.Object.GetOverriddenBrowser(CreateBrowserThroughFactory)); } [Fact] public void ClearOverriddenBrowserWithNoSetBrowser() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); Mock requestBrowser = new Mock(); context.Setup(c => c.Request.Browser).Returns(requestBrowser.Object); // Act & Assert context.Object.ClearOverriddenBrowser(); Assert.Same(requestBrowser.Object, context.Object.GetOverriddenBrowser(CreateBrowserThroughFactory)); } [Fact] public void GetVaryByCustomStringVariesBySetOverriddenBrowserMobile() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); Mock currentBrowser = new Mock(); currentBrowser.Setup(c => c.IsMobileDevice).Returns(true); context.Setup(c => c.Request.Browser).Returns(currentBrowser.Object); // Act string originalBrowserType = context.Object.GetVaryByCustomStringForOverriddenBrowser(CreateBrowserThroughFactory); context.Object.SetOverriddenBrowser(BrowserOverride.Desktop); string deskTopBrowserType = context.Object.GetVaryByCustomStringForOverriddenBrowser(CreateBrowserThroughFactory); context.Object.SetOverriddenBrowser(BrowserOverride.Mobile); string mobileBrowserType = context.Object.GetVaryByCustomStringForOverriddenBrowser(CreateBrowserThroughFactory); // Assert Assert.Equal(originalBrowserType, mobileBrowserType); Assert.NotEqual(originalBrowserType, deskTopBrowserType); Assert.NotEqual(mobileBrowserType, deskTopBrowserType); } [Fact] public void GetVaryByCustomStringVariesBySetOverriddenBrowserDesktop() { // Arrange Mock context = CookieBrowserOverrideStoreTest.CreateCookieContext(); Mock currentBrowser = new Mock(); currentBrowser.Setup(c => c.IsMobileDevice).Returns(false); context.Setup(c => c.Request.Browser).Returns(currentBrowser.Object); // Act string originalBrowserType = context.Object.GetVaryByCustomStringForOverriddenBrowser(CreateBrowserThroughFactory); context.Object.SetOverriddenBrowser(BrowserOverride.Mobile); string mobileBrowserType = context.Object.GetVaryByCustomStringForOverriddenBrowser(CreateBrowserThroughFactory); context.Object.SetOverriddenBrowser(BrowserOverride.Desktop); string deskTopBrowserType = context.Object.GetVaryByCustomStringForOverriddenBrowser(CreateBrowserThroughFactory); // Assert Assert.NotEqual(originalBrowserType, mobileBrowserType); Assert.Equal(originalBrowserType, deskTopBrowserType); Assert.NotEqual(mobileBrowserType, deskTopBrowserType); } // We need to call the .ctor of SimpleWorkerRequest that depends on HttpRuntime so for unit testing // simply create the browser capabilities by going directly through the factory. private static HttpBrowserCapabilitiesBase CreateBrowserThroughFactory(string userAgent) { HttpBrowserCapabilities browser = new HttpBrowserCapabilities { Capabilities = new Dictionary { { String.Empty, userAgent } } }; BrowserCapabilitiesFactory factory = new BrowserCapabilitiesFactory(); factory.ConfigureBrowserCapabilities(new NameValueCollection(), browser); return new HttpBrowserCapabilitiesWrapper(browser); } } }