Merge branch 'netcore/feature/migrate/relation-tests' into feature/migrate-service-integration-tests
Signed-off-by: Bjarke Berg <mail@bergmania.dk> # Conflicts: # src/Umbraco.Infrastructure/Persistence/Repositories/Implement/RelationRepository.cs # src/Umbraco.Tests.Common/Builders/MediaBuilder.cs # src/Umbraco.Tests.Integration/Services/RelationServiceTests.cs
This commit is contained in:
35
src/Umbraco.Core/Models/ReadOnlyRelation.cs
Normal file
35
src/Umbraco.Core/Models/ReadOnlyRelation.cs
Normal file
@@ -0,0 +1,35 @@
|
||||
using System;
|
||||
|
||||
namespace Umbraco.Core.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// A read only relation. Can be used to bulk save witch performs better than the normal save operation,
|
||||
/// but do not populate Ids back to the model
|
||||
/// </summary>
|
||||
public class ReadOnlyRelation
|
||||
{
|
||||
public ReadOnlyRelation(int id, int parentId, int childId, int relationTypeId, DateTime createDate, string comment)
|
||||
{
|
||||
Id = id;
|
||||
ParentId = parentId;
|
||||
ChildId = childId;
|
||||
RelationTypeId = relationTypeId;
|
||||
CreateDate = createDate;
|
||||
Comment = comment;
|
||||
}
|
||||
|
||||
public ReadOnlyRelation(int parentId, int childId, int relationTypeId): this(0, parentId, childId, relationTypeId, DateTime.Now, string.Empty)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public int Id { get; }
|
||||
public int ParentId { get; }
|
||||
public int ChildId { get; }
|
||||
public int RelationTypeId { get; }
|
||||
public DateTime CreateDate { get; }
|
||||
public string Comment { get; }
|
||||
|
||||
public bool HasIdentity => Id != 0;
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,12 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
/// <param name="relations"></param>
|
||||
void Save(IEnumerable<IRelation> relations);
|
||||
|
||||
/// <summary>
|
||||
/// Persist multiple <see cref="IRelation"/> at once but Ids are not returned on created relations
|
||||
/// </summary>
|
||||
/// <param name="relations"></param>
|
||||
void SaveBulk(IEnumerable<ReadOnlyRelation> relations);
|
||||
|
||||
/// <summary>
|
||||
/// Deletes all relations for a parent for any specified relation type alias
|
||||
/// </summary>
|
||||
|
||||
@@ -45,5 +45,22 @@ namespace Umbraco.Core.Persistence.Factories
|
||||
return dto;
|
||||
}
|
||||
|
||||
public static RelationDto BuildDto(ReadOnlyRelation entity)
|
||||
{
|
||||
var dto = new RelationDto
|
||||
{
|
||||
ChildId = entity.ChildId,
|
||||
Comment = string.IsNullOrEmpty(entity.Comment) ? string.Empty : entity.Comment,
|
||||
Datetime = entity.CreateDate,
|
||||
ParentId = entity.ParentId,
|
||||
RelationType = entity.RelationTypeId
|
||||
};
|
||||
|
||||
if (entity.HasIdentity)
|
||||
dto.Id = entity.Id;
|
||||
|
||||
return dto;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -980,11 +980,11 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
if (!keyToIds.TryGetValue(guid, out var id))
|
||||
return null; // This shouldn't happen!
|
||||
|
||||
return new Relation(entity.Id, id, relationType);
|
||||
return new ReadOnlyRelation(entity.Id, id, relationType.Id);
|
||||
}).WhereNotNull();
|
||||
|
||||
// Save bulk relations
|
||||
RelationRepository.Save(toSave);
|
||||
RelationRepository.SaveBulk(toSave);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -235,16 +235,16 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
},
|
||||
RelationFactory.BuildDto); // value = DTO
|
||||
|
||||
// Use NPoco's own InsertBulk command which will automatically re-populate the new Ids on the DTOs, our own
|
||||
// BulkInsertRecords does not cater for this.
|
||||
// UPDATE: actually this only seems to work if the database type is SqlServerCEDatabaseType, as this will do
|
||||
// individual inserts for each record.
|
||||
// For full SQL and LocalDb, SQL bulk copy is used, and this doesn't update the Ids.
|
||||
Database.InsertBulk(entitiesAndDtos.Values);
|
||||
|
||||
// Re-assign ID to the entity if they've been set on the DTO.
|
||||
foreach (var dto in entitiesAndDtos.Values)
|
||||
{
|
||||
Database.Insert(dto);
|
||||
}
|
||||
|
||||
// All dtos now have IDs assigned
|
||||
foreach (var de in entitiesAndDtos)
|
||||
{
|
||||
// re-assign ID to the entity
|
||||
de.Key.Id = de.Value.Id;
|
||||
}
|
||||
|
||||
@@ -253,6 +253,33 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
}
|
||||
}
|
||||
|
||||
public void SaveBulk(IEnumerable<ReadOnlyRelation> relations)
|
||||
{
|
||||
foreach (var hasIdentityGroup in relations.GroupBy(r => r.HasIdentity))
|
||||
{
|
||||
if (hasIdentityGroup.Key)
|
||||
{
|
||||
// Do updates, we can't really do a bulk update so this is still a 1 by 1 operation
|
||||
// however we can bulk populate the object types. It might be possible to bulk update
|
||||
// with SQL but would be pretty ugly and we're not really too worried about that for perf,
|
||||
// it's the bulk inserts we care about.
|
||||
foreach (var relation in hasIdentityGroup)
|
||||
{
|
||||
var dto = RelationFactory.BuildDto(relation);
|
||||
Database.Update(dto);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Do bulk inserts
|
||||
var dtos = hasIdentityGroup.Select(RelationFactory.BuildDto);
|
||||
|
||||
Database.InsertBulk(dtos);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<IRelation> GetPagedRelationsByQuery(IQuery<IRelation> query, long pageIndex, int pageSize, out long totalRecords, Ordering ordering)
|
||||
{
|
||||
var sql = GetBaseQuery(false);
|
||||
|
||||
@@ -50,10 +50,6 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
|
||||
{
|
||||
var sql = GetBaseQuery(false);
|
||||
|
||||
// should not happen due to the cache policy
|
||||
if (ids.Any())
|
||||
throw new NotImplementedException();
|
||||
|
||||
var dtos = Database.Fetch<RelationTypeDto>(sql);
|
||||
|
||||
return dtos.Select(x => DtoToEntity(x));
|
||||
|
||||
@@ -148,10 +148,10 @@ namespace Umbraco.Tests.Common.Builders
|
||||
return (ContentType)builder.Build();
|
||||
}public static ContentType CreateSimpleContentType(string alias = null, string name = null, IContentType parent = null, bool randomizeAliases = false, string propertyGroupName = "Content", bool mandatoryProperties = false, int defaultTemplateId = 0)
|
||||
{
|
||||
return (ContentType)CreateSimpleContentTypeHelper(alias, name, parent, randomizeAliases, propertyGroupName, defaultTemplateId).Build();
|
||||
return (ContentType)CreateSimpleContentTypeHelper(alias, name, parent, randomizeAliases, propertyGroupName, mandatoryProperties, defaultTemplateId).Build();
|
||||
}
|
||||
|
||||
public static ContentTypeBuilder CreateSimpleContentTypeHelper(string alias = null, string name = null, IContentType parent = null, bool randomizeAliases = false, string propertyGroupName = "Content", int defaultTemplateId = 0)
|
||||
public static ContentTypeBuilder CreateSimpleContentTypeHelper(string alias = null, string name = null, IContentType parent = null, bool randomizeAliases = false, string propertyGroupName = "Content", bool mandatoryProperties = false, int defaultTemplateId = 0)
|
||||
{
|
||||
return new ContentTypeBuilder()
|
||||
.WithAlias(alias ?? "simple")
|
||||
|
||||
@@ -178,6 +178,33 @@ namespace Umbraco.Tests.Common.Builders
|
||||
return member;
|
||||
}
|
||||
|
||||
public static IEnumerable<IMember> CreateSimpleMembers(IMemberType memberType, int amount, Action<int, IMember> onCreating = null)
|
||||
{
|
||||
var list = new List<IMember>();
|
||||
|
||||
for (int i = 0; i < amount; i++)
|
||||
{
|
||||
var name = "Member No-" + i;
|
||||
|
||||
var builder = new MemberBuilder()
|
||||
.WithMemberType(memberType)
|
||||
.WithName(name)
|
||||
.WithEmail("test" + i + "@test.com")
|
||||
.WithLogin("test" + i, "test" + i);
|
||||
|
||||
|
||||
builder = builder
|
||||
.AddPropertyData()
|
||||
.WithKeyValue("title", name + " member" + i)
|
||||
.WithKeyValue("bodyText", "This is a subpage" + i)
|
||||
.WithKeyValue("author", "John Doe" + i)
|
||||
.Done();
|
||||
|
||||
list.Add(builder.Build());
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
public static Member CreateSimpleMember(IMemberType memberType, string name, string email, string password, string username, Guid? key = null)
|
||||
{
|
||||
var builder = new MemberBuilder()
|
||||
|
||||
@@ -12,6 +12,9 @@ using Umbraco.Core.Persistence.Dtos;
|
||||
using Umbraco.Core.Persistence.Repositories;
|
||||
using Umbraco.Core.Persistence.Repositories.Implement;
|
||||
using Umbraco.Core.Scoping;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Tests.Common.Builders;
|
||||
using Umbraco.Tests.Integration.Testing;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using Umbraco.Tests.TestHelpers.Entities;
|
||||
using Umbraco.Tests.Testing;
|
||||
@@ -20,37 +23,51 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
{
|
||||
[TestFixture]
|
||||
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)]
|
||||
public class RelationRepositoryTest : TestWithDatabaseBase
|
||||
public class RelationRepositoryTest : UmbracoIntegrationTest
|
||||
{
|
||||
public override void SetUp()
|
||||
{
|
||||
base.SetUp();
|
||||
private RelationType _relateContent;
|
||||
private RelationType _relateContentType;
|
||||
private ContentType _contentType;
|
||||
private Content _textpage;
|
||||
private Content _subpage;
|
||||
private Content _subpage2;
|
||||
private Relation _relation;
|
||||
private Relation _relation2;
|
||||
private IContentTypeService ContentTypeService => GetRequiredService<IContentTypeService>();
|
||||
private IContentService ContentService => GetRequiredService<IContentService>();
|
||||
|
||||
private IMediaTypeService MediaTypeService => GetRequiredService<IMediaTypeService>();
|
||||
private IMediaService MediaService => GetRequiredService<IMediaService>();
|
||||
|
||||
private IMemberTypeService MemberTypeService => GetRequiredService<IMemberTypeService>();
|
||||
private IMemberService MemberService => GetRequiredService<IMemberService>();
|
||||
private IRelationService RelationService => GetRequiredService<IRelationService>();
|
||||
private IFileService FileService => GetRequiredService<IFileService>();
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
CreateTestData();
|
||||
}
|
||||
|
||||
private RelationRepository CreateRepository(IScopeProvider provider, out RelationTypeRepository relationTypeRepository)
|
||||
{
|
||||
var accessor = (IScopeAccessor) provider;
|
||||
relationTypeRepository = new RelationTypeRepository(accessor, AppCaches.Disabled, Mock.Of<ILogger<RelationTypeRepository>>());
|
||||
var entityRepository = new EntityRepository(accessor);
|
||||
var repository = new RelationRepository(accessor, Mock.Of<ILogger<RelationRepository>>(), relationTypeRepository, entityRepository);
|
||||
return repository;
|
||||
relationTypeRepository = (RelationTypeRepository)GetRequiredService<IRelationTypeRepository>();
|
||||
return (RelationRepository)GetRequiredService<IRelationRepository>();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Can_Perform_Add_On_RelationRepository()
|
||||
{
|
||||
// Arrange
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
RelationTypeRepository repositoryType;
|
||||
var repository = CreateRepository(provider, out repositoryType);
|
||||
var repository = CreateRepository(ScopeProvider, out repositoryType);
|
||||
|
||||
// Act
|
||||
var relationType = repositoryType.Get(1);
|
||||
var relation = new Relation(NodeDto.NodeIdSeed + 2, NodeDto.NodeIdSeed + 3, relationType);
|
||||
var relation = new Relation(_textpage.Id, _subpage.Id, relationType);
|
||||
repository.Save(relation);
|
||||
|
||||
|
||||
@@ -64,11 +81,10 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
public void Can_Perform_Update_On_RelationRepository()
|
||||
{
|
||||
// Arrange
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
RelationTypeRepository repositoryType;
|
||||
var repository = CreateRepository(provider, out repositoryType);
|
||||
var repository = CreateRepository(ScopeProvider, out repositoryType);
|
||||
|
||||
// Act
|
||||
var relation = repository.Get(1);
|
||||
@@ -89,11 +105,10 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
public void Can_Perform_Delete_On_RelationRepository()
|
||||
{
|
||||
// Arrange
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
RelationTypeRepository repositoryType;
|
||||
var repository = CreateRepository(provider, out repositoryType);
|
||||
var repository = CreateRepository(ScopeProvider, out repositoryType);
|
||||
|
||||
// Act
|
||||
var relation = repository.Get(2);
|
||||
@@ -111,11 +126,10 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
public void Can_Perform_Get_On_RelationRepository()
|
||||
{
|
||||
// Arrange
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
RelationTypeRepository repositoryType;
|
||||
var repository = CreateRepository(provider, out repositoryType);
|
||||
var repository = CreateRepository(ScopeProvider, out repositoryType);
|
||||
|
||||
// Act
|
||||
var relation = repository.Get(1);
|
||||
@@ -123,8 +137,8 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
// Assert
|
||||
Assert.That(relation, Is.Not.Null);
|
||||
Assert.That(relation.HasIdentity, Is.True);
|
||||
Assert.That(relation.ChildId, Is.EqualTo(NodeDto.NodeIdSeed + 3));
|
||||
Assert.That(relation.ParentId, Is.EqualTo(NodeDto.NodeIdSeed + 2));
|
||||
Assert.That(relation.ChildId, Is.EqualTo(_subpage.Id));
|
||||
Assert.That(relation.ParentId, Is.EqualTo(_textpage.Id));
|
||||
Assert.That(relation.RelationType.Alias, Is.EqualTo("relateContentOnCopy"));
|
||||
}
|
||||
}
|
||||
@@ -133,11 +147,10 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
public void Can_Perform_GetAll_On_RelationRepository()
|
||||
{
|
||||
// Arrange
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
RelationTypeRepository repositoryType;
|
||||
var repository = CreateRepository(provider, out repositoryType);
|
||||
var repository = CreateRepository(ScopeProvider, out repositoryType);
|
||||
|
||||
// Act
|
||||
var relations = repository.GetMany();
|
||||
@@ -154,11 +167,10 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
public void Can_Perform_GetAll_With_Params_On_RelationRepository()
|
||||
{
|
||||
// Arrange
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
RelationTypeRepository repositoryType;
|
||||
var repository = CreateRepository(provider, out repositoryType);
|
||||
var repository = CreateRepository(ScopeProvider, out repositoryType);
|
||||
|
||||
// Act
|
||||
var relations = repository.GetMany(1, 2);
|
||||
@@ -176,35 +188,34 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
{
|
||||
CreateTestDataForPagingTests(out var createdContent, out var createdMembers, out var createdMedia);
|
||||
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
var repository = CreateRepository(provider, out var relationTypeRepository);
|
||||
var repository = CreateRepository(ScopeProvider, out var relationTypeRepository);
|
||||
|
||||
// Get parent entities for child id
|
||||
var parents = repository.GetPagedParentEntitiesByChildId(createdMedia[0].Id, 0, 11, out var totalRecords).ToList();
|
||||
Assert.AreEqual(20, totalRecords);
|
||||
Assert.AreEqual(11, parents.Count);
|
||||
Assert.AreEqual(6, totalRecords);
|
||||
Assert.AreEqual(6, parents.Count);
|
||||
|
||||
//add the next page
|
||||
parents.AddRange(repository.GetPagedParentEntitiesByChildId(createdMedia[0].Id, 1, 11, out totalRecords));
|
||||
Assert.AreEqual(20, totalRecords);
|
||||
Assert.AreEqual(20, parents.Count);
|
||||
Assert.AreEqual(6, totalRecords);
|
||||
Assert.AreEqual(6, parents.Count);
|
||||
|
||||
var contentEntities = parents.OfType<IDocumentEntitySlim>().ToList();
|
||||
var mediaEntities = parents.OfType<IMediaEntitySlim>().ToList();
|
||||
var memberEntities = parents.OfType<IMemberEntitySlim>().ToList();
|
||||
|
||||
Assert.AreEqual(10, contentEntities.Count);
|
||||
Assert.AreEqual(3, contentEntities.Count);
|
||||
Assert.AreEqual(0, mediaEntities.Count);
|
||||
Assert.AreEqual(10, memberEntities.Count);
|
||||
Assert.AreEqual(3, memberEntities.Count);
|
||||
|
||||
//only of a certain type
|
||||
parents.AddRange(repository.GetPagedParentEntitiesByChildId(createdMedia[0].Id, 0, 100, out totalRecords, UmbracoObjectTypes.Document.GetGuid()));
|
||||
Assert.AreEqual(10, totalRecords);
|
||||
Assert.AreEqual(3, totalRecords);
|
||||
|
||||
parents.AddRange(repository.GetPagedParentEntitiesByChildId(createdMedia[0].Id, 0, 100, out totalRecords, UmbracoObjectTypes.Member.GetGuid()));
|
||||
Assert.AreEqual(10, totalRecords);
|
||||
Assert.AreEqual(3, totalRecords);
|
||||
|
||||
parents.AddRange(repository.GetPagedParentEntitiesByChildId(createdMedia[0].Id, 0, 100, out totalRecords, UmbracoObjectTypes.Media.GetGuid()));
|
||||
Assert.AreEqual(0, totalRecords);
|
||||
@@ -215,17 +226,16 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
public void Get_Paged_Parent_Child_Entities_With_Same_Entity_Relation()
|
||||
{
|
||||
//Create a media item and create a relationship between itself (parent -> child)
|
||||
var imageType = MockedContentTypes.CreateImageMediaType("myImage");
|
||||
ServiceContext.MediaTypeService.Save(imageType);
|
||||
var media = MockedMedia.CreateMediaImage(imageType, -1);
|
||||
ServiceContext.MediaService.Save(media);
|
||||
var relType = ServiceContext.RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedMediaAlias);
|
||||
ServiceContext.RelationService.Relate(media.Id, media.Id, relType);
|
||||
var imageType = MediaTypeBuilder.CreateImageMediaType("myImage");
|
||||
MediaTypeService.Save(imageType);
|
||||
var media = MediaBuilder.CreateMediaImage(imageType, -1);
|
||||
MediaService.Save(media);
|
||||
var relType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedMediaAlias);
|
||||
RelationService.Relate(media.Id, media.Id, relType);
|
||||
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
var repository = CreateRepository(provider, out var relationTypeRepository);
|
||||
var repository = CreateRepository(ScopeProvider, out var relationTypeRepository);
|
||||
|
||||
// Get parent entities for child id
|
||||
var parents = repository.GetPagedParentEntitiesByChildId(media.Id, 0, 10, out var totalRecords).ToList();
|
||||
@@ -244,35 +254,34 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
{
|
||||
CreateTestDataForPagingTests(out var createdContent, out var createdMembers, out var createdMedia);
|
||||
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
var repository = CreateRepository(provider, out var relationTypeRepository);
|
||||
var repository = CreateRepository(ScopeProvider, out var relationTypeRepository);
|
||||
|
||||
// Get parent entities for child id
|
||||
var parents = repository.GetPagedChildEntitiesByParentId(createdContent[0].Id, 0, 6, out var totalRecords).ToList();
|
||||
Assert.AreEqual(10, totalRecords);
|
||||
Assert.AreEqual(6, parents.Count);
|
||||
Assert.AreEqual(3, totalRecords);
|
||||
Assert.AreEqual(3, parents.Count);
|
||||
|
||||
//add the next page
|
||||
parents.AddRange(repository.GetPagedChildEntitiesByParentId(createdContent[0].Id, 1, 6, out totalRecords));
|
||||
Assert.AreEqual(10, totalRecords);
|
||||
Assert.AreEqual(10, parents.Count);
|
||||
Assert.AreEqual(3, totalRecords);
|
||||
Assert.AreEqual(3, parents.Count);
|
||||
|
||||
var contentEntities = parents.OfType<IDocumentEntitySlim>().ToList();
|
||||
var mediaEntities = parents.OfType<IMediaEntitySlim>().ToList();
|
||||
var memberEntities = parents.OfType<IMemberEntitySlim>().ToList();
|
||||
|
||||
Assert.AreEqual(0, contentEntities.Count);
|
||||
Assert.AreEqual(10, mediaEntities.Count);
|
||||
Assert.AreEqual(3, mediaEntities.Count);
|
||||
Assert.AreEqual(0, memberEntities.Count);
|
||||
|
||||
//only of a certain type
|
||||
parents.AddRange(repository.GetPagedChildEntitiesByParentId(createdContent[0].Id, 0, 100, out totalRecords, UmbracoObjectTypes.Media.GetGuid()));
|
||||
Assert.AreEqual(10, totalRecords);
|
||||
Assert.AreEqual(3, totalRecords);
|
||||
|
||||
parents.AddRange(repository.GetPagedChildEntitiesByParentId(createdMembers[0].Id, 0, 100, out totalRecords, UmbracoObjectTypes.Media.GetGuid()));
|
||||
Assert.AreEqual(10, totalRecords);
|
||||
Assert.AreEqual(3, totalRecords);
|
||||
|
||||
parents.AddRange(repository.GetPagedChildEntitiesByParentId(createdContent[0].Id, 0, 100, out totalRecords, UmbracoObjectTypes.Member.GetGuid()));
|
||||
Assert.AreEqual(0, totalRecords);
|
||||
@@ -283,53 +292,52 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
{
|
||||
//Create content
|
||||
createdContent = new List<IContent>();
|
||||
var contentType = MockedContentTypes.CreateBasicContentType("blah");
|
||||
ServiceContext.ContentTypeService.Save(contentType);
|
||||
for (int i = 0; i < 10; i++)
|
||||
var contentType = ContentTypeBuilder.CreateBasicContentType("blah");
|
||||
ContentTypeService.Save(contentType);
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
var c1 = MockedContent.CreateBasicContent(contentType);
|
||||
ServiceContext.ContentService.Save(c1);
|
||||
var c1 = ContentBuilder.CreateBasicContent(contentType);
|
||||
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 imageType = MediaTypeBuilder.CreateImageMediaType("myImage");
|
||||
MediaTypeService.Save(imageType);
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
var c1 = MockedMedia.CreateMediaImage(imageType, -1);
|
||||
ServiceContext.MediaService.Save(c1);
|
||||
var c1 = MediaBuilder.CreateMediaImage(imageType, -1);
|
||||
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 memberType = MemberTypeBuilder.CreateSimpleMemberType("simple");
|
||||
MemberTypeService.Save(memberType);
|
||||
createdMembers = MemberBuilder.CreateSimpleMembers(memberType, 3).ToList();
|
||||
MemberService.Save(createdMembers);
|
||||
|
||||
var relType = ServiceContext.RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedMediaAlias);
|
||||
var relType = 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);
|
||||
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);
|
||||
RelationService.Relate(member.Id, media.Id, relType);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Can_Perform_Exists_On_RelationRepository()
|
||||
{
|
||||
// Arrange
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
RelationTypeRepository repositoryType;
|
||||
var repository = CreateRepository(provider, out repositoryType);
|
||||
var repository = CreateRepository(ScopeProvider, out repositoryType);
|
||||
|
||||
// Act
|
||||
var exists = repository.Exists(2);
|
||||
@@ -345,14 +353,13 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
public void Can_Perform_Count_On_RelationRepository()
|
||||
{
|
||||
// Arrange
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
RelationTypeRepository repositoryType;
|
||||
var repository = CreateRepository(provider, out repositoryType);
|
||||
var repository = CreateRepository(ScopeProvider, out repositoryType);
|
||||
|
||||
// Act
|
||||
var query = scope.SqlContext.Query<IRelation>().Where(x => x.ParentId == NodeDto.NodeIdSeed + 2);
|
||||
var query = scope.SqlContext.Query<IRelation>().Where(x => x.ParentId == _textpage.Id);
|
||||
int count = repository.Count(query);
|
||||
|
||||
// Assert
|
||||
@@ -364,14 +371,13 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
public void Can_Perform_GetByQuery_On_RelationRepository()
|
||||
{
|
||||
// Arrange
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
RelationTypeRepository repositoryType;
|
||||
var repository = CreateRepository(provider, out repositoryType);
|
||||
var repository = CreateRepository(ScopeProvider, out repositoryType);
|
||||
|
||||
// Act
|
||||
var query = scope.SqlContext.Query<IRelation>().Where(x => x.RelationTypeId == RelationTypeDto.NodeIdSeed);
|
||||
var query = scope.SqlContext.Query<IRelation>().Where(x => x.RelationTypeId == _relateContent.Id);
|
||||
var relations = repository.Get(query);
|
||||
|
||||
// Assert
|
||||
@@ -386,14 +392,13 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
public void Can_Delete_Content_And_Verify_Relation_Is_Removed()
|
||||
{
|
||||
// Arrange
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
RelationTypeRepository repositoryType;
|
||||
var repository = CreateRepository(provider, out repositoryType);
|
||||
var repository = CreateRepository(ScopeProvider, out repositoryType);
|
||||
|
||||
var content = ServiceContext.ContentService.GetById(NodeDto.NodeIdSeed + 3);
|
||||
ServiceContext.ContentService.Delete(content, 0);
|
||||
var content = ContentService.GetById(_subpage.Id);
|
||||
ContentService.Delete(content, 0);
|
||||
|
||||
// Act
|
||||
var shouldntExist = repository.Exists(1);
|
||||
@@ -413,49 +418,50 @@ namespace Umbraco.Tests.Persistence.Repositories
|
||||
|
||||
public void CreateTestData()
|
||||
{
|
||||
var relateContent = new RelationType(
|
||||
_relateContent = new RelationType(
|
||||
"Relate Content on Copy", "relateContentOnCopy", true,
|
||||
Constants.ObjectTypes.Document,
|
||||
new Guid("C66BA18E-EAF3-4CFF-8A22-41B16D66A972"));
|
||||
|
||||
var relateContentType = new RelationType("Relate ContentType on Copy",
|
||||
_relateContentType = new RelationType("Relate ContentType on Copy",
|
||||
"relateContentTypeOnCopy",
|
||||
true,
|
||||
Constants.ObjectTypes.DocumentType,
|
||||
new Guid("A2CB7800-F571-4787-9638-BC48539A0EFB"));
|
||||
|
||||
var provider = TestObjects.GetScopeProvider(LoggerFactory);
|
||||
using (var scope = provider.CreateScope())
|
||||
using (var scope = ScopeProvider.CreateScope())
|
||||
{
|
||||
var accessor = (IScopeAccessor)provider;
|
||||
var accessor = (IScopeAccessor)ScopeProvider;
|
||||
var relationTypeRepository = new RelationTypeRepository(accessor, AppCaches.Disabled, Mock.Of<ILogger<RelationTypeRepository>>());
|
||||
var entityRepository = new EntityRepository(accessor);
|
||||
var relationRepository = new RelationRepository(accessor, Mock.Of<ILogger<RelationRepository>>(), relationTypeRepository, entityRepository);
|
||||
|
||||
relationTypeRepository.Save(relateContent);
|
||||
relationTypeRepository.Save(relateContentType);
|
||||
relationTypeRepository.Save(_relateContent);
|
||||
relationTypeRepository.Save(_relateContentType);
|
||||
|
||||
var template = TemplateBuilder.CreateTextPageTemplate();
|
||||
FileService.SaveTemplate(template);
|
||||
//Create and Save ContentType "umbTextpage" -> (NodeDto.NodeIdSeed)
|
||||
ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage", "Textpage");
|
||||
ServiceContext.FileService.SaveTemplate(contentType.DefaultTemplate); // else, FK violation on contentType!
|
||||
ServiceContext.ContentTypeService.Save(contentType);
|
||||
_contentType = ContentTypeBuilder.CreateSimpleContentType("umbTextpage", "Textpage", defaultTemplateId: template.Id);
|
||||
|
||||
ContentTypeService.Save(_contentType);
|
||||
|
||||
//Create and Save Content "Homepage" based on "umbTextpage" -> (NodeDto.NodeIdSeed + 1)
|
||||
Content textpage = MockedContent.CreateSimpleContent(contentType);
|
||||
ServiceContext.ContentService.Save(textpage, 0);
|
||||
_textpage = ContentBuilder.CreateSimpleContent(_contentType);
|
||||
ContentService.Save(_textpage, 0);
|
||||
|
||||
//Create and Save Content "Text Page 1" based on "umbTextpage" -> (NodeDto.NodeIdSeed + 2)
|
||||
Content subpage = MockedContent.CreateSimpleContent(contentType, "Text Page 1", textpage.Id);
|
||||
ServiceContext.ContentService.Save(subpage, 0);
|
||||
_subpage = ContentBuilder.CreateSimpleContent(_contentType, "Text Page 1", _textpage.Id);
|
||||
ContentService.Save(_subpage, 0);
|
||||
|
||||
//Create and Save Content "Text Page 1" based on "umbTextpage" -> (NodeDto.NodeIdSeed + 3)
|
||||
Content subpage2 = MockedContent.CreateSimpleContent(contentType, "Text Page 2", textpage.Id);
|
||||
ServiceContext.ContentService.Save(subpage2, 0);
|
||||
_subpage2 = ContentBuilder.CreateSimpleContent(_contentType, "Text Page 2", _textpage.Id);
|
||||
ContentService.Save(_subpage2, 0);
|
||||
|
||||
var relation = new Relation(textpage.Id, subpage.Id, relateContent) { Comment = string.Empty };
|
||||
var relation2 = new Relation(textpage.Id, subpage2.Id, relateContent) { Comment = string.Empty };
|
||||
relationRepository.Save(relation);
|
||||
relationRepository.Save(relation2);
|
||||
_relation = new Relation(_textpage.Id, _subpage.Id, _relateContent) { Comment = string.Empty };
|
||||
_relation2 = new Relation(_textpage.Id, _subpage2.Id, _relateContent) { Comment = string.Empty };
|
||||
relationRepository.Save(_relation);
|
||||
relationRepository.Save(_relation2);
|
||||
scope.Complete();
|
||||
}
|
||||
}
|
||||
@@ -6,12 +6,14 @@ using NUnit.Framework;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Core.Services.Implement;
|
||||
using Umbraco.Tests.Common.Builders;
|
||||
using Umbraco.Tests.Common.Builders.Extensions;
|
||||
using Umbraco.Tests.Integration.Testing;
|
||||
using Umbraco.Tests.TestHelpers;
|
||||
using Umbraco.Tests.TestHelpers.Entities;
|
||||
using Umbraco.Tests.Testing;
|
||||
|
||||
namespace Umbraco.Tests.Integration.Services
|
||||
namespace Umbraco.Tests.Services
|
||||
{
|
||||
[TestFixture]
|
||||
[Apartment(ApartmentState.STA)]
|
||||
@@ -19,30 +21,30 @@ namespace Umbraco.Tests.Integration.Services
|
||||
public class RelationServiceTests : UmbracoIntegrationTest
|
||||
{
|
||||
private IContentTypeService ContentTypeService => GetRequiredService<IContentTypeService>();
|
||||
private IMediaTypeService MediaTypeService => GetRequiredService<IMediaTypeService>();
|
||||
private IContentService ContentService => GetRequiredService<IContentService>();
|
||||
private IMediaTypeService MediaTypeService => GetRequiredService<IMediaTypeService>();
|
||||
private IMediaService MediaService => GetRequiredService<IMediaService>();
|
||||
private IRelationService RelationService => GetRequiredService<IRelationService>();
|
||||
|
||||
[Test]
|
||||
public void Get_Paged_Relations_By_Relation_Type()
|
||||
{
|
||||
// Create content
|
||||
//Create content
|
||||
var createdContent = new List<IContent>();
|
||||
var contentType = ContentTypeBuilder.CreateBasicContentType("blah");
|
||||
ContentTypeService.Save(contentType);
|
||||
for (var i = 0; i < 10; i++)
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
var c1 = ContentBuilder.CreateBasicContent(contentType);
|
||||
ContentService.Save(c1);
|
||||
createdContent.Add(c1);
|
||||
}
|
||||
|
||||
// Create media
|
||||
//Create media
|
||||
var createdMedia = new List<IMedia>();
|
||||
var imageType = MediaTypeBuilder.CreateImageMediaType("myImage");
|
||||
MediaTypeService.Save(imageType);
|
||||
for (var i = 0; i < 10; i++)
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
var c1 = MediaBuilder.CreateMediaImage(imageType, -1);
|
||||
MediaService.Save(c1);
|
||||
@@ -56,16 +58,16 @@ namespace Umbraco.Tests.Integration.Services
|
||||
foreach (var media in createdMedia)
|
||||
RelationService.Relate(content.Id, media.Id, relType);
|
||||
|
||||
var paged = RelationService.GetPagedByRelationTypeId(relType.Id, 0, 51, out var totalRecs).ToList();
|
||||
var paged = RelationService.GetPagedByRelationTypeId(relType.Id, 0, 4, out var totalRecs).ToList();
|
||||
|
||||
Assert.AreEqual(100, totalRecs);
|
||||
Assert.AreEqual(51, paged.Count);
|
||||
Assert.AreEqual(9, totalRecs);
|
||||
Assert.AreEqual(4, paged.Count);
|
||||
|
||||
// Next page
|
||||
paged.AddRange(RelationService.GetPagedByRelationTypeId(relType.Id, 1, 51, out totalRecs));
|
||||
//next page
|
||||
paged.AddRange(RelationService.GetPagedByRelationTypeId(relType.Id, 1, 4, out totalRecs));
|
||||
|
||||
Assert.AreEqual(100, totalRecs);
|
||||
Assert.AreEqual(100, paged.Count);
|
||||
Assert.AreEqual(9, totalRecs);
|
||||
Assert.AreEqual(8, paged.Count);
|
||||
|
||||
Assert.IsTrue(createdContent.Select(x => x.Id).ContainsAll(paged.Select(x => x.ParentId)));
|
||||
Assert.IsTrue(createdMedia.Select(x => x.Id).ContainsAll(paged.Select(x => x.ChildId)));
|
||||
@@ -107,12 +109,7 @@ namespace Umbraco.Tests.Integration.Services
|
||||
public void Can_Create_RelationType_Without_Name()
|
||||
{
|
||||
var rs = RelationService;
|
||||
var rt = new RelationTypeBuilder()
|
||||
.WithName("Test")
|
||||
.WithAlias("repeatedEventOccurence")
|
||||
.WithParentObjectType(Constants.ObjectTypes.Document)
|
||||
.WithChildObjectType(Constants.ObjectTypes.Media)
|
||||
.Build();
|
||||
IRelationType rt = new RelationType("Test", "repeatedEventOccurence", false, Constants.ObjectTypes.Document, Constants.ObjectTypes.Media);
|
||||
|
||||
Assert.DoesNotThrow(() => rs.Save(rt));
|
||||
|
||||
@@ -130,10 +127,7 @@ namespace Umbraco.Tests.Integration.Services
|
||||
public void Create_Relation_Type_Without_Object_Types()
|
||||
{
|
||||
var rs = RelationService;
|
||||
var rt = new RelationTypeBuilder()
|
||||
.WithName("repeatedEventOccurence")
|
||||
.WithAlias("repeatedEventOccurence")
|
||||
.Build();
|
||||
IRelationType rt = new RelationType("repeatedEventOccurence", "repeatedEventOccurence", false, null, null);
|
||||
|
||||
Assert.DoesNotThrow(() => rs.Save(rt));
|
||||
|
||||
@@ -170,53 +164,45 @@ namespace Umbraco.Tests.Integration.Services
|
||||
{
|
||||
var rs = RelationService;
|
||||
|
||||
var relations = CreateRelations(10);
|
||||
var newRelations = CreateRelations(10);
|
||||
|
||||
Assert.IsTrue(relations.All(x => !x.HasIdentity));
|
||||
Assert.IsTrue(newRelations.All(x => !x.HasIdentity));
|
||||
|
||||
RelationService.Save(relations);
|
||||
RelationService.Save(newRelations);
|
||||
|
||||
var insertedRelations = RelationService.GetAllRelations();
|
||||
|
||||
Assert.AreEqual(10, insertedRelations.Count());
|
||||
Assert.IsTrue(newRelations.All(x => x.HasIdentity));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Update_Bulk_Relations()
|
||||
{
|
||||
var rs = RelationService;
|
||||
|
||||
var date = DateTime.Now.AddDays(-10);
|
||||
var relations = CreateRelations(10);
|
||||
foreach (var r in relations)
|
||||
var newRelations = CreateRelations(10);
|
||||
foreach (var r in newRelations)
|
||||
{
|
||||
r.CreateDate = date;
|
||||
r.UpdateDate = date;
|
||||
}
|
||||
|
||||
// Insert
|
||||
RelationService.Save(relations);
|
||||
Assert.IsTrue(relations.All(x => x.UpdateDate == date));
|
||||
//insert
|
||||
RelationService.Save(newRelations);
|
||||
Assert.IsTrue(newRelations.All(x => x.UpdateDate == date));
|
||||
|
||||
// Re-get the relations to ensure we have updated IDs.
|
||||
relations = RelationService.GetAllRelations();
|
||||
|
||||
// Update
|
||||
var newDate = DateTime.Now.AddDays(-5);
|
||||
foreach (var r in relations)
|
||||
{
|
||||
foreach (var r in newRelations)
|
||||
r.UpdateDate = newDate;
|
||||
}
|
||||
|
||||
RelationService.Save(relations);
|
||||
Assert.IsTrue(relations.All(x => x.UpdateDate == newDate));
|
||||
//update
|
||||
RelationService.Save(newRelations);
|
||||
Assert.IsTrue(newRelations.All(x => x.UpdateDate == newDate));
|
||||
}
|
||||
|
||||
private IRelation CreateAndSaveRelation(string name, string alias)
|
||||
{
|
||||
var rs = RelationService;
|
||||
var rt = new RelationTypeBuilder()
|
||||
.WithName(name)
|
||||
.WithAlias(alias)
|
||||
.Build();
|
||||
var rt = new RelationType(name, alias, false, null, null);
|
||||
rs.Save(rt);
|
||||
|
||||
var ct = ContentTypeBuilder.CreateBasicContentType();
|
||||
@@ -230,10 +216,7 @@ namespace Umbraco.Tests.Integration.Services
|
||||
ContentService.Save(c1);
|
||||
MediaService.Save(c2);
|
||||
|
||||
var r = new RelationBuilder()
|
||||
.BetweenIds(c1.Id, c2.Id)
|
||||
.WithRelationType(rt)
|
||||
.Build();
|
||||
var r = new Relation(c1.Id, c2.Id, rt);
|
||||
RelationService.Save(r);
|
||||
|
||||
return r;
|
||||
@@ -248,7 +231,7 @@ namespace Umbraco.Tests.Integration.Services
|
||||
{
|
||||
var rs = RelationService;
|
||||
var rtName = Guid.NewGuid().ToString();
|
||||
var rt = new RelationTypeBuilder().Build();
|
||||
var rt = new RelationType(rtName, rtName, false, null, null);
|
||||
rs.Save(rt);
|
||||
|
||||
var ct = ContentTypeBuilder.CreateBasicContentType();
|
||||
@@ -264,10 +247,7 @@ namespace Umbraco.Tests.Integration.Services
|
||||
ContentService.Save(c1);
|
||||
MediaService.Save(c2);
|
||||
|
||||
return new RelationBuilder()
|
||||
.BetweenIds(c1.Id, c2.Id)
|
||||
.WithRelationType(rt)
|
||||
.Build();
|
||||
return new Relation(c1.Id, c2.Id, rt);
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
|
||||
@@ -306,7 +306,6 @@
|
||||
<Compile Include="Persistence\Querying\QueryBuilderTests.cs" />
|
||||
<Compile Include="Persistence\Repositories\MediaRepositoryTest.cs" />
|
||||
<Compile Include="Persistence\Repositories\MediaTypeRepositoryTest.cs" />
|
||||
<Compile Include="Persistence\Repositories\RelationRepositoryTest.cs" />
|
||||
<Compile Include="Persistence\Repositories\ScriptRepositoryTest.cs" />
|
||||
<Compile Include="Persistence\Repositories\StylesheetRepositoryTest.cs" />
|
||||
<Compile Include="PublishedContent\PublishedContentMoreTests.cs" />
|
||||
|
||||
Reference in New Issue
Block a user