2020-12-06 17:23:38 +00:00
|
|
|
using System.Collections.Generic;
|
2021-03-18 16:36:23 +11:00
|
|
|
using System.Data;
|
2021-01-28 11:35:02 +00:00
|
|
|
using System.Linq;
|
2020-12-06 17:23:38 +00:00
|
|
|
using System.Threading.Tasks;
|
2021-01-28 11:35:02 +00:00
|
|
|
using AngleSharp.Common;
|
2020-12-06 17:23:38 +00:00
|
|
|
using AutoFixture.NUnit3;
|
2021-01-15 16:51:23 +00:00
|
|
|
using Microsoft.AspNetCore.Http;
|
2020-12-06 17:23:38 +00:00
|
|
|
using Microsoft.AspNetCore.Identity;
|
2021-01-28 11:35:02 +00:00
|
|
|
using Microsoft.AspNetCore.Routing;
|
2020-12-06 17:23:38 +00:00
|
|
|
using Microsoft.Extensions.Logging;
|
2022-12-05 12:25:55 +01:00
|
|
|
using Microsoft.Extensions.Logging.Abstractions;
|
2021-01-28 11:35:02 +00:00
|
|
|
using Microsoft.Extensions.Options;
|
2020-12-06 17:23:38 +00:00
|
|
|
using Moq;
|
|
|
|
|
using NUnit.Framework;
|
2021-02-22 20:55:12 +00:00
|
|
|
using Umbraco.Cms.Core;
|
|
|
|
|
using Umbraco.Cms.Core.Cache;
|
|
|
|
|
using Umbraco.Cms.Core.Configuration.Models;
|
|
|
|
|
using Umbraco.Cms.Core.ContentApps;
|
|
|
|
|
using Umbraco.Cms.Core.Dictionary;
|
|
|
|
|
using Umbraco.Cms.Core.Events;
|
2021-03-18 08:38:57 +01:00
|
|
|
using Umbraco.Cms.Core.Hosting;
|
2021-05-18 12:40:24 +02:00
|
|
|
using Umbraco.Cms.Core.IO;
|
2021-02-22 20:55:12 +00:00
|
|
|
using Umbraco.Cms.Core.Mapping;
|
|
|
|
|
using Umbraco.Cms.Core.Models;
|
|
|
|
|
using Umbraco.Cms.Core.Models.ContentEditing;
|
|
|
|
|
using Umbraco.Cms.Core.Models.Mapping;
|
2021-02-28 17:02:05 +00:00
|
|
|
using Umbraco.Cms.Core.Models.Membership;
|
2021-02-22 20:55:12 +00:00
|
|
|
using Umbraco.Cms.Core.PropertyEditors;
|
2021-03-18 16:36:23 +11:00
|
|
|
using Umbraco.Cms.Core.Scoping;
|
2021-02-22 20:55:12 +00:00
|
|
|
using Umbraco.Cms.Core.Security;
|
|
|
|
|
using Umbraco.Cms.Core.Serialization;
|
|
|
|
|
using Umbraco.Cms.Core.Services;
|
|
|
|
|
using Umbraco.Cms.Core.Strings;
|
2021-02-23 09:05:06 +01:00
|
|
|
using Umbraco.Cms.Infrastructure.Serialization;
|
2021-02-22 20:55:12 +00:00
|
|
|
using Umbraco.Cms.Tests.Common.Builders;
|
|
|
|
|
using Umbraco.Cms.Tests.UnitTests.AutoFixture;
|
|
|
|
|
using Umbraco.Cms.Tests.UnitTests.Umbraco.Core.ShortStringHelper;
|
|
|
|
|
using Umbraco.Cms.Web.BackOffice.Controllers;
|
|
|
|
|
using Umbraco.Cms.Web.BackOffice.Mapping;
|
|
|
|
|
using Umbraco.Cms.Web.Common.ActionsResults;
|
2021-02-26 14:21:23 +00:00
|
|
|
using Umbraco.Cms.Web.Common.Security;
|
2021-02-23 09:05:06 +01:00
|
|
|
using MemberMapDefinition = Umbraco.Cms.Web.BackOffice.Mapping.MemberMapDefinition;
|
2020-12-06 17:23:38 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.BackOffice.Controllers;
|
2021-01-28 11:35:02 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
[TestFixture]
|
|
|
|
|
public class MemberControllerUnitTests
|
|
|
|
|
{
|
|
|
|
|
private IUmbracoMapper _mapper;
|
2020-12-06 17:23:38 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
[Test]
|
|
|
|
|
[AutoMoqData]
|
|
|
|
|
public void PostSaveMember_WhenMemberIsNull_ExpectFailureResponse(
|
|
|
|
|
MemberController sut)
|
|
|
|
|
{
|
|
|
|
|
// arrange
|
|
|
|
|
// act
|
|
|
|
|
var exception = Assert.ThrowsAsync<ArgumentNullException>(() => sut.PostSave(null));
|
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
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
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
[Test]
|
|
|
|
|
[AutoMoqData]
|
|
|
|
|
public void PostSaveMember_WhenModelStateIsNotValid_ExpectFailureResponse(
|
|
|
|
|
[Frozen] IMemberManager umbracoMembersUserManager,
|
|
|
|
|
IMemberService memberService,
|
|
|
|
|
IMemberTypeService memberTypeService,
|
|
|
|
|
IMemberGroupService memberGroupService,
|
|
|
|
|
IDataTypeService dataTypeService,
|
|
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
|
|
|
|
IPasswordChanger<MemberIdentityUser> passwordChanger,
|
|
|
|
|
IOptions<GlobalSettings> globalSettings,
|
2022-11-28 13:42:38 +01:00
|
|
|
IUser user,
|
|
|
|
|
ITwoFactorLoginService twoFactorLoginService)
|
2022-06-21 08:09:38 +02:00
|
|
|
{
|
|
|
|
|
// arrange
|
|
|
|
|
SetupMemberTestData(out var fakeMemberData, out _, ContentSaveAction.SaveNew);
|
|
|
|
|
var sut = CreateSut(
|
|
|
|
|
memberService,
|
|
|
|
|
memberTypeService,
|
|
|
|
|
memberGroupService,
|
|
|
|
|
umbracoMembersUserManager,
|
|
|
|
|
dataTypeService,
|
|
|
|
|
backOfficeSecurityAccessor,
|
|
|
|
|
passwordChanger,
|
2022-11-28 13:42:38 +01:00
|
|
|
globalSettings,
|
|
|
|
|
twoFactorLoginService);
|
2022-06-21 08:09:38 +02:00
|
|
|
sut.ModelState.AddModelError("key", "Invalid model state");
|
|
|
|
|
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.CreateAsync(It.IsAny<MemberIdentityUser>(), It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
|
|
|
|
|
// act
|
|
|
|
|
var result = sut.PostSave(fakeMemberData).Result;
|
|
|
|
|
var validation = result.Result as ValidationErrorResult;
|
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
Assert.IsNotNull(result.Result);
|
|
|
|
|
Assert.IsNull(result.Value);
|
|
|
|
|
Assert.AreEqual(StatusCodes.Status400BadRequest, validation?.StatusCode);
|
|
|
|
|
}
|
2020-12-06 17:23:38 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
[Test]
|
|
|
|
|
[AutoMoqData]
|
|
|
|
|
public async Task PostSaveMember_SaveNew_NoCustomField_WhenAllIsSetupCorrectly_ExpectSuccessResponse(
|
|
|
|
|
[Frozen] IMemberManager umbracoMembersUserManager,
|
|
|
|
|
IMemberService memberService,
|
|
|
|
|
IMemberTypeService memberTypeService,
|
|
|
|
|
IMemberGroupService memberGroupService,
|
|
|
|
|
IDataTypeService dataTypeService,
|
|
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
|
|
|
|
IBackOfficeSecurity backOfficeSecurity,
|
|
|
|
|
IPasswordChanger<MemberIdentityUser> passwordChanger,
|
|
|
|
|
IOptions<GlobalSettings> globalSettings,
|
2022-11-28 13:42:38 +01:00
|
|
|
IUser user,
|
|
|
|
|
ITwoFactorLoginService twoFactorLoginService)
|
2022-06-21 08:09:38 +02:00
|
|
|
{
|
|
|
|
|
// arrange
|
|
|
|
|
var member = SetupMemberTestData(out var fakeMemberData, out var memberDisplay, ContentSaveAction.SaveNew);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.CreateAsync(It.IsAny<MemberIdentityUser>(), It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.GetRolesAsync(It.IsAny<MemberIdentityUser>()))
|
|
|
|
|
.ReturnsAsync(() => Array.Empty<string>());
|
|
|
|
|
Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias");
|
|
|
|
|
Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity);
|
|
|
|
|
Mock.Get(memberService).SetupSequence(
|
2020-12-06 17:23:38 +00:00
|
|
|
x => x.GetByEmail(It.IsAny<string>()))
|
2022-06-21 08:09:38 +02:00
|
|
|
.Returns(() => null)
|
|
|
|
|
.Returns(() => member);
|
|
|
|
|
Mock.Get(memberService).Setup(x => x.GetByUsername(It.IsAny<string>())).Returns(() => member);
|
|
|
|
|
|
|
|
|
|
var sut = CreateSut(
|
|
|
|
|
memberService,
|
|
|
|
|
memberTypeService,
|
|
|
|
|
memberGroupService,
|
|
|
|
|
umbracoMembersUserManager,
|
|
|
|
|
dataTypeService,
|
|
|
|
|
backOfficeSecurityAccessor,
|
|
|
|
|
passwordChanger,
|
2022-11-28 13:42:38 +01:00
|
|
|
globalSettings,
|
|
|
|
|
twoFactorLoginService);
|
2022-06-21 08:09:38 +02:00
|
|
|
|
|
|
|
|
// act
|
|
|
|
|
var result = await sut.PostSave(fakeMemberData);
|
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
Assert.IsNull(result.Result);
|
|
|
|
|
Assert.IsNotNull(result.Value);
|
|
|
|
|
AssertMemberDisplayPropertiesAreEqual(memberDisplay, result.Value);
|
|
|
|
|
}
|
2020-12-06 17:23:38 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
[Test]
|
|
|
|
|
[AutoMoqData]
|
|
|
|
|
public async Task PostSaveMember_SaveNew_CustomField_WhenAllIsSetupCorrectly_ExpectSuccessResponse(
|
2021-02-12 14:38:20 +00:00
|
|
|
[Frozen] IMemberManager umbracoMembersUserManager,
|
2021-02-03 17:33:48 +00:00
|
|
|
IMemberService memberService,
|
|
|
|
|
IMemberTypeService memberTypeService,
|
|
|
|
|
IMemberGroupService memberGroupService,
|
|
|
|
|
IDataTypeService dataTypeService,
|
|
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
2021-02-20 19:16:31 +00:00
|
|
|
IBackOfficeSecurity backOfficeSecurity,
|
2021-03-04 17:29:11 +00:00
|
|
|
IPasswordChanger<MemberIdentityUser> passwordChanger,
|
2021-02-28 17:02:05 +00:00
|
|
|
IOptions<GlobalSettings> globalSettings,
|
2022-11-28 13:42:38 +01:00
|
|
|
IUser user,
|
|
|
|
|
ITwoFactorLoginService twoFactorLoginService)
|
2022-06-21 08:09:38 +02:00
|
|
|
{
|
|
|
|
|
// arrange
|
|
|
|
|
var member = SetupMemberTestData(out var fakeMemberData, out var memberDisplay, ContentSaveAction.SaveNew);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.CreateAsync(It.IsAny<MemberIdentityUser>(), It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.GetRolesAsync(It.IsAny<MemberIdentityUser>()))
|
|
|
|
|
.ReturnsAsync(() => Array.Empty<string>());
|
|
|
|
|
Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias");
|
|
|
|
|
Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity);
|
|
|
|
|
Mock.Get(memberService).SetupSequence(
|
2021-02-03 17:33:48 +00:00
|
|
|
x => x.GetByEmail(It.IsAny<string>()))
|
2022-06-21 08:09:38 +02:00
|
|
|
.Returns(() => null)
|
|
|
|
|
.Returns(() => member);
|
|
|
|
|
Mock.Get(memberService).Setup(x => x.GetByUsername(It.IsAny<string>())).Returns(() => member);
|
|
|
|
|
|
|
|
|
|
var sut = CreateSut(
|
|
|
|
|
memberService,
|
|
|
|
|
memberTypeService,
|
|
|
|
|
memberGroupService,
|
|
|
|
|
umbracoMembersUserManager,
|
|
|
|
|
dataTypeService,
|
|
|
|
|
backOfficeSecurityAccessor,
|
|
|
|
|
passwordChanger,
|
2022-11-28 13:42:38 +01:00
|
|
|
globalSettings,
|
|
|
|
|
twoFactorLoginService);
|
2022-06-21 08:09:38 +02:00
|
|
|
|
|
|
|
|
// act
|
|
|
|
|
var result = await sut.PostSave(fakeMemberData);
|
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
Assert.IsNull(result.Result);
|
|
|
|
|
Assert.IsNotNull(result.Value);
|
|
|
|
|
AssertMemberDisplayPropertiesAreEqual(memberDisplay, result.Value);
|
|
|
|
|
}
|
2021-02-03 17:33:48 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
[Test]
|
|
|
|
|
[AutoMoqData]
|
|
|
|
|
public async Task PostSaveMember_SaveExisting_WhenAllIsSetupCorrectly_ExpectSuccessResponse(
|
|
|
|
|
[Frozen] IMemberManager umbracoMembersUserManager,
|
|
|
|
|
IMemberService memberService,
|
|
|
|
|
IMemberTypeService memberTypeService,
|
|
|
|
|
IMemberGroupService memberGroupService,
|
|
|
|
|
IDataTypeService dataTypeService,
|
|
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
|
|
|
|
IBackOfficeSecurity backOfficeSecurity,
|
|
|
|
|
IPasswordChanger<MemberIdentityUser> passwordChanger,
|
|
|
|
|
IOptions<GlobalSettings> globalSettings,
|
2022-11-28 13:42:38 +01:00
|
|
|
IUser user,
|
|
|
|
|
ITwoFactorLoginService twoFactorLoginService)
|
2022-06-21 08:09:38 +02:00
|
|
|
{
|
|
|
|
|
// arrange
|
|
|
|
|
var member = SetupMemberTestData(out var fakeMemberData, out var memberDisplay, ContentSaveAction.Save);
|
|
|
|
|
var membersIdentityUser = new MemberIdentityUser(123);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.FindByIdAsync(It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => membersIdentityUser);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.UpdateAsync(It.IsAny<MemberIdentityUser>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.GetRolesAsync(It.IsAny<MemberIdentityUser>()))
|
|
|
|
|
.ReturnsAsync(() => Array.Empty<string>());
|
|
|
|
|
Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias");
|
|
|
|
|
Mock.Get(globalSettings);
|
|
|
|
|
|
|
|
|
|
SetupUserAccess(backOfficeSecurityAccessor, backOfficeSecurity, user);
|
|
|
|
|
SetupPasswordSuccess(umbracoMembersUserManager, passwordChanger);
|
|
|
|
|
|
|
|
|
|
Mock.Get(memberService).Setup(x => x.GetByUsername(It.IsAny<string>())).Returns(() => member);
|
|
|
|
|
Mock.Get(memberService).Setup(x => x.GetById(It.IsAny<int>())).Returns(() => member);
|
|
|
|
|
Mock.Get(memberService).SetupSequence(
|
|
|
|
|
x => x.GetByEmail(It.IsAny<string>()))
|
|
|
|
|
.Returns(() => null)
|
|
|
|
|
.Returns(() => member);
|
|
|
|
|
|
|
|
|
|
var sut = CreateSut(
|
|
|
|
|
memberService,
|
|
|
|
|
memberTypeService,
|
|
|
|
|
memberGroupService,
|
|
|
|
|
umbracoMembersUserManager,
|
|
|
|
|
dataTypeService,
|
|
|
|
|
backOfficeSecurityAccessor,
|
|
|
|
|
passwordChanger,
|
2022-11-28 13:42:38 +01:00
|
|
|
globalSettings,
|
|
|
|
|
twoFactorLoginService);
|
2022-06-21 08:09:38 +02:00
|
|
|
|
|
|
|
|
// act
|
|
|
|
|
var result = await sut.PostSave(fakeMemberData);
|
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
Assert.IsNull(result.Result);
|
|
|
|
|
Assert.IsNotNull(result.Value);
|
|
|
|
|
AssertMemberDisplayPropertiesAreEqual(memberDisplay, result.Value);
|
|
|
|
|
}
|
2021-02-03 17:33:48 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
[Test]
|
|
|
|
|
[AutoMoqData]
|
|
|
|
|
public async Task PostSaveMember_SaveExisting_WhenAllIsSetupWithPasswordIncorrectly_ExpectFailureResponse(
|
|
|
|
|
[Frozen] IMemberManager umbracoMembersUserManager,
|
|
|
|
|
IMemberService memberService,
|
|
|
|
|
IMemberTypeService memberTypeService,
|
|
|
|
|
IMemberGroupService memberGroupService,
|
|
|
|
|
IDataTypeService dataTypeService,
|
|
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
|
|
|
|
IBackOfficeSecurity backOfficeSecurity,
|
|
|
|
|
IPasswordChanger<MemberIdentityUser> passwordChanger,
|
|
|
|
|
IOptions<GlobalSettings> globalSettings,
|
2022-11-28 13:42:38 +01:00
|
|
|
IUser user,
|
|
|
|
|
ITwoFactorLoginService twoFactorLoginService)
|
2022-06-21 08:09:38 +02:00
|
|
|
{
|
|
|
|
|
// arrange
|
|
|
|
|
var member = SetupMemberTestData(out var fakeMemberData, out _, ContentSaveAction.Save);
|
|
|
|
|
var membersIdentityUser = new MemberIdentityUser(123);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.FindByIdAsync(It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => membersIdentityUser);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.UpdateAsync(It.IsAny<MemberIdentityUser>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias");
|
|
|
|
|
Mock.Get(globalSettings);
|
|
|
|
|
|
|
|
|
|
SetupUserAccess(backOfficeSecurityAccessor, backOfficeSecurity, user);
|
|
|
|
|
SetupPasswordSuccess(umbracoMembersUserManager, passwordChanger, false);
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
var sut = CreateSut(
|
|
|
|
|
memberService,
|
|
|
|
|
memberTypeService,
|
|
|
|
|
memberGroupService,
|
|
|
|
|
umbracoMembersUserManager,
|
|
|
|
|
dataTypeService,
|
|
|
|
|
backOfficeSecurityAccessor,
|
|
|
|
|
passwordChanger,
|
2022-11-28 13:42:38 +01:00
|
|
|
globalSettings,
|
|
|
|
|
twoFactorLoginService);
|
2022-06-21 08:09:38 +02:00
|
|
|
|
|
|
|
|
// act
|
|
|
|
|
var result = await sut.PostSave(fakeMemberData);
|
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
Assert.IsNotNull(result.Result);
|
|
|
|
|
Assert.IsNull(result.Value);
|
|
|
|
|
}
|
2020-12-06 17:23:38 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
private static void SetupUserAccess(IBackOfficeSecurityAccessor backOfficeSecurityAccessor, IBackOfficeSecurity backOfficeSecurity, IUser user)
|
|
|
|
|
{
|
|
|
|
|
Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity);
|
|
|
|
|
Mock.Get(user).Setup(x => x.AllowedSections).Returns(new[] { "member" });
|
|
|
|
|
Mock.Get(backOfficeSecurity).Setup(x => x.CurrentUser).Returns(user);
|
|
|
|
|
}
|
2021-02-28 19:09:02 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
private static void SetupPasswordSuccess(
|
|
|
|
|
IMemberManager umbracoMembersUserManager,
|
|
|
|
|
IPasswordChanger<MemberIdentityUser> passwordChanger,
|
|
|
|
|
bool successful = true)
|
|
|
|
|
{
|
2023-04-04 15:41:12 +02:00
|
|
|
var passwordChanged = new PasswordChangedModel { Error = null, ResetPassword = null };
|
2022-06-21 08:09:38 +02:00
|
|
|
if (!successful)
|
2021-02-28 17:02:05 +00:00
|
|
|
{
|
2022-06-21 08:09:38 +02:00
|
|
|
var attempt = Attempt.Fail(passwordChanged);
|
|
|
|
|
Mock.Get(passwordChanger)
|
|
|
|
|
.Setup(x => x.ChangePasswordWithIdentityAsync(
|
|
|
|
|
It.IsAny<ChangingPasswordModel>(),
|
2023-05-10 14:55:06 +02:00
|
|
|
umbracoMembersUserManager,
|
|
|
|
|
null))
|
2022-06-21 08:09:38 +02:00
|
|
|
.ReturnsAsync(() => attempt);
|
2021-02-28 17:02:05 +00:00
|
|
|
}
|
2022-06-21 08:09:38 +02:00
|
|
|
else
|
2021-02-28 17:02:05 +00:00
|
|
|
{
|
2022-06-21 08:09:38 +02:00
|
|
|
var attempt = Attempt.Succeed(passwordChanged);
|
|
|
|
|
Mock.Get(passwordChanger)
|
|
|
|
|
.Setup(x => x.ChangePasswordWithIdentityAsync(
|
|
|
|
|
It.IsAny<ChangingPasswordModel>(),
|
2023-05-10 14:55:06 +02:00
|
|
|
umbracoMembersUserManager,
|
|
|
|
|
null))
|
2022-06-21 08:09:38 +02:00
|
|
|
.ReturnsAsync(() => attempt);
|
2021-02-28 17:02:05 +00:00
|
|
|
}
|
2022-06-21 08:09:38 +02:00
|
|
|
}
|
2021-02-28 17:02:05 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
[Test]
|
|
|
|
|
[AutoMoqData]
|
|
|
|
|
public void PostSaveMember_SaveNew_WhenMemberEmailAlreadyExists_ExpectFailResponse(
|
|
|
|
|
[Frozen] IMemberManager umbracoMembersUserManager,
|
|
|
|
|
IMemberService memberService,
|
|
|
|
|
IMemberTypeService memberTypeService,
|
|
|
|
|
IMemberGroupService memberGroupService,
|
|
|
|
|
IDataTypeService dataTypeService,
|
|
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
|
|
|
|
IBackOfficeSecurity backOfficeSecurity,
|
|
|
|
|
IPasswordChanger<MemberIdentityUser> passwordChanger,
|
|
|
|
|
IOptions<GlobalSettings> globalSettings,
|
2022-11-28 13:42:38 +01:00
|
|
|
IUser user,
|
|
|
|
|
ITwoFactorLoginService twoFactorLoginService)
|
2022-06-21 08:09:38 +02:00
|
|
|
{
|
|
|
|
|
// arrange
|
|
|
|
|
var member = SetupMemberTestData(out var fakeMemberData, out _, ContentSaveAction.SaveNew);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.CreateAsync(It.IsAny<MemberIdentityUser>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(memberTypeService).Setup(x => x.GetDefault()).Returns("fakeAlias");
|
|
|
|
|
Mock.Get(backOfficeSecurityAccessor).Setup(x => x.BackOfficeSecurity).Returns(backOfficeSecurity);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.AddToRolesAsync(It.IsAny<MemberIdentityUser>(), It.IsAny<IEnumerable<string>>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
|
|
|
|
|
Mock.Get(memberService).SetupSequence(
|
|
|
|
|
x => x.GetByEmail(It.IsAny<string>()))
|
|
|
|
|
.Returns(() => member);
|
|
|
|
|
|
|
|
|
|
var sut = CreateSut(
|
|
|
|
|
memberService,
|
|
|
|
|
memberTypeService,
|
|
|
|
|
memberGroupService,
|
|
|
|
|
umbracoMembersUserManager,
|
|
|
|
|
dataTypeService,
|
|
|
|
|
backOfficeSecurityAccessor,
|
|
|
|
|
passwordChanger,
|
2022-11-28 13:42:38 +01:00
|
|
|
globalSettings,
|
|
|
|
|
twoFactorLoginService);
|
2022-06-21 08:09:38 +02:00
|
|
|
|
|
|
|
|
// act
|
|
|
|
|
var result = sut.PostSave(fakeMemberData).Result;
|
|
|
|
|
var validation = result.Result as ValidationErrorResult;
|
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
Assert.IsNotNull(result.Result);
|
|
|
|
|
Assert.IsNull(result.Value);
|
|
|
|
|
Assert.AreEqual(StatusCodes.Status400BadRequest, validation?.StatusCode);
|
|
|
|
|
}
|
2020-12-06 17:23:38 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
[Test]
|
|
|
|
|
[AutoMoqData]
|
|
|
|
|
public async Task PostSaveMember_SaveExistingMember_WithNoRoles_Add1Role_ExpectSuccessResponse(
|
|
|
|
|
[Frozen] IMemberManager umbracoMembersUserManager,
|
|
|
|
|
IMemberService memberService,
|
|
|
|
|
IMemberTypeService memberTypeService,
|
|
|
|
|
IMemberGroupService memberGroupService,
|
|
|
|
|
IDataTypeService dataTypeService,
|
|
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
|
|
|
|
IBackOfficeSecurity backOfficeSecurity,
|
|
|
|
|
IPasswordChanger<MemberIdentityUser> passwordChanger,
|
|
|
|
|
IOptions<GlobalSettings> globalSettings,
|
2022-11-28 13:42:38 +01:00
|
|
|
IUser user,
|
|
|
|
|
ITwoFactorLoginService twoFactorLoginService)
|
2022-06-21 08:09:38 +02:00
|
|
|
{
|
|
|
|
|
// arrange
|
|
|
|
|
var roleName = "anyrole";
|
|
|
|
|
IMember member = SetupMemberTestData(out var fakeMemberData, out var memberDisplay, ContentSaveAction.Save);
|
|
|
|
|
fakeMemberData.Groups = new List<string> { roleName };
|
|
|
|
|
var membersIdentityUser = new MemberIdentityUser(123);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.FindByIdAsync(It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => membersIdentityUser);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.ValidatePasswordAsync(It.IsAny<string>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.UpdateAsync(It.IsAny<MemberIdentityUser>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.AddToRolesAsync(It.IsAny<MemberIdentityUser>(), It.IsAny<IEnumerable<string>>()))
|
|
|
|
|
.ReturnsAsync(() => IdentityResult.Success);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Setup(x => x.GetRolesAsync(It.IsAny<MemberIdentityUser>()))
|
|
|
|
|
.ReturnsAsync(() => Array.Empty<string>());
|
|
|
|
|
|
|
|
|
|
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).Setup(x => x.GetById(It.IsAny<int>())).Returns(() => member);
|
|
|
|
|
|
|
|
|
|
SetupUserAccess(backOfficeSecurityAccessor, backOfficeSecurity, user);
|
|
|
|
|
SetupPasswordSuccess(umbracoMembersUserManager, passwordChanger);
|
|
|
|
|
|
|
|
|
|
Mock.Get(memberService).SetupSequence(
|
|
|
|
|
x => x.GetByEmail(It.IsAny<string>()))
|
|
|
|
|
.Returns(() => null)
|
|
|
|
|
.Returns(() => member);
|
|
|
|
|
var sut = CreateSut(
|
|
|
|
|
memberService,
|
|
|
|
|
memberTypeService,
|
|
|
|
|
memberGroupService,
|
|
|
|
|
umbracoMembersUserManager,
|
|
|
|
|
dataTypeService,
|
|
|
|
|
backOfficeSecurityAccessor,
|
|
|
|
|
passwordChanger,
|
2022-11-28 13:42:38 +01:00
|
|
|
globalSettings,
|
|
|
|
|
twoFactorLoginService);
|
2022-06-21 08:09:38 +02:00
|
|
|
|
|
|
|
|
// act
|
|
|
|
|
var result = await sut.PostSave(fakeMemberData);
|
|
|
|
|
|
|
|
|
|
// assert
|
|
|
|
|
Assert.IsNull(result.Result);
|
|
|
|
|
Assert.IsNotNull(result.Value);
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Verify(u => u.GetRolesAsync(membersIdentityUser));
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Verify(u => u.AddToRolesAsync(membersIdentityUser, new[] { roleName }));
|
|
|
|
|
Mock.Get(umbracoMembersUserManager)
|
|
|
|
|
.Verify(x => x.GetRolesAsync(It.IsAny<MemberIdentityUser>()));
|
|
|
|
|
Mock.Get(memberService)
|
|
|
|
|
.Verify(m => m.Save(It.IsAny<Member>()));
|
|
|
|
|
AssertMemberDisplayPropertiesAreEqual(memberDisplay, result.Value);
|
|
|
|
|
}
|
2021-02-03 17:33:48 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
/// <summary>
|
|
|
|
|
/// Create member controller to test
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="memberService">Member service</param>
|
|
|
|
|
/// <param name="memberTypeService">Member type service</param>
|
|
|
|
|
/// <param name="memberGroupService">Member group service</param>
|
|
|
|
|
/// <param name="membersUserManager">Members user manager</param>
|
|
|
|
|
/// <param name="dataTypeService">Data type service</param>
|
|
|
|
|
/// <param name="backOfficeSecurityAccessor">Back office security accessor</param>
|
|
|
|
|
/// <param name="passwordChanger">Password changer class</param>
|
|
|
|
|
/// <param name="globalSettings">The global settings</param>
|
|
|
|
|
/// <returns>A member controller for the tests</returns>
|
|
|
|
|
private MemberController CreateSut(
|
|
|
|
|
IMemberService memberService,
|
|
|
|
|
IMemberTypeService memberTypeService,
|
|
|
|
|
IMemberGroupService memberGroupService,
|
|
|
|
|
IUmbracoUserManager<MemberIdentityUser> membersUserManager,
|
|
|
|
|
IDataTypeService dataTypeService,
|
|
|
|
|
IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
|
|
|
|
|
IPasswordChanger<MemberIdentityUser> passwordChanger,
|
2022-11-28 13:42:38 +01:00
|
|
|
IOptions<GlobalSettings> globalSettings,
|
|
|
|
|
ITwoFactorLoginService twoFactorLoginService)
|
2022-06-21 08:09:38 +02:00
|
|
|
{
|
|
|
|
|
var httpContextAccessor = new HttpContextAccessor();
|
|
|
|
|
|
|
|
|
|
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 BackOfficeSecurityAccessor(httpContextAccessor);
|
|
|
|
|
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());
|
|
|
|
|
var 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(
|
|
|
|
|
new DataEditorAttribute(Constants.PropertyEditors.Aliases.TextBox, "Test Textbox", "textbox"),
|
|
|
|
|
textService.Object,
|
|
|
|
|
Mock.Of<IShortStringHelper>(),
|
|
|
|
|
Mock.Of<IJsonSerializer>(),
|
|
|
|
|
Mock.Of<IIOHelper>()));
|
|
|
|
|
|
|
|
|
|
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,
|
2021-01-28 11:35:02 +00:00
|
|
|
contentTypeBaseServiceProvider.Object,
|
2022-11-28 13:42:38 +01:00
|
|
|
propertyEditorCollection,
|
|
|
|
|
twoFactorLoginService));
|
2020-12-06 17:23:38 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
var map = new MapDefinitionCollection(() => new List<IMapDefinition>
|
|
|
|
|
{
|
2022-08-29 09:50:48 +02:00
|
|
|
new global::Umbraco.Cms.Core.Models.Mapping.MemberMapDefinition(),
|
2022-06-21 08:09:38 +02:00
|
|
|
memberMapDefinition,
|
|
|
|
|
new ContentTypeMapDefinition(
|
2021-01-28 11:35:02 +00:00
|
|
|
commonMapper,
|
2020-12-06 17:23:38 +00:00
|
|
|
propertyEditorCollection,
|
|
|
|
|
dataTypeService,
|
2022-06-21 08:09:38 +02:00
|
|
|
new Mock<IFileService>().Object,
|
|
|
|
|
new Mock<IContentTypeService>().Object,
|
|
|
|
|
new Mock<IMediaTypeService>().Object,
|
|
|
|
|
memberTypeService,
|
|
|
|
|
new Mock<ILoggerFactory>().Object,
|
|
|
|
|
mockShortStringHelper,
|
|
|
|
|
globalSettings,
|
|
|
|
|
new Mock<IHostingEnvironment>().Object,
|
|
|
|
|
new Mock<IOptionsMonitor<ContentSettings>>().Object),
|
|
|
|
|
});
|
|
|
|
|
var scopeProvider = Mock.Of<ICoreScopeProvider>(x => x.CreateCoreScope(
|
|
|
|
|
It.IsAny<IsolationLevel>(),
|
|
|
|
|
It.IsAny<RepositoryCacheMode>(),
|
|
|
|
|
It.IsAny<IEventDispatcher>(),
|
|
|
|
|
It.IsAny<IScopedNotificationPublisher>(),
|
|
|
|
|
It.IsAny<bool?>(),
|
|
|
|
|
It.IsAny<bool>(),
|
|
|
|
|
It.IsAny<bool>()) == Mock.Of<ICoreScope>());
|
|
|
|
|
|
2022-12-05 12:25:55 +01:00
|
|
|
_mapper = new UmbracoMapper(map, scopeProvider, NullLogger<UmbracoMapper>.Instance);
|
2022-06-21 08:09:38 +02:00
|
|
|
|
|
|
|
|
return new MemberController(
|
|
|
|
|
new DefaultCultureDictionary(
|
|
|
|
|
new Mock<ILocalizationService>().Object,
|
|
|
|
|
NoAppCache.Instance),
|
|
|
|
|
new LoggerFactory(),
|
|
|
|
|
mockShortStringHelper,
|
|
|
|
|
new DefaultEventMessagesFactory(
|
|
|
|
|
new Mock<IEventMessagesAccessor>().Object),
|
|
|
|
|
textService.Object,
|
|
|
|
|
propertyEditorCollection,
|
|
|
|
|
_mapper,
|
|
|
|
|
memberService,
|
|
|
|
|
memberTypeService,
|
|
|
|
|
(IMemberManager)membersUserManager,
|
|
|
|
|
dataTypeService,
|
|
|
|
|
backOfficeSecurityAccessor,
|
|
|
|
|
new ConfigurationEditorJsonSerializer(),
|
|
|
|
|
passwordChanger,
|
2022-11-28 13:42:38 +01:00
|
|
|
scopeProvider,
|
|
|
|
|
twoFactorLoginService);
|
2022-06-21 08:09:38 +02:00
|
|
|
}
|
2020-12-06 17:23:38 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
/// <summary>
|
|
|
|
|
/// Setup all standard member data for test
|
|
|
|
|
/// </summary>
|
|
|
|
|
private Member SetupMemberTestData(
|
|
|
|
|
out MemberSave fakeMemberData,
|
|
|
|
|
out MemberDisplay memberDisplay,
|
|
|
|
|
ContentSaveAction contentAction)
|
|
|
|
|
{
|
|
|
|
|
// arrange
|
|
|
|
|
var memberType = MemberTypeBuilder.CreateSimpleMemberType();
|
|
|
|
|
var member = MemberBuilder.CreateSimpleMember(memberType, "Test Member", "test@example.com", "123", "test");
|
|
|
|
|
var memberId = 123;
|
|
|
|
|
member.Id = memberId;
|
|
|
|
|
|
|
|
|
|
// TODO: replace with builder for MemberSave and MemberDisplay
|
|
|
|
|
fakeMemberData = new MemberSave
|
2020-12-06 17:23:38 +00:00
|
|
|
{
|
2022-06-21 08:09:38 +02:00
|
|
|
Id = memberId,
|
|
|
|
|
SortOrder = member.SortOrder,
|
|
|
|
|
ContentTypeId = memberType.Id,
|
|
|
|
|
Key = member.Key,
|
|
|
|
|
Password = new ChangingPasswordModel { Id = 456, 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 = member.ContentTypeAlias,
|
|
|
|
|
Action = contentAction,
|
|
|
|
|
Icon = "icon-document",
|
|
|
|
|
Path = member.Path,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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>>
|
2021-01-28 11:35:02 +00:00
|
|
|
{
|
2022-06-21 08:09:38 +02:00
|
|
|
new()
|
2021-01-28 11:35:02 +00:00
|
|
|
{
|
2022-06-21 08:09:38 +02:00
|
|
|
Alias = "test",
|
|
|
|
|
Id = 77,
|
|
|
|
|
Properties = new List<ContentPropertyDisplay>
|
2021-01-28 11:35:02 +00:00
|
|
|
{
|
2022-06-21 08:09:38 +02:00
|
|
|
new() { Alias = $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}login" },
|
|
|
|
|
new() { Alias = $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}email" },
|
|
|
|
|
new()
|
|
|
|
|
{
|
|
|
|
|
Alias =
|
|
|
|
|
$"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}password",
|
|
|
|
|
},
|
|
|
|
|
new()
|
|
|
|
|
{
|
|
|
|
|
Alias =
|
|
|
|
|
$"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}membergroup",
|
|
|
|
|
},
|
|
|
|
|
new()
|
|
|
|
|
{
|
|
|
|
|
Alias =
|
|
|
|
|
$"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}failedPasswordAttempts",
|
|
|
|
|
},
|
|
|
|
|
new()
|
|
|
|
|
{
|
|
|
|
|
Alias =
|
|
|
|
|
$"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}approved",
|
|
|
|
|
},
|
|
|
|
|
new()
|
|
|
|
|
{
|
|
|
|
|
Alias =
|
|
|
|
|
$"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}lockedOut",
|
|
|
|
|
},
|
|
|
|
|
new()
|
2022-11-28 13:42:38 +01:00
|
|
|
{
|
|
|
|
|
Alias =
|
|
|
|
|
$"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}twoFactorEnabled",
|
|
|
|
|
},
|
|
|
|
|
new()
|
2022-06-21 08:09:38 +02:00
|
|
|
{
|
|
|
|
|
Alias =
|
|
|
|
|
$"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}lastLockoutDate",
|
|
|
|
|
},
|
|
|
|
|
new()
|
|
|
|
|
{
|
|
|
|
|
Alias =
|
|
|
|
|
$"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}lastLoginDate",
|
|
|
|
|
},
|
|
|
|
|
new()
|
2021-02-04 17:01:21 +00:00
|
|
|
{
|
2022-06-21 08:09:38 +02:00
|
|
|
Alias =
|
|
|
|
|
$"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}lastPasswordChangeDate",
|
2022-04-21 14:47:27 +02:00
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2022-06-21 08:09:38 +02:00
|
|
|
},
|
|
|
|
|
};
|
2021-01-28 11:35:02 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
return member;
|
|
|
|
|
}
|
2021-01-28 11:35:02 +00:00
|
|
|
|
2022-06-21 08:09:38 +02:00
|
|
|
/// <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);
|
|
|
|
|
|
|
|
|
|
// 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());
|
|
|
|
|
Assert.AreNotSame(memberDisplay.Properties, resultValue.Properties);
|
|
|
|
|
for (var index = 0; index < resultValue.Properties.Count(); index++)
|
2021-01-28 11:35:02 +00:00
|
|
|
{
|
2022-06-21 08:09:38 +02:00
|
|
|
Assert.AreNotSame(
|
|
|
|
|
memberDisplay.Properties.GetItemByIndex(index),
|
|
|
|
|
resultValue.Properties.GetItemByIndex(index));
|
|
|
|
|
|
|
|
|
|
// Assert.AreEqual(memberDisplay.Properties.GetItemByIndex(index), resultValue.Properties.GetItemByIndex(index));
|
2020-12-06 17:23:38 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|