Merge remote-tracking branch 'origin/netcore/netcore' into netcore/feature/more-files-from-infrastructure-to-core

# Conflicts:
#	src/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/ConvertersTests.cs
This commit is contained in:
Nikolaj
2020-12-09 08:45:28 +01:00
55 changed files with 440 additions and 3027 deletions

View File

@@ -0,0 +1,279 @@
using System;
using System.Linq;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Moq;
using NUnit.Framework;
using Microsoft.Extensions.Logging;
using Umbraco.Core.Configuration;
using Umbraco.Core.Migrations;
using Umbraco.Core.Migrations.Install;
using Umbraco.Core.Migrations.Upgrade;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
using Umbraco.Core.Persistence.Dtos;
using Umbraco.Core.Services;
using Umbraco.Tests.Common.Builders;
using Umbraco.Tests.Integration.Testing;
using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.Testing;
namespace Umbraco.Tests.Migrations
{
[TestFixture]
[UmbracoTest(Database = UmbracoTestOptions.Database.NewEmptyPerTest)]
public class AdvancedMigrationTests : UmbracoIntegrationTest
{
private ILoggerFactory _loggerFactory = NullLoggerFactory.Instance;
private IUmbracoVersion UmbracoVersion => GetRequiredService<IUmbracoVersion>();
[Test]
public void CreateTableOfTDto()
{
var builder = Mock.Of<IMigrationBuilder>();
Mock.Get(builder)
.Setup(x => x.Build(It.IsAny<Type>(), It.IsAny<IMigrationContext>()))
.Returns<Type, IMigrationContext>((t, c) =>
{
if (t != typeof(CreateTableOfTDtoMigration))
throw new NotSupportedException();
return new CreateTableOfTDtoMigration(c);
});
using (var scope = ScopeProvider.CreateScope())
{
var upgrader = new Upgrader(
new MigrationPlan("test")
.From(string.Empty)
.To<CreateTableOfTDtoMigration>("done"));
upgrader.Execute(ScopeProvider, builder, Mock.Of<IKeyValueService>(), _loggerFactory.CreateLogger<Upgrader>(), _loggerFactory);
var helper = new DatabaseSchemaCreator(scope.Database, LoggerFactory.CreateLogger<DatabaseSchemaCreator>(), LoggerFactory, UmbracoVersion);
var exists = helper.TableExists("umbracoUser");
Assert.IsTrue(exists);
scope.Complete();
}
}
[Test]
public void DeleteKeysAndIndexesOfTDto()
{
var builder = Mock.Of<IMigrationBuilder>();
Mock.Get(builder)
.Setup(x => x.Build(It.IsAny<Type>(), It.IsAny<IMigrationContext>()))
.Returns<Type, IMigrationContext>((t, c) =>
{
switch (t.Name)
{
case "CreateTableOfTDtoMigration":
return new CreateTableOfTDtoMigration(c);
case "DeleteKeysAndIndexesMigration":
return new DeleteKeysAndIndexesMigration(c);
default:
throw new NotSupportedException();
}
});
using (var scope = ScopeProvider.CreateScope())
{
var upgrader = new Upgrader(
new MigrationPlan("test")
.From(string.Empty)
.To<CreateTableOfTDtoMigration>("a")
.To<DeleteKeysAndIndexesMigration>("done"));
upgrader.Execute(ScopeProvider, builder, Mock.Of<IKeyValueService>(), _loggerFactory.CreateLogger<Upgrader>(), _loggerFactory);
scope.Complete();
}
}
[Test]
public void CreateKeysAndIndexesOfTDto()
{
var builder = Mock.Of<IMigrationBuilder>();
Mock.Get(builder)
.Setup(x => x.Build(It.IsAny<Type>(), It.IsAny<IMigrationContext>()))
.Returns<Type, IMigrationContext>((t, c) =>
{
switch (t.Name)
{
case "CreateTableOfTDtoMigration":
return new CreateTableOfTDtoMigration(c);
case "DeleteKeysAndIndexesMigration":
return new DeleteKeysAndIndexesMigration(c);
case "CreateKeysAndIndexesOfTDtoMigration":
return new CreateKeysAndIndexesOfTDtoMigration(c);
default:
throw new NotSupportedException();
}
});
using (var scope = ScopeProvider.CreateScope())
{
var upgrader = new Upgrader(
new MigrationPlan("test")
.From(string.Empty)
.To<CreateTableOfTDtoMigration>("a")
.To<DeleteKeysAndIndexesMigration>("b")
.To<CreateKeysAndIndexesOfTDtoMigration>("done"));
upgrader.Execute(ScopeProvider, builder, Mock.Of<IKeyValueService>(), _loggerFactory.CreateLogger<Upgrader>(), _loggerFactory);
scope.Complete();
}
}
[Test]
public void CreateKeysAndIndexes()
{
var builder = Mock.Of<IMigrationBuilder>();
Mock.Get(builder)
.Setup(x => x.Build(It.IsAny<Type>(), It.IsAny<IMigrationContext>()))
.Returns<Type, IMigrationContext>((t, c) =>
{
switch (t.Name)
{
case "CreateTableOfTDtoMigration":
return new CreateTableOfTDtoMigration(c);
case "DeleteKeysAndIndexesMigration":
return new DeleteKeysAndIndexesMigration(c);
case "CreateKeysAndIndexesMigration":
return new CreateKeysAndIndexesMigration(c);
default:
throw new NotSupportedException();
}
});
using (var scope = ScopeProvider.CreateScope())
{
var upgrader = new Upgrader(
new MigrationPlan("test")
.From(string.Empty)
.To<CreateTableOfTDtoMigration>("a")
.To<DeleteKeysAndIndexesMigration>("b")
.To<CreateKeysAndIndexesMigration>("done"));
upgrader.Execute(ScopeProvider, builder, Mock.Of<IKeyValueService>(), _loggerFactory.CreateLogger<Upgrader>(), _loggerFactory);
scope.Complete();
}
}
[Test]
public void CreateColumn()
{
var builder = Mock.Of<IMigrationBuilder>();
Mock.Get(builder)
.Setup(x => x.Build(It.IsAny<Type>(), It.IsAny<IMigrationContext>()))
.Returns<Type, IMigrationContext>((t, c) =>
{
switch (t.Name)
{
case "CreateTableOfTDtoMigration":
return new CreateTableOfTDtoMigration(c);
case "CreateColumnMigration":
return new CreateColumnMigration(c);
default:
throw new NotSupportedException();
}
});
using (var scope = ScopeProvider.CreateScope())
{
var upgrader = new Upgrader(
new MigrationPlan("test")
.From(string.Empty)
.To<CreateTableOfTDtoMigration>("a")
.To<CreateColumnMigration>("done"));
upgrader.Execute(ScopeProvider, builder, Mock.Of<IKeyValueService>(), _loggerFactory.CreateLogger<Upgrader>(), _loggerFactory);
scope.Complete();
}
}
public class CreateTableOfTDtoMigration : MigrationBase
{
public CreateTableOfTDtoMigration(IMigrationContext context)
: base(context)
{ }
public override void Migrate()
{
// creates User table with keys, indexes, etc
Create.Table<UserDto>().Do();
}
}
public class DeleteKeysAndIndexesMigration : MigrationBase
{
public DeleteKeysAndIndexesMigration(IMigrationContext context)
: base(context)
{ }
public override void Migrate()
{
// drops User table keys and indexes
//Execute.DropKeysAndIndexes("umbracoUser");
// drops *all* tables keys and indexes
var tables = SqlSyntax.GetTablesInSchema(Context.Database).ToList();
foreach (var table in tables)
Delete.KeysAndIndexes(table, false, true).Do();
foreach (var table in tables)
Delete.KeysAndIndexes(table, true, false).Do();
}
}
public class CreateKeysAndIndexesOfTDtoMigration : MigrationBase
{
public CreateKeysAndIndexesOfTDtoMigration(IMigrationContext context)
: base(context)
{ }
public override void Migrate()
{
// creates Node table keys and indexes
Create.KeysAndIndexes<UserDto>().Do();
}
}
public class CreateKeysAndIndexesMigration : MigrationBase
{
public CreateKeysAndIndexesMigration(IMigrationContext context)
: base(context)
{ }
public override void Migrate()
{
// creates *all* tables keys and indexes
foreach (var x in DatabaseSchemaCreator.OrderedTables)
{
// ok - for tests, restrict to Node
if (x != typeof(UserDto)) continue;
Create.KeysAndIndexes(x).Do();
}
}
}
public class CreateColumnMigration : MigrationBase
{
public CreateColumnMigration(IMigrationContext context)
: base(context)
{ }
public override void Migrate()
{
// cannot delete the column without this, of course
Delete.KeysAndIndexes("umbracoUser").Do();
Delete.Column("id").FromTable("umbracoUser").Do();
var table = DefinitionFactory.GetTableDefinition(typeof(UserDto), SqlSyntax);
var column = table.Columns.First(x => x.Name == "id");
var create = SqlSyntax.Format(column); // returns [id] INTEGER NOT NULL IDENTITY(1060,1)
Database.Execute($"ALTER TABLE {SqlSyntax.GetQuotedTableName("umbracoUser")} ADD " + create);
}
}
}
}

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Logging;
@@ -30,15 +30,21 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
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 IMemberService GetMemberService() => GetRequiredService<IMemberService>();
private IRelationService RelationService => GetRequiredService<IRelationService>();
private IFileService FileService => GetRequiredService<IFileService>();
[SetUp]
@@ -57,13 +63,12 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
public void Can_Perform_Add_On_RelationRepository()
{
// Arrange
using (var scope = ScopeProvider.CreateScope())
using (IScope scope = ScopeProvider.CreateScope())
{
RelationTypeRepository repositoryType;
var repository = CreateRepository(ScopeProvider, out repositoryType);
RelationRepository repository = CreateRepository(ScopeProvider, out RelationTypeRepository repositoryType);
// Act
var relationType = repositoryType.Get(1);
IRelationType relationType = repositoryType.Get(1);
var relation = new Relation(_textpage.Id, _subpage.Id, relationType);
repository.Save(relation);
@@ -78,18 +83,17 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
public void Can_Perform_Update_On_RelationRepository()
{
// Arrange
using (var scope = ScopeProvider.CreateScope())
using (IScope scope = ScopeProvider.CreateScope())
{
RelationTypeRepository repositoryType;
var repository = CreateRepository(ScopeProvider, out repositoryType);
RelationRepository repository = CreateRepository(ScopeProvider, out RelationTypeRepository repositoryType);
// Act
var relation = repository.Get(1);
IRelation relation = repository.Get(1);
relation.Comment = "This relation has been updated";
repository.Save(relation);
var relationUpdated = repository.Get(1);
IRelation relationUpdated = repository.Get(1);
// Assert
Assert.That(relationUpdated, Is.Not.Null);
@@ -102,13 +106,12 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
public void Can_Perform_Delete_On_RelationRepository()
{
// Arrange
using (var scope = ScopeProvider.CreateScope())
using (IScope scope = ScopeProvider.CreateScope())
{
RelationTypeRepository repositoryType;
var repository = CreateRepository(ScopeProvider, out repositoryType);
RelationRepository repository = CreateRepository(ScopeProvider, out RelationTypeRepository repositoryType);
// Act
var relation = repository.Get(2);
IRelation relation = repository.Get(2);
repository.Delete(relation);
@@ -123,13 +126,12 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
public void Can_Perform_Get_On_RelationRepository()
{
// Arrange
using (var scope = ScopeProvider.CreateScope())
using (IScope scope = ScopeProvider.CreateScope())
{
RelationTypeRepository repositoryType;
var repository = CreateRepository(ScopeProvider, out repositoryType);
RelationRepository repository = CreateRepository(ScopeProvider, out RelationTypeRepository repositoryType);
// Act
var relation = repository.Get(1);
IRelation relation = repository.Get(1);
// Assert
Assert.That(relation, Is.Not.Null);
@@ -144,13 +146,12 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
public void Can_Perform_GetAll_On_RelationRepository()
{
// Arrange
using (var scope = ScopeProvider.CreateScope())
using (IScope scope = ScopeProvider.CreateScope())
{
RelationTypeRepository repositoryType;
var repository = CreateRepository(ScopeProvider, out repositoryType);
RelationRepository repository = CreateRepository(ScopeProvider, out RelationTypeRepository repositoryType);
// Act
var relations = repository.GetMany();
IEnumerable<IRelation> relations = repository.GetMany();
// Assert
Assert.That(relations, Is.Not.Null);
@@ -164,13 +165,12 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
public void Can_Perform_GetAll_With_Params_On_RelationRepository()
{
// Arrange
using (var scope = ScopeProvider.CreateScope())
using (IScope scope = ScopeProvider.CreateScope())
{
RelationTypeRepository repositoryType;
var repository = CreateRepository(ScopeProvider, out repositoryType);
RelationRepository repository = CreateRepository(ScopeProvider, out RelationTypeRepository repositoryType);
// Act
var relations = repository.GetMany(1, 2);
IEnumerable<IRelation> relations = repository.GetMany(1, 2);
// Assert
Assert.That(relations, Is.Not.Null);
@@ -183,18 +183,18 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
[Test]
public void Get_Paged_Parent_Entities_By_Child_Id()
{
CreateTestDataForPagingTests(out var createdContent, out var createdMembers, out var createdMedia);
CreateTestDataForPagingTests(out List<IContent> createdContent, out List<IMember> createdMembers, out List<IMedia> createdMedia);
using (var scope = ScopeProvider.CreateScope())
using (IScope scope = ScopeProvider.CreateScope())
{
var repository = CreateRepository(ScopeProvider, out var relationTypeRepository);
RelationRepository 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(6, totalRecords);
Assert.AreEqual(6, parents.Count);
//add the next page
// add the next page
parents.AddRange(repository.GetPagedParentEntitiesByChildId(createdMedia[0].Id, 1, 11, out totalRecords));
Assert.AreEqual(6, totalRecords);
Assert.AreEqual(6, parents.Count);
@@ -207,7 +207,7 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
Assert.AreEqual(0, mediaEntities.Count);
Assert.AreEqual(3, memberEntities.Count);
//only of a certain type
// only of a certain type
parents.AddRange(repository.GetPagedParentEntitiesByChildId(createdMedia[0].Id, 0, 100, out totalRecords, UmbracoObjectTypes.Document.GetGuid()));
Assert.AreEqual(3, totalRecords);
@@ -222,17 +222,17 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
[Test]
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 = MediaTypeBuilder.CreateImageMediaType("myImage");
// Create a media item and create a relationship between itself (parent -> child)
MediaType imageType = MediaTypeBuilder.CreateImageMediaType("myImage");
MediaTypeService.Save(imageType);
var media = MediaBuilder.CreateMediaImage(imageType, -1);
Media media = MediaBuilder.CreateMediaImage(imageType, -1);
MediaService.Save(media);
var relType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedMediaAlias);
IRelationType relType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedMediaAlias);
RelationService.Relate(media.Id, media.Id, relType);
using (var scope = ScopeProvider.CreateScope())
using (IScope scope = ScopeProvider.CreateScope())
{
var repository = CreateRepository(ScopeProvider, out var relationTypeRepository);
RelationRepository repository = CreateRepository(ScopeProvider, out var relationTypeRepository);
// Get parent entities for child id
var parents = repository.GetPagedParentEntitiesByChildId(media.Id, 0, 10, out var totalRecords).ToList();
@@ -251,16 +251,16 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
{
CreateTestDataForPagingTests(out var createdContent, out var createdMembers, out _);
using (var scope = ScopeProvider.CreateScope())
using (IScope scope = ScopeProvider.CreateScope())
{
var repository = CreateRepository(ScopeProvider, out _);
RelationRepository repository = CreateRepository(ScopeProvider, out _);
// Get parent entities for child id
var parents = repository.GetPagedChildEntitiesByParentId(createdContent[0].Id, 0, 6, out var totalRecords).ToList();
Assert.AreEqual(3, totalRecords);
Assert.AreEqual(3, parents.Count);
//add the next page
// add the next page
parents.AddRange(repository.GetPagedChildEntitiesByParentId(createdContent[0].Id, 1, 6, out totalRecords));
Assert.AreEqual(3, totalRecords);
Assert.AreEqual(3, parents.Count);
@@ -273,7 +273,7 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
Assert.AreEqual(3, mediaEntities.Count);
Assert.AreEqual(0, memberEntities.Count);
//only of a certain type
// only of a certain type
parents.AddRange(repository.GetPagedChildEntitiesByParentId(createdContent[0].Id, 0, 100, out totalRecords, UmbracoObjectTypes.Media.GetGuid()));
Assert.AreEqual(3, totalRecords);
@@ -287,9 +287,9 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
private void CreateTestDataForPagingTests(out List<IContent> createdContent, out List<IMember> createdMembers, out List<IMedia> createdMedia)
{
//Create content
// Create content
createdContent = new List<IContent>();
var contentType = ContentTypeBuilder.CreateBasicContentType("blah");
ContentType contentType = ContentTypeBuilder.CreateBasicContentType("blah");
ContentTypeService.Save(contentType);
for (int i = 0; i < 3; i++)
{
@@ -298,33 +298,42 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
createdContent.Add(c1);
}
//Create media
// Create media
createdMedia = new List<IMedia>();
var imageType = MediaTypeBuilder.CreateImageMediaType("myImage");
MediaType imageType = MediaTypeBuilder.CreateImageMediaType("myImage");
MediaTypeService.Save(imageType);
for (int i = 0; i < 3; i++)
{
var c1 = MediaBuilder.CreateMediaImage(imageType, -1);
Media c1 = MediaBuilder.CreateMediaImage(imageType, -1);
MediaService.Save(c1);
createdMedia.Add(c1);
}
// Create members
var memberType = MemberTypeBuilder.CreateSimpleMemberType("simple");
MemberType memberType = MemberTypeBuilder.CreateSimpleMemberType("simple");
MemberTypeService.Save(memberType);
createdMembers = MemberBuilder.CreateSimpleMembers(memberType, 3).ToList();
MemberService.Save(createdMembers);
GetMemberService().Save(createdMembers);
var relType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedMediaAlias);
IRelationType relType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedMediaAlias);
// Relate content to media
foreach (var content in createdContent)
foreach (var media in createdMedia)
foreach (IContent content in createdContent)
{
foreach (IMedia media in createdMedia)
{
RelationService.Relate(content.Id, media.Id, relType);
}
}
// Relate members to media
foreach (var member in createdMembers)
foreach (var media in createdMedia)
foreach (IMember member in createdMembers)
{
foreach (IMedia media in createdMedia)
{
RelationService.Relate(member.Id, media.Id, relType);
}
}
}
[Test]
@@ -333,8 +342,7 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
// Arrange
using (var scope = ScopeProvider.CreateScope())
{
RelationTypeRepository repositoryType;
var repository = CreateRepository(ScopeProvider, out repositoryType);
var repository = CreateRepository(ScopeProvider, out RelationTypeRepository repositoryType);
// Act
var exists = repository.Exists(2);
@@ -352,8 +360,7 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
// Arrange
using (var scope = ScopeProvider.CreateScope())
{
RelationTypeRepository repositoryType;
var repository = CreateRepository(ScopeProvider, out repositoryType);
var repository = CreateRepository(ScopeProvider, out RelationTypeRepository repositoryType);
// Act
var query = scope.SqlContext.Query<IRelation>().Where(x => x.ParentId == _textpage.Id);
@@ -368,14 +375,13 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
public void Can_Perform_GetByQuery_On_RelationRepository()
{
// Arrange
using (var scope = ScopeProvider.CreateScope())
using (IScope scope = ScopeProvider.CreateScope())
{
RelationTypeRepository repositoryType;
var repository = CreateRepository(ScopeProvider, out repositoryType);
RelationRepository repository = CreateRepository(ScopeProvider, out RelationTypeRepository repositoryType);
// Act
var query = scope.SqlContext.Query<IRelation>().Where(x => x.RelationTypeId == _relateContent.Id);
var relations = repository.Get(query);
global::Umbraco.Core.Persistence.Querying.IQuery<IRelation> query = scope.SqlContext.Query<IRelation>().Where(x => x.RelationTypeId == _relateContent.Id);
IEnumerable<IRelation> relations = repository.Get(query);
// Assert
Assert.That(relations, Is.Not.Null);
@@ -389,12 +395,11 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
public void Can_Delete_Content_And_Verify_Relation_Is_Removed()
{
// Arrange
using (var scope = ScopeProvider.CreateScope())
using (IScope scope = ScopeProvider.CreateScope())
{
RelationTypeRepository repositoryType;
var repository = CreateRepository(ScopeProvider, out repositoryType);
RelationRepository repository = CreateRepository(ScopeProvider, out RelationTypeRepository repositoryType);
var content = ContentService.GetById(_subpage.Id);
IContent content = ContentService.GetById(_subpage.Id);
ContentService.Delete(content, 0);
// Act
@@ -410,17 +415,20 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
public void CreateTestData()
{
_relateContent = new RelationType(
"Relate Content on Copy", "relateContentOnCopy", true,
"Relate Content on Copy",
"relateContentOnCopy",
true,
Constants.ObjectTypes.Document,
new Guid("C66BA18E-EAF3-4CFF-8A22-41B16D66A972"));
_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"));
using (var scope = ScopeProvider.CreateScope())
using (IScope scope = ScopeProvider.CreateScope())
{
var accessor = (IScopeAccessor)ScopeProvider;
var relationTypeRepository = new RelationTypeRepository(accessor, AppCaches.Disabled, Mock.Of<ILogger<RelationTypeRepository>>());
@@ -430,22 +438,22 @@ namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositor
relationTypeRepository.Save(_relateContent);
relationTypeRepository.Save(_relateContentType);
var template = TemplateBuilder.CreateTextPageTemplate();
Template template = TemplateBuilder.CreateTextPageTemplate();
FileService.SaveTemplate(template);
//Create and Save ContentType "umbTextpage" -> (NodeDto.NodeIdSeed)
// Create and Save ContentType "umbTextpage" -> (NodeDto.NodeIdSeed)
_contentType = ContentTypeBuilder.CreateSimpleContentType("umbTextpage", "Textpage", defaultTemplateId: template.Id);
ContentTypeService.Save(_contentType);
//Create and Save Content "Homepage" based on "umbTextpage" -> (NodeDto.NodeIdSeed + 1)
// Create and Save Content "Homepage" based on "umbTextpage" -> (NodeDto.NodeIdSeed + 1)
_textpage = ContentBuilder.CreateSimpleContent(_contentType);
ContentService.Save(_textpage, 0);
//Create and Save Content "Text Page 1" based on "umbTextpage" -> (NodeDto.NodeIdSeed + 2)
// Create and Save Content "Text Page 1" based on "umbTextpage" -> (NodeDto.NodeIdSeed + 2)
_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)
// Create and Save Content "Text Page 1" based on "umbTextpage" -> (NodeDto.NodeIdSeed + 3)
_subpage2 = ContentBuilder.CreateSimpleContent(_contentType, "Text Page 2", _textpage.Id);
ContentService.Save(_subpage2, 0);

View File

@@ -0,0 +1,72 @@
using System.Linq;
using System.Threading;
using Microsoft.Extensions.Logging;
using Moq;
using NUnit.Framework;
using Umbraco.Core.Cache;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Repositories.Implement;
using Umbraco.Core.Scoping;
using Umbraco.Core.Services;
using Umbraco.Tests.Integration.Testing;
using Umbraco.Tests.Testing;
namespace Umbraco.Tests.Integration.Umbraco.Infrastructure.Services
{
[TestFixture]
[Apartment(ApartmentState.STA)]
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)]
public class RedirectUrlServiceTests : UmbracoIntegrationTestWithContent
{
private IContent _testPage;
private IContent _altTestPage;
private const string Url = "blah";
private const string CultureA = "en";
private const string CultureB = "de";
private IRedirectUrlService RedirectUrlService => GetRequiredService<IRedirectUrlService>();
public override void CreateTestData()
{
base.CreateTestData();
using (IScope scope = ScopeProvider.CreateScope())
{
var repository = new RedirectUrlRepository((IScopeAccessor)ScopeProvider, AppCaches.Disabled, Mock.Of<ILogger<RedirectUrlRepository>>());
IContent rootContent = ContentService.GetRootContent().First();
var subPages = ContentService.GetPagedChildren(rootContent.Id, 0, 2, out _).ToList();
_testPage = subPages[0];
_altTestPage = subPages[1];
repository.Save(new RedirectUrl
{
ContentKey = _testPage.Key,
Url = Url,
Culture = CultureA
});
repository.Save(new RedirectUrl
{
ContentKey = _altTestPage.Key,
Url = Url,
Culture = CultureB
});
scope.Complete();
}
}
[Test]
public void Can_Get_Most_Recent_RedirectUrl()
{
IRedirectUrl redirect = RedirectUrlService.GetMostRecentRedirectUrl(Url);
Assert.AreEqual(redirect.ContentId, _altTestPage.Id);
}
[Test]
public void Can_Get_Most_Recent_RedirectUrl_With_Culture()
{
IRedirectUrl redirect = RedirectUrlService.GetMostRecentRedirectUrl(Url, CultureA);
Assert.AreEqual(redirect.ContentId, _testPage.Id);
}
}
}