Skip to content

Commit fcfaff9

Browse files
authored
Querying: Restore ability to retrieve all children published in any culture (closes #20760) (#20766)
* Restore ability to retrieve all children published in any culture. * Fixed typo in test name.
1 parent 04918ec commit fcfaff9

File tree

3 files changed

+62
-23
lines changed

3 files changed

+62
-23
lines changed

src/Umbraco.Core/Services/PublishStatus/PublishStatusService.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ public bool IsDocumentPublished(Guid documentKey, string culture)
6969

7070
if (_publishedCultures.TryGetValue(documentKey, out ISet<string>? publishedCultures))
7171
{
72-
return publishedCultures.Contains(culture, StringComparer.InvariantCultureIgnoreCase);
72+
// If "*" is provided as the culture, we consider this as "published in any culture". This aligns
73+
// with behaviour in Umbraco 13.
74+
return culture == Constants.System.InvariantCulture || publishedCultures.Contains(culture, StringComparer.InvariantCultureIgnoreCase);
7375
}
7476

7577
_logger.LogDebug("Document {DocumentKey} not found in the publish status cache", documentKey);

src/Umbraco.Core/Services/PublishStatus/PublishedContentStatusFilteringService.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Umbraco.Cms.Core.Models.PublishedContent;
1+
using Umbraco.Cms.Core.Models.PublishedContent;
22
using Umbraco.Cms.Core.PublishedCache;
33
using Umbraco.Extensions;
44

@@ -40,13 +40,14 @@ public IEnumerable<IPublishedContent> FilterAvailable(IEnumerable<Guid> candidat
4040
_publishStatusQueryService.IsDocumentPublished(key, culture)
4141
&& _publishStatusQueryService.HasPublishedAncestorPath(key));
4242

43-
return WhereIsInvariantOrHasCulture(candidateKeys, culture, preview).ToArray();
43+
return WhereIsInvariantOrHasCultureOrRequestedAllCultures(candidateKeys, culture, preview).ToArray();
4444
}
4545

46-
private IEnumerable<IPublishedContent> WhereIsInvariantOrHasCulture(IEnumerable<Guid> keys, string culture, bool preview)
46+
private IEnumerable<IPublishedContent> WhereIsInvariantOrHasCultureOrRequestedAllCultures(IEnumerable<Guid> keys, string culture, bool preview)
4747
=> keys
4848
.Select(key => _publishedContentCache.GetById(preview, key))
4949
.WhereNotNull()
50-
.Where(content => content.ContentType.VariesByCulture() is false
50+
.Where(content => culture == Constants.System.InvariantCulture
51+
|| content.ContentType.VariesByCulture() is false
5152
|| content.Cultures.ContainsKey(culture));
5253
}

tests/Umbraco.Tests.UnitTests/Umbraco.Core/Services/PublishStatus/PublishedContentStatusFilteringServiceTests.cs

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
using Moq;
1+
using Moq;
22
using NUnit.Framework;
3+
using Umbraco.Cms.Core;
34
using Umbraco.Cms.Core.Models;
45
using Umbraco.Cms.Core.Models.PublishedContent;
56
using Umbraco.Cms.Core.PublishedCache;
@@ -44,9 +45,10 @@ public void FilterAvailable_Invariant_ForPreview_YieldsUnpublishedItems()
4445

4546
[TestCase("da-DK", 3)]
4647
[TestCase("en-US", 4)]
48+
[TestCase("*", 5)]
4749
public void FilterAvailable_Variant_ForNonPreview_YieldsPublishedItemsInCulture(string culture, int expectedNumberOfChildren)
4850
{
49-
var (sut, items) = SetupVariant(false, culture);
51+
var (sut, items) = SetupVariant(false, culture == Constants.System.InvariantCulture ? "en-US" : culture);
5052

5153
var children = sut.FilterAvailable(items.Keys, culture).ToArray();
5254
Assert.AreEqual(expectedNumberOfChildren, children.Length);
@@ -70,16 +72,24 @@ public void FilterAvailable_Variant_ForNonPreview_YieldsPublishedItemsInCulture(
7072
{
7173
Assert.AreEqual(8, children[2].Id);
7274
}
75+
76+
if (culture == Constants.System.InvariantCulture)
77+
{
78+
Assert.AreEqual(4, children[2].Id);
79+
Assert.AreEqual(6, children[3].Id);
80+
Assert.AreEqual(8, children[4].Id);
81+
}
7382
}
7483

75-
[TestCase("da-DK")]
76-
[TestCase("en-US")]
77-
public void FilterAvailable_Variant_ForPreview_YieldsUnpublishedItemsInCulture(string culture)
84+
[TestCase("da-DK", 7)]
85+
[TestCase("en-US", 7)]
86+
[TestCase("*", 10)]
87+
public void FilterAvailable_Variant_ForPreview_YieldsUnpublishedItemsInCulture(string culture, int expectedNumberOfChildren)
7888
{
79-
var (sut, items) = SetupVariant(true, culture);
89+
var (sut, items) = SetupVariant(true, culture == Constants.System.InvariantCulture ? "en-US" : culture);
8090

8191
var children = sut.FilterAvailable(items.Keys, culture).ToArray();
82-
Assert.AreEqual(7, children.Length);
92+
Assert.AreEqual(expectedNumberOfChildren, children.Length);
8393

8494
// IDs 0 through 3 exist in both en-US and da-DK
8595
Assert.Multiple(() =>
@@ -105,16 +115,27 @@ public void FilterAvailable_Variant_ForPreview_YieldsUnpublishedItemsInCulture(s
105115
Assert.AreEqual(8, children[5].Id);
106116
Assert.AreEqual(9, children[6].Id);
107117
}
118+
119+
if (culture == Constants.System.InvariantCulture)
120+
{
121+
Assert.AreEqual(4, children[4].Id);
122+
Assert.AreEqual(5, children[5].Id);
123+
Assert.AreEqual(6, children[6].Id);
124+
Assert.AreEqual(7, children[7].Id);
125+
Assert.AreEqual(8, children[8].Id);
126+
Assert.AreEqual(9, children[9].Id);
127+
}
108128
}
109129

110-
[TestCase("da-DK")]
111-
[TestCase("en-US")]
112-
public void FilterAvailable_MixedVariance_ForNonPreview_YieldsPublishedItemsInCultureOrInvariant(string culture)
130+
[TestCase("da-DK", 4)]
131+
[TestCase("en-US", 4)]
132+
[TestCase("*", 5)]
133+
public void FilterAvailable_MixedVariance_ForNonPreview_YieldsPublishedItemsInCultureOrInvariant(string culture, int expectedNumberOfChildren)
113134
{
114-
var (sut, items) = SetupMixedVariance(false, culture);
135+
var (sut, items) = SetupMixedVariance(false, culture == Constants.System.InvariantCulture ? "en-US" : culture);
115136

116137
var children = sut.FilterAvailable(items.Keys, culture).ToArray();
117-
Assert.AreEqual(4, children.Length);
138+
Assert.AreEqual(expectedNumberOfChildren, children.Length);
118139

119140
// IDs 0 through 2 are invariant - only even IDs are published
120141
Assert.Multiple(() =>
@@ -140,16 +161,23 @@ public void FilterAvailable_MixedVariance_ForNonPreview_YieldsPublishedItemsInCu
140161
{
141162
Assert.AreEqual(8, children[3].Id);
142163
}
164+
165+
if (culture == Constants.System.InvariantCulture)
166+
{
167+
Assert.AreEqual(6, children[3].Id);
168+
Assert.AreEqual(8, children[4].Id);
169+
}
143170
}
144171

145-
[TestCase("da-DK")]
146-
[TestCase("en-US")]
147-
public void FilterAvailable_MixedVariance_FoPreview_YieldsPublishedItemsInCultureOrInvariant(string culture)
172+
[TestCase("da-DK", 8)]
173+
[TestCase("en-US", 8)]
174+
[TestCase("*", 10)]
175+
public void FilterAvailable_MixedVariance_ForPreview_YieldsPublishedItemsInCultureOrInvariant(string culture, int expectedNumberOfChildren)
148176
{
149-
var (sut, items) = SetupMixedVariance(true, culture);
177+
var (sut, items) = SetupMixedVariance(true, culture == Constants.System.InvariantCulture ? "en-US" : culture);
150178

151179
var children = sut.FilterAvailable(items.Keys, culture).ToArray();
152-
Assert.AreEqual(8, children.Length);
180+
Assert.AreEqual(expectedNumberOfChildren, children.Length);
153181

154182
// IDs 0 through 2 are invariant
155183
Assert.Multiple(() =>
@@ -180,6 +208,14 @@ public void FilterAvailable_MixedVariance_FoPreview_YieldsPublishedItemsInCultur
180208
Assert.AreEqual(8, children[6].Id);
181209
Assert.AreEqual(9, children[7].Id);
182210
}
211+
212+
if (culture == Constants.System.InvariantCulture)
213+
{
214+
Assert.AreEqual(6, children[6].Id);
215+
Assert.AreEqual(7, children[7].Id);
216+
Assert.AreEqual(8, children[8].Id);
217+
Assert.AreEqual(9, children[9].Id);
218+
}
183219
}
184220

185221
// sets up invariant test data:
@@ -328,7 +364,7 @@ private IPublishStatusQueryService SetupPublishStatusQueryService(Dictionary<Gui
328364
.Returns((Guid key, string culture) => items
329365
.TryGetValue(key, out var item)
330366
&& idIsPublished(item.Id)
331-
&& (item.ContentType.VariesByCulture() is false || item.Cultures.ContainsKey(culture)));
367+
&& (culture == Constants.System.InvariantCulture || item.ContentType.VariesByCulture() is false || item.Cultures.ContainsKey(culture)));
332368
publishStatusQueryService
333369
.Setup(s => s.HasPublishedAncestorPath(It.IsAny<Guid>()))
334370
.Returns(true);

0 commit comments

Comments
 (0)