diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs index de10009dfd..3105a83a86 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Net; using System.Threading.Tasks; using AutoFixture.NUnit3; using Microsoft.AspNetCore.Identity; @@ -41,30 +42,55 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers ArgumentNullException exception = Assert.ThrowsAsync(() => sut.PostSave(null)); // assert - //Assert.That(exception.Message, Is.EqualTo("Exception of type 'Umbraco.Web.Common.Exceptions.HttpResponse...")); - //Assert.That(exception.HResult, Is.EqualTo(42)); + Assert.That(exception.Message, Is.EqualTo("Value cannot be null. (Parameter 'The member content item was null')")); } [Test] [AutoMoqData] public void PostSaveMember_WhenModelStateIsNotValid_ExpectFailureResponse( - MemberController sut) + [Frozen] IMembersUserManager umbracoMembersUserManager, + IMemberTypeService memberTypeService, + IDataTypeService dataTypeService, + IMemberService memberService, + MapDefinitionCollection memberMapDefinition, + PropertyEditorCollection propertyEditorCollection, + IBackOfficeSecurityAccessor backOfficeSecurityAccessor, + IBackOfficeSecurity backOfficeSecurity) { // arrange + Member member = SetupMemberTestData(memberMapDefinition, out UmbracoMapper mapper, out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew); + //Mock.Get(umbracoMembersUserManager) + // .Setup(x => x.CreateAsync(It.IsAny(), It.IsAny())) + // .ReturnsAsync(() => IdentityResult.Success); + //Mock.Get(umbracoMembersUserManager) + // .Setup(x => x.ValidatePasswordAsync(It.IsAny())) + // .ReturnsAsync(() => IdentityResult.Success); + //Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias"); + //Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity); + ////Mock.Get(memberService).SetupSequence( + // x => x.GetByEmail(It.IsAny())) + // .Returns(() => null) + // .Returns(() => member); + + MemberController sut = CreateSut(mapper, memberService, memberTypeService, umbracoMembersUserManager, dataTypeService, propertyEditorCollection, backOfficeSecurityAccessor); sut.ModelState.AddModelError("key", "Invalid model state"); - var fakeMemberData = new MemberSave() - { - Password = new ChangingPasswordModel() - { - Id = 123, - NewPassword = "i2ruf38vrba8^&T^", - OldPassword = null - } - }; + + + Mock.Get(umbracoMembersUserManager) + .Setup(x => x.CreateAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(() => IdentityResult.Success); + Mock.Get(umbracoMembersUserManager) + .Setup(x => x.ValidatePasswordAsync(It.IsAny())) + .ReturnsAsync(() => IdentityResult.Success); + + var value = new MemberDisplay(); + string reason = "Validation failed"; // act + HttpResponseException exception = Assert.ThrowsAsync(() => sut.PostSave(fakeMemberData)); + // assert - Assert.ThrowsAsync(() => sut.PostSave(fakeMemberData)); + AssertExpectedException(exception, value, reason); } @@ -83,11 +109,13 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers // arrange Member member = SetupMemberTestData(memberMapDefinition, out UmbracoMapper mapper, out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew); Mock.Get(umbracoMembersUserManager) - .Setup(x => x.CreateAsync(It.IsAny())) + .Setup(x => x.CreateAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(() => IdentityResult.Success); + Mock.Get(umbracoMembersUserManager) + .Setup(x => x.ValidatePasswordAsync(It.IsAny())) .ReturnsAsync(() => IdentityResult.Success); Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias"); Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity); - Mock.Get(memberService).SetupSequence( x => x.GetByEmail(It.IsAny())) .Returns(() => null) @@ -115,12 +143,21 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers IBackOfficeSecurity backOfficeSecurity) { // arrange - Member member = SetupMemberTestData(memberMapDefinition, out UmbracoMapper mapper, out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew); + Member member = SetupMemberTestData(memberMapDefinition, out UmbracoMapper mapper, out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.Save); Mock.Get(umbracoMembersUserManager) .Setup(x => x.FindByIdAsync(It.IsAny())) .ReturnsAsync(() => new MembersIdentityUser()); Mock.Get(umbracoMembersUserManager) - .Setup(x => x.UpdateAsync(new MembersIdentityUser())); + .Setup(x => x.ValidatePasswordAsync(It.IsAny())) + .ReturnsAsync(() => IdentityResult.Success); + + string password = "fakepassword9aw89rnyco3938cyr^%&*()i8Y"; + Mock.Get(umbracoMembersUserManager) + .Setup(x => x.GeneratePassword(It.IsAny())) + .Returns(password); + Mock.Get(umbracoMembersUserManager) + .Setup(x => x.UpdateAsync(It.IsAny())) + .ReturnsAsync(() => IdentityResult.Success); Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias"); Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity); @@ -140,7 +177,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers [Test] [AutoMoqData] - public async Task PostSaveMember_SaveNew_WhenMemberEmailAlreadyExists_ExpectSuccessResponse( + public void PostSaveMember_SaveNew_WhenMemberEmailAlreadyExists_ExpectSuccessResponse( [Frozen] IMembersUserManager umbracoMembersUserManager, IMemberTypeService memberTypeService, IDataTypeService dataTypeService, @@ -163,13 +200,29 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers .Returns(() => member); MemberController sut = CreateSut(mapper, memberService, memberTypeService, umbracoMembersUserManager, dataTypeService, propertyEditorCollection, backOfficeSecurityAccessor); + var value = new MemberDisplay(); + string reason = "Validation failed"; // act HttpResponseException exception = Assert.ThrowsAsync(() => sut.PostSave(fakeMemberData)); // assert - //Assert.That(exception.Message, Is.EqualTo("Exception of type 'Umbraco.Web.Common.Exceptions.HttpResponse...")); - //Assert.That(exception.Value, Is.EqualTo(42)); + AssertExpectedException(exception, value, reason); + } + + private void AssertExpectedException(HttpResponseException exception, object value, string reason) + { + var expectedException = new HttpResponseException(HttpStatusCode.BadRequest, value) + { + AdditionalHeaders = + { + ["X-Status-Reason"] = reason + } + }; + + Assert.That(exception.AdditionalHeaders, Is.EqualTo(expectedException.AdditionalHeaders)); + Assert.That(exception.Value, Is.EqualTo(expectedException.Value)); + Assert.That(exception.Status, Is.EqualTo(expectedException.Status)); } /// @@ -190,7 +243,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers var testEmail = "test@umbraco.com"; var testUser = "TestUser"; - var member = new Member(testName, testEmail, testUser, testContentType) {RawPasswordValue = fakePassword}; + var member = new Member(testName, testEmail, testUser, testContentType) { RawPasswordValue = fakePassword }; mapper = new UmbracoMapper(memberMapDefinition); // TODO: reuse maps @@ -238,6 +291,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers { var fakeMemberData = new MemberSave() { + Id = 123, Password = new ChangingPasswordModel() { Id = 123, diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs index c13c02293d..957863704b 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs @@ -237,6 +237,11 @@ namespace Umbraco.Web.BackOffice.Controllers [MemberSaveValidation] public async Task> PostSave([ModelBinder(typeof(MemberBinder))] MemberSave contentItem) { + if (contentItem == null) + { + throw new ArgumentNullException("The member content item was null"); + } + // If we've reached here it means: // * Our model has been bound // * and validated