diff --git a/src/Umbraco.Tests.Common/Umbraco.Tests.Common.csproj b/src/Umbraco.Tests.Common/Umbraco.Tests.Common.csproj index 527d022be7..a4b67c51b7 100644 --- a/src/Umbraco.Tests.Common/Umbraco.Tests.Common.csproj +++ b/src/Umbraco.Tests.Common/Umbraco.Tests.Common.csproj @@ -1,13 +1,9 @@ - netcoreapp3.1 + netstandard2.0 - - - - diff --git a/src/Umbraco.Tests.Integration/TestServerTest/Controllers/UsersControllerTests.cs b/src/Umbraco.Tests.Integration/TestServerTest/Controllers/UsersControllerTests.cs index 024239c1af..16a05a7aaa 100644 --- a/src/Umbraco.Tests.Integration/TestServerTest/Controllers/UsersControllerTests.cs +++ b/src/Umbraco.Tests.Integration/TestServerTest/Controllers/UsersControllerTests.cs @@ -22,7 +22,7 @@ using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Tests.Integration.TestServerTest.Controllers { - // [Explicit("We need to fix the tests on buildserver and when running multiple tests in one run")] + [Explicit("We need to fix the tests on buildserver and when running multiple tests in one run")] [TestFixture] [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] public class UsersControllerTests : UmbracoTestServerTestBase @@ -175,40 +175,6 @@ 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())); - // } - // [Test] public async Task PostUnlockUsers_When_One_UserId_Supplied_Expect_User_Locked_Out_With_Correct_Response_Message() { @@ -286,42 +252,5 @@ namespace Umbraco.Tests.Integration.TestServerTest.Controllers Assert.AreEqual($"Unlocked {users.Count()} users", actual.Message); }); } - // - // [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}"); -// } } } diff --git a/src/Umbraco.Tests.Common/AutoFixture/AutoMoqDataAttribute.cs b/src/Umbraco.Tests.UnitTests/AutoFixture/AutoMoqDataAttribute.cs similarity index 62% rename from src/Umbraco.Tests.Common/AutoFixture/AutoMoqDataAttribute.cs rename to src/Umbraco.Tests.UnitTests/AutoFixture/AutoMoqDataAttribute.cs index 406d9a5a20..e3de162969 100644 --- a/src/Umbraco.Tests.Common/AutoFixture/AutoMoqDataAttribute.cs +++ b/src/Umbraco.Tests.UnitTests/AutoFixture/AutoMoqDataAttribute.cs @@ -1,11 +1,14 @@ using System; using AutoFixture; using AutoFixture.AutoMoq; +using AutoFixture.Kernel; using AutoFixture.NUnit3; -using Microsoft.AspNetCore.Mvc.ModelBinding; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; using Moq; using Umbraco.Core.BackOffice; using Umbraco.Core.Configuration; +using Umbraco.Web.BackOffice.Controllers; namespace Umbraco.Tests.Common.AutoFixture { @@ -24,11 +27,19 @@ namespace Umbraco.Tests.Common.AutoFixture { public void Customize(IFixture fixture) { - fixture.Customize(new AutoMoqCustomization()); - fixture.Customize(c => c.OmitAutoProperties()); fixture.Customize( u => u.FromFactory( (a,b,c) => BackOfficeIdentityUser.CreateNew(Mock.Of(),a,b,c))); + fixture + .Customize(new ConstructorCustomization(typeof(UsersController), new GreedyConstructorQuery())) + .Customize(new ConstructorCustomization(typeof(BackOfficeUserManager), new GreedyConstructorQuery())) + .Customize(new AutoMoqCustomization()); + + fixture.Customize>(cc => cc.FromFactory(() => Mock.Of>())); + + + + } } } diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/UsersControllerUnitTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/UsersControllerUnitTests.cs index 138d4902ec..f068108b90 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/UsersControllerUnitTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/UsersControllerUnitTests.cs @@ -1,46 +1,33 @@ -using System; +using System.Threading; using System.Threading.Tasks; using AutoFixture.NUnit3; using Microsoft.AspNetCore.Identity; using Moq; using NUnit.Framework; using Umbraco.Core.BackOffice; -using Umbraco.Core.Models.Membership; using Umbraco.Tests.Common.AutoFixture; using Umbraco.Web.BackOffice.Controllers; +using Umbraco.Web.Common.Exceptions; namespace Umbraco.Tests.Web.Controllers { [TestFixture] public class UsersControllerUnitTests { - [Test] - [AutoMoqData] - public void PostUnlockUsers_When_User_Lockout_Update_Fails_Expect_Failure_Response( - [Frozen(Matching.ParameterName)] Mock backOfficeUserManager, + [Test,AutoMoqData] + public async Task PostUnlockUsers_When_User_Lockout_Update_Fails_Expect_Failure_Response( + [Frozen] IUserStore userStore, UsersController sut, - BackOfficeIdentityUser[] users, + BackOfficeIdentityUser user, int[] userIds, string expectedMessage) { - for (var i = 0; i < userIds.Length; i++) - { - var userId = userIds[i]; - var user = users[i]; - backOfficeUserManager.Setup(x => x.FindByIdAsync(userId.ToString())) - .ReturnsAsync(user); - backOfficeUserManager.Setup(x => x.SetLockoutEndDateAsync(user, It.IsAny())) - .ReturnsAsync(IdentityResult.Failed(new IdentityError { Description = expectedMessage })); - } + Mock.Get(userStore) + .Setup(x => x.FindByIdAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(user); - var actual = sut.PostUnlockUsers(userIds); - - // - // - // Assert.Multiple(() => - // { - // - // }); + Assert.ThrowsAsync(() => sut.PostUnlockUsers(userIds)); } + } } diff --git a/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs index 5b193129ce..b7c1f6a2a8 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/TemplateRepositoryTest.cs @@ -92,7 +92,7 @@ namespace Umbraco.Tests.Persistence.Repositories Assert.That(repository.Get("test"), Is.Not.Null); Assert.That(_fileSystems.MvcViewsFileSystem.FileExists("test.cshtml"), Is.True); Assert.AreEqual( - @"@inherits Umbraco.Web.Mvc.UmbracoViewPage @{ Layout = null;}".StripWhitespace(), + @"@inherits Umbraco.Web.Common.AspNetCore.UmbracoViewPage @{ Layout = null;}".StripWhitespace(), template.Content.StripWhitespace()); } } @@ -118,7 +118,7 @@ namespace Umbraco.Tests.Persistence.Repositories Assert.That(repository.Get("test2"), Is.Not.Null); Assert.That(_fileSystems.MvcViewsFileSystem.FileExists("test2.cshtml"), Is.True); Assert.AreEqual( - "@inherits Umbraco.Web.Mvc.UmbracoViewPage @{ Layout = \"test.cshtml\";}".StripWhitespace(), + "@inherits Umbraco.Web.Common.AspNetCore.UmbracoViewPage @{ Layout = \"test.cshtml\";}".StripWhitespace(), template2.Content.StripWhitespace()); } } diff --git a/src/Umbraco.Web/HttpContextExtensions.cs b/src/Umbraco.Web/HttpContextExtensions.cs new file mode 100644 index 0000000000..76cfc0aff1 --- /dev/null +++ b/src/Umbraco.Web/HttpContextExtensions.cs @@ -0,0 +1,53 @@ +using System.Web; + +namespace Umbraco.Core +{ + public static class HttpContextExtensions + { + public static string GetCurrentRequestIpAddress(this HttpContextBase httpContext) + { + if (httpContext == null) + { + return "Unknown, httpContext is null"; + } + + HttpRequestBase request; + try + { + // is not null - throws + request = httpContext.Request; + } + catch + { + return "Unknown, httpContext.Request is null"; + } + + if (request.ServerVariables == null) + { + return "Unknown, httpContext.Request.ServerVariables is null"; + } + + // From: http://stackoverflow.com/a/740431/5018 + + try + { + var ipAddress = request.ServerVariables["HTTP_X_FORWARDED_FOR"]; + + if (string.IsNullOrEmpty(ipAddress)) + return request.UserHostAddress; + + var addresses = ipAddress.Split(','); + if (addresses.Length != 0) + return addresses[0]; + + return request.UserHostAddress; + } + catch (System.Exception ex) + { + //This try catch is to just always ensure that no matter what we're not getting any exceptions caused since + // that would cause people to not be able to login + return string.Format("Unknown, exception occurred trying to resolve IP {0}", ex); + } + } + } +} diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index e5d4537c85..7900585c01 100755 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -147,6 +147,7 @@ +