Handle create and update validation for media picker. (#18537)

This commit is contained in:
Andy Butland
2025-03-04 14:08:08 +01:00
committed by GitHub
parent 5358c0346e
commit ca6da751f2
2 changed files with 46 additions and 18 deletions

View File

@@ -86,7 +86,7 @@ public class MediaPicker3PropertyEditor : DataEditor
var validators = new TypedJsonValidatorRunner<List<MediaWithCropsDto>, MediaPicker3Configuration>(
jsonSerializer,
new MinMaxValidator(localizedTextService),
new AllowedTypeValidator(localizedTextService, mediaTypeService),
new AllowedTypeValidator(localizedTextService, mediaTypeService, _mediaService),
new StartNodeValidator(localizedTextService, mediaNavigationQueryService));
Validators.Add(validators);
@@ -367,11 +367,13 @@ public class MediaPicker3PropertyEditor : DataEditor
{
private readonly ILocalizedTextService _localizedTextService;
private readonly IMediaTypeService _mediaTypeService;
private readonly IMediaService _mediaService;
public AllowedTypeValidator(ILocalizedTextService localizedTextService, IMediaTypeService mediaTypeService)
public AllowedTypeValidator(ILocalizedTextService localizedTextService, IMediaTypeService mediaTypeService, IMediaService mediaService)
{
_localizedTextService = localizedTextService;
_mediaTypeService = mediaTypeService;
_mediaService = mediaService;
}
public IEnumerable<ValidationResult> Validate(
@@ -393,7 +395,20 @@ public class MediaPicker3PropertyEditor : DataEditor
return [];
}
IEnumerable<string> distinctTypeAliases = value.DistinctBy(x => x.MediaTypeAlias).Select(x => x.MediaTypeAlias);
// We may or may not have explicit MediaTypeAlias values provided, depending on whether the operation is an update or a
// create. So let's make sure we have them all.
IEnumerable<string> providedTypeAliases = value
.Where(x => x.MediaTypeAlias.IsNullOrWhiteSpace() is false)
.Select(x => x.MediaTypeAlias);
IEnumerable<Guid> retrievedMediaKeys = value
.Where(x => x.MediaTypeAlias.IsNullOrWhiteSpace())
.Select(x => x.MediaKey);
IEnumerable<IMedia> retrievedMedia = _mediaService.GetByIds(retrievedMediaKeys);
IEnumerable<string> retrievedTypeAliases = retrievedMedia
.Select(x => x.ContentType.Alias);
IEnumerable<string> distinctTypeAliases = providedTypeAliases.Union(retrievedTypeAliases).Distinct();
foreach (var typeAlias in distinctTypeAliases)
{

View File

@@ -22,7 +22,7 @@ internal class MediaPicker3ValueEditorValidationTests
[TestCase(false, false)]
public void Validates_Start_Node_Immediate_Parent(bool shouldSucceed, bool hasValidParentKey)
{
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
var (valueEditor, mediaTypeServiceMock, _, mediaNavigationQueryServiceMock) = CreateValueEditor();
Guid? validParentKey = Guid.NewGuid();
var mediaKey = Guid.NewGuid();
@@ -49,7 +49,7 @@ internal class MediaPicker3ValueEditorValidationTests
[Test]
public void Validates_Start_Node_Parent_Not_Found()
{
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
var (valueEditor, mediaTypeServiceMock, _, mediaNavigationQueryServiceMock) = CreateValueEditor();
Guid? parentKey = null;
var mediaKey = Guid.NewGuid();
@@ -71,7 +71,7 @@ internal class MediaPicker3ValueEditorValidationTests
[TestCase(false, true, false)]
public void Validates_Start_Node_Ancestor(bool shouldSucceed, bool findsAncestor, bool hasValidAncestorKey)
{
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
var (valueEditor, mediaTypeServiceMock, _, mediaNavigationQueryServiceMock) = CreateValueEditor();
Guid ancestorKey = Guid.NewGuid();
Guid? parentKey = Guid.NewGuid();
@@ -90,26 +90,32 @@ internal class MediaPicker3ValueEditorValidationTests
ValidateResult(shouldSucceed, result);
}
[TestCase(true, true, true)]
[TestCase(false, true, false)]
[TestCase(false, false, true)]
public void Validates_Allowed_Type(bool shouldSucceed, bool hasAllowedType, bool findsMediaType)
[TestCase(true, true, true, false)]
[TestCase(false, true, false, false)]
[TestCase(false, false, true, false)]
[TestCase(true, true, true, true)]
[TestCase(false, true, false, true)]
[TestCase(false, false, true, true)]
public void Validates_Allowed_Type(bool shouldSucceed, bool hasAllowedType, bool findsMediaType, bool valueProvidesMediaTypeAlias)
{
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
var (valueEditor, mediaTypeServiceMock, mediaServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
var mediaKey = Guid.NewGuid();
var mediaTypeKey = Guid.NewGuid();
var mediaTypeAlias = "Alias";
valueEditor.ConfigurationObject = new MediaPicker3Configuration() { Filter = $"{mediaTypeKey}" };
var mediaTypeMock = new Mock<IMediaType>();
var mediaMock = new Mock<IMedia>();
if (hasAllowedType)
{
mediaTypeMock.Setup(x => x.Key).Returns(mediaTypeKey);
mediaMock.SetupGet(x => x.ContentType.Alias).Returns(mediaTypeAlias);
}
else
{
mediaTypeMock.Setup(x => x.Key).Returns(Guid.NewGuid());
mediaMock.SetupGet(x => x.ContentType.Alias).Returns("AnotherAlias");
}
if (findsMediaType)
@@ -121,7 +127,13 @@ internal class MediaPicker3ValueEditorValidationTests
mediaTypeServiceMock.Setup(x => x.Get(It.IsAny<string>())).Returns((IMediaType)null);
}
var value = "[ {\n \" key\" : \"20266ebe-1f7e-4cf3-a694-7a5fb210223b\",\n \"mediaKey\" : \"" + mediaKey + "\",\n \"mediaTypeAlias\" : \"" + mediaTypeAlias + "\",\n \"crops\" : [ ],\n \"focalPoint\" : null\n} ]";
if (valueProvidesMediaTypeAlias is false)
{
mediaServiceMock.Setup(x => x.GetByIds(It.Is<IEnumerable<Guid>>(y => y.First() == mediaKey))).Returns([mediaMock.Object]);
}
var providedMediaTypeAlias = valueProvidesMediaTypeAlias ? mediaTypeAlias : string.Empty;
var value = "[ {\n \" key\" : \"20266ebe-1f7e-4cf3-a694-7a5fb210223b\",\n \"mediaKey\" : \"" + mediaKey + "\",\n \"mediaTypeAlias\" : \"" + providedMediaTypeAlias + "\",\n \"crops\" : [ ],\n \"focalPoint\" : null\n} ]";
var result = valueEditor.Validate(value, false, null, PropertyValidationContext.Empty());
ValidateResult(shouldSucceed, result);
@@ -134,7 +146,7 @@ internal class MediaPicker3ValueEditorValidationTests
[TestCase("[]", false, true)]
public void Validates_Multiple(string value, bool multiple, bool succeed)
{
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
var (valueEditor, mediaTypeServiceMock, _, mediaNavigationQueryServiceMock) = CreateValueEditor();
valueEditor.ConfigurationObject = new MediaPicker3Configuration() { Multiple = multiple };
@@ -150,7 +162,7 @@ internal class MediaPicker3ValueEditorValidationTests
[TestCase("[]", 0, true)]
public void Validates_Min_Limit(string value, int min, bool succeed)
{
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
var (valueEditor, mediaTypeServiceMock, _, mediaNavigationQueryServiceMock) = CreateValueEditor();
valueEditor.ConfigurationObject = new MediaPicker3Configuration() { Multiple = true, ValidationLimit = new MediaPicker3Configuration.NumberRange { Min = min } };
@@ -168,7 +180,7 @@ internal class MediaPicker3ValueEditorValidationTests
[TestCase("[]", 0, true)]
public void Validates_Max_Limit(string value, int max, bool succeed)
{
var (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock) = CreateValueEditor();
var (valueEditor, mediaTypeServiceMock, _, mediaNavigationQueryServiceMock) = CreateValueEditor();
valueEditor.ConfigurationObject = new MediaPicker3Configuration() { Multiple = true, ValidationLimit = new MediaPicker3Configuration.NumberRange { Max = max } };
@@ -188,9 +200,10 @@ internal class MediaPicker3ValueEditorValidationTests
}
}
private static (MediaPicker3PropertyEditor.MediaPicker3PropertyValueEditor ValueEditor, Mock<IMediaTypeService> MediaTypeServiceMock, Mock<IMediaNavigationQueryService> MediaNavigationQueryServiceMock) CreateValueEditor()
private static (MediaPicker3PropertyEditor.MediaPicker3PropertyValueEditor ValueEditor, Mock<IMediaTypeService> MediaTypeServiceMock, Mock<IMediaService> MediaServiceMock, Mock<IMediaNavigationQueryService> MediaNavigationQueryServiceMock) CreateValueEditor()
{
var mediaTypeServiceMock = new Mock<IMediaTypeService>();
var mediaServiceMock = new Mock<IMediaService>();
var mediaNavigationQueryServiceMock = new Mock<IMediaNavigationQueryService>();
var valueEditor = new MediaPicker3PropertyEditor.MediaPicker3PropertyValueEditor(
Mock.Of<IShortStringHelper>(),
@@ -198,7 +211,7 @@ internal class MediaPicker3ValueEditorValidationTests
Mock.Of<IIOHelper>(),
new DataEditorAttribute("alias"),
Mock.Of<IMediaImportService>(),
Mock.Of<IMediaService>(),
mediaServiceMock.Object,
Mock.Of<ITemporaryFileService>(),
Mock.Of<IScopeProvider>(),
Mock.Of<IBackOfficeSecurityAccessor>(),
@@ -210,6 +223,6 @@ internal class MediaPicker3ValueEditorValidationTests
ConfigurationObject = new MediaPicker3Configuration()
};
return (valueEditor, mediaTypeServiceMock, mediaNavigationQueryServiceMock);
return (valueEditor, mediaTypeServiceMock, mediaServiceMock, mediaNavigationQueryServiceMock);
}
}