From efcbb2a664edc45c3d70d2bdcc5d535e8d551718 Mon Sep 17 00:00:00 2001 From: Hisham Abdullah Bin Ateya Date: Wed, 5 Aug 2015 23:13:54 +0300 Subject: [PATCH] Add 'Microsoft.AspNet.Localization' Unit Tests --- Localization.sln | 9 +- ...anguageHeaderRequestCultureProviderTest.cs | 48 +++++ .../CookieRequestCultureProviderTest.cs | 96 ++++++++++ .../CustomRequestCultureProviderTest.cs | 61 +++++++ .../Microsoft.AspNet.Localization.Tests.xproj | 20 ++ .../QueryStringRequestCultureProviderTest.cs | 172 ++++++++++++++++++ .../project.json | 15 ++ 7 files changed, 420 insertions(+), 1 deletion(-) create mode 100644 test/Microsoft.AspNet.Localization.Tests/AccessLanguageHeaderRequestCultureProviderTest.cs create mode 100644 test/Microsoft.AspNet.Localization.Tests/CookieRequestCultureProviderTest.cs create mode 100644 test/Microsoft.AspNet.Localization.Tests/CustomRequestCultureProviderTest.cs create mode 100644 test/Microsoft.AspNet.Localization.Tests/Microsoft.AspNet.Localization.Tests.xproj create mode 100644 test/Microsoft.AspNet.Localization.Tests/QueryStringRequestCultureProviderTest.cs create mode 100644 test/Microsoft.AspNet.Localization.Tests/project.json diff --git a/Localization.sln b/Localization.sln index db586522a9..78aa0eb0d7 100644 --- a/Localization.sln +++ b/Localization.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22823.1 +VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{FB313677-BAB3-4E49-8CDB-4FA4A9564767}" EndProject @@ -28,6 +28,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{B723DB83-A EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.Localization.Tests", "test\Microsoft.Framework.Localization.Tests\Microsoft.Framework.Localization.Tests.xproj", "{287AD58D-DF34-4F16-8616-FD78FA1CADF9}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Localization.Tests", "test\Microsoft.AspNet.Localization.Tests\Microsoft.AspNet.Localization.Tests.xproj", "{19A2A931-5C60-47A0-816A-0DC9C4CE5736}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -62,6 +64,10 @@ Global {287AD58D-DF34-4F16-8616-FD78FA1CADF9}.Debug|Any CPU.Build.0 = Debug|Any CPU {287AD58D-DF34-4F16-8616-FD78FA1CADF9}.Release|Any CPU.ActiveCfg = Release|Any CPU {287AD58D-DF34-4F16-8616-FD78FA1CADF9}.Release|Any CPU.Build.0 = Release|Any CPU + {19A2A931-5C60-47A0-816A-0DC9C4CE5736}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {19A2A931-5C60-47A0-816A-0DC9C4CE5736}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19A2A931-5C60-47A0-816A-0DC9C4CE5736}.Release|Any CPU.ActiveCfg = Release|Any CPU + {19A2A931-5C60-47A0-816A-0DC9C4CE5736}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -74,5 +80,6 @@ Global {BD22AE1C-6631-4DA6-874D-0DC0F803CEAB} = {FB313677-BAB3-4E49-8CDB-4FA4A9564767} {F3988D3A-A4C8-4FD7-BAFE-13E0D0A1659A} = {FB313677-BAB3-4E49-8CDB-4FA4A9564767} {287AD58D-DF34-4F16-8616-FD78FA1CADF9} = {B723DB83-A670-4BCB-95FB-195361331AD2} + {19A2A931-5C60-47A0-816A-0DC9C4CE5736} = {B723DB83-A670-4BCB-95FB-195361331AD2} EndGlobalSection EndGlobal diff --git a/test/Microsoft.AspNet.Localization.Tests/AccessLanguageHeaderRequestCultureProviderTest.cs b/test/Microsoft.AspNet.Localization.Tests/AccessLanguageHeaderRequestCultureProviderTest.cs new file mode 100644 index 0000000000..b9ccd53707 --- /dev/null +++ b/test/Microsoft.AspNet.Localization.Tests/AccessLanguageHeaderRequestCultureProviderTest.cs @@ -0,0 +1,48 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Globalization; +using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Localization; +using Microsoft.AspNet.TestHost; +using Microsoft.Framework.DependencyInjection; +using Xunit; + +namespace Microsoft.Framework.Localization.Tests +{ + public class AccessLanguageHeaderRequestCultureProviderTest + { + [Fact] + public async void GetFallbackLanguage() + { + using (var server = TestServer.Create(app => + { + var options = new RequestLocalizationOptions + { + SupportedCultures = new List + { + new CultureInfo("ar-SA"), + new CultureInfo("en-US") + } + }; + app.UseRequestLocalization(options); + app.Run(context => + { + var requestCultureFeature = context.Features.Get(); + var requestCulture = requestCultureFeature.RequestCulture; + Assert.Equal("ar-SA", requestCulture.Culture.Name); + return Task.FromResult(0); + }); + })) + { + var client = server.CreateClient(); + client.DefaultRequestHeaders.AcceptLanguage.ParseAdd("jp,ar-SA,en-US"); + var count = client.DefaultRequestHeaders.AcceptLanguage.Count; + var response = await client.GetAsync(string.Empty); + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Localization.Tests/CookieRequestCultureProviderTest.cs b/test/Microsoft.AspNet.Localization.Tests/CookieRequestCultureProviderTest.cs new file mode 100644 index 0000000000..2a14092b8c --- /dev/null +++ b/test/Microsoft.AspNet.Localization.Tests/CookieRequestCultureProviderTest.cs @@ -0,0 +1,96 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Globalization; +using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Localization; +using Microsoft.AspNet.TestHost; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Net.Http.Headers; +using Xunit; + +namespace Microsoft.Framework.Localization.Tests +{ + public class CookieRequestCultureProviderTest + { + [Fact] + public async void GetCultureInfoFromPersistentCookie() + { + using (var server = TestServer.Create(app => + { + var options = new RequestLocalizationOptions(); + var provider = new CookieRequestCultureProvider(); + provider.CookieName = "Preferences"; + options.RequestCultureProviders.Insert(0, provider); + app.UseRequestLocalization(options); + app.Run(context => + { + var requestCultureFeature = context.Features.Get(); + var requestCulture = requestCultureFeature.RequestCulture; + Assert.Equal("ar-SA", requestCulture.Culture.Name); + return Task.FromResult(0); + }); + })) + { + var client = server.CreateClient(); + var culture = new CultureInfo("ar-SA"); + var requestCulture = new RequestCulture(culture); + var value = CookieRequestCultureProvider.MakeCookieValue(requestCulture); + client.DefaultRequestHeaders.Add("Cookie", new CookieHeaderValue("Preferences", value).ToString()); + var response = await client.GetAsync(string.Empty); + Assert.Equal("c=ar-SA|uic=ar-SA",value); + } + } + + [Fact] + public async void GetDefaultCultureInfoIfCultureKeysAreMissingOrInvalid() + { + using (var server = TestServer.Create(app => + { + var options = new RequestLocalizationOptions(); + var provider = new CookieRequestCultureProvider(); + provider.CookieName = "Preferences"; + options.RequestCultureProviders.Insert(0, provider); + app.UseRequestLocalization(options); + app.Run(context => + { + var requestCultureFeature = context.Features.Get(); + var requestCulture = requestCultureFeature.RequestCulture; + Assert.Equal(options.DefaultRequestCulture.Culture.Name, requestCulture.Culture.Name); + return Task.FromResult(0); + }); + })) + { + var client = server.CreateClient(); + client.DefaultRequestHeaders.Add("Cookie", new CookieHeaderValue("Preferences", "uic=ar-SA").ToString()); + var response = await client.GetAsync(string.Empty); + } + } + + [Fact] + public async void GetDefaultCultureInfoIfCookieDoesNotExist() + { + using (var server = TestServer.Create(app => + { + var options = new RequestLocalizationOptions(); + var provider = new CookieRequestCultureProvider(); + provider.CookieName = "Preferences"; + options.RequestCultureProviders.Insert(0, provider); + app.UseRequestLocalization(options); + app.Run(context => + { + var requestCultureFeature = context.Features.Get(); + var requestCulture = requestCultureFeature.RequestCulture; + Assert.Equal(options.DefaultRequestCulture.Culture.Name, requestCulture.Culture.Name); + return Task.FromResult(0); + }); + })) + { + var client = server.CreateClient(); + var response = await client.GetAsync(string.Empty); + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Localization.Tests/CustomRequestCultureProviderTest.cs b/test/Microsoft.AspNet.Localization.Tests/CustomRequestCultureProviderTest.cs new file mode 100644 index 0000000000..83928c419d --- /dev/null +++ b/test/Microsoft.AspNet.Localization.Tests/CustomRequestCultureProviderTest.cs @@ -0,0 +1,61 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Localization; +using Microsoft.AspNet.TestHost; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Globalization; +using Xunit; + +namespace Microsoft.Framework.Localization.Tests +{ + public class CustomRequestCultureProviderTest + { + [Fact] + public async void CustomRequestCultureProviderThatGetsCultureInfoFromUrl() + { + using (var server = TestServer.Create(app => + { + var options = new RequestLocalizationOptions(); + options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context => + { + var culture = GetCultureInfoFromUrl(context); + var requestCulture = new RequestCulture(culture); + return Task.FromResult(requestCulture); + })); + app.UseRequestLocalization(options); + app.Run(context => + { + var requestCultureFeature = context.Features.Get(); + var requestCulture = requestCultureFeature.RequestCulture; + Assert.Equal("ar", requestCulture.Culture.Name); + return Task.FromResult(0); + }); + })) + { + var client = server.CreateClient(); + var response = await client.GetAsync("/ar/page"); + } + } + + private CultureInfo GetCultureInfoFromUrl(HttpContext context) + { + var currentCulture = "en"; + var segments = context.Request.Path.Value.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); + if (segments.Length > 1 && segments[0].Length == 2) + { + if (CultureInfoCache.KnownCultureNames.Contains(segments[0])) + currentCulture = segments[0]; + else + throw new InvalidOperationException($"The '{segments[0]}' is invalid culture name."); + } + return CultureInfoCache.GetCultureInfo(currentCulture); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Localization.Tests/Microsoft.AspNet.Localization.Tests.xproj b/test/Microsoft.AspNet.Localization.Tests/Microsoft.AspNet.Localization.Tests.xproj new file mode 100644 index 0000000000..859644e3de --- /dev/null +++ b/test/Microsoft.AspNet.Localization.Tests/Microsoft.AspNet.Localization.Tests.xproj @@ -0,0 +1,20 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + 19a2a931-5c60-47a0-816a-0dc9c4ce5736 + Microsoft.AspNet.Localization.Tests + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + diff --git a/test/Microsoft.AspNet.Localization.Tests/QueryStringRequestCultureProviderTest.cs b/test/Microsoft.AspNet.Localization.Tests/QueryStringRequestCultureProviderTest.cs new file mode 100644 index 0000000000..b8915e56bd --- /dev/null +++ b/test/Microsoft.AspNet.Localization.Tests/QueryStringRequestCultureProviderTest.cs @@ -0,0 +1,172 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Localization; +using Microsoft.AspNet.TestHost; +using Microsoft.Framework.DependencyInjection; +using Xunit; + +namespace Microsoft.Framework.Localization.Tests +{ + public class QueryStringRequestCultureProviderTest + { + [Fact] + public async void GetCultureInfoFromQueryString() + { + using (var server = TestServer.Create(app => + { + var options = new RequestLocalizationOptions(); + app.UseRequestLocalization(options); + app.Run(context => + { + var requestCultureFeature = context.Features.Get(); + var requestCulture = requestCultureFeature.RequestCulture; + Assert.Equal("ar-SA", requestCulture.Culture.Name); + Assert.Equal("ar-YE", requestCulture.UICulture.Name); + return Task.FromResult(0); + }); + })) + { + var client = server.CreateClient(); + var response = await client.GetAsync("/page?culture=ar-SA&ui-culture=ar-YE"); + } + } + + [Fact] + public async void GetDefaultCultureInfoIfCultureKeysAreMissing() + { + using (var server = TestServer.Create(app => + { + var options = new RequestLocalizationOptions(); + app.UseRequestLocalization(options); + app.Run(context => + { + var requestCultureFeature = context.Features.Get(); + var requestCulture = requestCultureFeature.RequestCulture; + Assert.Equal(options.DefaultRequestCulture.Culture.Name, requestCulture.Culture.Name); + Assert.Equal(options.DefaultRequestCulture.UICulture.Name, requestCulture.UICulture.Name); + return Task.FromResult(0); + }); + })) + { + var client = server.CreateClient(); + var response = await client.GetAsync("/page"); + } + } + + [Fact] + public async void GetDefaultCultureInfoIfCultureIsInvalid() + { + using (var server = TestServer.Create(app => + { + var options = new RequestLocalizationOptions(); + app.UseRequestLocalization(options); + app.Run(context => + { + var requestCultureFeature = context.Features.Get(); + var requestCulture = requestCultureFeature.RequestCulture; + Assert.Equal(options.DefaultRequestCulture.Culture.Name, requestCulture.Culture.Name); + return Task.FromResult(0); + }); + })) + { + var client = server.CreateClient(); + var response = await client.GetAsync("/page?culture=ar-XY&ui-culture=ar-SA"); + } + } + + [Fact] + public async void GetDefaultCultureInfoIfUICultureIsInvalid() + { + using (var server = TestServer.Create(app => + { + var options = new RequestLocalizationOptions(); + app.UseRequestLocalization(options); + app.Run(context => + { + var requestCultureFeature = context.Features.Get(); + var requestCulture = requestCultureFeature.RequestCulture; + Assert.Equal(options.DefaultRequestCulture.UICulture.Name, requestCulture.UICulture.Name); + return Task.FromResult(0); + }); + })) + { + var client = server.CreateClient(); + var response = await client.GetAsync("/page?culture=ar-SA&ui-culture=ar-XY"); + } + } + + [Fact] + public async void GetSameCultureInfoIfCultureKeyIsMissing() + { + using (var server = TestServer.Create(app => + { + var options = new RequestLocalizationOptions(); + app.UseRequestLocalization(options); + app.Run(context => + { + var requestCultureFeature = context.Features.Get(); + var requestCulture = requestCultureFeature.RequestCulture; + Assert.Equal("ar-SA", requestCulture.Culture.Name); + Assert.Equal("ar-SA", requestCulture.UICulture.Name); + return Task.FromResult(0); + }); + })) + { + var client = server.CreateClient(); + var response = await client.GetAsync("/page?ui-culture=ar-SA"); + } + } + + [Fact] + public async void GetSameCultureInfoIfUICultureKeyIsMissing() + { + using (var server = TestServer.Create(app => + { + var options = new RequestLocalizationOptions(); + app.UseRequestLocalization(options); + app.Run(context => + { + var requestCultureFeature = context.Features.Get(); + var requestCulture = requestCultureFeature.RequestCulture; + Assert.Equal("ar-SA", requestCulture.Culture.Name); + Assert.Equal("ar-SA", requestCulture.UICulture.Name); + return Task.FromResult(0); + }); + })) + { + var client = server.CreateClient(); + var response = await client.GetAsync("/page?culture=ar-SA"); + } + } + + [Fact] + public async void GetCultureInfoFromQueryStringWithCustomKeys() + { + using (var server = TestServer.Create(app => + { + var options = new RequestLocalizationOptions(); + var provider = new QueryStringRequestCultureProvider(); + provider.QueryStringKey = "c"; + provider.UIQueryStringKey = "uic"; + options.RequestCultureProviders.Insert(0, provider); + app.UseRequestLocalization(options); + app.Run(context => + { + var requestCultureFeature = context.Features.Get(); + var requestCulture = requestCultureFeature.RequestCulture; + Assert.Equal("ar-SA", requestCulture.Culture.Name); + Assert.Equal("ar-YE", requestCulture.UICulture.Name); + return Task.FromResult(0); + }); + })) + { + var client = server.CreateClient(); + var response = await client.GetAsync("/page?c=ar-SA&uic=ar-YE"); + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Localization.Tests/project.json b/test/Microsoft.AspNet.Localization.Tests/project.json new file mode 100644 index 0000000000..e3aeaad6a6 --- /dev/null +++ b/test/Microsoft.AspNet.Localization.Tests/project.json @@ -0,0 +1,15 @@ +{ + "dependencies": { + "Microsoft.AspNet.Localization": "1.0.0-*", + "Microsoft.AspNet.TestHost": "1.0.0-*", + "xunit": "2.1.0-*", + "xunit.runner.dnx": "2.1.0-*" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { } + }, + "commands": { + "test": "xunit.runner.dnx" + } +} \ No newline at end of file