// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Globalization; using System.Text; using System.Web; using System.Web.Helpers.Test; using System.Web.TestUtil; using System.Web.WebPages.Scope; using Moq; using Xunit; using Assert = Microsoft.TestCommon.AssertEx; namespace Microsoft.Web.Helpers.Test { public class BingTest { private static readonly IDictionary _emptyStateStorage = new Dictionary(); private const string BasicBingSearchTemplate = @"
" + @"" + @"" + @""; private const string BasicBingSearchFooter = "
" + @"" + @"" + @"" + @"
"; private const string BasicBingSearchLocalSiteSearch = @" "; [Fact] public void SiteTitleThrowsWhenSetToNull() { Assert.ThrowsArgumentNull(() => Bing.SiteTitle = null, "SiteTitle"); } [Fact] public void SiteTitleUsesScopeStorage() { // Arrange var value = "value"; // Act Bing.SiteTitle = value; // Assert Assert.Equal(Bing.SiteTitle, value); Assert.Equal(ScopeStorage.CurrentScope[Bing._siteTitleKey], value); } [Fact] public void SiteUrlThrowsWhenSetToNull() { Assert.ThrowsArgumentNull(() => Bing.SiteUrl = null, "SiteUrl"); } [Fact] public void SiteUrlUsesScopeStorage() { // Arrange var value = "value"; // Act Bing.SiteUrl = value; // Assert Assert.Equal(Bing.SiteUrl, value); Assert.Equal(ScopeStorage.CurrentScope[Bing._siteUrlKey], value); } [Fact] public void SearchBoxGeneratesValidHtml() { // Act & Assert XhtmlAssert.Validate1_0( Bing._SearchBox("322px", null, null, GetContextForSearchBox(), _emptyStateStorage), true ); } [Fact] public void SearchBoxDoesNotContainSearchLocalWhenSiteUrlIsNull() { // Arrange var encoding = Encoding.UTF8; var expectedHtml = String.Format(CultureInfo.InvariantCulture, BasicBingSearchTemplate, encoding.CodePage, 322) + BasicBingSearchFooter; // Act var actualHtml = Bing._SearchBox("322px", null, null, GetContextForSearchBox(encoding), _emptyStateStorage).ToString(); // Assert UnitTestHelper.AssertEqualsIgnoreWhitespace(expectedHtml, actualHtml); } [Fact] public void SearchBoxDoesNotContainSearchLocalWhenSiteUrlIsEmpty() { // Arrange var encoding = Encoding.UTF8; var expectedHtml = String.Format(CultureInfo.InvariantCulture, BasicBingSearchTemplate, encoding.CodePage, 322) + BasicBingSearchFooter; // Act var actualHtml = Bing._SearchBox("322px", String.Empty, String.Empty, GetContextForSearchBox(encoding), _emptyStateStorage).ToString(); // Assert UnitTestHelper.AssertEqualsIgnoreWhitespace(expectedHtml, actualHtml); } [Fact] public void SearchBoxUsesResponseEncodingToDetermineCodePage() { // Arrange var encoding = Encoding.GetEncoding(51932); //euc-jp var expectedHtml = String.Format(CultureInfo.InvariantCulture, BasicBingSearchTemplate, encoding.CodePage, 322) + BasicBingSearchFooter; // Act var actualHtml = Bing._SearchBox("322px", String.Empty, String.Empty, GetContextForSearchBox(encoding), _emptyStateStorage).ToString(); // Assert UnitTestHelper.AssertEqualsIgnoreWhitespace(expectedHtml, actualHtml); } [Fact] public void SearchBoxUsesWidthToSetBingSearchTableSize() { // Arrange var encoding = Encoding.UTF8; var expectedHtml = String.Format(CultureInfo.InvariantCulture, BasicBingSearchTemplate, encoding.CodePage, 609) + BasicBingSearchFooter; // Act var actualHtml = Bing._SearchBox("609px", String.Empty, String.Empty, GetContextForSearchBox(encoding), _emptyStateStorage).ToString(); // Assert UnitTestHelper.AssertEqualsIgnoreWhitespace(expectedHtml, actualHtml); } [Fact] public void SearchBoxUsesWithSiteUrlProducesLocalSearchOptions() { // Arrange var encoding = Encoding.Default; var expectedHtml = String.Format(CultureInfo.InvariantCulture, BasicBingSearchTemplate, encoding.CodePage, 322) + String.Format(CultureInfo.InvariantCulture, BasicBingSearchLocalSiteSearch, "www.asp.net", "Search Site") + BasicBingSearchFooter; // Act var actualHtml = Bing._SearchBox("322px", "www.asp.net", String.Empty, GetContextForSearchBox(encoding), _emptyStateStorage).ToString(); // Assert UnitTestHelper.AssertEqualsIgnoreWhitespace(expectedHtml, actualHtml); } [Fact] public void SearchBoxUsesWithSiteUrlAndSiteTitleProducesLocalSearchOptions() { // Arrange var encoding = Encoding.Default; var expectedHtml = String.Format(CultureInfo.InvariantCulture, BasicBingSearchTemplate, encoding.CodePage, 322) + String.Format(CultureInfo.InvariantCulture, BasicBingSearchLocalSiteSearch, "www.microsoft.com", "Custom Search") + BasicBingSearchFooter; // Act var actualHtml = Bing._SearchBox("322px", "www.microsoft.com", "Custom Search", GetContextForSearchBox(encoding), _emptyStateStorage).ToString(); // Assert UnitTestHelper.AssertEqualsIgnoreWhitespace(expectedHtml, actualHtml); } [Fact] public void SearchBoxWithLocalSiteOptionUsesResponseEncoding() { // Arrange var encoding = Encoding.GetEncoding(1258); //windows-1258 var expectedHtml = String.Format(CultureInfo.InvariantCulture, BasicBingSearchTemplate, encoding.CodePage, 322) + String.Format(CultureInfo.InvariantCulture, BasicBingSearchLocalSiteSearch, "www.asp.net", "Search Site") + BasicBingSearchFooter; // Act var actualHtml = Bing._SearchBox("322px", "www.asp.net", String.Empty, GetContextForSearchBox(encoding), _emptyStateStorage).ToString(); // Assert UnitTestHelper.AssertEqualsIgnoreWhitespace(expectedHtml, actualHtml); } [Fact] public void SearchBoxUsesScopeStorageIfSiteTitleParameterIsNull() { // Arrange var encoding = Encoding.GetEncoding(1258); //windows-1258 var expectedHtml = String.Format(CultureInfo.InvariantCulture, BasicBingSearchTemplate, encoding.CodePage, 322) + String.Format(CultureInfo.InvariantCulture, BasicBingSearchLocalSiteSearch, "www.asp.net", "foobar") + BasicBingSearchFooter; // Act var actualHtml = Bing._SearchBox("322px", "www.asp.net", null, GetContextForSearchBox(encoding), new Dictionary { { Bing._siteTitleKey, "foobar" } }).ToString(); // Assert UnitTestHelper.AssertEqualsIgnoreWhitespace(expectedHtml, actualHtml); } [Fact] public void SearchBoxUsesScopeStorageIfSiteTitleParameterIsEmpty() { // Arrange var encoding = Encoding.GetEncoding(1258); //windows-1258 var expectedHtml = String.Format(CultureInfo.InvariantCulture, BasicBingSearchTemplate, encoding.CodePage, 322) + String.Format(CultureInfo.InvariantCulture, BasicBingSearchLocalSiteSearch, "www.asptest.net", "bazbiz") + BasicBingSearchFooter; // Act var actualHtml = Bing._SearchBox("322px", "www.asptest.net", String.Empty, GetContextForSearchBox(encoding), new Dictionary { { Bing._siteTitleKey, "bazbiz" } }).ToString(); // Assert UnitTestHelper.AssertEqualsIgnoreWhitespace(expectedHtml, actualHtml); } [Fact] public void SearchBoxUsesScopeStorageIfSiteUrlParameterIsNull() { // Arrange var encoding = Encoding.GetEncoding(1258); //windows-1258 var expectedHtml = String.Format(CultureInfo.InvariantCulture, BasicBingSearchTemplate, encoding.CodePage, 322) + String.Format(CultureInfo.InvariantCulture, BasicBingSearchLocalSiteSearch, "www.myawesomesite.net", "my-test-string") + BasicBingSearchFooter; // Act var actualHtml = Bing._SearchBox("322px", null, "my-test-string", GetContextForSearchBox(encoding), new Dictionary { { Bing._siteUrlKey, "www.myawesomesite.net" } }).ToString(); // Assert UnitTestHelper.AssertEqualsIgnoreWhitespace(expectedHtml, actualHtml); } [Fact] public void SearchBoxUsesScopeStorageIfSiteUrlParameterIsEmpty() { // Arrange var encoding = Encoding.GetEncoding(1258); //windows-1258 var expectedHtml = String.Format(CultureInfo.InvariantCulture, BasicBingSearchTemplate, encoding.CodePage, 322) + String.Format(CultureInfo.InvariantCulture, BasicBingSearchLocalSiteSearch, "www.myawesomesite.net", "my-test-string") + BasicBingSearchFooter; // Act var actualHtml = Bing._SearchBox("322px", String.Empty, "my-test-string", GetContextForSearchBox(encoding), new Dictionary { { Bing._siteUrlKey, "www.myawesomesite.net" } }).ToString(); // Assert UnitTestHelper.AssertEqualsIgnoreWhitespace(expectedHtml, actualHtml); } private HttpContextBase GetContextForSearchBox(Encoding contentEncoding = null) { Mock context = new Mock(); Mock response = new Mock(); response.Setup(c => c.ContentEncoding).Returns(contentEncoding ?? Encoding.Default); context.Setup(c => c.Response).Returns(response.Object); return context.Object; } } }