Added MemberController unit tests. Removed TODO.
This commit is contained in:
@@ -9,17 +9,23 @@ namespace Umbraco.Core.Models.Mapping
|
||||
/// <inheritdoc />
|
||||
public void DefineMaps(UmbracoMapper mapper) => mapper.Define<MemberSave, IMember>(Map);
|
||||
|
||||
//TODO: put this here instead of a new mapper definition (like user). Can move
|
||||
|
||||
private static void Map(MemberSave source, IMember target, MapperContext context)
|
||||
{
|
||||
// TODO: ensure all properties are mapped as required
|
||||
target.IsApproved = source.IsApproved;
|
||||
target.Name = source.Name;
|
||||
target.Email = source.Email;
|
||||
target.Key = source.Key;
|
||||
target.Username = source.Username;
|
||||
target.Comments = source.Comments;
|
||||
target.CreateDate = source.CreateDate;
|
||||
target.UpdateDate = source.UpdateDate;
|
||||
target.Email = source.Email;
|
||||
|
||||
// TODO: ensure all properties are mapped as required
|
||||
//target.Id = source.Id;
|
||||
//target.ParentId = -1;
|
||||
//target.Path = "-1," + source.Id;
|
||||
|
||||
//TODO: add groups as required
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,7 +93,9 @@ namespace Umbraco.Infrastructure.Security
|
||||
set => BeingDirty.SetPropertyValueAndDetectChanges(value, ref _name, nameof(Name));
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the password config
|
||||
/// </summary>
|
||||
public string PasswordConfig
|
||||
{
|
||||
get => _passwordConfig;
|
||||
@@ -186,13 +188,13 @@ namespace Umbraco.Infrastructure.Security
|
||||
{
|
||||
get
|
||||
{
|
||||
var isLocked = LockoutEnd.HasValue && LockoutEnd.Value.ToLocalTime() >= DateTime.Now;
|
||||
bool isLocked = LockoutEnd.HasValue && LockoutEnd.Value.ToLocalTime() >= DateTime.Now;
|
||||
return isLocked;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating the IUser IsApproved
|
||||
/// Gets or sets a value indicating whether the IUser IsApproved
|
||||
/// </summary>
|
||||
public bool IsApproved { get; set; }
|
||||
|
||||
|
||||
@@ -17,18 +17,28 @@ namespace Umbraco.Infrastructure.Security
|
||||
private string _passwordConfig;
|
||||
private IReadOnlyCollection<IReadOnlyUserGroup> _groups;
|
||||
|
||||
// TODO: reused from backoffice - share?
|
||||
// Custom comparer for enumerables
|
||||
private static readonly DelegateEqualityComparer<IReadOnlyCollection<IReadOnlyUserGroup>> s_groupsComparer = new DelegateEqualityComparer<IReadOnlyCollection<IReadOnlyUserGroup>>(
|
||||
(groups, enumerable) => groups.Select(x => x.Alias).UnsortedSequenceEqual(enumerable.Select(x => x.Alias)),
|
||||
groups => groups.GetHashCode());
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="MembersIdentityUser"/> class.
|
||||
/// </summary>
|
||||
public MembersIdentityUser(int userId)
|
||||
{
|
||||
// use the property setters - they do more than just setting a field
|
||||
Id = UserIdToString(userId);
|
||||
}
|
||||
|
||||
public MembersIdentityUser()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Used to construct a new instance without an identity
|
||||
/// </summary>
|
||||
public static MembersIdentityUser CreateNew(string username, string email, string memberTypeAlias,
|
||||
string name = null)
|
||||
public static MembersIdentityUser CreateNew(string username, string email, string memberTypeAlias, string name = null)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(username))
|
||||
{
|
||||
@@ -46,20 +56,7 @@ namespace Umbraco.Infrastructure.Security
|
||||
user.EnableChangeTracking();
|
||||
return user;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="MembersIdentityUser"/> class.
|
||||
/// </summary>
|
||||
public MembersIdentityUser(int userId)
|
||||
{
|
||||
// use the property setters - they do more than just setting a field
|
||||
Id = UserIdToString(userId);
|
||||
}
|
||||
|
||||
public MembersIdentityUser()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the member's real name
|
||||
/// </summary>
|
||||
@@ -80,7 +77,6 @@ namespace Umbraco.Infrastructure.Security
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the user groups
|
||||
/// TBC: how to implement for members?
|
||||
/// </summary>
|
||||
public IReadOnlyCollection<IReadOnlyUserGroup> Groups
|
||||
{
|
||||
@@ -113,13 +109,13 @@ namespace Umbraco.Infrastructure.Security
|
||||
{
|
||||
get
|
||||
{
|
||||
var isLocked = LockoutEnd.HasValue && LockoutEnd.Value.ToLocalTime() >= DateTime.Now;
|
||||
bool isLocked = LockoutEnd.HasValue && LockoutEnd.Value.ToLocalTime() >= DateTime.Now;
|
||||
return isLocked;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating the member is approved
|
||||
/// Gets or sets a value indicating whether the member is approved
|
||||
/// </summary>
|
||||
public bool IsApproved { get; set; }
|
||||
|
||||
@@ -129,9 +125,5 @@ namespace Umbraco.Infrastructure.Security
|
||||
public string MemberTypeAlias { get; set; }
|
||||
|
||||
private static string UserIdToString(int userId) => string.Intern(userId.ToString());
|
||||
|
||||
// TODO: implement as per base identity user
|
||||
//public bool LoginsChanged;
|
||||
//public bool RolesChanged;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -515,8 +515,6 @@ namespace Umbraco.Infrastructure.Security
|
||||
: user.SecurityStamp);
|
||||
}
|
||||
|
||||
// TODO: share all possible between backoffice user
|
||||
|
||||
private MembersIdentityUser AssignLoginsCallback(MembersIdentityUser user)
|
||||
{
|
||||
if (user != null)
|
||||
@@ -673,8 +671,6 @@ namespace Umbraco.Infrastructure.Security
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
public override Task<IList<MembersIdentityUser>> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken = default) => throw new NotImplementedException();
|
||||
|
||||
// TODO: We should support these
|
||||
|
||||
/// <summary>
|
||||
/// Not supported in Umbraco
|
||||
/// </summary>
|
||||
|
||||
@@ -33,14 +33,14 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Infrastructure.Security
|
||||
[Test]
|
||||
public void GivenICreateUser_AndTheUserIsNull_ThenIShouldGetAFailedResultAsync()
|
||||
{
|
||||
//arrange
|
||||
// arrange
|
||||
MembersUserStore sut = CreateSut();
|
||||
CancellationToken fakeCancellationToken = new CancellationToken(){};
|
||||
|
||||
//act
|
||||
// act
|
||||
Action actual = () => sut.CreateAsync(null, fakeCancellationToken);
|
||||
|
||||
//assert
|
||||
// assert
|
||||
Assert.That(actual, Throws.ArgumentNullException);
|
||||
}
|
||||
|
||||
@@ -48,10 +48,10 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Infrastructure.Security
|
||||
[Test]
|
||||
public async Task GivenICreateANewUser_AndTheUserIsPopulatedCorrectly_ThenIShouldGetASuccessResultAsync()
|
||||
{
|
||||
//arrange
|
||||
// arrange
|
||||
MembersUserStore sut = CreateSut();
|
||||
MembersIdentityUser fakeUser = new MembersIdentityUser() { };
|
||||
CancellationToken fakeCancellationToken = new CancellationToken() { };
|
||||
var fakeUser = new MembersIdentityUser() { };
|
||||
var fakeCancellationToken = new CancellationToken() { };
|
||||
|
||||
IMemberType fakeMemberType = new MemberType(new MockShortStringHelper(), 77);
|
||||
IMember mockMember = Mock.Of<IMember>(m =>
|
||||
@@ -67,30 +67,15 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Infrastructure.Security
|
||||
_mockMemberService.Setup(x => x.CreateMember(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())).Returns(mockMember);
|
||||
_mockMemberService.Setup(x => x.Save(mockMember, raiseEvents));
|
||||
|
||||
//act
|
||||
// act
|
||||
IdentityResult identityResult = await sut.CreateAsync(fakeUser, fakeCancellationToken);
|
||||
|
||||
//assert
|
||||
// assert
|
||||
Assert.IsTrue(identityResult.Succeeded);
|
||||
Assert.IsTrue(!identityResult.Errors.Any());
|
||||
}
|
||||
|
||||
//FindByNameAsync
|
||||
[Test]
|
||||
public async Task GivenIGetUserNameAsync()
|
||||
{
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task GivenIFindByNameAsync()
|
||||
{
|
||||
}
|
||||
|
||||
//SetNormalizedUserNameAsync
|
||||
//SetUserNameAsync
|
||||
//HasPasswordAsync
|
||||
//GetPasswordHashAsync
|
||||
//SetPasswordHashAsync
|
||||
//GetUserIdAsync
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,38 +1,53 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using AngleSharp.Common;
|
||||
using AutoFixture.NUnit3;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Routing;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Cache;
|
||||
using Umbraco.Core.Configuration.Models;
|
||||
using Umbraco.Core.Dictionary;
|
||||
using Umbraco.Core.Events;
|
||||
using Umbraco.Core.Mapping;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Models.ContentEditing;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
using Umbraco.Core.PropertyEditors.Validators;
|
||||
using Umbraco.Core.Security;
|
||||
using Umbraco.Core.Serialization;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Core.Strings;
|
||||
using Umbraco.Extensions;
|
||||
using Umbraco.Infrastructure.Security;
|
||||
using Umbraco.Tests.Common.Builders;
|
||||
using Umbraco.Tests.UnitTests.AutoFixture;
|
||||
using Umbraco.Tests.UnitTests.Umbraco.Core.ShortStringHelper;
|
||||
using Umbraco.Web;
|
||||
using Umbraco.Web.BackOffice.Controllers;
|
||||
using Umbraco.Web.BackOffice.Mapping;
|
||||
using Umbraco.Web.Common.ActionsResults;
|
||||
using Umbraco.Web.ContentApps;
|
||||
using Umbraco.Web.Models;
|
||||
using Umbraco.Web.Models.ContentEditing;
|
||||
using Umbraco.Web.Models.Mapping;
|
||||
using Umbraco.Web.PropertyEditors;
|
||||
using IHostingEnvironment = Umbraco.Core.Hosting.IHostingEnvironment;
|
||||
|
||||
namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
|
||||
{
|
||||
[TestFixture]
|
||||
public class MemberControllerUnitTests
|
||||
{
|
||||
private UmbracoMapper _mapper;
|
||||
|
||||
[Test]
|
||||
[AutoMoqData]
|
||||
public void PostSaveMember_WhenMemberIsNull_ExpectFailureResponse(
|
||||
@@ -50,16 +65,15 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
|
||||
[AutoMoqData]
|
||||
public void PostSaveMember_WhenModelStateIsNotValid_ExpectFailureResponse(
|
||||
[Frozen] IMembersUserManager umbracoMembersUserManager,
|
||||
IMemberTypeService memberTypeService,
|
||||
IDataTypeService dataTypeService,
|
||||
IMemberService memberService,
|
||||
MapDefinitionCollection memberMapDefinition,
|
||||
PropertyEditorCollection propertyEditorCollection,
|
||||
IMemberTypeService memberTypeService,
|
||||
IMemberGroupService memberGroupService,
|
||||
IDataTypeService dataTypeService,
|
||||
IBackOfficeSecurityAccessor backOfficeSecurityAccessor)
|
||||
{
|
||||
// arrange
|
||||
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);
|
||||
Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew);
|
||||
MemberController sut = CreateSut(memberService, memberTypeService, memberGroupService, umbracoMembersUserManager, dataTypeService, backOfficeSecurityAccessor);
|
||||
sut.ModelState.AddModelError("key", "Invalid model state");
|
||||
|
||||
Mock.Get(umbracoMembersUserManager)
|
||||
@@ -87,16 +101,15 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
|
||||
[AutoMoqData]
|
||||
public async Task PostSaveMember_SaveNew_WhenAllIsSetupCorrectly_ExpectSuccessResponse(
|
||||
[Frozen] IMembersUserManager umbracoMembersUserManager,
|
||||
IMemberTypeService memberTypeService,
|
||||
IDataTypeService dataTypeService,
|
||||
IMemberService memberService,
|
||||
MapDefinitionCollection memberMapDefinition,
|
||||
PropertyEditorCollection propertyEditorCollection,
|
||||
IMemberTypeService memberTypeService,
|
||||
IMemberGroupService memberGroupService,
|
||||
IDataTypeService dataTypeService,
|
||||
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
||||
IBackOfficeSecurity backOfficeSecurity)
|
||||
{
|
||||
// arrange
|
||||
Member member = SetupMemberTestData(memberMapDefinition, out UmbracoMapper mapper, out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew);
|
||||
Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew);
|
||||
Mock.Get(umbracoMembersUserManager)
|
||||
.Setup(x => x.CreateAsync(It.IsAny<MembersIdentityUser>(), It.IsAny<string>()))
|
||||
.ReturnsAsync(() => IdentityResult.Success);
|
||||
@@ -109,31 +122,32 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
|
||||
x => x.GetByEmail(It.IsAny<string>()))
|
||||
.Returns(() => null)
|
||||
.Returns(() => member);
|
||||
Mock.Get(memberService).Setup(x => x.GetByUsername(It.IsAny<string>())).Returns(() => member);
|
||||
|
||||
MemberController sut = CreateSut(mapper, memberService, memberTypeService, umbracoMembersUserManager, dataTypeService, propertyEditorCollection, backOfficeSecurityAccessor);
|
||||
MemberController sut = CreateSut(memberService, memberTypeService, memberGroupService, umbracoMembersUserManager, dataTypeService, backOfficeSecurityAccessor);
|
||||
|
||||
// act
|
||||
ActionResult<MemberDisplay> result = await sut.PostSave(fakeMemberData);
|
||||
|
||||
// assert
|
||||
Assert.IsNull(result.Result);
|
||||
Assert.AreEqual(memberDisplay, result.Value);
|
||||
Assert.IsNotNull(result.Value);
|
||||
AssertMemberDisplayPropertiesAreEqual(memberDisplay, result.Value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[AutoMoqData]
|
||||
public async Task PostSaveMember_Save_WhenAllIsSetupCorrectly_ExpectSuccessResponse(
|
||||
public async Task PostSaveMember_SaveExisting_WhenAllIsSetupCorrectly_ExpectSuccessResponse(
|
||||
[Frozen] IMembersUserManager umbracoMembersUserManager,
|
||||
IMemberTypeService memberTypeService,
|
||||
IDataTypeService dataTypeService,
|
||||
IMemberService memberService,
|
||||
MapDefinitionCollection memberMapDefinition,
|
||||
PropertyEditorCollection propertyEditorCollection,
|
||||
IMemberTypeService memberTypeService,
|
||||
IMemberGroupService memberGroupService,
|
||||
IDataTypeService dataTypeService,
|
||||
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
||||
IBackOfficeSecurity backOfficeSecurity)
|
||||
{
|
||||
// arrange
|
||||
Member member = SetupMemberTestData(memberMapDefinition, out UmbracoMapper mapper, out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.Save);
|
||||
Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.Save);
|
||||
Mock.Get(umbracoMembersUserManager)
|
||||
.Setup(x => x.FindByIdAsync(It.IsAny<string>()))
|
||||
.ReturnsAsync(() => new MembersIdentityUser());
|
||||
@@ -150,36 +164,36 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
|
||||
.ReturnsAsync(() => IdentityResult.Success);
|
||||
Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias");
|
||||
Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity);
|
||||
|
||||
Mock.Get(memberService).Setup(x => x.GetByUsername(It.IsAny<string>())).Returns(() => member);
|
||||
Mock.Get(memberService).SetupSequence(
|
||||
x => x.GetByEmail(It.IsAny<string>()))
|
||||
.Returns(() => null)
|
||||
.Returns(() => member);
|
||||
|
||||
MemberController sut = CreateSut(mapper, memberService, memberTypeService, umbracoMembersUserManager, dataTypeService, propertyEditorCollection, backOfficeSecurityAccessor);
|
||||
MemberController sut = CreateSut(memberService, memberTypeService, memberGroupService, umbracoMembersUserManager, dataTypeService, backOfficeSecurityAccessor);
|
||||
|
||||
// act
|
||||
ActionResult<MemberDisplay> result = await sut.PostSave(fakeMemberData);
|
||||
|
||||
// assert
|
||||
Assert.IsNull(result.Result);
|
||||
Assert.AreEqual(memberDisplay, result.Value);
|
||||
Assert.IsNotNull(result.Value);
|
||||
AssertMemberDisplayPropertiesAreEqual(memberDisplay, result.Value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[AutoMoqData]
|
||||
public void PostSaveMember_SaveNew_WhenMemberEmailAlreadyExists_ExpectFailResponse(
|
||||
[Frozen] IMembersUserManager umbracoMembersUserManager,
|
||||
IMemberTypeService memberTypeService,
|
||||
IDataTypeService dataTypeService,
|
||||
IMemberService memberService,
|
||||
MapDefinitionCollection memberMapDefinition,
|
||||
PropertyEditorCollection propertyEditorCollection,
|
||||
IMemberTypeService memberTypeService,
|
||||
IMemberGroupService memberGroupService,
|
||||
IDataTypeService dataTypeService,
|
||||
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
||||
IBackOfficeSecurity backOfficeSecurity)
|
||||
{
|
||||
// arrange
|
||||
Member member = SetupMemberTestData(memberMapDefinition, out UmbracoMapper mapper, out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew);
|
||||
Member member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew);
|
||||
Mock.Get(umbracoMembersUserManager)
|
||||
.Setup(x => x.CreateAsync(It.IsAny<MembersIdentityUser>()))
|
||||
.ReturnsAsync(() => IdentityResult.Success);
|
||||
@@ -193,7 +207,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
|
||||
x => x.GetByEmail(It.IsAny<string>()))
|
||||
.Returns(() => member);
|
||||
|
||||
MemberController sut = CreateSut(mapper, memberService, memberTypeService, umbracoMembersUserManager, dataTypeService, propertyEditorCollection, backOfficeSecurityAccessor);
|
||||
MemberController sut = CreateSut(memberService, memberTypeService, memberGroupService, umbracoMembersUserManager, dataTypeService, backOfficeSecurityAccessor);
|
||||
string reason = "Validation failed";
|
||||
|
||||
// act
|
||||
@@ -207,75 +221,130 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Setup all standard member data for test
|
||||
/// Create membercontroller to test
|
||||
/// </summary>
|
||||
private Member SetupMemberTestData(
|
||||
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";
|
||||
|
||||
var member = new Member(testName, testEmail, testUser, testContentType) { RawPasswordValue = fakePassword };
|
||||
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;
|
||||
}
|
||||
|
||||
/// <param name="memberService"></param>
|
||||
/// <param name="memberTypeService"></param>
|
||||
/// <param name="memberGroupService"></param>
|
||||
/// <param name="membersUserManager"></param>
|
||||
/// <param name="dataTypeService"></param>
|
||||
/// <param name="backOfficeSecurityAccessor"></param>
|
||||
/// <returns></returns>
|
||||
private MemberController CreateSut(
|
||||
UmbracoMapper mapper,
|
||||
IMemberService memberService,
|
||||
IMemberTypeService memberTypeService,
|
||||
IMemberGroupService memberGroupService,
|
||||
IMembersUserManager membersUserManager,
|
||||
IDataTypeService dataTypeService,
|
||||
PropertyEditorCollection propertyEditorCollection,
|
||||
IBackOfficeSecurityAccessor backOfficeSecurityAccessor) =>
|
||||
new MemberController(
|
||||
IBackOfficeSecurityAccessor backOfficeSecurityAccessor)
|
||||
{
|
||||
var mockShortStringHelper = new MockShortStringHelper();
|
||||
|
||||
var textService = new Mock<ILocalizedTextService>();
|
||||
var contentTypeBaseServiceProvider = new Mock<IContentTypeBaseServiceProvider>();
|
||||
contentTypeBaseServiceProvider.Setup(x => x.GetContentTypeOf(It.IsAny<IContentBase>())).Returns(new ContentType(mockShortStringHelper, 123));
|
||||
var contentAppFactories = new Mock<List<IContentAppFactory>>();
|
||||
var mockContentAppFactoryCollection = new Mock<ILogger<ContentAppFactoryCollection>>();
|
||||
var hybridBackOfficeSecurityAccessor = new HybridBackofficeSecurityAccessor(new DictionaryAppCache());
|
||||
var contentAppFactoryCollection = new ContentAppFactoryCollection(
|
||||
contentAppFactories.Object,
|
||||
mockContentAppFactoryCollection.Object,
|
||||
hybridBackOfficeSecurityAccessor);
|
||||
var mockUserService = new Mock<IUserService>();
|
||||
var commonMapper = new CommonMapper(
|
||||
mockUserService.Object,
|
||||
contentTypeBaseServiceProvider.Object,
|
||||
contentAppFactoryCollection,
|
||||
textService.Object);
|
||||
var mockCultureDictionary = new Mock<ICultureDictionary>();
|
||||
|
||||
var mockPasswordConfig = new Mock<IOptions<MemberPasswordConfigurationSettings>>();
|
||||
mockPasswordConfig.Setup(x => x.Value).Returns(() => new MemberPasswordConfigurationSettings());
|
||||
IDataEditor dataEditor = Mock.Of<IDataEditor>(
|
||||
x => x.Type == EditorType.PropertyValue
|
||||
&& x.Alias == Constants.PropertyEditors.Aliases.Label);
|
||||
Mock.Get(dataEditor).Setup(x => x.GetValueEditor()).Returns(new TextOnlyValueEditor(Mock.Of<IDataTypeService>(), Mock.Of<ILocalizationService>(), new DataEditorAttribute(Constants.PropertyEditors.Aliases.TextBox, "Test Textbox", "textbox"), textService.Object, Mock.Of<IShortStringHelper>(), Mock.Of<IJsonSerializer>()));
|
||||
|
||||
var propertyEditorCollection = new PropertyEditorCollection(new DataEditorCollection(new[] { dataEditor }));
|
||||
|
||||
IMapDefinition memberMapDefinition = new MemberMapDefinition(
|
||||
commonMapper,
|
||||
new CommonTreeNodeMapper(Mock.Of<LinkGenerator>()),
|
||||
new MemberTabsAndPropertiesMapper(
|
||||
mockCultureDictionary.Object,
|
||||
backOfficeSecurityAccessor,
|
||||
textService.Object,
|
||||
memberTypeService,
|
||||
memberService,
|
||||
memberGroupService,
|
||||
mockPasswordConfig.Object,
|
||||
contentTypeBaseServiceProvider.Object,
|
||||
propertyEditorCollection),
|
||||
new HttpContextAccessor());
|
||||
|
||||
var map = new MapDefinitionCollection(new List<IMapDefinition>()
|
||||
{
|
||||
new global::Umbraco.Core.Models.Mapping.MemberMapDefinition(),
|
||||
memberMapDefinition,
|
||||
new ContentTypeMapDefinition(
|
||||
commonMapper,
|
||||
propertyEditorCollection,
|
||||
dataTypeService,
|
||||
new Mock<IFileService>().Object,
|
||||
new Mock<IContentTypeService>().Object,
|
||||
new Mock<IMediaTypeService>().Object,
|
||||
memberTypeService,
|
||||
new Mock<ILoggerFactory>().Object,
|
||||
mockShortStringHelper,
|
||||
new Mock<IOptions<GlobalSettings>>().Object,
|
||||
new Mock<IHostingEnvironment>().Object)
|
||||
});
|
||||
_mapper = new UmbracoMapper(map);
|
||||
|
||||
return new MemberController(
|
||||
new DefaultCultureDictionary(
|
||||
new Mock<ILocalizationService>().Object,
|
||||
new HttpRequestAppCache(() => null)),
|
||||
new LoggerFactory(),
|
||||
new MockShortStringHelper(),
|
||||
mockShortStringHelper,
|
||||
new DefaultEventMessagesFactory(
|
||||
new Mock<IEventMessagesAccessor>().Object),
|
||||
new Mock<ILocalizedTextService>().Object,
|
||||
textService.Object,
|
||||
propertyEditorCollection,
|
||||
mapper,
|
||||
_mapper,
|
||||
memberService,
|
||||
memberTypeService,
|
||||
membersUserManager,
|
||||
dataTypeService,
|
||||
backOfficeSecurityAccessor,
|
||||
new ConfigurationEditorJsonSerializer());
|
||||
}
|
||||
|
||||
private static MemberSave CreateFakeMemberData(IMember member, ContentSaveAction action)
|
||||
|
||||
/// <summary>
|
||||
/// Setup all standard member data for test
|
||||
/// </summary>
|
||||
private Member SetupMemberTestData(
|
||||
out MemberSave fakeMemberData,
|
||||
out MemberDisplay memberDisplay,
|
||||
ContentSaveAction contentAction)
|
||||
{
|
||||
var fakeMemberData = new MemberSave()
|
||||
// arrange
|
||||
MemberType memberType = MemberTypeBuilder.CreateSimpleMemberType();
|
||||
Member member = MemberBuilder.CreateSimpleMember(memberType, "Test Member", "test@example.com", "123", "test");
|
||||
int memberId = 123;
|
||||
member.Id = memberId;
|
||||
|
||||
//TODO: replace with builder for MemberSave and MemberDisplay
|
||||
fakeMemberData = new MemberSave()
|
||||
{
|
||||
Id = 123,
|
||||
Id = memberId,
|
||||
SortOrder = member.SortOrder,
|
||||
ContentTypeId = memberType.Id,
|
||||
Key = member.Key,
|
||||
Password = new ChangingPasswordModel()
|
||||
{
|
||||
Id = 123,
|
||||
Id = 456,
|
||||
NewPassword = member.RawPasswordValue,
|
||||
OldPassword = null
|
||||
},
|
||||
@@ -285,13 +354,86 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers
|
||||
PersistedContent = member,
|
||||
PropertyCollectionDto = new ContentPropertyCollectionDto()
|
||||
{
|
||||
Properties = new List<ContentPropertyDto>()
|
||||
{
|
||||
new ContentPropertyDto(),
|
||||
new ContentPropertyDto()
|
||||
}
|
||||
},
|
||||
Groups = new List<string>(),
|
||||
Alias = "fakeAlias",
|
||||
ContentTypeAlias = "fakeContentType",
|
||||
Action = action
|
||||
//Alias = "fakeAlias",
|
||||
ContentTypeAlias = member.ContentTypeAlias,
|
||||
Action = contentAction,
|
||||
Icon = "icon-document",
|
||||
Path = member.Path
|
||||
};
|
||||
return fakeMemberData;
|
||||
|
||||
memberDisplay = new MemberDisplay()
|
||||
{
|
||||
Id = memberId,
|
||||
SortOrder = member.SortOrder,
|
||||
ContentTypeId = memberType.Id,
|
||||
Key = member.Key,
|
||||
Name = member.Name,
|
||||
Email = member.Email,
|
||||
Username = member.Username,
|
||||
//Alias = "fakeAlias",
|
||||
ContentTypeAlias = member.ContentTypeAlias,
|
||||
ContentType = new ContentTypeBasic(),
|
||||
ContentTypeName = member.ContentType.Name,
|
||||
Icon = fakeMemberData.Icon,
|
||||
Path = member.Path,
|
||||
Tabs = new List<Tab<ContentPropertyDisplay>>()
|
||||
{
|
||||
new Tab<ContentPropertyDisplay>()
|
||||
{
|
||||
Alias = "test"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return member;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check all member properties are equal
|
||||
/// </summary>
|
||||
/// <param name="memberDisplay"></param>
|
||||
/// <param name="resultValue"></param>
|
||||
private void AssertMemberDisplayPropertiesAreEqual(MemberDisplay memberDisplay, MemberDisplay resultValue)
|
||||
{
|
||||
Assert.AreNotSame(memberDisplay, resultValue);
|
||||
Assert.AreEqual(memberDisplay.Id, resultValue.Id);
|
||||
Assert.AreEqual(memberDisplay.Alias, resultValue.Alias);
|
||||
Assert.AreEqual(memberDisplay.Username, resultValue.Username);
|
||||
Assert.AreEqual(memberDisplay.Email, resultValue.Email);
|
||||
Assert.AreEqual(memberDisplay.AdditionalData, resultValue.AdditionalData);
|
||||
Assert.AreEqual(memberDisplay.ContentApps, resultValue.ContentApps);
|
||||
Assert.AreEqual(memberDisplay.ContentType.Alias, resultValue.ContentType.Alias);
|
||||
Assert.AreEqual(memberDisplay.ContentTypeAlias, resultValue.ContentTypeAlias);
|
||||
Assert.AreEqual(memberDisplay.ContentTypeName, resultValue.ContentTypeName);
|
||||
Assert.AreEqual(memberDisplay.ContentTypeId, resultValue.ContentTypeId);
|
||||
Assert.AreEqual(memberDisplay.Icon, resultValue.Icon);
|
||||
Assert.AreEqual(memberDisplay.Errors, resultValue.Errors);
|
||||
Assert.AreEqual(memberDisplay.Key, resultValue.Key);
|
||||
Assert.AreEqual(memberDisplay.Name, resultValue.Name);
|
||||
Assert.AreEqual(memberDisplay.Path, resultValue.Path);
|
||||
Assert.AreEqual(memberDisplay.SortOrder, resultValue.SortOrder);
|
||||
Assert.AreEqual(memberDisplay.Trashed, resultValue.Trashed);
|
||||
Assert.AreEqual(memberDisplay.TreeNodeUrl, resultValue.TreeNodeUrl);
|
||||
Assert.AreNotSame(memberDisplay.Properties, resultValue.Properties);
|
||||
|
||||
//TODO: can we check create/update dates when saving?
|
||||
//Assert.AreEqual(memberDisplay.CreateDate, resultValue.CreateDate);
|
||||
//Assert.AreEqual(memberDisplay.UpdateDate, resultValue.UpdateDate);
|
||||
|
||||
//TODO: check all properties
|
||||
//Assert.AreEqual(memberDisplay.Properties.Count(), resultValue.Properties.Count());
|
||||
//for (var index = 0; index < resultValue.Properties.Count(); index++)
|
||||
//{
|
||||
// Assert.AreNotSame(memberDisplay.Properties.GetItemByIndex(index), resultValue.Properties.GetItemByIndex(index));
|
||||
// Assert.AreEqual(memberDisplay.Properties.GetItemByIndex(index), resultValue.Properties.GetItemByIndex(index));
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -351,7 +351,6 @@ namespace Umbraco.Web.BackOffice.Controllers
|
||||
memberType.Alias,
|
||||
contentItem.Name);
|
||||
|
||||
// TODO: may not need to add password like this
|
||||
IdentityResult created = await _memberManager.CreateAsync(identityMember, contentItem.Password.NewPassword);
|
||||
|
||||
if (created.Succeeded == false)
|
||||
@@ -362,7 +361,7 @@ namespace Umbraco.Web.BackOffice.Controllers
|
||||
// now re-look the member back up which will now exist
|
||||
IMember member = _memberService.GetByEmail(contentItem.Email);
|
||||
|
||||
var creatorId = _backOfficeSecurityAccessor.BackOfficeSecurity.CurrentUser.Id;
|
||||
int creatorId = _backOfficeSecurityAccessor.BackOfficeSecurity.CurrentUser.Id;
|
||||
member.CreatorId = creatorId;
|
||||
|
||||
// map the save info over onto the user
|
||||
@@ -476,7 +475,7 @@ namespace Umbraco.Web.BackOffice.Controllers
|
||||
$"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}password");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IMember byUsername = _memberService.GetByUsername(contentItem.Username);
|
||||
if (byUsername != null && byUsername.Key != contentItem.Key)
|
||||
|
||||
Reference in New Issue
Block a user