diff --git a/src/Umbraco.Core/Routing/PublishedUrlInfoProvider.cs b/src/Umbraco.Core/Routing/PublishedUrlInfoProvider.cs index 0e1fbffab69b..0eb1bfbbb881 100644 --- a/src/Umbraco.Core/Routing/PublishedUrlInfoProvider.cs +++ b/src/Umbraco.Core/Routing/PublishedUrlInfoProvider.cs @@ -45,7 +45,12 @@ public PublishedUrlInfoProvider( public async Task> GetAllAsync(IContent content) { HashSet urlInfos = []; - IEnumerable cultures = await _languageService.GetAllIsoCodesAsync(); + + // For invariant content, only return the URL for the default language. + // Invariant content doesn't vary by culture, so it only has one URL. + IEnumerable cultures = content.ContentType.VariesByCulture() + ? await _languageService.GetAllIsoCodesAsync() + : [(await _languageService.GetDefaultIsoCodeAsync())]; // First we get the urls of all cultures, using the published router, meaning we respect any extensions. foreach (var culture in cultures) diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishedUrlInfoProviderTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishedUrlInfoProviderTests.cs index 3bb768fec3b7..36b9ef11215f 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishedUrlInfoProviderTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/PublishedUrlInfoProviderTests.cs @@ -1,12 +1,39 @@ using NUnit.Framework; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Services; using Umbraco.Cms.Tests.Common.Builders; +using Umbraco.Cms.Tests.Common.Builders.Extensions; namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Services; internal sealed class PublishedUrlInfoProviderTests : PublishedUrlInfoProviderTestsBase { + private ILanguageService LanguageService => GetRequiredService(); + + [Test] + public async Task Invariant_content_returns_only_default_language_url() + { + // Arrange: Add a second language (Danish) alongside the default English + var danishLanguage = new LanguageBuilder() + .WithCultureInfo("da-DK") + .WithCultureName("Danish") + .Build(); + await LanguageService.CreateAsync(danishLanguage, Constants.Security.SuperUserKey); + + // The base class creates invariant content (ContentType doesn't vary by culture) + // Publish the root content + ContentService.PublishBranch(Textpage, PublishBranchFilter.IncludeUnpublished, ["*"]); + + // Act: Get all URLs for the invariant content + var urls = await PublishedUrlInfoProvider.GetAllAsync(Textpage); + + // Assert: Invariant content should only return ONE URL (for the default language) + // not multiple URLs for each configured language + Assert.AreEqual(1, urls.Count, "Invariant content should only return one URL for the default language, not URLs for all configured languages"); + Assert.IsNotNull(urls.First().Url); + Assert.AreEqual("en-US", urls.First().Culture, "The URL should be for the default language (en-US)"); + } [Test] public async Task Two_items_in_level_1_with_same_name_will_have_conflicting_routes()