public void SavingPreservesPassword() { IMember sut; var provider = TestObjects.GetScopeProvider(Logger); using (var scope = provider.CreateScope()) { MemberTypeRepository memberTypeRepository; MemberGroupRepository memberGroupRepository; var repository = CreateRepository(provider, out memberTypeRepository, out memberGroupRepository); var memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.Save(memberType); var member = MockedMember.CreateSimpleMember(memberType, "Johnny Hefty", "*****@*****.**", "123", "hefty"); repository.Save(member); sut = repository.Get(member.Id); //when the password is null it will not overwrite what is already there. sut.RawPasswordValue = null; repository.Save(sut); sut = repository.Get(member.Id); Assert.That(sut.RawPasswordValue, Is.EqualTo("123")); } }
public void Rebuild_All_Xml_Structures() { var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; MemberGroupRepository memberGroupRepository; using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { var memberType1 = CreateTestMemberType(); for (var i = 0; i < 100; i++) { var member = MockedMember.CreateSimpleMember(memberType1, "blah" + i, "blah" + i + "@example.com", "blah", "blah" + i); repository.AddOrUpdate(member); } unitOfWork.Commit(); //delete all xml unitOfWork.Database.Execute("DELETE FROM cmsContentXml"); Assert.AreEqual(0, unitOfWork.Database.ExecuteScalar <int>("SELECT COUNT(*) FROM cmsContentXml")); repository.RebuildXmlStructures(media => new XElement("test"), 10); Assert.AreEqual(100, unitOfWork.Database.ExecuteScalar <int>("SELECT COUNT(*) FROM cmsContentXml")); } }
public void MemberRepository_Does_Not_Replace_Password_When_Null() { IMember sut; var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; MemberGroupRepository memberGroupRepository; using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { var memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.AddOrUpdate(memberType); unitOfWork.Commit(); var member = MockedMember.CreateSimpleMember(memberType, "Johnny Hefty", "*****@*****.**", "123", "hefty"); repository.AddOrUpdate(member); unitOfWork.Commit(); sut = repository.Get(member.Id); //when the password is null it will not overwrite what is already there. sut.RawPasswordValue = null; repository.AddOrUpdate(sut); unitOfWork.Commit(); sut = repository.Get(member.Id); Assert.That(sut.RawPasswordValue, Is.EqualTo("123")); } }
public void MemberHasBuiltinProperties() { var provider = TestObjects.GetScopeProvider(Logger); using (var scope = provider.CreateScope()) { MemberTypeRepository memberTypeRepository; MemberGroupRepository memberGroupRepository; var repository = CreateRepository(provider, out memberTypeRepository, out memberGroupRepository); var memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.Save(memberType); var member = MockedMember.CreateSimpleMember(memberType, "Johnny Hefty", "*****@*****.**", "123", "hefty"); repository.Save(member); var sut = repository.Get(member.Id); Assert.That(memberType.CompositionPropertyGroups.Count(), Is.EqualTo(2)); Assert.That(memberType.CompositionPropertyTypes.Count(), Is.EqualTo(3 + Constants.Conventions.Member.GetStandardPropertyTypeStubs().Count)); Assert.That(sut.Properties.Count(), Is.EqualTo(3 + Constants.Conventions.Member.GetStandardPropertyTypeStubs().Count)); var grp = memberType.CompositionPropertyGroups.FirstOrDefault(x => x.Name == Constants.Conventions.Member.StandardPropertiesGroupName); Assert.IsNotNull(grp); var aliases = Constants.Conventions.Member.GetStandardPropertyTypeStubs().Select(x => x.Key).ToArray(); foreach (var p in memberType.CompositionPropertyTypes.Where(x => aliases.Contains(x.Alias))) { Assert.AreEqual(grp.Id, p.PropertyGroupId.Value); } } }
public void MemberRepository_Can_Update_Email_And_Login_When_Changed() { IMember sut; var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; MemberGroupRepository memberGroupRepository; using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { var memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.AddOrUpdate(memberType); unitOfWork.Commit(); var member = MockedMember.CreateSimpleMember(memberType, "Johnny Hefty", "*****@*****.**", "123", "hefty"); repository.AddOrUpdate(member); unitOfWork.Commit(); sut = repository.Get(member.Id); sut.Username = "******"; sut.Email = "*****@*****.**"; repository.AddOrUpdate(sut); unitOfWork.Commit(); sut = repository.Get(member.Id); Assert.That(sut.Email, Is.EqualTo("*****@*****.**")); Assert.That(sut.Username, Is.EqualTo("This is new")); } }
public void ValidateUser__must_lock_out_users_after_max_attempts_of_wrong_password() { // Arrange IMemberType memberType = MockedContentTypes.CreateSimpleMemberType(); ServiceContext.MemberTypeService.Save(memberType); var member = MockedMember.CreateSimpleMember(memberType, "test", "*****@*****.**", "password", "test"); ServiceContext.MemberService.Save(member); var wrongPassword = "******"; var numberOfFailedAttempts = MembersMembershipProvider.MaxInvalidPasswordAttempts + 2; // Act var memberBefore = ServiceContext.MemberService.GetById(member.Id); for (int i = 0; i < numberOfFailedAttempts; i++) { MembersMembershipProvider.ValidateUser(member.Username, wrongPassword); } var memberAfter = ServiceContext.MemberService.GetById(member.Id); // Assert Assert.Multiple(() => { Assert.AreEqual(0, memberBefore.FailedPasswordAttempts, "Expected 0 failed password attempts before"); Assert.IsFalse(memberBefore.IsLockedOut, "Expected the member NOT to be locked out before"); Assert.AreEqual(MembersMembershipProvider.MaxInvalidPasswordAttempts, memberAfter.FailedPasswordAttempts, "Expected exactly the max possible failed password attempts after"); Assert.IsTrue(memberAfter.IsLockedOut, "Expected the member to be locked out after"); }); }
public void Rebuild_Member_Xml_On_Alias_Change() { var contentType1 = MockedContentTypes.CreateSimpleMemberType("test1", "Test1"); var contentType2 = MockedContentTypes.CreateSimpleMemberType("test2", "Test2"); ServiceContext.MemberTypeService.Save(contentType1); ServiceContext.MemberTypeService.Save(contentType2); var contentItems1 = MockedMember.CreateSimpleMember(contentType1, 10).ToArray(); contentItems1.ForEach(x => ServiceContext.MemberService.Save(x)); var contentItems2 = MockedMember.CreateSimpleMember(contentType2, 5).ToArray(); contentItems2.ForEach(x => ServiceContext.MemberService.Save(x)); //only update the contentType1 alias which will force an xml rebuild for all content of that type contentType1.Alias = "newAlias"; ServiceContext.MemberTypeService.Save(contentType1); foreach (var c in contentItems1) { var xml = DatabaseContext.Database.FirstOrDefault <ContentXmlDto>("WHERE nodeId = @Id", new { Id = c.Id }); Assert.IsNotNull(xml); Assert.IsTrue(xml.Xml.StartsWith("<newAlias")); } foreach (var c in contentItems2) { var xml = DatabaseContext.Database.FirstOrDefault <ContentXmlDto>("WHERE nodeId = @Id", new { Id = c.Id }); Assert.IsNotNull(xml); Assert.IsTrue(xml.Xml.StartsWith("<test2")); //should remain the same } }
public void Rebuild_Member_Xml_On_Property_Removal() { var standardProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); var contentType1 = MockedContentTypes.CreateSimpleMemberType("test1", "Test1"); ServiceContext.MemberTypeService.Save(contentType1); var contentItems1 = MockedMember.CreateSimpleMember(contentType1, 10).ToArray(); contentItems1.ForEach(x => ServiceContext.MemberService.Save(x)); var alias = contentType1.PropertyTypes.First(x => standardProps.ContainsKey(x.Alias) == false).Alias; var elementToMatch = "<" + alias + ">"; foreach (var c in contentItems1) { var xml = DatabaseContext.Database.FirstOrDefault <ContentXmlDto>("WHERE nodeId = @Id", new { Id = c.Id }); Assert.IsNotNull(xml); Assert.IsTrue(xml.Xml.Contains(elementToMatch)); //verify that it is there before we remove the property } //remove a property (NOT ONE OF THE DEFAULTS) contentType1.RemovePropertyType(alias); ServiceContext.MemberTypeService.Save(contentType1); var reQueried = ServiceContext.MemberTypeService.Get(contentType1.Id); var reContent = ServiceContext.MemberService.GetById(contentItems1.First().Id); foreach (var c in contentItems1) { var xml = DatabaseContext.Database.FirstOrDefault <ContentXmlDto>("WHERE nodeId = @Id", new { Id = c.Id }); Assert.IsNotNull(xml); Assert.IsFalse(xml.Xml.Contains(elementToMatch)); //verify that it is no longer there } }
public void MemberRepository_Can_Persist_Member() { IMember sut; var provider = new PetaPocoUnitOfWorkProvider(); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; using (var repository = CreateRepository(unitOfWork, out memberTypeRepository)) { var memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.AddOrUpdate(memberType); unitOfWork.Commit(); var member = MockedMember.CreateSimpleContent(memberType, "Johnny Hefty", "*****@*****.**", "123", "hefty", -1); repository.AddOrUpdate(member); unitOfWork.Commit(); sut = repository.Get(member.Id); 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); } }
public void Can_Get_Custom_Properties() { var date = DateTime.Now; var memberType = MockedContentTypes.CreateSimpleMemberType("Member", "Member"); var member = MockedMember.CreateSimpleMember(memberType, "test name", "*****@*****.**", "test password", "test username"); member.Comments = "test comment"; member.IsApproved = true; member.IsLockedOut = false; member.CreateDate = date; member.LastLoginDate = date.AddMinutes(1); member.LastLockoutDate = date.AddMinutes(2); //NOTE: Last activity date is always the same as last login date since we don't have a place to store that data //member.LastLoginDate = date.AddMinutes(3); member.LastPasswordChangeDate = date.AddMinutes(4); member.PasswordQuestion = "test question"; member.Properties["title"].Value = "Test Value 1"; member.Properties["bodyText"].Value = "Test Value 2"; member.Properties["author"].Value = "Test Value 3"; var mpc = new MemberPublishedContent(member); var d = mpc.AsDynamic(); Assert.AreEqual("Test Value 1", d.title); Assert.AreEqual("Test Value 1", d.Title); Assert.AreEqual("Test Value 2", d.bodyText); Assert.AreEqual("Test Value 2", d.BodyText); Assert.AreEqual("Test Value 3", d.author); Assert.AreEqual("Test Value 3", d.Author); }
public void New_Member_Has_Built_In_Properties_By_Default() { var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; MemberGroupRepository memberGroupRepository; using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { var memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.AddOrUpdate(memberType); unitOfWork.Commit(); var member = MockedMember.CreateSimpleMember(memberType, "Johnny Hefty", "*****@*****.**", "123", "hefty"); repository.AddOrUpdate(member); unitOfWork.Commit(); var sut = repository.Get(member.Id); Assert.That(sut.ContentType.PropertyGroups.Count(), Is.EqualTo(2)); Assert.That(sut.ContentType.PropertyTypes.Count(), Is.EqualTo(3 + Constants.Conventions.Member.GetStandardPropertyTypeStubs().Count)); Assert.That(sut.Properties.Count(), Is.EqualTo(3 + Constants.Conventions.Member.GetStandardPropertyTypeStubs().Count)); Assert.That(sut.Properties.Any(x => x.HasIdentity == false || x.Id == 0), Is.False); var grp = sut.PropertyGroups.FirstOrDefault(x => x.Name == Constants.Conventions.Member.StandardPropertiesGroupName); Assert.IsNotNull(grp); var aliases = Constants.Conventions.Member.GetStandardPropertyTypeStubs().Select(x => x.Key).ToArray(); foreach (var p in sut.PropertyTypes.Where(x => aliases.Contains(x.Alias))) { Assert.AreEqual(grp.Id, p.PropertyGroupId.Value); } } }
public void SavingUpdatesNameAndEmail() { IMember sut; var provider = TestObjects.GetScopeProvider(Logger); using (var scope = provider.CreateScope()) { MemberTypeRepository memberTypeRepository; MemberGroupRepository memberGroupRepository; var repository = CreateRepository(provider, out memberTypeRepository, out memberGroupRepository); var memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.Save(memberType); var member = MockedMember.CreateSimpleMember(memberType, "Johnny Hefty", "*****@*****.**", "123", "hefty"); repository.Save(member); sut = repository.Get(member.Id); sut.Username = "******"; sut.Email = "*****@*****.**"; repository.Save(sut); sut = repository.Get(member.Id); Assert.That(sut.Email, Is.EqualTo("*****@*****.**")); Assert.That(sut.Username, Is.EqualTo("This is new")); } }
private void CreateTestDataForPagingTests(out List <IContent> createdContent, out List <IMember> createdMembers, out List <IMedia> createdMedia) { //Create content createdContent = new List <IContent>(); var contentType = MockedContentTypes.CreateBasicContentType("blah"); ServiceContext.ContentTypeService.Save(contentType); for (int i = 0; i < 10; i++) { var c1 = MockedContent.CreateBasicContent(contentType); ServiceContext.ContentService.Save(c1); createdContent.Add(c1); } //Create media createdMedia = new List <IMedia>(); var imageType = MockedContentTypes.CreateImageMediaType("myImage"); ServiceContext.MediaTypeService.Save(imageType); for (int i = 0; i < 10; i++) { var c1 = MockedMedia.CreateMediaImage(imageType, -1); ServiceContext.MediaService.Save(c1); createdMedia.Add(c1); } // Create members var memberType = MockedContentTypes.CreateSimpleMemberType("simple"); ServiceContext.MemberTypeService.Save(memberType); createdMembers = MockedMember.CreateSimpleMember(memberType, 10).ToList(); ServiceContext.MemberService.Save(createdMembers); var relType = ServiceContext.RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedMediaAlias); // Relate content to media foreach (var content in createdContent) { foreach (var media in createdMedia) { ServiceContext.RelationService.Relate(content.Id, media.Id, relType); } } // Relate members to media foreach (var member in createdMembers) { foreach (var media in createdMedia) { ServiceContext.RelationService.Relate(member.Id, media.Id, relType); } } }
public void Can_Serialize_Without_Error() { var ss = new SerializationService(new JsonNetSerializer()); var memberType = MockedContentTypes.CreateSimpleMemberType("memberType", "Member Type"); memberType.Id = 99; var member = MockedMember.CreateSimpleMember(memberType, "Name", "*****@*****.**", "pass", "user", Guid.NewGuid()); var i = 200; foreach (var property in member.Properties) { property.Id = ++i; } member.Id = 10; member.CreateDate = DateTime.Now; member.CreatorId = 22; member.Comments = "comments"; member.Key = Guid.NewGuid(); member.FailedPasswordAttempts = 22; member.Level = 3; member.Path = "-1,4,10"; member.Groups = new[] { "group1", "group2" }; member.IsApproved = true; member.IsLockedOut = true; member.LastLockoutDate = DateTime.Now; member.LastLoginDate = DateTime.Now; member.LastPasswordChangeDate = DateTime.Now; member.PasswordQuestion = "question"; member.ProviderUserKey = Guid.NewGuid(); member.RawPasswordAnswerValue = "raw answer"; member.RawPasswordValue = "raw pass"; member.SortOrder = 5; member.Trashed = false; member.UpdateDate = DateTime.Now; member.Version = Guid.NewGuid(); ((IUmbracoEntity)member).AdditionalData.Add("test1", 123); ((IUmbracoEntity)member).AdditionalData.Add("test2", "hello"); var result = ss.ToStream(member); var json = result.ResultStream.ToJsonString(); Console.WriteLine(json); }
public void Deleting_PropertyType_Removes_The_Property_From_Member() { IMemberType memberType = MockedContentTypes.CreateSimpleMemberType(); ServiceContext.MemberTypeService.Save(memberType); IMember member = MockedMember.CreateSimpleMember(memberType, "test", "*****@*****.**", "pass", "test"); ServiceContext.MemberService.Save(member); var initProps = member.Properties.Count; //remove a property (NOT ONE OF THE DEFAULTS) var standardProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); memberType.RemovePropertyType(memberType.PropertyTypes.First(x => standardProps.ContainsKey(x.Alias) == false).Alias); ServiceContext.MemberTypeService.Save(memberType); //re-load it from the db member = ServiceContext.MemberService.GetById(member.Id); Assert.AreEqual(initProps - 1, member.Properties.Count); }
public void Can_Serialize_Without_Error() { var memberType = MockedContentTypes.CreateSimpleMemberType("memberType", "Member Type"); memberType.Id = 99; var member = MockedMember.CreateSimpleMember(memberType, "Name", "*****@*****.**", "pass", "user", Guid.NewGuid()); var i = 200; foreach (var property in member.Properties) { property.Id = ++i; } member.Id = 10; member.CreateDate = DateTime.Now; member.CreatorId = 22; member.Comments = "comments"; member.Key = Guid.NewGuid(); member.FailedPasswordAttempts = 22; member.Level = 3; member.Path = "-1,4,10"; member.Groups = new[] { "group1", "group2" }; member.IsApproved = true; member.IsLockedOut = true; member.LastLockoutDate = DateTime.Now; member.LastLoginDate = DateTime.Now; member.LastPasswordChangeDate = DateTime.Now; member.PasswordQuestion = "question"; member.ProviderUserKey = Guid.NewGuid(); member.RawPasswordAnswerValue = "raw answer"; member.RawPasswordValue = "raw pass"; member.SortOrder = 5; member.Trashed = false; member.UpdateDate = DateTime.Now; member.AdditionalData.Add("test1", 123); member.AdditionalData.Add("test2", "hello"); var json = JsonConvert.SerializeObject(member); Debug.Print(json); }
private IMember CreateTestMember(IMemberType memberType = null, string name = null, string email = null, string password = null, string username = null, Guid?key = null) { var provider = new PetaPocoUnitOfWorkProvider(Logger); var unitOfWork = provider.GetUnitOfWork(); MemberTypeRepository memberTypeRepository; MemberGroupRepository memberGroupRepository; using (var repository = CreateRepository(unitOfWork, out memberTypeRepository, out memberGroupRepository)) { if (memberType == null) { memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.AddOrUpdate(memberType); unitOfWork.Commit(); } var member = MockedMember.CreateSimpleMember(memberType, name ?? "Johnny Hefty", email ?? "*****@*****.**", password ?? "123", username ?? "hefty", key); repository.AddOrUpdate(member); unitOfWork.Commit(); return(member); } }
private IMember CreateTestMember(IMemberType memberType = null, string name = null, string email = null, string password = null, string username = null, Guid?key = null) { var provider = TestObjects.GetScopeProvider(Logger); using (var scope = provider.CreateScope()) { MemberTypeRepository memberTypeRepository; MemberGroupRepository memberGroupRepository; var repository = CreateRepository(provider, out memberTypeRepository, out memberGroupRepository); if (memberType == null) { memberType = MockedContentTypes.CreateSimpleMemberType(); memberTypeRepository.Save(memberType); } var member = MockedMember.CreateSimpleMember(memberType, name ?? "Johnny Hefty", email ?? "*****@*****.**", password ?? "123", username ?? "hefty", key); repository.Save(member); scope.Complete(); return(member); } }
public void Get_Paged_Mixed_Entities_By_Ids() { //Create content var createdContent = new List <IContent>(); var contentType = MockedContentTypes.CreateBasicContentType("blah"); ServiceContext.ContentTypeService.Save(contentType); for (int i = 0; i < 10; i++) { var c1 = MockedContent.CreateBasicContent(contentType); ServiceContext.ContentService.Save(c1); createdContent.Add(c1); } //Create media var createdMedia = new List <IMedia>(); var imageType = MockedContentTypes.CreateImageMediaType("myImage"); ServiceContext.MediaTypeService.Save(imageType); for (int i = 0; i < 10; i++) { var c1 = MockedMedia.CreateMediaImage(imageType, -1); ServiceContext.MediaService.Save(c1); createdMedia.Add(c1); } // Create members var memberType = MockedContentTypes.CreateSimpleMemberType("simple"); ServiceContext.MemberTypeService.Save(memberType); var createdMembers = MockedMember.CreateSimpleMember(memberType, 10).ToList(); ServiceContext.MemberService.Save(createdMembers); var provider = TestObjects.GetScopeProvider(Logger); using (var scope = provider.CreateScope()) { var repo = CreateRepository((IScopeAccessor)provider); var ids = createdContent.Select(x => x.Id).Concat(createdMedia.Select(x => x.Id)).Concat(createdMembers.Select(x => x.Id)); var objectTypes = new[] { Constants.ObjectTypes.Document, Constants.ObjectTypes.Media, Constants.ObjectTypes.Member }; var query = SqlContext.Query <IUmbracoEntity>() .WhereIn(e => e.Id, ids); var entities = repo.GetPagedResultsByQuery(query, objectTypes, 0, 20, out var totalRecords, null, null).ToList(); Assert.AreEqual(20, entities.Count); Assert.AreEqual(30, totalRecords); //add the next page entities.AddRange(repo.GetPagedResultsByQuery(query, objectTypes, 1, 20, out totalRecords, null, null)); Assert.AreEqual(30, entities.Count); Assert.AreEqual(30, totalRecords); var contentEntities = entities.OfType <IDocumentEntitySlim>().ToList(); var mediaEntities = entities.OfType <IMediaEntitySlim>().ToList(); var memberEntities = entities.OfType <IMemberEntitySlim>().ToList(); Assert.AreEqual(10, contentEntities.Count); Assert.AreEqual(10, mediaEntities.Count); Assert.AreEqual(10, memberEntities.Count); } }
public void Can_Deep_Clone() { // Arrange var memberType = MockedContentTypes.CreateSimpleMemberType("memberType", "Member Type"); memberType.Id = 99; var member = MockedMember.CreateSimpleMember(memberType, "Name", "*****@*****.**", "pass", "user", Guid.NewGuid()); var i = 200; foreach (var property in member.Properties) { property.Id = ++i; } member.Id = 10; member.CreateDate = DateTime.Now; member.CreatorId = 22; member.Comments = "comments"; member.Key = Guid.NewGuid(); member.FailedPasswordAttempts = 22; member.Level = 3; member.Path = "-1,4,10"; member.Groups = new[] { "group1", "group2" }; member.IsApproved = true; member.IsLockedOut = true; member.LastLockoutDate = DateTime.Now; member.LastLoginDate = DateTime.Now; member.LastPasswordChangeDate = DateTime.Now; member.PasswordQuestion = "question"; member.ProviderUserKey = Guid.NewGuid(); member.RawPasswordAnswerValue = "raw answer"; member.RawPasswordValue = "raw pass"; member.SortOrder = 5; member.Trashed = false; member.UpdateDate = DateTime.Now; member.AdditionalData.Add("test1", 123); member.AdditionalData.Add("test2", "hello"); // Act var clone = (Member)member.DeepClone(); // Assert Assert.AreNotSame(clone, member); Assert.AreEqual(clone, member); Assert.AreEqual(clone.Id, member.Id); Assert.AreEqual(clone.VersionId, member.VersionId); Assert.AreEqual(clone.AdditionalData, member.AdditionalData); Assert.AreEqual(clone.ContentType, member.ContentType); Assert.AreEqual(clone.ContentTypeId, member.ContentTypeId); Assert.AreEqual(clone.CreateDate, member.CreateDate); Assert.AreEqual(clone.CreatorId, member.CreatorId); Assert.AreEqual(clone.Comments, member.Comments); Assert.AreEqual(clone.Key, member.Key); Assert.AreEqual(clone.FailedPasswordAttempts, member.FailedPasswordAttempts); Assert.AreEqual(clone.Level, member.Level); Assert.AreEqual(clone.Path, member.Path); Assert.AreEqual(clone.Groups, member.Groups); Assert.AreEqual(clone.Groups.Count(), member.Groups.Count()); Assert.AreEqual(clone.IsApproved, member.IsApproved); Assert.AreEqual(clone.IsLockedOut, member.IsLockedOut); Assert.AreEqual(clone.SortOrder, member.SortOrder); Assert.AreEqual(clone.LastLockoutDate, member.LastLockoutDate); Assert.AreNotSame(clone.LastLoginDate, member.LastLoginDate); Assert.AreEqual(clone.LastPasswordChangeDate, member.LastPasswordChangeDate); Assert.AreEqual(clone.Trashed, member.Trashed); Assert.AreEqual(clone.UpdateDate, member.UpdateDate); Assert.AreEqual(clone.VersionId, member.VersionId); Assert.AreEqual(clone.PasswordQuestion, member.PasswordQuestion); Assert.AreEqual(clone.ProviderUserKey, member.ProviderUserKey); Assert.AreEqual(clone.RawPasswordAnswerValue, member.RawPasswordAnswerValue); Assert.AreEqual(clone.RawPasswordValue, member.RawPasswordValue); Assert.AreNotSame(clone.Properties, member.Properties); Assert.AreEqual(clone.Properties.Count(), member.Properties.Count()); for (var index = 0; index < member.Properties.Count; index++) { Assert.AreNotSame(clone.Properties[index], member.Properties[index]); Assert.AreEqual(clone.Properties[index], member.Properties[index]); } // this can be the same, it is immutable Assert.AreSame(clone.ContentType, member.ContentType); //This double verifies by reflection var allProps = clone.GetType().GetProperties(); foreach (var propertyInfo in allProps) { Assert.AreEqual(propertyInfo.GetValue(clone, null), propertyInfo.GetValue(member, null)); } }