From 540195c597599645daf3417a038ed1640e2d60d4 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Mon, 22 Jun 2020 15:01:55 +0200 Subject: [PATCH] Cleanup and fixed more tests Signed-off-by: Bjarke Berg --- .../Builders/UserBuilder.cs | 6 + .../Controllers/UsersControllerTests.cs | 210 ++-- .../BackOfficeOwinUserManagerTests.cs | 2 +- .../Templates/ViewHelperTests.cs | 14 +- src/Umbraco.Tests/TestHelpers/TestObjects.cs | 3 +- .../Web/Controllers/UsersControllerTests.cs | 1052 ++++++++--------- .../Security/BackOfficeOwinUserManager.cs | 2 +- 7 files changed, 651 insertions(+), 638 deletions(-) diff --git a/src/Umbraco.Tests.Common/Builders/UserBuilder.cs b/src/Umbraco.Tests.Common/Builders/UserBuilder.cs index 3ca15620ea..d702b9716c 100644 --- a/src/Umbraco.Tests.Common/Builders/UserBuilder.cs +++ b/src/Umbraco.Tests.Common/Builders/UserBuilder.cs @@ -79,6 +79,12 @@ namespace Umbraco.Tests.Common.Builders return this; } + public UserBuilder WithUsername(string username) + { + _username = username; + return this; + } + public UserBuilder WithComments(string comments) { _comments = comments; diff --git a/src/Umbraco.Tests.Integration/TestServerTest/Controllers/UsersControllerTests.cs b/src/Umbraco.Tests.Integration/TestServerTest/Controllers/UsersControllerTests.cs index 202eba5392..024ad1873e 100644 --- a/src/Umbraco.Tests.Integration/TestServerTest/Controllers/UsersControllerTests.cs +++ b/src/Umbraco.Tests.Integration/TestServerTest/Controllers/UsersControllerTests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; @@ -9,6 +10,7 @@ using Newtonsoft.Json; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Models; +using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; using Umbraco.Tests.Common.Builders; using Umbraco.Tests.Common.Builders.Extensions; @@ -176,110 +178,114 @@ namespace Umbraco.Tests.Integration.TestServerTest.Controllers // [Test] // public async Task PostUnlockUsers_When_User_Lockout_Update_Fails_Expect_Failure_Response() // { - // var mockUserManager = CreateMockUserManager(); - // var usersController = CreateSut(mockUserManager); - // - // const string expectedMessage = "identity error!"; - // var user = new BackOfficeIdentityUser( - // new Mock().Object, - // 1, - // new List()) - // { - // Name = "bob" - // }; - // - // mockUserManager.Setup(x => x.FindByIdAsync(It.IsAny())) - // .ReturnsAsync(user); - // mockUserManager.Setup(x => x.SetLockoutEndDateAsync(user, It.IsAny())) - // .ReturnsAsync(IdentityResult.Failed(new IdentityError {Description = expectedMessage})); - // - // var response = await usersController.PostUnlockUsers(new[] { 1 }); - // - // Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); - // Assert.True(response.Headers.TryGetValues("X-Status-Reason", out var values)); - // Assert.True(values.Contains("Validation failed")); - // - // var responseContent = response.Content as ObjectContent; - // var responseValue = responseContent?.Value as HttpError; - // Assert.NotNull(responseValue); - // Assert.True(responseValue.Message.Contains(expectedMessage)); - // Assert.True(responseValue.Message.Contains(user.Id.ToString())); + // // + // // var mockUserManager = CreateMockUserManager(); + // // var usersController = CreateSut(mockUserManager); + // // + // // const string expectedMessage = "identity error!"; + // // var user = new BackOfficeIdentityUser( + // // new Mock().Object, + // // 1, + // // new List()) + // // { + // // Name = "bob" + // // }; + // // + // // mockUserManager.Setup(x => x.FindByIdAsync(It.IsAny())) + // // .ReturnsAsync(user); + // // mockUserManager.Setup(x => x.SetLockoutEndDateAsync(user, It.IsAny())) + // // .ReturnsAsync(IdentityResult.Failed(new IdentityError {Description = expectedMessage})); + // // + // // var response = await usersController.PostUnlockUsers(new[] { 1 }); + // // + // // Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); + // // Assert.True(response.Headers.TryGetValues("X-Status-Reason", out var values)); + // // Assert.True(values.Contains("Validation failed")); + // // + // // var responseContent = response.Content as ObjectContent; + // // var responseValue = responseContent?.Value as HttpError; + // // Assert.NotNull(responseValue); + // // Assert.True(responseValue.Message.Contains(expectedMessage)); + // // Assert.True(responseValue.Message.Contains(user.Id.ToString())); // } // - // [Test] - // public async Task PostUnlockUsers_When_One_UserId_Supplied_Expect_User_Locked_Out_With_Correct_Response_Message() - // { - // var mockUserManager = CreateMockUserManager(); - // var usersController = CreateSut(mockUserManager); - // - // var user = new BackOfficeIdentityUser( - // new Mock().Object, - // 1, - // new List()) - // { - // Name = "bob" - // }; - // - // mockUserManager.Setup(x => x.FindByIdAsync(user.Id.ToString())) - // .ReturnsAsync(user); - // mockUserManager.Setup(x => x.SetLockoutEndDateAsync(user, It.IsAny())) - // .ReturnsAsync(IdentityResult.Success) - // .Verifiable(); - // - // var response = await usersController.PostUnlockUsers(new[] { user.Id }); - // - // Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); - // - // var responseContent = response.Content as ObjectContent; - // var notifications = responseContent?.Value as SimpleNotificationModel; - // Assert.NotNull(notifications); - // Assert.AreEqual(user.Name, notifications.Message); - // mockUserManager.Verify(); - // } - // - // [Test] - // public async Task PostUnlockUsers_When_Multiple_UserIds_Supplied_Expect_User_Locked_Out_With_Correct_Response_Message() - // { - // var mockUserManager = CreateMockUserManager(); - // var usersController = CreateSut(mockUserManager); - // - // var user1 = new BackOfficeIdentityUser( - // new Mock().Object, - // 1, - // new List()) - // { - // Name = "bob" - // }; - // var user2 = new BackOfficeIdentityUser( - // new Mock().Object, - // 2, - // new List()) - // { - // Name = "alice" - // }; - // var userIdsToLock = new[] {user1.Id, user2.Id}; - // - // mockUserManager.Setup(x => x.FindByIdAsync(user1.Id.ToString())) - // .ReturnsAsync(user1); - // mockUserManager.Setup(x => x.FindByIdAsync(user2.Id.ToString())) - // .ReturnsAsync(user2); - // mockUserManager.Setup(x => x.SetLockoutEndDateAsync(user1, It.IsAny())) - // .ReturnsAsync(IdentityResult.Success) - // .Verifiable(); - // mockUserManager.Setup(x => x.SetLockoutEndDateAsync(user2, It.IsAny())) - // .ReturnsAsync(IdentityResult.Success) - // .Verifiable(); - // - // var response = await usersController.PostUnlockUsers(userIdsToLock); - // - // Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); - // - // var responseContent = response.Content as ObjectContent; - // var notifications = responseContent?.Value as SimpleNotificationModel; - // Assert.NotNull(notifications); - // Assert.AreEqual(userIdsToLock.Length.ToString(), notifications.Message); - // mockUserManager.Verify(); - // } + [Test] + public async Task PostUnlockUsers_When_One_UserId_Supplied_Expect_User_Locked_Out_With_Correct_Response_Message() + { + var userService = GetRequiredService(); + + var user = new UserBuilder() + .AddUserGroup() + .WithAlias("writer") // Needs to be an existing alias + .Done() + .WithIsLockedOut(true, DateTime.UtcNow) + .Build(); + + userService.Save(user); + var url = PrepareUrl(x => x.PostUnlockUsers(new []{user.Id})); + + // Act + var response = await Client.PostAsync(url, new StringContent(string.Empty)); + var body = await response.Content.ReadAsStringAsync(); + body = body.TrimStart(AngularJsonMediaTypeFormatter.XsrfPrefix); + Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); + var actual = JsonConvert.DeserializeObject(body, new JsonSerializerSettings + { + ContractResolver = new IgnoreRequiredAttributsResolver() + }); + + Assert.Multiple(() => + { + Assert.NotNull(actual); + Assert.AreEqual($"{user.Name} is now unlocked", actual.Message); + }); + } + + [Test] + public async Task PostUnlockUsers_When_Multiple_UserIds_Supplied_Expect_User_Locked_Out_With_Correct_Response_Message() + { + var numberOfUsers = 3; + var userService = GetRequiredService(); + + var users = new List(); + for (int i = 0; i < numberOfUsers; i++) + { + users.Add(new UserBuilder() + .WithName($"Test User {i}") + .WithEmail($"TestUser{i}@umbraco.com") + .WithUsername($"TestUser{i}") + .AddUserGroup() + .WithAlias("writer") // Needs to be an existing alias + .Done() + .WithIsLockedOut(true, DateTime.UtcNow) + .Build()); + } + + foreach (var user in users) + { + userService.Save(user); + } + + + + var url = PrepareUrl(x => x.PostUnlockUsers(users.Select(x=>x.Id).ToArray())); + + // Act + var response = await Client.PostAsync(url, new StringContent(string.Empty)); + var body = await response.Content.ReadAsStringAsync(); + body = body.TrimStart(AngularJsonMediaTypeFormatter.XsrfPrefix); + Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); + var actual = JsonConvert.DeserializeObject(body, new JsonSerializerSettings + { + ContractResolver = new IgnoreRequiredAttributsResolver() + }); + + Assert.Multiple(() => + { + Assert.NotNull(actual); + Assert.AreEqual($"Unlocked {users.Count()} users", actual.Message); + }); + } // // [Test] // public async Task GetPagedUsers_Fips() diff --git a/src/Umbraco.Tests/Security/BackOfficeOwinUserManagerTests.cs b/src/Umbraco.Tests/Security/BackOfficeOwinUserManagerTests.cs index 2f31c9d6b2..8958eabd42 100644 --- a/src/Umbraco.Tests/Security/BackOfficeOwinUserManagerTests.cs +++ b/src/Umbraco.Tests/Security/BackOfficeOwinUserManagerTests.cs @@ -23,7 +23,7 @@ namespace Umbraco.Tests.Security const string v7Hash = "7Uob6fMTTxDIhWGebYiSxg==P+hgvWlXLbDd4cFLADn811KOaVI/9pg1PNvTuG5NklY="; const string plaintext = "4XxzH3s3&J"; - var mockPasswordConfiguration = new Mock(); + var mockPasswordConfiguration = new Mock(); var mockIpResolver = new Mock(); var mockUserStore = new Mock>(); var mockDataProtectionProvider = new Mock(); diff --git a/src/Umbraco.Tests/Templates/ViewHelperTests.cs b/src/Umbraco.Tests/Templates/ViewHelperTests.cs index ee7264eaec..ca304d5cda 100644 --- a/src/Umbraco.Tests/Templates/ViewHelperTests.cs +++ b/src/Umbraco.Tests/Templates/ViewHelperTests.cs @@ -10,7 +10,7 @@ namespace Umbraco.Tests.Templates public void NoOptions() { var view = ViewHelper.GetDefaultFileContent(); - Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Mvc.UmbracoViewPage + Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Common.AspNetCore.UmbracoViewPage @{ Layout = null; }"), FixView(view)); @@ -20,7 +20,7 @@ namespace Umbraco.Tests.Templates public void Layout() { var view = ViewHelper.GetDefaultFileContent(layoutPageAlias: "Dharznoik"); - Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Mvc.UmbracoViewPage + Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Common.AspNetCore.UmbracoViewPage @{ Layout = ""Dharznoik.cshtml""; }"), FixView(view)); @@ -30,7 +30,7 @@ namespace Umbraco.Tests.Templates public void ClassName() { var view = ViewHelper.GetDefaultFileContent(modelClassName: "ClassName"); - Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Mvc.UmbracoViewPage + Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Common.AspNetCore.UmbracoViewPage @{ Layout = null; }"), FixView(view)); @@ -40,7 +40,7 @@ namespace Umbraco.Tests.Templates public void Namespace() { var view = ViewHelper.GetDefaultFileContent(modelNamespace: "Models"); - Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Mvc.UmbracoViewPage + Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Common.AspNetCore.UmbracoViewPage @{ Layout = null; }"), FixView(view)); @@ -50,7 +50,7 @@ namespace Umbraco.Tests.Templates public void ClassNameAndNamespace() { var view = ViewHelper.GetDefaultFileContent(modelClassName: "ClassName", modelNamespace: "My.Models"); - Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Mvc.UmbracoViewPage + Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Common.AspNetCore.UmbracoViewPage @using ContentModels = My.Models; @{ Layout = null; @@ -61,7 +61,7 @@ namespace Umbraco.Tests.Templates public void ClassNameAndNamespaceAndAlias() { var view = ViewHelper.GetDefaultFileContent(modelClassName: "ClassName", modelNamespace: "My.Models", modelNamespaceAlias: "MyModels"); - Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Mvc.UmbracoViewPage + Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Common.AspNetCore.UmbracoViewPage @using MyModels = My.Models; @{ Layout = null; @@ -72,7 +72,7 @@ namespace Umbraco.Tests.Templates public void Combined() { var view = ViewHelper.GetDefaultFileContent(layoutPageAlias: "Dharznoik", modelClassName: "ClassName", modelNamespace: "My.Models", modelNamespaceAlias: "MyModels"); - Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Mvc.UmbracoViewPage + Assert.AreEqual(FixView(@"@inherits Umbraco.Web.Common.AspNetCore.UmbracoViewPage @using MyModels = My.Models; @{ Layout = ""Dharznoik.cshtml""; diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects.cs b/src/Umbraco.Tests/TestHelpers/TestObjects.cs index 9a9b4e08c3..efd5feb2e0 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects.cs @@ -99,6 +99,7 @@ namespace Umbraco.Tests.TestHelpers IEventMessagesFactory eventMessagesFactory, UrlSegmentProviderCollection urlSegmentProviders, IUmbracoVersion umbracoVersion, + IHostingEnvironment hostingEnvironment, IFactory factory = null) { if (scopeProvider == null) throw new ArgumentNullException(nameof(scopeProvider)); @@ -167,7 +168,7 @@ namespace Umbraco.Tests.TestHelpers var mediaService = GetLazyService(factory, c => new MediaService(scopeProvider, mediaFileSystem, logger, eventMessagesFactory, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), TestHelper.ShortStringHelper)); var contentTypeService = GetLazyService(factory, c => new ContentTypeService(scopeProvider, logger, eventMessagesFactory, contentService.Value, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c))); var mediaTypeService = GetLazyService(factory, c => new MediaTypeService(scopeProvider, logger, eventMessagesFactory, mediaService.Value, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c))); - var fileService = GetLazyService(factory, c => new FileService(scopeProvider, ioHelper, logger, eventMessagesFactory, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), TestHelper.ShortStringHelper, globalSettings)); + var fileService = GetLazyService(factory, c => new FileService(scopeProvider, logger, eventMessagesFactory, GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), GetRepo(c), TestHelper.ShortStringHelper, globalSettings, hostingEnvironment)); var memberTypeService = GetLazyService(factory, c => new MemberTypeService(scopeProvider, logger, eventMessagesFactory, memberService.Value, GetRepo(c), GetRepo(c), GetRepo(c))); var entityService = GetLazyService(factory, c => new EntityService(scopeProvider, logger, eventMessagesFactory, idkMap, GetRepo(c))); diff --git a/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs b/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs index 92560cf485..58718a4064 100644 --- a/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/UsersControllerTests.cs @@ -1,526 +1,526 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Net.Http.Formatting; -using System.Reflection; -using System.Security.Cryptography; -using System.Threading.Tasks; -using System.Web.Http; -using System.Web.Http.Controllers; -using System.Web.Http.Hosting; -using Microsoft.AspNetCore.Identity; -using Microsoft.Owin; -using Moq; -using Newtonsoft.Json; -using NUnit.Framework; -using Umbraco.Core; -using Umbraco.Core.Cache; -using Umbraco.Web.Composing; -using Umbraco.Core.Configuration; -using Umbraco.Core.IO; -using Umbraco.Core.Logging; -using Umbraco.Core.Models; -using Umbraco.Core.Models.Membership; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.Mappers; -using Umbraco.Core.Persistence.Querying; -using Umbraco.Core.Services; -using Umbraco.Tests.TestHelpers; -using Umbraco.Tests.TestHelpers.ControllerTesting; -using Umbraco.Tests.TestHelpers.Entities; -using Umbraco.Tests.Testing; -using Umbraco.Web; -using Umbraco.Web.Editors; -using Umbraco.Web.Features; -using Umbraco.Web.Models.ContentEditing; -using IUser = Umbraco.Core.Models.Membership.IUser; -using Umbraco.Core.Mapping; -using Umbraco.Core.Configuration.UmbracoSettings; -using Umbraco.Core.Hosting; -using Umbraco.Web.Routing; -using Umbraco.Core.Media; -using Umbraco.Net; -using Umbraco.Persistance.SqlCe; -using Umbraco.Web.Security; -using BackOfficeIdentityUser = Umbraco.Core.BackOffice.BackOfficeIdentityUser; - -namespace Umbraco.Tests.Web.Controllers -{ - [TestFixture] - [UmbracoTest(Database = UmbracoTestOptions.Database.None)] - public class UsersControllerTests : TestWithDatabaseBase - { - protected override void ComposeApplication(bool withApplication) - { - base.ComposeApplication(withApplication); - //if (!withApplication) return; - - // replace the true IUserService implementation with a mock - // so that each test can configure the service to their liking - Composition.RegisterUnique(f => Mock.Of()); - - // kill the true IEntityService too - Composition.RegisterUnique(f => Mock.Of()); - - Composition.RegisterUnique(); - } - - [Test] - public async Task Save_User() - { - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) - { - var userServiceMock = Mock.Get(ServiceContext.UserService); - - userServiceMock.Setup(service => service.Save(It.IsAny(), It.IsAny())) - .Callback((IUser u, bool raiseEvents) => - { - u.Id = 1234; - }); - userServiceMock.Setup(service => service.GetAllUserGroups(It.IsAny())) - .Returns(new[] { Mock.Of(group => group.Id == 123 && group.Alias == "writers" && group.Name == "Writers") }); - userServiceMock.Setup(service => service.GetUserGroupsByAlias(It.IsAny())) - .Returns(new[] { Mock.Of(group => group.Id == 123 && group.Alias == "writers" && group.Name == "Writers") }); - userServiceMock.Setup(service => service.GetUserById(It.IsAny())) - .Returns((int id) => id == 1234 ? new User(TestObjects.GetGlobalSettings(), 1234, "Test", "test@test.com", "test@test.com", "", null, new List(), new int[0], new int[0]) : null); - - var usersController = new UsersController( - Factory.GetInstance(), - umbracoContextAccessor, - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - ShortStringHelper, - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance() - - ); - return usersController; - } - - var userSave = new UserSave - { - Id = 1234, - Email = "test@test.com", - Username = "test@test.com", - Culture = "en", - Name = "Test", - UserGroups = new[] { "writers" } - }; - - var runner = new TestRunner(CtrlFactory); - var response = await runner.Execute("Users", "PostSaveUser", HttpMethod.Post, - new ObjectContent(userSave, new JsonMediaTypeFormatter())); - var obj = JsonConvert.DeserializeObject(response.Item2); - - Assert.AreEqual(userSave.Name, obj.Name); - Assert.AreEqual(1234, obj.Id); - Assert.AreEqual(userSave.Email, obj.Email); - var userGroupAliases = obj.UserGroups.Select(x => x.Alias).ToArray(); - foreach (var group in userSave.UserGroups) - { - Assert.IsTrue(userGroupAliases.Contains(group)); - } - } - - private void MockForGetPagedUsers() - { - Mock.Get(Current.SqlContext) - .Setup(x => x.Query()) - .Returns(new Query(Current.SqlContext)); - - var syntax = new SqlCeSyntaxProvider(); - - Mock.Get(Current.SqlContext) - .Setup(x => x.SqlSyntax) - .Returns(syntax); - - var mappers = new MapperCollection(new [] - { - new UserMapper(new Lazy(() => Current.SqlContext), new ConcurrentDictionary>()) - }); - - Mock.Get(Current.SqlContext) - .Setup(x => x.Mappers) - .Returns(mappers); - } - - [Test] - public async Task GetPagedUsers_Empty() - { - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) - { - var usersController = new UsersController( - Factory.GetInstance(), - umbracoContextAccessor, - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - ShortStringHelper, - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance() - ); - return usersController; - } - - MockForGetPagedUsers(); - - var runner = new TestRunner(CtrlFactory); - var response = await runner.Execute("Users", "GetPagedUsers", HttpMethod.Get); - - var obj = JsonConvert.DeserializeObject>(response.Item2); - Assert.AreEqual(0, obj.TotalItems); - } - - [Test] - public async Task GetPagedUsers_10() - { - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) - { - //setup some mocks - var userServiceMock = Mock.Get(ServiceContext.UserService); - var users = MockedUser.CreateMulipleUsers(10); - long outVal = 10; - userServiceMock.Setup(service => service.GetAll( - It.IsAny(), It.IsAny(), out outVal, It.IsAny(), It.IsAny(), - It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) - .Returns(() => users); - - var usersController = new UsersController( - Factory.GetInstance(), - umbracoContextAccessor, - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - ShortStringHelper, - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance() - ); - return usersController; - } - - MockForGetPagedUsers(); - - var runner = new TestRunner(CtrlFactory); - var response = await runner.Execute("Users", "GetPagedUsers", HttpMethod.Get); - - var obj = JsonConvert.DeserializeObject>(response.Item2); - Assert.AreEqual(10, obj.TotalItems); - Assert.AreEqual(10, obj.Items.Count()); - } - - [Test] - public async Task GetPagedUsers_Fips() - { - await RunFipsTest("GetPagedUsers", mock => - { - var users = MockedUser.CreateMulipleUsers(10); - long outVal = 10; - mock.Setup(service => service.GetAll( - It.IsAny(), It.IsAny(), out outVal, It.IsAny(), It.IsAny(), - It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) - .Returns(() => users); - }, response => - { - var obj = JsonConvert.DeserializeObject>(response.Item2); - Assert.AreEqual(10, obj.TotalItems); - Assert.AreEqual(10, obj.Items.Count()); - }); - } - - [Test] - public async Task GetById_Fips() - { - const int mockUserId = 1234; - var user = MockedUser.CreateUser(); - - await RunFipsTest("GetById", mock => - { - mock.Setup(service => service.GetUserById(1234)) - .Returns((int i) => i == mockUserId ? user : null); - }, response => - { - var obj = JsonConvert.DeserializeObject(response.Item2); - Assert.AreEqual(user.Username, obj.Username); - Assert.AreEqual(user.Email, obj.Email); - }, new { controller = "Users", action = "GetById" }, $"Users/GetById/{mockUserId}"); - } - - - private async Task RunFipsTest(string action, Action> userServiceSetup, - Action> verification, - object routeDefaults = null, string url = null) - { - ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) - { - //setup some mocks - var userServiceMock = Mock.Get(ServiceContext.UserService); - userServiceSetup(userServiceMock); - - var usersController = new UsersController( - Factory.GetInstance(), - umbracoContextAccessor, - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - ShortStringHelper, - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance() - ); - return usersController; - } - - // Testing what happens if the system were configured to only use FIPS-compliant algorithms - var typ = typeof(CryptoConfig); - var flds = typ.GetFields(BindingFlags.Static | BindingFlags.NonPublic); - var haveFld = flds.FirstOrDefault(f => f.Name == "s_haveFipsAlgorithmPolicy"); - var isFld = flds.FirstOrDefault(f => f.Name == "s_fipsAlgorithmPolicy"); - var originalFipsValue = CryptoConfig.AllowOnlyFipsAlgorithms; - - try - { - if (!originalFipsValue) - { - haveFld.SetValue(null, true); - isFld.SetValue(null, true); - } - - MockForGetPagedUsers(); - - var runner = new TestRunner(CtrlFactory); - var response = await runner.Execute("Users", action, HttpMethod.Get, routeDefaults: routeDefaults, url: url); - verification(response); - } - finally - { - if (!originalFipsValue) - { - haveFld.SetValue(null, false); - isFld.SetValue(null, false); - } - } - } - - [Test] - public async Task PostUnlockUsers_When_UserIds_Not_Supplied_Expect_Ok_Response() - { - var usersController = CreateSut(); - - usersController.Request = new HttpRequestMessage(); - - var response = await usersController.PostUnlockUsers(new int[0]); - - Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); - } - - [Test] - public void PostUnlockUsers_When_User_Does_Not_Exist_Expect_InvalidOperationException() - { - var mockUserManager = CreateMockUserManager(); - var usersController = CreateSut(mockUserManager); - - mockUserManager.Setup(x => x.FindByIdAsync(It.IsAny())) - .ReturnsAsync((BackOfficeIdentityUser) null); - - Assert.ThrowsAsync(async () => await usersController.PostUnlockUsers(new[] {1})); - } - - [Test] - public async Task PostUnlockUsers_When_User_Lockout_Update_Fails_Expect_Failure_Response() - { - var mockUserManager = CreateMockUserManager(); - var usersController = CreateSut(mockUserManager); - - const string expectedMessage = "identity error!"; - var user = new BackOfficeIdentityUser( - new Mock().Object, - 1, - new List()) - { - Name = "bob" - }; - - mockUserManager.Setup(x => x.FindByIdAsync(It.IsAny())) - .ReturnsAsync(user); - mockUserManager.Setup(x => x.SetLockoutEndDateAsync(user, It.IsAny())) - .ReturnsAsync(IdentityResult.Failed(new IdentityError {Description = expectedMessage})); - - var response = await usersController.PostUnlockUsers(new[] { 1 }); - - Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); - Assert.True(response.Headers.TryGetValues("X-Status-Reason", out var values)); - Assert.True(values.Contains("Validation failed")); - - var responseContent = response.Content as ObjectContent; - var responseValue = responseContent?.Value as HttpError; - Assert.NotNull(responseValue); - Assert.True(responseValue.Message.Contains(expectedMessage)); - Assert.True(responseValue.Message.Contains(user.Id.ToString())); - } - - [Test] - public async Task PostUnlockUsers_When_One_UserId_Supplied_Expect_User_Locked_Out_With_Correct_Response_Message() - { - var mockUserManager = CreateMockUserManager(); - var usersController = CreateSut(mockUserManager); - - var user = new BackOfficeIdentityUser( - new Mock().Object, - 1, - new List()) - { - Name = "bob" - }; - - mockUserManager.Setup(x => x.FindByIdAsync(user.Id.ToString())) - .ReturnsAsync(user); - mockUserManager.Setup(x => x.SetLockoutEndDateAsync(user, It.IsAny())) - .ReturnsAsync(IdentityResult.Success) - .Verifiable(); - - var response = await usersController.PostUnlockUsers(new[] { user.Id }); - - Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); - - var responseContent = response.Content as ObjectContent; - var notifications = responseContent?.Value as SimpleNotificationModel; - Assert.NotNull(notifications); - Assert.AreEqual(user.Name, notifications.Message); - mockUserManager.Verify(); - } - - [Test] - public async Task PostUnlockUsers_When_Multiple_UserIds_Supplied_Expect_User_Locked_Out_With_Correct_Response_Message() - { - var mockUserManager = CreateMockUserManager(); - var usersController = CreateSut(mockUserManager); - - var user1 = new BackOfficeIdentityUser( - new Mock().Object, - 1, - new List()) - { - Name = "bob" - }; - var user2 = new BackOfficeIdentityUser( - new Mock().Object, - 2, - new List()) - { - Name = "alice" - }; - var userIdsToLock = new[] {user1.Id, user2.Id}; - - mockUserManager.Setup(x => x.FindByIdAsync(user1.Id.ToString())) - .ReturnsAsync(user1); - mockUserManager.Setup(x => x.FindByIdAsync(user2.Id.ToString())) - .ReturnsAsync(user2); - mockUserManager.Setup(x => x.SetLockoutEndDateAsync(user1, It.IsAny())) - .ReturnsAsync(IdentityResult.Success) - .Verifiable(); - mockUserManager.Setup(x => x.SetLockoutEndDateAsync(user2, It.IsAny())) - .ReturnsAsync(IdentityResult.Success) - .Verifiable(); - - var response = await usersController.PostUnlockUsers(userIdsToLock); - - Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); - - var responseContent = response.Content as ObjectContent; - var notifications = responseContent?.Value as SimpleNotificationModel; - Assert.NotNull(notifications); - Assert.AreEqual(userIdsToLock.Length.ToString(), notifications.Message); - mockUserManager.Verify(); - } - - private UsersController CreateSut(IMock mockUserManager = null) - { - var mockLocalizedTextService = new Mock(); - mockLocalizedTextService.Setup(x => x.Localize(It.IsAny(), It.IsAny(), It.IsAny>())) - .Returns((string key, CultureInfo ci, IDictionary tokens) - => tokens.Aggregate("", (current, next) => current + (current == string.Empty ? "" : ",") + next.Value)); - - var usersController = new UsersController( - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - ServiceContext.CreatePartial(localizedTextService: mockLocalizedTextService.Object), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - ShortStringHelper, - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance(), - Factory.GetInstance()); - - var mockOwinContext = new Mock(); - var mockUserManagerMarker = new Mock(); - - mockOwinContext.Setup(x => x.Get(It.IsAny())) - .Returns(mockUserManagerMarker.Object); - mockUserManagerMarker.Setup(x => x.GetManager(It.IsAny())) - .Returns(mockUserManager?.Object ?? CreateMockUserManager().Object); - - usersController.Request = new HttpRequestMessage(); - usersController.Request.Properties["MS_OwinContext"] = mockOwinContext.Object; - usersController.Request.Properties[HttpPropertyKeys.RequestContextKey] = new HttpRequestContext {Configuration = new HttpConfiguration()}; - - return usersController; - } - - private static Mock CreateMockUserManager() - { - return new Mock( - new Mock().Object, - new Mock().Object, - new Mock>().Object, - null, null, null, null, null, null, null); - } - } -} +// using System; +// using System.Collections.Concurrent; +// using System.Collections.Generic; +// using System.Globalization; +// using System.Linq; +// using System.Net; +// using System.Net.Http; +// using System.Net.Http.Formatting; +// using System.Reflection; +// using System.Security.Cryptography; +// using System.Threading.Tasks; +// using System.Web.Http; +// using System.Web.Http.Controllers; +// using System.Web.Http.Hosting; +// using Microsoft.AspNetCore.Identity; +// using Microsoft.Owin; +// using Moq; +// using Newtonsoft.Json; +// using NUnit.Framework; +// using Umbraco.Core; +// using Umbraco.Core.Cache; +// using Umbraco.Web.Composing; +// using Umbraco.Core.Configuration; +// using Umbraco.Core.IO; +// using Umbraco.Core.Logging; +// using Umbraco.Core.Models; +// using Umbraco.Core.Models.Membership; +// using Umbraco.Core.Persistence; +// using Umbraco.Core.Persistence.Mappers; +// using Umbraco.Core.Persistence.Querying; +// using Umbraco.Core.Services; +// using Umbraco.Tests.TestHelpers; +// using Umbraco.Tests.TestHelpers.ControllerTesting; +// using Umbraco.Tests.TestHelpers.Entities; +// using Umbraco.Tests.Testing; +// using Umbraco.Web; +// using Umbraco.Web.Editors; +// using Umbraco.Web.Features; +// using Umbraco.Web.Models.ContentEditing; +// using IUser = Umbraco.Core.Models.Membership.IUser; +// using Umbraco.Core.Mapping; +// using Umbraco.Core.Configuration.UmbracoSettings; +// using Umbraco.Core.Hosting; +// using Umbraco.Web.Routing; +// using Umbraco.Core.Media; +// using Umbraco.Net; +// using Umbraco.Persistance.SqlCe; +// using Umbraco.Web.Security; +// using BackOfficeIdentityUser = Umbraco.Core.BackOffice.BackOfficeIdentityUser; +// +// namespace Umbraco.Tests.Web.Controllers +// { +// [TestFixture] +// [UmbracoTest(Database = UmbracoTestOptions.Database.None)] +// public class UsersControllerTests : TestWithDatabaseBase +// { +// protected override void ComposeApplication(bool withApplication) +// { +// base.ComposeApplication(withApplication); +// //if (!withApplication) return; +// +// // replace the true IUserService implementation with a mock +// // so that each test can configure the service to their liking +// Composition.RegisterUnique(f => Mock.Of()); +// +// // kill the true IEntityService too +// Composition.RegisterUnique(f => Mock.Of()); +// +// Composition.RegisterUnique(); +// } +// +// [Test] +// public async Task Save_User() +// { +// ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) +// { +// var userServiceMock = Mock.Get(ServiceContext.UserService); +// +// userServiceMock.Setup(service => service.Save(It.IsAny(), It.IsAny())) +// .Callback((IUser u, bool raiseEvents) => +// { +// u.Id = 1234; +// }); +// userServiceMock.Setup(service => service.GetAllUserGroups(It.IsAny())) +// .Returns(new[] { Mock.Of(group => group.Id == 123 && group.Alias == "writers" && group.Name == "Writers") }); +// userServiceMock.Setup(service => service.GetUserGroupsByAlias(It.IsAny())) +// .Returns(new[] { Mock.Of(group => group.Id == 123 && group.Alias == "writers" && group.Name == "Writers") }); +// userServiceMock.Setup(service => service.GetUserById(It.IsAny())) +// .Returns((int id) => id == 1234 ? new User(TestObjects.GetGlobalSettings(), 1234, "Test", "test@test.com", "test@test.com", "", null, new List(), new int[0], new int[0]) : null); +// +// var usersController = new UsersController( +// Factory.GetInstance(), +// umbracoContextAccessor, +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// ShortStringHelper, +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance() +// +// ); +// return usersController; +// } +// +// var userSave = new UserSave +// { +// Id = 1234, +// Email = "test@test.com", +// Username = "test@test.com", +// Culture = "en", +// Name = "Test", +// UserGroups = new[] { "writers" } +// }; +// +// var runner = new TestRunner(CtrlFactory); +// var response = await runner.Execute("Users", "PostSaveUser", HttpMethod.Post, +// new ObjectContent(userSave, new JsonMediaTypeFormatter())); +// var obj = JsonConvert.DeserializeObject(response.Item2); +// +// Assert.AreEqual(userSave.Name, obj.Name); +// Assert.AreEqual(1234, obj.Id); +// Assert.AreEqual(userSave.Email, obj.Email); +// var userGroupAliases = obj.UserGroups.Select(x => x.Alias).ToArray(); +// foreach (var group in userSave.UserGroups) +// { +// Assert.IsTrue(userGroupAliases.Contains(group)); +// } +// } +// +// private void MockForGetPagedUsers() +// { +// Mock.Get(Current.SqlContext) +// .Setup(x => x.Query()) +// .Returns(new Query(Current.SqlContext)); +// +// var syntax = new SqlCeSyntaxProvider(); +// +// Mock.Get(Current.SqlContext) +// .Setup(x => x.SqlSyntax) +// .Returns(syntax); +// +// var mappers = new MapperCollection(new [] +// { +// new UserMapper(new Lazy(() => Current.SqlContext), new ConcurrentDictionary>()) +// }); +// +// Mock.Get(Current.SqlContext) +// .Setup(x => x.Mappers) +// .Returns(mappers); +// } +// +// [Test] +// public async Task GetPagedUsers_Empty() +// { +// ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) +// { +// var usersController = new UsersController( +// Factory.GetInstance(), +// umbracoContextAccessor, +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// ShortStringHelper, +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance() +// ); +// return usersController; +// } +// +// MockForGetPagedUsers(); +// +// var runner = new TestRunner(CtrlFactory); +// var response = await runner.Execute("Users", "GetPagedUsers", HttpMethod.Get); +// +// var obj = JsonConvert.DeserializeObject>(response.Item2); +// Assert.AreEqual(0, obj.TotalItems); +// } +// +// [Test] +// public async Task GetPagedUsers_10() +// { +// ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) +// { +// //setup some mocks +// var userServiceMock = Mock.Get(ServiceContext.UserService); +// var users = MockedUser.CreateMulipleUsers(10); +// long outVal = 10; +// userServiceMock.Setup(service => service.GetAll( +// It.IsAny(), It.IsAny(), out outVal, It.IsAny(), It.IsAny(), +// It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) +// .Returns(() => users); +// +// var usersController = new UsersController( +// Factory.GetInstance(), +// umbracoContextAccessor, +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// ShortStringHelper, +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance() +// ); +// return usersController; +// } +// +// MockForGetPagedUsers(); +// +// var runner = new TestRunner(CtrlFactory); +// var response = await runner.Execute("Users", "GetPagedUsers", HttpMethod.Get); +// +// var obj = JsonConvert.DeserializeObject>(response.Item2); +// Assert.AreEqual(10, obj.TotalItems); +// Assert.AreEqual(10, obj.Items.Count()); +// } +// +// [Test] +// public async Task GetPagedUsers_Fips() +// { +// await RunFipsTest("GetPagedUsers", mock => +// { +// var users = MockedUser.CreateMulipleUsers(10); +// long outVal = 10; +// mock.Setup(service => service.GetAll( +// It.IsAny(), It.IsAny(), out outVal, It.IsAny(), It.IsAny(), +// It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())) +// .Returns(() => users); +// }, response => +// { +// var obj = JsonConvert.DeserializeObject>(response.Item2); +// Assert.AreEqual(10, obj.TotalItems); +// Assert.AreEqual(10, obj.Items.Count()); +// }); +// } +// +// [Test] +// public async Task GetById_Fips() +// { +// const int mockUserId = 1234; +// var user = MockedUser.CreateUser(); +// +// await RunFipsTest("GetById", mock => +// { +// mock.Setup(service => service.GetUserById(1234)) +// .Returns((int i) => i == mockUserId ? user : null); +// }, response => +// { +// var obj = JsonConvert.DeserializeObject(response.Item2); +// Assert.AreEqual(user.Username, obj.Username); +// Assert.AreEqual(user.Email, obj.Email); +// }, new { controller = "Users", action = "GetById" }, $"Users/GetById/{mockUserId}"); +// } +// +// +// private async Task RunFipsTest(string action, Action> userServiceSetup, +// Action> verification, +// object routeDefaults = null, string url = null) +// { +// ApiController CtrlFactory(HttpRequestMessage message, IUmbracoContextAccessor umbracoContextAccessor) +// { +// //setup some mocks +// var userServiceMock = Mock.Get(ServiceContext.UserService); +// userServiceSetup(userServiceMock); +// +// var usersController = new UsersController( +// Factory.GetInstance(), +// umbracoContextAccessor, +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// ShortStringHelper, +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance() +// ); +// return usersController; +// } +// +// // Testing what happens if the system were configured to only use FIPS-compliant algorithms +// var typ = typeof(CryptoConfig); +// var flds = typ.GetFields(BindingFlags.Static | BindingFlags.NonPublic); +// var haveFld = flds.FirstOrDefault(f => f.Name == "s_haveFipsAlgorithmPolicy"); +// var isFld = flds.FirstOrDefault(f => f.Name == "s_fipsAlgorithmPolicy"); +// var originalFipsValue = CryptoConfig.AllowOnlyFipsAlgorithms; +// +// try +// { +// if (!originalFipsValue) +// { +// haveFld.SetValue(null, true); +// isFld.SetValue(null, true); +// } +// +// MockForGetPagedUsers(); +// +// var runner = new TestRunner(CtrlFactory); +// var response = await runner.Execute("Users", action, HttpMethod.Get, routeDefaults: routeDefaults, url: url); +// verification(response); +// } +// finally +// { +// if (!originalFipsValue) +// { +// haveFld.SetValue(null, false); +// isFld.SetValue(null, false); +// } +// } +// } +// +// [Test] +// public async Task PostUnlockUsers_When_UserIds_Not_Supplied_Expect_Ok_Response() +// { +// var usersController = CreateSut(); +// +// usersController.Request = new HttpRequestMessage(); +// +// var response = await usersController.PostUnlockUsers(new int[0]); +// +// Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); +// } +// +// [Test] +// public void PostUnlockUsers_When_User_Does_Not_Exist_Expect_InvalidOperationException() +// { +// var mockUserManager = CreateMockUserManager(); +// var usersController = CreateSut(mockUserManager); +// +// mockUserManager.Setup(x => x.FindByIdAsync(It.IsAny())) +// .ReturnsAsync((BackOfficeIdentityUser) null); +// +// Assert.ThrowsAsync(async () => await usersController.PostUnlockUsers(new[] {1})); +// } +// +// [Test] +// public async Task PostUnlockUsers_When_User_Lockout_Update_Fails_Expect_Failure_Response() +// { +// var mockUserManager = CreateMockUserManager(); +// var usersController = CreateSut(mockUserManager); +// +// const string expectedMessage = "identity error!"; +// var user = new BackOfficeIdentityUser( +// new Mock().Object, +// 1, +// new List()) +// { +// Name = "bob" +// }; +// +// mockUserManager.Setup(x => x.FindByIdAsync(It.IsAny())) +// .ReturnsAsync(user); +// mockUserManager.Setup(x => x.SetLockoutEndDateAsync(user, It.IsAny())) +// .ReturnsAsync(IdentityResult.Failed(new IdentityError {Description = expectedMessage})); +// +// var response = await usersController.PostUnlockUsers(new[] { 1 }); +// +// Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode); +// Assert.True(response.Headers.TryGetValues("X-Status-Reason", out var values)); +// Assert.True(values.Contains("Validation failed")); +// +// var responseContent = response.Content as ObjectContent; +// var responseValue = responseContent?.Value as HttpError; +// Assert.NotNull(responseValue); +// Assert.True(responseValue.Message.Contains(expectedMessage)); +// Assert.True(responseValue.Message.Contains(user.Id.ToString())); +// } +// +// [Test] +// public async Task PostUnlockUsers_When_One_UserId_Supplied_Expect_User_Locked_Out_With_Correct_Response_Message() +// { +// var mockUserManager = CreateMockUserManager(); +// var usersController = CreateSut(mockUserManager); +// +// var user = new BackOfficeIdentityUser( +// new Mock().Object, +// 1, +// new List()) +// { +// Name = "bob" +// }; +// +// mockUserManager.Setup(x => x.FindByIdAsync(user.Id.ToString())) +// .ReturnsAsync(user); +// mockUserManager.Setup(x => x.SetLockoutEndDateAsync(user, It.IsAny())) +// .ReturnsAsync(IdentityResult.Success) +// .Verifiable(); +// +// var response = await usersController.PostUnlockUsers(new[] { user.Id }); +// +// Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); +// +// var responseContent = response.Content as ObjectContent; +// var notifications = responseContent?.Value as SimpleNotificationModel; +// Assert.NotNull(notifications); +// Assert.AreEqual(user.Name, notifications.Message); +// mockUserManager.Verify(); +// } +// +// [Test] +// public async Task PostUnlockUsers_When_Multiple_UserIds_Supplied_Expect_User_Locked_Out_With_Correct_Response_Message() +// { +// var mockUserManager = CreateMockUserManager(); +// var usersController = CreateSut(mockUserManager); +// +// var user1 = new BackOfficeIdentityUser( +// new Mock().Object, +// 1, +// new List()) +// { +// Name = "bob" +// }; +// var user2 = new BackOfficeIdentityUser( +// new Mock().Object, +// 2, +// new List()) +// { +// Name = "alice" +// }; +// var userIdsToLock = new[] {user1.Id, user2.Id}; +// +// mockUserManager.Setup(x => x.FindByIdAsync(user1.Id.ToString())) +// .ReturnsAsync(user1); +// mockUserManager.Setup(x => x.FindByIdAsync(user2.Id.ToString())) +// .ReturnsAsync(user2); +// mockUserManager.Setup(x => x.SetLockoutEndDateAsync(user1, It.IsAny())) +// .ReturnsAsync(IdentityResult.Success) +// .Verifiable(); +// mockUserManager.Setup(x => x.SetLockoutEndDateAsync(user2, It.IsAny())) +// .ReturnsAsync(IdentityResult.Success) +// .Verifiable(); +// +// var response = await usersController.PostUnlockUsers(userIdsToLock); +// +// Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); +// +// var responseContent = response.Content as ObjectContent; +// var notifications = responseContent?.Value as SimpleNotificationModel; +// Assert.NotNull(notifications); +// Assert.AreEqual(userIdsToLock.Length.ToString(), notifications.Message); +// mockUserManager.Verify(); +// } +// +// private UsersController CreateSut(IMock mockUserManager = null) +// { +// var mockLocalizedTextService = new Mock(); +// mockLocalizedTextService.Setup(x => x.Localize(It.IsAny(), It.IsAny(), It.IsAny>())) +// .Returns((string key, CultureInfo ci, IDictionary tokens) +// => tokens.Aggregate("", (current, next) => current + (current == string.Empty ? "" : ",") + next.Value)); +// +// var usersController = new UsersController( +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// ServiceContext.CreatePartial(localizedTextService: mockLocalizedTextService.Object), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// ShortStringHelper, +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance(), +// Factory.GetInstance()); +// +// var mockOwinContext = new Mock(); +// var mockUserManagerMarker = new Mock(); +// +// mockOwinContext.Setup(x => x.Get(It.IsAny())) +// .Returns(mockUserManagerMarker.Object); +// mockUserManagerMarker.Setup(x => x.GetManager(It.IsAny())) +// .Returns(mockUserManager?.Object ?? CreateMockUserManager().Object); +// +// usersController.Request = new HttpRequestMessage(); +// usersController.Request.Properties["MS_OwinContext"] = mockOwinContext.Object; +// usersController.Request.Properties[HttpPropertyKeys.RequestContextKey] = new HttpRequestContext {Configuration = new HttpConfiguration()}; +// +// return usersController; +// } +// +// private static Mock CreateMockUserManager() +// { +// return new Mock( +// new Mock().Object, +// new Mock().Object, +// new Mock>().Object, +// null, null, null, null, null, null, null); +// } +// } +// } diff --git a/src/Umbraco.Web/Security/BackOfficeOwinUserManager.cs b/src/Umbraco.Web/Security/BackOfficeOwinUserManager.cs index 7bc5cd9294..771c3239b6 100644 --- a/src/Umbraco.Web/Security/BackOfficeOwinUserManager.cs +++ b/src/Umbraco.Web/Security/BackOfficeOwinUserManager.cs @@ -47,7 +47,7 @@ namespace Umbraco.Web.Security IExternalLoginService externalLoginService, IGlobalSettings globalSettings, UmbracoMapper mapper, - IPasswordConfiguration passwordConfiguration, + IUserPasswordConfiguration passwordConfiguration, IIpResolver ipResolver, BackOfficeIdentityErrorDescriber errors, IDataProtectionProvider dataProtectionProvider,