Merge branch 'v15/dev' into v16/merge-from-15

# Conflicts:
#	src/Umbraco.Cms.Api.Management/Controllers/PublishedCache/RebuildPublishedCacheController.cs
#	src/Umbraco.Cms.Api.Management/Factories/UserPresentationFactory.cs
#	src/Umbraco.Core/Persistence/Repositories/ITrackedReferencesRepository.cs
#	src/Umbraco.Core/Services/ContentEditingService.cs
#	src/Umbraco.Core/Services/DataTypeService.cs
#	src/Umbraco.Core/Services/IContentEditingService.cs
#	src/Umbraco.Core/Services/IDataTypeService.cs
#	src/Umbraco.Core/Services/ITrackedReferencesService.cs
#	src/Umbraco.Core/Services/RelationService.cs
#	src/Umbraco.Core/Services/TrackedReferencesService.cs
#	src/Umbraco.Infrastructure/Examine/Deferred/DeliveryApiContentIndexHandleContentTypeChanges.cs
#	src/Umbraco.Infrastructure/Examine/DeliveryApiIndexingHandler.cs
#	src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TrackedReferencesRepository.cs
#	src/Umbraco.Web.UI.Client/src/external/backend-api/src/sdk.gen.ts
#	src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.data.ts
#	src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts
#	src/Umbraco.Web.UI.Client/src/packages/core/router/modal-registration/modal-route-registration.controller.ts
#	src/Umbraco.Web.UI.Client/src/packages/core/router/route/route.context.ts
#	src/Umbraco.Web.UI.Client/src/packages/core/router/route/route.interface.ts
#	src/Umbraco.Web.UI.Client/src/packages/core/router/route/router-slot.element.ts
#	src/Umbraco.Web.UI.Client/src/packages/core/router/router-slot/model.ts
#	src/Umbraco.Web.UI.Client/src/packages/data-type/reference/repository/data-type-reference.server.data.ts
#	src/Umbraco.Web.UI.Client/src/packages/documents/documents/publishing/repository/document-publishing.server.data-source.ts
#	src/Umbraco.Web.UI.Client/src/packages/documents/documents/rollback/entity-action/rollback.action.ts
#	tests/Umbraco.Tests.AcceptanceTest/package-lock.json
#	tests/Umbraco.Tests.AcceptanceTest/package.json
#	tests/Umbraco.Tests.Common/Builders/UserGroupBuilder.cs
#	tests/Umbraco.Tests.Integration/Umbraco.Core/Services/TemporaryFileServiceTests.cs
This commit is contained in:
Andy Butland
2025-04-09 22:05:59 +02:00
91 changed files with 2817 additions and 368 deletions

View File

@@ -48,7 +48,7 @@ public class ContentBuilderTests : DeliveryApiTests
Assert.NotNull(result);
Assert.AreEqual("The page", result.Name);
Assert.AreEqual("thePageType", result.ContentType);
Assert.AreEqual("/url:url-segment", result.Route.Path);
Assert.AreEqual("/url:url-segment/", result.Route.Path);
Assert.AreEqual(key, result.Id);
Assert.AreEqual(2, result.Properties.Count);
Assert.AreEqual("Delivery API value", result.Properties["deliveryApi"]);

View File

@@ -40,7 +40,7 @@ public class ContentPickerValueConverterTests : PropertyValueConverterTests
Assert.NotNull(result);
Assert.AreEqual("The page", result.Name);
Assert.AreEqual(PublishedContent.Key, result.Id);
Assert.AreEqual("/the-page-url", result.Route.Path);
Assert.AreEqual("/the-page-url/", result.Route.Path);
Assert.AreEqual("TheContentType", result.ContentType);
Assert.IsEmpty(result.Properties);
}
@@ -103,7 +103,7 @@ public class ContentPickerValueConverterTests : PropertyValueConverterTests
Assert.NotNull(result);
Assert.AreEqual("The page", result.Name);
Assert.AreEqual(content.Object.Key, result.Id);
Assert.AreEqual("/page-url-segment", result.Route.Path);
Assert.AreEqual("/page-url-segment/", result.Route.Path);
Assert.AreEqual("TheContentType", result.ContentType);
Assert.AreEqual(2, result.Properties.Count);
Assert.AreEqual("Delivery API value", result.Properties[DeliveryApiPropertyType.Alias]);

View File

@@ -50,7 +50,7 @@ public class ContentRouteBuilderTests : DeliveryApiTests
IEnumerable<Guid> ancestorsKeys = [rootKey];
navigationQueryServiceMock.Setup(x => x.TryGetAncestorsKeys(childKey, out ancestorsKeys)).Returns(true);
var contentCache = CreatePublishedContentCache("#");
var contentCache = CreatePublishedContentCache();
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), root.Key)).Returns(root);
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), child.Key)).Returns(child);
@@ -77,7 +77,7 @@ public class ContentRouteBuilderTests : DeliveryApiTests
var grandchildKey = Guid.NewGuid();
var grandchild = SetupInvariantPublishedContent("The Grandchild", grandchildKey, navigationQueryServiceMock, child);
var contentCache = CreatePublishedContentCache("#");
var contentCache = CreatePublishedContentCache();
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), root.Key)).Returns(root);
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), child.Key)).Returns(child);
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), grandchild.Key)).Returns(grandchild);
@@ -104,7 +104,7 @@ public class ContentRouteBuilderTests : DeliveryApiTests
var childKey = Guid.NewGuid();
var child = SetupVariantPublishedContent("The Child", childKey, navigationQueryServiceMock, root);
var contentCache = CreatePublishedContentCache("#");
var contentCache = CreatePublishedContentCache();
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), root.Key)).Returns(root);
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), child.Key)).Returns(child);
@@ -136,7 +136,7 @@ public class ContentRouteBuilderTests : DeliveryApiTests
var childKey = Guid.NewGuid();
var child = SetupInvariantPublishedContent("The Child", childKey, navigationQueryServiceMock, root);
var contentCache = CreatePublishedContentCache("#");
var contentCache = CreatePublishedContentCache();
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), root.Key)).Returns(root);
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), child.Key)).Returns(child);
@@ -168,7 +168,7 @@ public class ContentRouteBuilderTests : DeliveryApiTests
var childKey = Guid.NewGuid();
var child = SetupVariantPublishedContent("The Child", childKey, navigationQueryServiceMock, root);
var contentCache = CreatePublishedContentCache("#");
var contentCache = CreatePublishedContentCache();
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), root.Key)).Returns(root);
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), child.Key)).Returns(child);
@@ -209,7 +209,7 @@ public class ContentRouteBuilderTests : DeliveryApiTests
{
var result = GetUnRoutableRoute(resolvedUrl, "/the/content/route");
Assert.IsNotNull(result);
Assert.AreEqual("/the/content/route", result.Path);
Assert.AreEqual("/the/content/route/", result.Path);
}
[TestCase("")]
@@ -266,7 +266,7 @@ public class ContentRouteBuilderTests : DeliveryApiTests
var childKey = Guid.NewGuid();
var child = SetupInvariantPublishedContent("The Child", childKey, navigationQueryServiceMock, root, false);
var contentCache = CreatePublishedContentCache("#");
var contentCache = CreatePublishedContentCache();
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), root.Key)).Returns(root);
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), child.Key)).Returns(child);
@@ -293,7 +293,7 @@ public class ContentRouteBuilderTests : DeliveryApiTests
var childKey = Guid.NewGuid();
var child = SetupInvariantPublishedContent("The Child", childKey, navigationQueryServiceMock, root, false);
var contentCache = CreatePublishedContentCache("#");
var contentCache = CreatePublishedContentCache();
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), root.Key)).Returns(root);
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), child.Key)).Returns(child);
@@ -321,7 +321,7 @@ public class ContentRouteBuilderTests : DeliveryApiTests
var requestPreviewServiceMock = new Mock<IRequestPreviewService>();
requestPreviewServiceMock.Setup(m => m.IsPreview()).Returns(isPreview);
var contentCache = CreatePublishedContentCache("#");
var contentCache = CreatePublishedContentCache();
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), root.Key)).Returns(root);
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), child.Key)).Returns(child);
@@ -355,7 +355,7 @@ public class ContentRouteBuilderTests : DeliveryApiTests
var childKey = Guid.NewGuid();
var child = SetupInvariantPublishedContent("The Child", childKey, navigationQueryServiceMock, root);
var contentCache = CreatePublishedContentCache("#");
var contentCache = CreatePublishedContentCache();
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), root.Key)).Returns(root);
Mock.Get(contentCache).Setup(x => x.GetById(It.IsAny<bool>(), child.Key)).Returns(child);
@@ -460,7 +460,7 @@ public class ContentRouteBuilderTests : DeliveryApiTests
var requestPreviewServiceMock = new Mock<IRequestPreviewService>();
requestPreviewServiceMock.Setup(m => m.IsPreview()).Returns(isPreview);
contentCache ??= CreatePublishedContentCache("#");
contentCache ??= CreatePublishedContentCache();
apiContentPathProvider ??= SetupApiContentPathProvider(hideTopLevelNodeFromPath, contentCache, navigationQueryService);
return CreateContentRouteBuilder(
@@ -480,25 +480,24 @@ public class ContentRouteBuilderTests : DeliveryApiTests
.Returns(publishedUrl);
var contentPathProvider = new ApiContentPathProvider(publishedUrlProviderMock.Object);
var contentCache = CreatePublishedContentCache(routeById);
var contentCache = CreatePublishedContentCache();
var navigationQueryServiceMock = new Mock<IDocumentNavigationQueryService>();
var content = SetupVariantPublishedContent("The Content", Guid.NewGuid(), navigationQueryServiceMock);
var documentUrlServiceMock = new Mock<IDocumentUrlService>();
documentUrlServiceMock
.Setup(m => m.GetLegacyRouteFormat(It.IsAny<Guid>(), It.IsAny<string?>(), It.IsAny<bool>()))
.Returns(routeById);
var builder = CreateContentRouteBuilder(
contentPathProvider,
CreateGlobalSettings(),
contentCache: contentCache);
contentCache: contentCache,
documentUrlService: documentUrlServiceMock.Object);
return builder.Build(content);
}
private IPublishedContentCache CreatePublishedContentCache(string routeById)
{
var publishedContentCacheMock = new Mock<IPublishedContentCache>();
publishedContentCacheMock
.Setup(c => c.GetRouteById(It.IsAny<int>(), It.IsAny<string?>()))
.Returns(routeById);
return publishedContentCacheMock.Object;
}
private IPublishedContentCache CreatePublishedContentCache()
=> Mock.Of<IPublishedContentCache>();
}

View File

@@ -9,6 +9,7 @@ using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core.PropertyEditors;
using Umbraco.Cms.Core.PropertyEditors.DeliveryApi;
using Umbraco.Cms.Core.PublishedCache;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Services.Navigation;
using Umbraco.Extensions;
@@ -128,7 +129,8 @@ public class DeliveryApiTests
IOptionsMonitor<RequestHandlerSettings>? requestHandlerSettingsMonitor = null,
IPublishedContentCache? contentCache = null,
IDocumentNavigationQueryService? navigationQueryService = null,
IPublishStatusQueryService? publishStatusQueryService = null)
IPublishStatusQueryService? publishStatusQueryService = null,
IDocumentUrlService? documentUrlService = null)
{
if (requestHandlerSettingsMonitor == null)
{
@@ -145,6 +147,7 @@ public class DeliveryApiTests
requestHandlerSettingsMonitor,
contentCache ?? Mock.Of<IPublishedContentCache>(),
navigationQueryService ?? Mock.Of<IDocumentNavigationQueryService>(),
publishStatusQueryService ?? PublishStatusQueryService);
publishStatusQueryService ?? PublishStatusQueryService,
documentUrlService ?? Mock.Of<IDocumentUrlService>());
}
}

View File

@@ -59,7 +59,7 @@ public class MultiNodeTreePickerValueConverterTests : PropertyValueConverterTest
Assert.AreEqual(1, result.Count());
Assert.AreEqual(PublishedContent.Name, result.First().Name);
Assert.AreEqual(PublishedContent.Key, result.First().Id);
Assert.AreEqual("/the-page-url", result.First().Route.Path);
Assert.AreEqual("/the-page-url/", result.First().Route.Path);
Assert.AreEqual("TheContentType", result.First().ContentType);
Assert.IsEmpty(result.First().Properties);
}
@@ -86,7 +86,7 @@ public class MultiNodeTreePickerValueConverterTests : PropertyValueConverterTest
Assert.AreEqual(PublishedContent.Name, result.First().Name);
Assert.AreEqual(PublishedContent.Key, result.First().Id);
Assert.AreEqual("/the-page-url", result.First().Route.Path);
Assert.AreEqual("/the-page-url/", result.First().Route.Path);
Assert.AreEqual("TheContentType", result.First().ContentType);
Assert.AreEqual("The other page", result.Last().Name);
@@ -130,7 +130,7 @@ public class MultiNodeTreePickerValueConverterTests : PropertyValueConverterTest
Assert.AreEqual(1, result.Count());
Assert.AreEqual("The page", result.First().Name);
Assert.AreEqual(key, result.First().Id);
Assert.AreEqual("/page-url-segment", result.First().Route.Path);
Assert.AreEqual("/page-url-segment/", result.First().Route.Path);
Assert.AreEqual("TheContentType", result.First().ContentType);
Assert.AreEqual(2, result.First().Properties.Count);
Assert.AreEqual("Delivery API value", result.First().Properties[DeliveryApiPropertyType.Alias]);
@@ -204,7 +204,7 @@ public class MultiNodeTreePickerValueConverterTests : PropertyValueConverterTest
Assert.AreEqual(1, result.Count());
Assert.AreEqual(PublishedContent.Name, result.First().Name);
Assert.AreEqual(PublishedContent.Key, result.First().Id);
Assert.AreEqual("/the-page-url", result.First().Route.Path);
Assert.AreEqual("/the-page-url/", result.First().Route.Path);
Assert.AreEqual("TheContentType", result.First().ContentType);
}

View File

@@ -46,7 +46,7 @@ public class MultiUrlPickerValueConverterTests : PropertyValueConverterTests
Assert.Null(link.Target);
var route = link.Route;
Assert.NotNull(route);
Assert.AreEqual("/the-page-url", route.Path);
Assert.AreEqual("/the-page-url/", route.Path);
}
[Test]
@@ -221,7 +221,7 @@ public class MultiUrlPickerValueConverterTests : PropertyValueConverterTests
var link = result.First();
Assert.AreEqual("Custom link name", link.Title);
Assert.AreEqual(PublishedContent.Key, link.DestinationId);
Assert.AreEqual("/the-page-url", link.Route!.Path);
Assert.AreEqual("/the-page-url/", link.Route!.Path);
Assert.AreEqual(LinkType.Content, link.LinkType);
Assert.AreEqual("_blank", link.Target);
Assert.AreEqual("?something=true", link.QueryString);
@@ -252,7 +252,7 @@ public class MultiUrlPickerValueConverterTests : PropertyValueConverterTests
var link = result.First();
Assert.AreEqual(PublishedContent.Name, link.Title);
Assert.AreEqual(PublishedContent.Key, link.DestinationId);
Assert.AreEqual("/the-page-url", link.Route!.Path);
Assert.AreEqual("/the-page-url/", link.Route!.Path);
Assert.AreEqual(LinkType.Content, link.LinkType);
Assert.Null(link.Target);
Assert.Null(link.Url);

View File

@@ -6,6 +6,7 @@ using Umbraco.Cms.Core.DeliveryApi;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core.PublishedCache;
using Umbraco.Cms.Core.Routing;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Services.Navigation;
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.DeliveryApi;
@@ -127,7 +128,8 @@ public class PropertyValueConverterTests : DeliveryApiTests
IOptionsMonitor<RequestHandlerSettings>? requestHandlerSettingsMonitor = null,
IPublishedContentCache? contentCache = null,
IDocumentNavigationQueryService? navigationQueryService = null,
IPublishStatusQueryService? publishStatusQueryService = null)
IPublishStatusQueryService? publishStatusQueryService = null,
IDocumentUrlService? documentUrlService = null)
{
contentCache ??= PublishedContentCacheMock.Object;
navigationQueryService ??= DocumentNavigationQueryServiceMock.Object;
@@ -140,6 +142,7 @@ public class PropertyValueConverterTests : DeliveryApiTests
requestHandlerSettingsMonitor,
contentCache,
navigationQueryService,
publishStatusQueryService);
publishStatusQueryService,
documentUrlService);
}
}