Skip to content

Commit d164892

Browse files
committed
Handle create and update validation for media picker. (#18537)
1 parent 8d28984 commit d164892

File tree

2 files changed

+46
-18
lines changed

2 files changed

+46
-18
lines changed

src/Umbraco.Infrastructure/PropertyEditors/MediaPicker3PropertyEditor.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public MediaPicker3PropertyValueEditor(
8686
var validators = new TypedJsonValidatorRunner<List<MediaWithCropsDto>, MediaPicker3Configuration>(
8787
jsonSerializer,
8888
new MinMaxValidator(localizedTextService),
89-
new AllowedTypeValidator(localizedTextService, mediaTypeService),
89+
new AllowedTypeValidator(localizedTextService, mediaTypeService, _mediaService),
9090
new StartNodeValidator(localizedTextService, mediaNavigationQueryService));
9191

9292
Validators.Add(validators);
@@ -367,11 +367,13 @@ internal class AllowedTypeValidator : ITypedJsonValidator<List<MediaWithCropsDto
367367
{
368368
private readonly ILocalizedTextService _localizedTextService;
369369
private readonly IMediaTypeService _mediaTypeService;
370+
private readonly IMediaService _mediaService;
370371

371-
public AllowedTypeValidator(ILocalizedTextService localizedTextService, IMediaTypeService mediaTypeService)
372+
public AllowedTypeValidator(ILocalizedTextService localizedTextService, IMediaTypeService mediaTypeService, IMediaService mediaService)
372373
{
373374
_localizedTextService = localizedTextService;
374375
_mediaTypeService = mediaTypeService;
376+
_mediaService = mediaService;
375377
}
376378

377379
public IEnumerable<ValidationResult> Validate(
@@ -393,7 +395,20 @@ public IEnumerable<ValidationResult> Validate(
393395
return [];
394396
}
395397

396-
IEnumerable<string> distinctTypeAliases = value.DistinctBy(x => x.MediaTypeAlias).Select(x => x.MediaTypeAlias);
398+
// We may or may not have explicit MediaTypeAlias values provided, depending on whether the operation is an update or a
399+
// create. So let's make sure we have them all.
400+
IEnumerable<string> providedTypeAliases = value
401+
.Where(x => x.MediaTypeAlias.IsNullOrWhiteSpace() is false)
402+
.Select(x => x.MediaTypeAlias);
403+
404+
IEnumerable<Guid> retrievedMediaKeys = value
405+
.Where(x => x.MediaTypeAlias.IsNullOrWhiteSpace())
406+
.Select(x => x.MediaKey);
407+
IEnumerable<IMedia> retrievedMedia = _mediaService.GetByIds(retrievedMediaKeys);
408+
IEnumerable<string> retrievedTypeAliases = retrievedMedia
409+
.Select(x => x.ContentType.Alias);
410+
411+
IEnumerable<string> distinctTypeAliases = providedTypeAliases.Union(retrievedTypeAliases).Distinct();
397412

398413
foreach (var typeAlias in distinctTypeAliases)
399414
{

tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/MediaPicker3ValueEditorValidationTests.cs

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ internal class MediaPicker3ValueEditorValidationTests
2222
[TestCase(false, false)]
2323
public void Validates_Start_Node_Immediate_Parent(bool shouldSucceed, bool hasValidParentKey)
2424
{
25-
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
25+
var (valueEditor, mediaTypeServiceMock, _, mediaNavigationQueryServiceMock) = CreateValueEditor();
2626

2727
Guid? validParentKey = Guid.NewGuid();
2828
var mediaKey = Guid.NewGuid();
@@ -49,7 +49,7 @@ public void Validates_Start_Node_Immediate_Parent(bool shouldSucceed, bool hasVa
4949
[Test]
5050
public void Validates_Start_Node_Parent_Not_Found()
5151
{
52-
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
52+
var (valueEditor, mediaTypeServiceMock, _, mediaNavigationQueryServiceMock) = CreateValueEditor();
5353

5454
Guid? parentKey = null;
5555
var mediaKey = Guid.NewGuid();
@@ -71,7 +71,7 @@ public void Validates_Start_Node_Parent_Not_Found()
7171
[TestCase(false, true, false)]
7272
public void Validates_Start_Node_Ancestor(bool shouldSucceed, bool findsAncestor, bool hasValidAncestorKey)
7373
{
74-
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
74+
var (valueEditor, mediaTypeServiceMock, _, mediaNavigationQueryServiceMock) = CreateValueEditor();
7575

7676
Guid ancestorKey = Guid.NewGuid();
7777
Guid? parentKey = Guid.NewGuid();
@@ -90,26 +90,32 @@ public void Validates_Start_Node_Ancestor(bool shouldSucceed, bool findsAncestor
9090
ValidateResult(shouldSucceed, result);
9191
}
9292

93-
[TestCase(true, true, true)]
94-
[TestCase(false, true, false)]
95-
[TestCase(false, false, true)]
96-
public void Validates_Allowed_Type(bool shouldSucceed, bool hasAllowedType, bool findsMediaType)
93+
[TestCase(true, true, true, false)]
94+
[TestCase(false, true, false, false)]
95+
[TestCase(false, false, true, false)]
96+
[TestCase(true, true, true, true)]
97+
[TestCase(false, true, false, true)]
98+
[TestCase(false, false, true, true)]
99+
public void Validates_Allowed_Type(bool shouldSucceed, bool hasAllowedType, bool findsMediaType, bool valueProvidesMediaTypeAlias)
97100
{
98-
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
101+
var (valueEditor, mediaTypeServiceMock, mediaServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
99102

100103
var mediaKey = Guid.NewGuid();
101104
var mediaTypeKey = Guid.NewGuid();
102105
var mediaTypeAlias = "Alias";
103106
valueEditor.ConfigurationObject = new MediaPicker3Configuration() { Filter = $"{mediaTypeKey}" };
104107
var mediaTypeMock = new Mock<IMediaType>();
108+
var mediaMock = new Mock<IMedia>();
105109

106110
if (hasAllowedType)
107111
{
108112
mediaTypeMock.Setup(x => x.Key).Returns(mediaTypeKey);
113+
mediaMock.SetupGet(x => x.ContentType.Alias).Returns(mediaTypeAlias);
109114
}
110115
else
111116
{
112117
mediaTypeMock.Setup(x => x.Key).Returns(Guid.NewGuid());
118+
mediaMock.SetupGet(x => x.ContentType.Alias).Returns("AnotherAlias");
113119
}
114120

115121
if (findsMediaType)
@@ -121,7 +127,13 @@ public void Validates_Allowed_Type(bool shouldSucceed, bool hasAllowedType, bool
121127
mediaTypeServiceMock.Setup(x => x.Get(It.IsAny<string>())).Returns((IMediaType)null);
122128
}
123129

124-
var value = "[ {\n \" key\" : \"20266ebe-1f7e-4cf3-a694-7a5fb210223b\",\n \"mediaKey\" : \"" + mediaKey + "\",\n \"mediaTypeAlias\" : \"" + mediaTypeAlias + "\",\n \"crops\" : [ ],\n \"focalPoint\" : null\n} ]";
130+
if (valueProvidesMediaTypeAlias is false)
131+
{
132+
mediaServiceMock.Setup(x => x.GetByIds(It.Is<IEnumerable<Guid>>(y => y.First() == mediaKey))).Returns([mediaMock.Object]);
133+
}
134+
135+
var providedMediaTypeAlias = valueProvidesMediaTypeAlias ? mediaTypeAlias : string.Empty;
136+
var value = "[ {\n \" key\" : \"20266ebe-1f7e-4cf3-a694-7a5fb210223b\",\n \"mediaKey\" : \"" + mediaKey + "\",\n \"mediaTypeAlias\" : \"" + providedMediaTypeAlias + "\",\n \"crops\" : [ ],\n \"focalPoint\" : null\n} ]";
125137
var result = valueEditor.Validate(value, false, null, PropertyValidationContext.Empty());
126138

127139
ValidateResult(shouldSucceed, result);
@@ -134,7 +146,7 @@ public void Validates_Allowed_Type(bool shouldSucceed, bool hasAllowedType, bool
134146
[TestCase("[]", false, true)]
135147
public void Validates_Multiple(string value, bool multiple, bool succeed)
136148
{
137-
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
149+
var (valueEditor, mediaTypeServiceMock, _, mediaNavigationQueryServiceMock) = CreateValueEditor();
138150

139151
valueEditor.ConfigurationObject = new MediaPicker3Configuration() { Multiple = multiple };
140152

@@ -150,7 +162,7 @@ public void Validates_Multiple(string value, bool multiple, bool succeed)
150162
[TestCase("[]", 0, true)]
151163
public void Validates_Min_Limit(string value, int min, bool succeed)
152164
{
153-
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
165+
var (valueEditor, mediaTypeServiceMock, _, mediaNavigationQueryServiceMock) = CreateValueEditor();
154166

155167
valueEditor.ConfigurationObject = new MediaPicker3Configuration() { Multiple = true, ValidationLimit = new MediaPicker3Configuration.NumberRange { Min = min } };
156168

@@ -168,7 +180,7 @@ public void Validates_Min_Limit(string value, int min, bool succeed)
168180
[TestCase("[]", 0, true)]
169181
public void Validates_Max_Limit(string value, int max, bool succeed)
170182
{
171-
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
183+
var (valueEditor, mediaTypeServiceMock, _, mediaNavigationQueryServiceMock) = CreateValueEditor();
172184

173185
valueEditor.ConfigurationObject = new MediaPicker3Configuration() { Multiple = true, ValidationLimit = new MediaPicker3Configuration.NumberRange { Max = max } };
174186

@@ -188,17 +200,18 @@ private static void ValidateResult(bool succeed, IEnumerable<ValidationResult> r
188200
}
189201
}
190202

191-
private static (MediaPicker3PropertyEditor.MediaPicker3PropertyValueEditor ValueEditor, Mock<IMediaTypeService> MediaTypeServiceMock, Mock<IMediaNavigationQueryService> MediaNavigationQueryServiceMock) CreateValueEditor()
203+
private static (MediaPicker3PropertyEditor.MediaPicker3PropertyValueEditor ValueEditor, Mock<IMediaTypeService> MediaTypeServiceMock, Mock<IMediaService> MediaServiceMock, Mock<IMediaNavigationQueryService> MediaNavigationQueryServiceMock) CreateValueEditor()
192204
{
193205
var mediaTypeServiceMock = new Mock<IMediaTypeService>();
206+
var mediaServiceMock = new Mock<IMediaService>();
194207
var mediaNavigationQueryServiceMock = new Mock<IMediaNavigationQueryService>();
195208
var valueEditor = new MediaPicker3PropertyEditor.MediaPicker3PropertyValueEditor(
196209
Mock.Of<IShortStringHelper>(),
197210
new SystemTextJsonSerializer(),
198211
Mock.Of<IIOHelper>(),
199212
new DataEditorAttribute("alias"),
200213
Mock.Of<IMediaImportService>(),
201-
Mock.Of<IMediaService>(),
214+
mediaServiceMock.Object,
202215
Mock.Of<ITemporaryFileService>(),
203216
Mock.Of<IScopeProvider>(),
204217
Mock.Of<IBackOfficeSecurityAccessor>(),
@@ -210,6 +223,6 @@ private static (MediaPicker3PropertyEditor.MediaPicker3PropertyValueEditor Value
210223
ConfigurationObject = new MediaPicker3Configuration()
211224
};
212225

213-
return (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock);
226+
return (valueEditor, mediaTypeServiceMock, mediaServiceMock, mediaNavigationQueryServiceMock);
214227
}
215228
}

0 commit comments

Comments
 (0)