Fixing Member and MemberType, so the ids are properly assigned through the repositories.

Adding test to assert that no Properties, PropertyTypes or PropertyGroups exists without an id when loaded from the db.
NOTE Changes signature of Member class as Email, Username and Password is required.
This commit is contained in:
Morten Christensen
2013-10-01 10:20:16 +02:00
parent 5aa01e78ab
commit 7dee2802fe
10 changed files with 82 additions and 135 deletions

View File

@@ -20,19 +20,26 @@ namespace Umbraco.Core.Models
private object _providerUserKey;
private Type _userTypeKey;
public Member(string name, int parentId, IMemberType contentType, PropertyCollection properties) : base(name, parentId, contentType, properties)
public Member(string name, string email, string username, string password, int parentId, IMemberType contentType)
: base(name, parentId, contentType, new PropertyCollection())
{
Mandate.ParameterNotNull(contentType, "contentType");
_contentType = contentType;
_email = email;
_username = username;
_password = password;
}
public Member(string name, IContentBase parent, IMemberType contentType, PropertyCollection properties)
: base(name, parent, contentType, properties)
public Member(string name, string email, string username, string password, IContentBase parent, IMemberType contentType)
: base(name, parent, contentType, new PropertyCollection())
{
Mandate.ParameterNotNull(contentType, "contentType");
_contentType = contentType;
_email = email;
_username = username;
_password = password;
}
private static readonly PropertyInfo DefaultContentTypeAliasSelector = ExpressionHelper.GetPropertyInfo<Member, string>(x => x.ContentTypeAlias);

View File

@@ -18,5 +18,8 @@ namespace Umbraco.Core.Models.Rdbms
[Column("PropertyGroupSortOrder")]
public int SortOrder { get; set; }
[Column("contenttypeNodeId")]
public int ContentTypeNodeId { get; set; }
}
}

View File

@@ -18,17 +18,13 @@ namespace Umbraco.Core.Persistence.Factories
public IMember BuildEntity(MemberReadOnlyDto dto)
{
var properties = CreateProperties(_memberTypes[dto.ContentTypeAlias], dto.Properties, dto.CreateDate);
var propertyCollection = new PropertyCollection(properties);
var member = new Member(dto.Text, dto.ParentId, _memberTypes[dto.ContentTypeAlias], propertyCollection)
var member = new Member(dto.Text, dto.Email, dto.LoginName, dto.Password, dto.ParentId, _memberTypes[dto.ContentTypeAlias])
{
Id = dto.NodeId,
CreateDate = dto.CreateDate,
UpdateDate = dto.UpdateDate,
Name = dto.Text,
Email = dto.Email,
Username = dto.LoginName,
Password = dto.Password,
ProviderUserKey = dto.UniqueId,
Trashed = dto.Trashed,
Key = dto.UniqueId.Value,
@@ -37,7 +33,8 @@ namespace Umbraco.Core.Persistence.Factories
Path = dto.Path,
SortOrder = dto.SortOrder,
Version = dto.VersionId,
ContentTypeAlias = dto.ContentTypeAlias
ContentTypeAlias = dto.ContentTypeAlias,
Properties = new PropertyCollection(properties)
};
member.SetProviderUserKeyType(typeof(Guid));

View File

@@ -60,7 +60,7 @@ namespace Umbraco.Core.Persistence.Factories
{
var group = new PropertyGroup();
//Only assign an Id if the PropertyGroup belongs to this ContentType
if (groupDto.Id.HasValue && groupDto.Id == memberType.Id)
if (groupDto.ContentTypeNodeId == memberType.Id)
{
group.Id = groupDto.Id.Value;
@@ -78,7 +78,8 @@ namespace Umbraco.Core.Persistence.Factories
group.PropertyTypes = new PropertyTypeCollection();
//Because we are likely to have a group with no PropertyTypes we need to ensure that these are excluded
var typeDtos = dto.PropertyTypes.Where(x => x.Id.HasValue && x.Id > 0 && x.PropertyTypeGroupId.HasValue && x.PropertyTypeGroupId.Value == groupDto.Id.Value);
var localGroupDto = groupDto;
var typeDtos = dto.PropertyTypes.Where(x => x.Id.HasValue && x.Id > 0 && x.PropertyTypeGroupId.HasValue && x.PropertyTypeGroupId.Value == localGroupDto.Id.Value);
foreach (var typeDto in typeDtos)
{
//Internal dictionary for adding "MemberCanEdit" and "VisibleOnProfile" properties to each PropertyType

View File

@@ -103,8 +103,8 @@ namespace Umbraco.Core.Persistence.Repositories
"cmsPropertyType.validationRegExp", "cmsPropertyType.dataTypeId", "cmsPropertyType.sortOrder AS PropertyTypeSortOrder",
"cmsPropertyType.propertyTypeGroupId AS PropertyTypesGroupId", "cmsMemberType.memberCanEdit", "cmsMemberType.viewOnProfile",
"cmsDataType.controlId", "cmsDataType.dbType", "cmsPropertyTypeGroup.id AS PropertyTypeGroupId",
"cmsPropertyTypeGroup.text AS PropertyGroupName", "cmsPropertyTypeGroup.parentGroupId",
"cmsPropertyTypeGroup.sortorder AS PropertyGroupSortOrder")
"cmsPropertyTypeGroup.text AS PropertyGroupName", "cmsPropertyTypeGroup.parentGroupId",
"cmsPropertyTypeGroup.sortorder AS PropertyGroupSortOrder", "cmsPropertyTypeGroup.contenttypeNodeId")
.From<NodeDto>()
.InnerJoin<ContentTypeDto>().On<ContentTypeDto, NodeDto>(left => left.NodeId, right => right.NodeId)
.LeftJoin<PropertyTypeDto>().On<PropertyTypeDto, NodeDto>(left => left.ContentTypeId, right => right.NodeId)

View File

@@ -200,13 +200,13 @@ namespace Umbraco.Core.Services
/// <summary>
/// Creates a new Member
/// </summary>
/// <param name="username"></param>
/// <param name="email"></param>
/// <param name="username"></param>
/// <param name="password"></param>
/// <param name="memberTypeAlias"></param>
/// <param name="userId"></param>
/// <returns></returns>
public IMember CreateMember(string username, string email, string password, string memberTypeAlias, int userId = 0)
public IMember CreateMember(string email, string username, string password, string memberTypeAlias, int userId = 0)
{
var uow = _uowProvider.GetUnitOfWork();
IMemberType memberType;
@@ -220,14 +220,10 @@ namespace Umbraco.Core.Services
if (memberType == null)
throw new Exception(string.Format("No MemberType matching the passed in Alias: '{0}' was found", memberTypeAlias));
var member = new Member(email, -1, memberType, new PropertyCollection());
var member = new Member(email, email, username, password, -1, memberType);
using (var repository = _repositoryFactory.CreateMemberRepository(uow))
{
member.Username = username;
member.Email = email;
member.Password = password;
repository.AddOrUpdate(member);
uow.Commit();
}

View File

@@ -4,32 +4,23 @@ using NUnit.Framework;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Rdbms;
using Umbraco.Core.ObjectResolution;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Caching;
using Umbraco.Core.Persistence.Mappers;
using Umbraco.Core.Persistence.Querying;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.SqlSyntax;
using Umbraco.Core.Persistence.UnitOfWork;
using Umbraco.Core.Publishing;
using Umbraco.Core.Services;
using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.TestHelpers.Entities;
namespace Umbraco.Tests.Persistence.Repositories
{
[TestFixture, NUnit.Framework.Ignore]
public class MemberRepositoryTest : MemberRepositoryBaseTest
[TestFixture]
public class MemberRepositoryTest : BaseDatabaseFactoryTest
{
#region Overrides of MemberRepositoryBaseTest
[SetUp]
public override void Initialize()
{
base.Initialize();
SqlSyntaxContext.SqlSyntaxProvider = SqlServerSyntax.Provider;
}
[TearDown]
@@ -38,18 +29,6 @@ namespace Umbraco.Tests.Persistence.Repositories
base.TearDown();
}
public override string ConnectionString
{
get { return @"server=.\SQLEXPRESS;database=EmptyForTest;user id=umbraco;password=umbraco"; }
}
public override string ProviderName
{
get { return "System.Data.SqlClient"; }
}
#endregion
private MemberRepository CreateRepository(IDatabaseUnitOfWork unitOfWork, out MemberTypeRepository memberTypeRepository)
{
memberTypeRepository = new MemberTypeRepository(unitOfWork, NullCacheProvider.Current);
@@ -71,10 +50,11 @@ namespace Umbraco.Tests.Persistence.Repositories
Assert.That(repository, Is.Not.Null);
}
[Test]
[Test, NUnit.Framework.Ignore]
public void MemberRepository_Can_Get_Member_By_Id()
{
var unitOfWork = UnitOfWorkProvider.GetUnitOfWork();
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
MemberTypeRepository memberTypeRepository;
using (var repository = CreateRepository(unitOfWork, out memberTypeRepository))
{
@@ -85,10 +65,11 @@ namespace Umbraco.Tests.Persistence.Repositories
}
}
[Test]
[Test, NUnit.Framework.Ignore]
public void MemberRepository_Can_Get_Specific_Members()
{
var unitOfWork = UnitOfWorkProvider.GetUnitOfWork();
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
MemberTypeRepository memberTypeRepository;
using (var repository = CreateRepository(unitOfWork, out memberTypeRepository))
{
@@ -101,10 +82,11 @@ namespace Umbraco.Tests.Persistence.Repositories
}
}
[Test]
[Test, NUnit.Framework.Ignore]
public void MemberRepository_Can_Get_All_Members()
{
var unitOfWork = UnitOfWorkProvider.GetUnitOfWork();
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
MemberTypeRepository memberTypeRepository;
using (var repository = CreateRepository(unitOfWork, out memberTypeRepository))
{
@@ -117,11 +99,12 @@ namespace Umbraco.Tests.Persistence.Repositories
}
}
[Test]
[Test, NUnit.Framework.Ignore]
public void MemberRepository_Can_Perform_GetByQuery_With_Key()
{
// Arrange
var unitOfWork = UnitOfWorkProvider.GetUnitOfWork();
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
MemberTypeRepository memberTypeRepository;
using (var repository = CreateRepository(unitOfWork, out memberTypeRepository))
{
@@ -136,11 +119,12 @@ namespace Umbraco.Tests.Persistence.Repositories
}
}
[Test]
[Test, NUnit.Framework.Ignore]
public void MemberRepository_Can_Perform_GetByQuery_With_Property_Value()
{
// Arrange
var unitOfWork = UnitOfWorkProvider.GetUnitOfWork();
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
MemberTypeRepository memberTypeRepository;
using (var repository = CreateRepository(unitOfWork, out memberTypeRepository))
{
@@ -156,11 +140,12 @@ namespace Umbraco.Tests.Persistence.Repositories
}
}
[Test]
[Test, NUnit.Framework.Ignore]
public void MemberRepository_Can_Perform_GetByQuery_With_Property_Alias_And_Value()
{
// Arrange
var unitOfWork = UnitOfWorkProvider.GetUnitOfWork();
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
MemberTypeRepository memberTypeRepository;
using (var repository = CreateRepository(unitOfWork, out memberTypeRepository))
{
@@ -179,7 +164,8 @@ namespace Umbraco.Tests.Persistence.Repositories
public void MemberRepository_Can_Persist_Member()
{
IMember sut;
var unitOfWork = UnitOfWorkProvider.GetUnitOfWork();
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
MemberTypeRepository memberTypeRepository;
using (var repository = CreateRepository(unitOfWork, out memberTypeRepository))
{
@@ -196,7 +182,9 @@ namespace Umbraco.Tests.Persistence.Repositories
Assert.That(sut, Is.Not.Null);
Assert.That(sut.ContentType.PropertyGroups.Count(), Is.EqualTo(1));
Assert.That(sut.ContentType.PropertyTypes.Count(), Is.EqualTo(12));
Assert.That(sut.Properties.Count(), Is.EqualTo(12));
Assert.That(sut.Properties.Any(x => x.HasIdentity == false || x.Id == 0), Is.False);
}
}
@@ -278,60 +266,4 @@ namespace Umbraco.Tests.Persistence.Repositories
get { return new Guid(Constants.ObjectTypes.Member); }
}
}
[TestFixture]
public abstract class MemberRepositoryBaseTest
{
[SetUp]
public virtual void Initialize()
{
TestHelper.SetupLog4NetForTests();
TestHelper.InitializeContentDirectories();
string path = TestHelper.CurrentAssemblyDirectory;
AppDomain.CurrentDomain.SetData("DataDirectory", path);
RepositoryResolver.Current = new RepositoryResolver(
new RepositoryFactory());
MappingResolver.Current = new MappingResolver(
() => PluginManager.Current.ResolveAssignedMapperTypes());
var dbFactory = new DefaultDatabaseFactory(ConnectionString, ProviderName);
UnitOfWorkProvider = new PetaPocoUnitOfWorkProvider(dbFactory);
ApplicationContext.Current = new ApplicationContext(
//assign the db context
new DatabaseContext(new DefaultDatabaseFactory()),
//assign the service context
new ServiceContext(UnitOfWorkProvider, new FileUnitOfWorkProvider(), new PublishingStrategy()),
//disable cache
false)
{
IsReady = true
};
Resolution.Freeze();
}
[TearDown]
public virtual void TearDown()
{
SqlSyntaxContext.SqlSyntaxProvider = null;
AppDomain.CurrentDomain.SetData("DataDirectory", null);
//reset the app context
ApplicationContext.Current = null;
RepositoryResolver.Reset();
MappingResolver.Reset();
}
public abstract string ConnectionString { get; }
public abstract string ProviderName { get; }
public PetaPocoUnitOfWorkProvider UnitOfWorkProvider { get; set; }
}
}

View File

@@ -1,24 +1,22 @@
using System.Linq;
using NUnit.Framework;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Caching;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.SqlSyntax;
using Umbraco.Core.Persistence.UnitOfWork;
using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.TestHelpers.Entities;
namespace Umbraco.Tests.Persistence.Repositories
{
[TestFixture, NUnit.Framework.Ignore]
public class MemberTypeRepositoryTest : MemberRepositoryBaseTest
[TestFixture]
public class MemberTypeRepositoryTest : BaseDatabaseFactoryTest
{
#region Overrides of MemberRepositoryBaseTest
[SetUp]
public override void Initialize()
{
base.Initialize();
SqlSyntaxContext.SqlSyntaxProvider = SqlServerSyntax.Provider;
}
[TearDown]
@@ -27,18 +25,6 @@ namespace Umbraco.Tests.Persistence.Repositories
base.TearDown();
}
public override string ConnectionString
{
get { return @"server=.\SQLEXPRESS;database=EmptyForTest;user id=umbraco;password=umbraco"; }
}
public override string ProviderName
{
get { return "System.Data.SqlClient"; }
}
#endregion
private MemberTypeRepository CreateRepository(IDatabaseUnitOfWork unitOfWork)
{
return new MemberTypeRepository(unitOfWork, NullCacheProvider.Current);
@@ -59,9 +45,33 @@ namespace Umbraco.Tests.Persistence.Repositories
}
[Test]
public void MemberRepository_Can_Persist_Member()
{
IMemberType sut;
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
using (var repository = CreateRepository(unitOfWork))
{
var memberType = MockedContentTypes.CreateSimpleMemberType();
repository.AddOrUpdate(memberType);
unitOfWork.Commit();
sut = repository.Get(memberType.Id);
Assert.That(sut, Is.Not.Null);
Assert.That(sut.PropertyGroups.Count(), Is.EqualTo(1));
Assert.That(sut.PropertyTypes.Count(), Is.EqualTo(12));
Assert.That(sut.PropertyGroups.Any(x => x.HasIdentity == false || x.Id == 0), Is.False);
Assert.That(sut.PropertyTypes.Any(x => x.HasIdentity == false || x.Id == 0), Is.False);
}
}
[Test, NUnit.Framework.Ignore]
public void MemberTypeRepository_Can_Get_MemberType_By_Id()
{
var unitOfWork = UnitOfWorkProvider.GetUnitOfWork();
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
using (var repository = CreateRepository(unitOfWork))
{

View File

@@ -1,4 +1,5 @@
using Umbraco.Core.Models;
using Umbraco.Core.Models.Membership;
namespace Umbraco.Tests.TestHelpers.Entities
{
@@ -6,7 +7,7 @@ namespace Umbraco.Tests.TestHelpers.Entities
{
public static Member CreateSimpleContent(IMemberType contentType, string name, string email, string password, string username, int parentId)
{
var member = new Member(name, parentId, contentType, new PropertyCollection())
var member = new Member(name, email, username, password, parentId, contentType)
{
CreatorId = 0,
Email = email,

View File

@@ -323,8 +323,8 @@ namespace Umbraco.Web.Security.Providers
"Cannot create member as a member with the same email address exists: " + email);
return null;
}
var member = MemberService.CreateMember(username, email, password, DefaultMemberTypeAlias);
var member = MemberService.CreateMember(email, username, password, DefaultMemberTypeAlias);
member.IsApproved = isApproved;
member.PasswordQuestion = passwordQuestion;