2020-12-06 17:23:38 +00:00
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2020-12-11 14:32:13 +00:00
|
|
|
using System.Net;
|
2020-12-06 17:23:38 +00:00
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using AutoFixture.NUnit3;
|
|
|
|
|
using Microsoft.AspNetCore.Identity;
|
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
using Moq;
|
|
|
|
|
using NUnit.Framework;
|
|
|
|
|
using Umbraco.Core.Cache;
|
|
|
|
|
using Umbraco.Core.Dictionary;
|
|
|
|
|
using Umbraco.Core.Events;
|
|
|
|
|
using Umbraco.Core.Mapping;
|
|
|
|
|
using Umbraco.Core.Models;
|
|
|
|
|
using Umbraco.Core.PropertyEditors;
|
|
|
|
|
using Umbraco.Core.Security;
|
|
|
|
|
using Umbraco.Core.Serialization;
|
|
|
|
|
using Umbraco.Core.Services;
|
|
|
|
|
using Umbraco.Core.Strings;
|
2020-12-08 01:57:14 +00:00
|
|
|
using Umbraco.Infrastructure.Security;
|
2020-12-06 17:23:38 +00:00
|
|
|
using Umbraco.Tests.UnitTests.AutoFixture;
|
|
|
|
|
using Umbraco.Tests.UnitTests.Umbraco.Core.ShortStringHelper;
|
|
|
|
|
using Umbraco.Web;
|
|
|
|
|
using Umbraco.Web.BackOffice.Controllers;
|
|
|
|
|
using Umbraco.Web.Common.Exceptions;
|
|
|
|
|
using Umbraco.Web.Models;
|
|
|
|
|
using Umbraco.Web.Models.ContentEditing;
|
|
|
|
|
|
|
|
|
|
namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
|
|
|
|
|
{
|
|
|
|
|
[TestFixture]
|
|
|
|
|
public class MemberControllerUnitTests
|
|
|
|
|
{
|
|
|
|
|
[Test]
|
|
|
|
|
[AutoMoqData]
|
|
|
|
|
public void PostSaveMember_WhenMemberIsNull_ExpectFailureResponse(
|
|
|
|
|
MemberController sut)
|
|
|
|
|
{
|
|
|
|
|
// arrange
|
|
|
|
|
// act
|
|
|
|
|
ArgumentNullException exception = Assert.ThrowsAsync<ArgumentNullException>(() => sut.PostSave(null));
|
|
|
|
|
|
|
|
|
|
// assert
|
2020-12-11 14:32:13 +00:00
|
|
|
Assert.That(exception.Message, Is.EqualTo("Value cannot be null. (Parameter 'The member content item was null')"));
|
2020-12-06 17:23:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
[AutoMoqData]
|
|
|
|
|
public void PostSaveMember_WhenModelStateIsNotValid_ExpectFailureResponse(
|
2020-12-11 14:32:13 +00:00
|
|
|
[Frozen] IMembersUserManager umbracoMembersUserManager,
|
|
|
|
|
IMemberTypeService memberTypeService,
|
|
|
|
|
IDataTypeService dataTypeService,
|
|
|
|
|
IMemberService memberService,
|
|
|
|
|
MapDefinitionCollection memberMapDefinition,
|
|
|
|
|
PropertyEditorCollection propertyEditorCollection,
|
|
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
|
|
|
|
IBackOfficeSecurity backOfficeSecurity)
|
2020-12-06 17:23:38 +00:00
|
|
|
{
|
|
|
|
|
// arrange
|
2020-12-11 14:32:13 +00:00
|
|
|
Member member = SetupMemberTestData(memberMapDefinition, out UmbracoMapper mapper, out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew);
|
|
|
|
|
MemberController sut = CreateSut(mapper, memberService, memberTypeService, umbracoMembersUserManager, dataTypeService, propertyEditorCollection, backOfficeSecurityAccessor);
|
2020-12-06 17:23:38 +00:00
|
|
|
sut.ModelState.AddModelError("key", "Invalid model state");
|
2020-12-11 14:32:13 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.CreateAsync(It.IsAny<MembersIdentityUser>(), It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
|
|
|
|
|
var value = new MemberDisplay();
|
|
|
|
|
string reason = "Validation failed";
|
2020-12-06 17:23:38 +00:00
|
|
|
|
|
|
|
|
// act
|
2020-12-11 14:32:13 +00:00
|
|
|
HttpResponseException exception = Assert.ThrowsAsync<HttpResponseException>(() => sut.PostSave(fakeMemberData));
|
|
|
|
|
|
2020-12-06 17:23:38 +00:00
|
|
|
// assert
|
2020-12-11 14:32:13 +00:00
|
|
|
AssertExpectedException(exception, value, reason);
|
2020-12-06 17:23:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
[AutoMoqData]
|
|
|
|
|
public async Task PostSaveMember_SaveNew_WhenAllIsSetupCorrectly_ExpectSuccessResponse(
|
2020-12-08 01:57:14 +00:00
|
|
|
[Frozen] IMembersUserManager umbracoMembersUserManager,
|
2020-12-06 17:23:38 +00:00
|
|
|
IMemberTypeService memberTypeService,
|
|
|
|
|
IDataTypeService dataTypeService,
|
|
|
|
|
IMemberService memberService,
|
|
|
|
|
MapDefinitionCollection memberMapDefinition,
|
|
|
|
|
PropertyEditorCollection propertyEditorCollection,
|
|
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
|
|
|
|
IBackOfficeSecurity backOfficeSecurity)
|
|
|
|
|
{
|
|
|
|
|
// arrange
|
2020-12-08 17:18:22 +00:00
|
|
|
Member member = SetupMemberTestData(memberMapDefinition, out UmbracoMapper mapper, out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
2020-12-11 14:32:13 +00:00
|
|
|
.Setup(x => x.CreateAsync(It.IsAny<MembersIdentityUser>(), It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
|
2020-12-08 17:18:22 +00:00
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias");
|
|
|
|
|
Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity);
|
2020-12-06 17:23:38 +00:00
|
|
|
Mock.Get(memberService).SetupSequence(
|
|
|
|
|
x => x.GetByEmail(It.IsAny<string>()))
|
|
|
|
|
.Returns(() => null)
|
|
|
|
|
.Returns(() => member);
|
|
|
|
|
|
|
|
|
|
MemberController sut = CreateSut(mapper, memberService, memberTypeService, umbracoMembersUserManager, dataTypeService, propertyEditorCollection, backOfficeSecurityAccessor);
|
|
|
|
|
|
|
|
|
|
// act
|
|
|
|
|
ActionResult<MemberDisplay> actualResult = await sut.PostSave(fakeMemberData);
|
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
Assert.AreEqual(memberDisplay, actualResult.Value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
[AutoMoqData]
|
|
|
|
|
public async Task PostSaveMember_Save_WhenAllIsSetupCorrectly_ExpectSuccessResponse(
|
2020-12-08 01:57:14 +00:00
|
|
|
[Frozen] IMembersUserManager umbracoMembersUserManager,
|
2020-12-06 17:23:38 +00:00
|
|
|
IMemberTypeService memberTypeService,
|
|
|
|
|
IDataTypeService dataTypeService,
|
|
|
|
|
IMemberService memberService,
|
|
|
|
|
MapDefinitionCollection memberMapDefinition,
|
|
|
|
|
PropertyEditorCollection propertyEditorCollection,
|
|
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
|
|
|
|
IBackOfficeSecurity backOfficeSecurity)
|
|
|
|
|
{
|
|
|
|
|
// arrange
|
2020-12-11 14:32:13 +00:00
|
|
|
Member member = SetupMemberTestData(memberMapDefinition, out UmbracoMapper mapper, out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.Save);
|
2020-12-08 17:18:22 +00:00
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.FindByIdAsync(It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => new MembersIdentityUser());
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
2020-12-11 14:32:13 +00:00
|
|
|
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
|
|
|
|
|
string password = "fakepassword9aw89rnyco3938cyr^%&*()i8Y";
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
2021-01-11 14:24:49 +00:00
|
|
|
.Setup(x => x.HashPassword(It.IsAny<string>()))
|
2020-12-11 14:32:13 +00:00
|
|
|
.Returns(password);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.UpdateAsync(It.IsAny<MembersIdentityUser>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
2020-12-08 17:18:22 +00:00
|
|
|
Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias");
|
|
|
|
|
Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity);
|
2020-12-06 17:23:38 +00:00
|
|
|
|
|
|
|
|
Mock.Get(memberService).SetupSequence(
|
|
|
|
|
x => x.GetByEmail(It.IsAny<string>()))
|
|
|
|
|
.Returns(() => null)
|
|
|
|
|
.Returns(() => member);
|
|
|
|
|
|
|
|
|
|
MemberController sut = CreateSut(mapper, memberService, memberTypeService, umbracoMembersUserManager, dataTypeService, propertyEditorCollection, backOfficeSecurityAccessor);
|
|
|
|
|
|
|
|
|
|
// act
|
|
|
|
|
ActionResult<MemberDisplay> actualResult = await sut.PostSave(fakeMemberData);
|
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
Assert.AreEqual(memberDisplay, actualResult.Value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
|
[AutoMoqData]
|
2020-12-11 14:32:13 +00:00
|
|
|
public void PostSaveMember_SaveNew_WhenMemberEmailAlreadyExists_ExpectSuccessResponse(
|
2020-12-08 01:57:14 +00:00
|
|
|
[Frozen] IMembersUserManager umbracoMembersUserManager,
|
2020-12-06 17:23:38 +00:00
|
|
|
IMemberTypeService memberTypeService,
|
|
|
|
|
IDataTypeService dataTypeService,
|
|
|
|
|
IMemberService memberService,
|
|
|
|
|
MapDefinitionCollection memberMapDefinition,
|
|
|
|
|
PropertyEditorCollection propertyEditorCollection,
|
|
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
|
|
|
|
IBackOfficeSecurity backOfficeSecurity)
|
|
|
|
|
{
|
|
|
|
|
// arrange
|
2020-12-08 17:18:22 +00:00
|
|
|
Member member = SetupMemberTestData(memberMapDefinition, out UmbracoMapper mapper, out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.CreateAsync(It.IsAny<MembersIdentityUser>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias");
|
|
|
|
|
Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity);
|
2020-12-06 17:23:38 +00:00
|
|
|
|
|
|
|
|
Mock.Get(memberService).SetupSequence(
|
|
|
|
|
x => x.GetByEmail(It.IsAny<string>()))
|
|
|
|
|
.Returns(() => member);
|
|
|
|
|
|
|
|
|
|
MemberController sut = CreateSut(mapper, memberService, memberTypeService, umbracoMembersUserManager, dataTypeService, propertyEditorCollection, backOfficeSecurityAccessor);
|
2020-12-11 14:32:13 +00:00
|
|
|
var value = new MemberDisplay();
|
|
|
|
|
string reason = "Validation failed";
|
2020-12-06 17:23:38 +00:00
|
|
|
|
|
|
|
|
// act
|
|
|
|
|
HttpResponseException exception = Assert.ThrowsAsync<HttpResponseException>(() => sut.PostSave(fakeMemberData));
|
|
|
|
|
|
|
|
|
|
// assert
|
2020-12-11 14:32:13 +00:00
|
|
|
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));
|
2020-12-06 17:23:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Setup all standard member data for test
|
|
|
|
|
/// </summary>
|
2020-12-08 17:18:22 +00:00
|
|
|
private Member SetupMemberTestData(
|
2020-12-06 17:23:38 +00:00
|
|
|
MapDefinitionCollection memberMapDefinition,
|
|
|
|
|
out UmbracoMapper mapper,
|
|
|
|
|
out MemberSave fakeMemberData,
|
|
|
|
|
out MemberDisplay memberDisplay,
|
|
|
|
|
ContentSaveAction contentAction)
|
|
|
|
|
{
|
|
|
|
|
var memberType = new MemberType(new DefaultShortStringHelper(new DefaultShortStringHelperConfig()), int.MinValue);
|
|
|
|
|
IMemberType testContentType = memberType;
|
|
|
|
|
|
|
|
|
|
string fakePassword = "i2ruf38vrba8^&T^";
|
|
|
|
|
var testName = "Test Name";
|
|
|
|
|
var testEmail = "test@umbraco.com";
|
|
|
|
|
var testUser = "TestUser";
|
|
|
|
|
|
2020-12-11 14:32:13 +00:00
|
|
|
var member = new Member(testName, testEmail, testUser, testContentType) { RawPasswordValue = fakePassword };
|
2020-12-06 17:23:38 +00:00
|
|
|
mapper = new UmbracoMapper(memberMapDefinition);
|
|
|
|
|
|
|
|
|
|
// TODO: reuse maps
|
|
|
|
|
mapper.Define<Member, MemberDisplay>((m, context) => new MemberDisplay()
|
|
|
|
|
{
|
|
|
|
|
Username = m.Username
|
|
|
|
|
});
|
|
|
|
|
mapper.Define<MemberSave, IMember>((m, context) => new Member(new Mock<IMemberType>().Object));
|
|
|
|
|
fakeMemberData = CreateFakeMemberData(member, contentAction);
|
|
|
|
|
|
|
|
|
|
memberDisplay = new MemberDisplay()
|
|
|
|
|
{
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return member;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MemberController CreateSut(
|
|
|
|
|
UmbracoMapper mapper,
|
|
|
|
|
IMemberService memberService,
|
|
|
|
|
IMemberTypeService memberTypeService,
|
2020-12-08 01:57:14 +00:00
|
|
|
IMembersUserManager membersUserManager,
|
2020-12-06 17:23:38 +00:00
|
|
|
IDataTypeService dataTypeService,
|
|
|
|
|
PropertyEditorCollection propertyEditorCollection,
|
|
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor) =>
|
|
|
|
|
new MemberController(
|
|
|
|
|
new DefaultCultureDictionary(
|
|
|
|
|
new Mock<ILocalizationService>().Object,
|
|
|
|
|
new HttpRequestAppCache(() => null)),
|
|
|
|
|
new LoggerFactory(),
|
|
|
|
|
new MockShortStringHelper(),
|
|
|
|
|
new DefaultEventMessagesFactory(
|
|
|
|
|
new Mock<IEventMessagesAccessor>().Object),
|
|
|
|
|
new Mock<ILocalizedTextService>().Object,
|
|
|
|
|
propertyEditorCollection,
|
|
|
|
|
mapper,
|
|
|
|
|
memberService,
|
|
|
|
|
memberTypeService,
|
|
|
|
|
membersUserManager,
|
|
|
|
|
dataTypeService,
|
|
|
|
|
backOfficeSecurityAccessor,
|
|
|
|
|
new ConfigurationEditorJsonSerializer());
|
|
|
|
|
|
|
|
|
|
private static MemberSave CreateFakeMemberData(IMember member, ContentSaveAction action)
|
|
|
|
|
{
|
|
|
|
|
var fakeMemberData = new MemberSave()
|
|
|
|
|
{
|
2020-12-11 14:32:13 +00:00
|
|
|
Id = 123,
|
2020-12-06 17:23:38 +00:00
|
|
|
Password = new ChangingPasswordModel()
|
|
|
|
|
{
|
|
|
|
|
Id = 123,
|
|
|
|
|
NewPassword = member.RawPasswordValue,
|
|
|
|
|
OldPassword = null
|
|
|
|
|
},
|
|
|
|
|
Name = member.Name,
|
|
|
|
|
Email = member.Email,
|
|
|
|
|
Username = member.Username,
|
|
|
|
|
PersistedContent = member,
|
|
|
|
|
PropertyCollectionDto = new ContentPropertyCollectionDto()
|
|
|
|
|
{
|
|
|
|
|
},
|
|
|
|
|
Groups = new List<string>(),
|
|
|
|
|
Alias = "fakeAlias",
|
|
|
|
|
ContentTypeAlias = "fakeContentType",
|
|
|
|
|
Action = action
|
|
|
|
|
};
|
|
|
|
|
return fakeMemberData;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|