From 17660610a2417b64417f11c209b849caaa147cef Mon Sep 17 00:00:00 2001 From: Oleg Zhuk Date: Tue, 22 Oct 2024 14:34:43 +0200 Subject: [PATCH] VCST-2006: Add active image format configuration (#113) feat: Added active image format configuration to resolve files by extension and content type. By default, the following formats are enabled: JPEG, PNG, WebP. The system supports the following image formats: BMP, GIF, JPEG, PBM, PNG, TIFF, TGA, WebP. For a complete list of image formats supported by ImageSharp, please visit this link: https://docs.sixlabors.com/articles/imagesharp/imageformats.html --- README.md | 49 +++---- docs/media/main-page.png | Bin 0 -> 96448 bytes .../ModuleConstants.cs | 21 ++- .../Services/IImageService.cs | 17 ++- .../Services/DefaultImageService.cs | 65 ++++++++-- .../BlobImagesChangesProvider.cs | 17 ++- .../en.VirtoCommerce.Thumbnail.json | 4 + .../ru.VirtoCommerce.Thumbnail.json | 121 ++++++++++-------- .../BlobChangesProviderTestBase.cs | 17 ++- 9 files changed, 213 insertions(+), 98 deletions(-) create mode 100644 docs/media/main-page.png diff --git a/README.md b/README.md index 8f26d55..4cda669 100644 --- a/README.md +++ b/README.md @@ -2,33 +2,38 @@ [![CI status](https://github.com/VirtoCommerce/vc-module-image-tools/workflows/Module%20CI/badge.svg?branch=dev)](https://github.com/VirtoCommerce/vc-module-image-tools/actions?query=workflow%3A"Module+CI") [![Quality gate](https://sonarcloud.io/api/project_badges/measure?project=VirtoCommerce_vc-module-image-tools&metric=alert_status&branch=dev)](https://sonarcloud.io/dashboard?id=VirtoCommerce_vc-module-image-tools) [![Reliability rating](https://sonarcloud.io/api/project_badges/measure?project=VirtoCommerce_vc-module-image-tools&metric=reliability_rating&branch=dev)](https://sonarcloud.io/dashboard?id=VirtoCommerce_vc-module-image-tools) [![Security rating](https://sonarcloud.io/api/project_badges/measure?project=VirtoCommerce_vc-module-image-tools&metric=security_rating&branch=dev)](https://sonarcloud.io/dashboard?id=VirtoCommerce_vc-module-image-tools) [![Sqale rating](https://sonarcloud.io/api/project_badges/measure?project=VirtoCommerce_vc-module-image-tools&metric=sqale_rating&branch=dev)](https://sonarcloud.io/dashboard?id=VirtoCommerce_vc-module-image-tools) -VirtoCommerce.ImageTools module represents a functionality that helps working with images. This module allows generating thumbnails, which can be used for upload instead of the original images. - -## Key features - -1. Possibility to make different image thumbnails and use them, instead of using the original images. For example, this functionality can be used in listing or for previews; -1. Possibility to resize Group images into tasks and run them against an asset catalog in the background; -1. Supports image formats: Bmp, Gif, Jpeg, Pbm, Png, Tiff, Tga, WebP; - -![image](https://user-images.githubusercontent.com/20122385/36428926-e483c5e6-1659-11e8-88aa-e4dc2b95b50b.png) - -## Documentation - -[Image Tools Module Document](/docs/index.md) - -[View on GitHub](https://github.com/VirtoCommerce/vc-module-image-tools) +The ImageTools module provides functionality for working with images. It allows generating thumbnails that can be used for uploading instead of the original images. + +## Key Features + +1. Generate different image thumbnails and use them instead of the original images. This functionality is useful for listings or previews. +2. Resize group images into tasks and run them against an asset catalog in the background. +3. Utilize the [Sixlabors.ImageSharp library](https://docs.sixlabors.com/articles/imagesharp/index.html) for image processing. +4. Default image formats supported: + - Jpeg + - Png + - WebP +5. Additional image formats supported (can be enabled in thumbnail settings): + - Jpeg + - Bmp + - WebP + - Gif + - Pbm + - Png + - Tiff + - Tga + +![ImageTools Main Screen](docs/media/main-page.png) ## References - -* Deploy: https://docs.virtocommerce.org/developer-guide/deploy-module-from-source-code/ -* Installation: https://docs.virtocommerce.org/user-guide/modules/ -* Home: https://virtocommerce.com -* Community: https://www.virtocommerce.org -* [Download Latest Release](https://github.com/VirtoCommerce/vc-module-image-tools/releases) +- Home: https://virtocommerce.com +- Documentation: https://docs.virtocommerce.org +- Community: https://www.virtocommerce.org +- [Download Latest Release](https://github.com/VirtoCommerce/vc-module-image-tools/releases) ## License -Copyright (c) Virto Solutions LTD. All rights reserved. +Copyright (c) Virto Solutions LTD. All rights reserved. Licensed under the Virto Commerce Open Software License (the "License"); you may not use this file except in compliance with the License. You may diff --git a/docs/media/main-page.png b/docs/media/main-page.png new file mode 100644 index 0000000000000000000000000000000000000000..0c4132ddc5967ce7edebb7bbd79c943759b078ad GIT binary patch literal 96448 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

;CM6z&wEEQhzA8I#7xsORH-?a^H~hDpaY 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 rk;*JJi2gXgIYch5zf;lmaAAF$Q AllGeneralSettings { get @@ -65,6 +83,7 @@ public static IEnumerable AllGeneralSettings yield return EventBasedThumbnailGeneration; yield return ImageProcessJobCronExpression; yield return ProcessBatchSize; + yield return AllowedImageFormats; } } } diff --git a/src/VirtoCommerce.ImageToolsModule.Core/Services/IImageService.cs b/src/VirtoCommerce.ImageToolsModule.Core/Services/IImageService.cs index bd49462..1e5d9b5 100644 --- a/src/VirtoCommerce.ImageToolsModule.Core/Services/IImageService.cs +++ b/src/VirtoCommerce.ImageToolsModule.Core/Services/IImageService.cs @@ -12,10 +12,9 @@ namespace VirtoCommerce.ImageToolsModule.Core.Services public interface IImageService { ///

- ///Loads Image from blob storage + /// Loads Image from blob storage /// /// image url. - /// image format. /// Image object. Task> LoadImageAsync(string imageUrl); @@ -27,5 +26,19 @@ public interface IImageService /// Image object format. /// Target image quality. Task SaveImageAsync(string imageUrl, Image image, IImageFormat format, JpegQuality jpegQuality); + + /// + /// Defines if given file extension is allowed for image processing + /// + /// + /// + Task IsFileExtensionAllowedAsync(string path); + + /// + /// Defines if given image format is allowed for image processing + /// + /// + /// + Task IsImageFormatAllowedAsync(IImageFormat format); } } diff --git a/src/VirtoCommerce.ImageToolsModule.Data/Services/DefaultImageService.cs b/src/VirtoCommerce.ImageToolsModule.Data/Services/DefaultImageService.cs index cbf78a0..111ceae 100644 --- a/src/VirtoCommerce.ImageToolsModule.Data/Services/DefaultImageService.cs +++ b/src/VirtoCommerce.ImageToolsModule.Data/Services/DefaultImageService.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.IO; +using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using SixLabors.ImageSharp; @@ -7,19 +9,27 @@ using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.PixelFormats; using VirtoCommerce.AssetsModule.Core.Assets; +using VirtoCommerce.ImageToolsModule.Core; using VirtoCommerce.ImageToolsModule.Core.Models; using VirtoCommerce.ImageToolsModule.Core.Services; +using VirtoCommerce.Platform.Core.Common; +using VirtoCommerce.Platform.Core.Settings; namespace VirtoCommerce.ImageToolsModule.Data.Services { public class DefaultImageService : IImageService { private readonly IBlobStorageProvider _storageProvider; + private readonly ISettingsManager _settingsManager; private readonly ILogger _logger; - public DefaultImageService(IBlobStorageProvider storageProvider, ILogger logger) + private IList _allowedImageFormats; + private readonly StringComparer _ignoreCase = StringComparer.OrdinalIgnoreCase; + + public DefaultImageService(IBlobStorageProvider storageProvider, ISettingsManager settingsManager, ILogger logger) { _storageProvider = storageProvider; + _settingsManager = settingsManager; _logger = logger; } @@ -27,21 +37,27 @@ public DefaultImageService(IBlobStorageProvider storageProvider, ILogger /// image url. - /// image format. /// Image object. public virtual async Task> LoadImageAsync(string imageUrl) { - _logger.LogInformation($"Loading image {imageUrl}"); + _logger.LogInformation("Loading image {imageUrl}", imageUrl); + try { - using var blobStream = _storageProvider.OpenRead(imageUrl); - return await Image.LoadAsync(blobStream); + await using var blobStream = await _storageProvider.OpenReadAsync(imageUrl); + var imageFormat = await Image.DetectFormatAsync(blobStream); + + if (await IsImageFormatAllowedAsync(imageFormat)) + { + return await Image.LoadAsync(blobStream); + } } catch (Exception ex) { - _logger.LogError(ex, $"Could not load image {imageUrl}"); - return null!; + _logger.LogError(ex, "Could not load image {imageUrl}", imageUrl); } + + return null!; } /// @@ -57,7 +73,7 @@ public virtual async Task SaveImageAsync(string imageUrl, Image image, I await using var blobStream = await _storageProvider.OpenWriteAsync(imageUrl); using var stream = new MemoryStream(); - if (format.DefaultMimeType == "image/jpeg") + if (format.DefaultMimeType == JpegFormat.Instance.DefaultMimeType) { var options = new JpegEncoder { @@ -74,5 +90,38 @@ public virtual async Task SaveImageAsync(string imageUrl, Image image, I stream.Position = 0; await stream.CopyToAsync(blobStream); } + + public virtual async Task IsFileExtensionAllowedAsync(string path) + { + var allowedImageFormats = await GetAllowedImageFormats(); + var extension = Path.GetExtension(path).TrimStart('.'); + + return allowedImageFormats + .SelectMany(x => x.FileExtensions) + .Contains(extension, _ignoreCase); + } + + public virtual async Task IsImageFormatAllowedAsync(IImageFormat format) + { + var allowedImageFormats = await GetAllowedImageFormats(); + + return allowedImageFormats.Any(x => x.Name.EqualsIgnoreCase(format.Name)); + } + + + private async Task> GetAllowedImageFormats() + { + if (_allowedImageFormats == null) + { + var allowedImageFormatsSetting = await _settingsManager.GetObjectSettingAsync(ModuleConstants.Settings.General.AllowedImageFormats.Name); + var allowedFormatNames = allowedImageFormatsSetting.AllowedValues.OfType().ToArray(); + + _allowedImageFormats = Configuration.Default.ImageFormats + .Where(x => allowedFormatNames.Contains(x.Name, _ignoreCase)) + .ToArray(); + } + + return _allowedImageFormats; + } } } diff --git a/src/VirtoCommerce.ImageToolsModule.Data/ThumbnailGeneration/BlobImagesChangesProvider.cs b/src/VirtoCommerce.ImageToolsModule.Data/ThumbnailGeneration/BlobImagesChangesProvider.cs index 07898a8..b2c4cd6 100644 --- a/src/VirtoCommerce.ImageToolsModule.Data/ThumbnailGeneration/BlobImagesChangesProvider.cs +++ b/src/VirtoCommerce.ImageToolsModule.Data/ThumbnailGeneration/BlobImagesChangesProvider.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; @@ -19,19 +18,20 @@ public class BlobImagesChangesProvider : IImagesChangesProvider { public bool IsTotalCountSupported => true; - private static readonly string[] _supportedImageExtensions = { ".bmp", ".gif", ".jpg", ".jpeg", ".png", ".webp", ".pbm" }; - private readonly IBlobStorageProvider _storageProvider; private readonly IThumbnailOptionSearchService _thumbnailOptionSearchService; + private readonly IImageService _imageService; private readonly IPlatformMemoryCache _platformMemoryCache; public BlobImagesChangesProvider( IBlobStorageProvider storageProvider, IThumbnailOptionSearchService thumbnailOptionSearchService, + IImageService imageService, IPlatformMemoryCache platformMemoryCache) { _storageProvider = storageProvider; _thumbnailOptionSearchService = thumbnailOptionSearchService; + _imageService = imageService; _platformMemoryCache = platformMemoryCache; } @@ -94,9 +94,12 @@ protected virtual async Task> ReadBlobFo var searchResults = await _storageProvider.SearchAsync(folderPath, null); // Add supported images - foreach (var imageBlob in searchResults.Results.Where(IsSupportedImage)) + foreach (var imageBlob in searchResults.Results) { - result.TryAdd(imageBlob.Url, imageBlob); + if (await IsSupportedImage(imageBlob)) + { + result.TryAdd(imageBlob.Url, imageBlob); + } } // Add images from child folders recursively @@ -113,9 +116,9 @@ await Parallel.ForEachAsync(searchResults.Results.Where(IsFolder), async (folder return result; } - protected virtual bool IsSupportedImage(BlobEntry blobEntry) + protected virtual Task IsSupportedImage(BlobEntry blobEntry) { - return _supportedImageExtensions.Contains(Path.GetExtension(blobEntry.Name), StringComparer.OrdinalIgnoreCase); + return _imageService.IsFileExtensionAllowedAsync(blobEntry.Name); } protected virtual bool IsFolder(BlobEntry blobEntry) diff --git a/src/VirtoCommerce.ImageToolsModule.Web/Localizations/en.VirtoCommerce.Thumbnail.json b/src/VirtoCommerce.ImageToolsModule.Web/Localizations/en.VirtoCommerce.Thumbnail.json index 9f08c32..bbd77c4 100644 --- a/src/VirtoCommerce.ImageToolsModule.Web/Localizations/en.VirtoCommerce.Thumbnail.json +++ b/src/VirtoCommerce.ImageToolsModule.Web/Localizations/en.VirtoCommerce.Thumbnail.json @@ -157,6 +157,10 @@ "ImageTools.Thumbnails.EventBasedThumbnailGeneration": { "title": "Enable event based thumbnail generation", "description": "Start thumbnail generation as soon as an asset is added" + }, + "ImageTools.Thumbnails.AllowedImageFormats": { + "title": "Allowed image formats", + "description": "Thumbnails will only be generated for the specified image formats. For a list of image formats supported by ImageSharp, please visit the following link: https://docs.sixlabors.com/articles/imagesharp/imageformats.html" } }, "module": { diff --git a/src/VirtoCommerce.ImageToolsModule.Web/Localizations/ru.VirtoCommerce.Thumbnail.json b/src/VirtoCommerce.ImageToolsModule.Web/Localizations/ru.VirtoCommerce.Thumbnail.json index 3d3b911..c89cfbc 100644 --- a/src/VirtoCommerce.ImageToolsModule.Web/Localizations/ru.VirtoCommerce.Thumbnail.json +++ b/src/VirtoCommerce.ImageToolsModule.Web/Localizations/ru.VirtoCommerce.Thumbnail.json @@ -3,29 +3,29 @@ "main-menu-title": "Миниатюры", "blades": { "tasks-list": { - "title": "Задачи по созданию миниатюр", - "subtitle": "Список всех задач по созданию миниатюр", + "title": "Список задач по генерации миниатюр", + "subtitle": "Список всех задач по генерации миниатюр", "labels": { "task-name": "Название задачи", - "last-run": "Последний показ" + "last-run": "Последний запуск" } }, "task-detail": { - "title": "Информация о задаче создания миниатюр", + "title": "Детали задачи генерации миниатюр", "subtitle": "Управление настройками и деталями задачи", "labels": { "name": "Название", - "path-images": "Путь к изображению", - "thumbnail-settings": "Настройки миниатюры" + "path-images": "Путь к изображениям", + "thumbnail-settings": "Настройки миниатюр" }, "placeholders": { "name": "Введите название", - "path-images": "Выберите путь к изображению", - "thumbnail-settings": "Выбрать настройки..." + "path-images": "Выберите путь к изображениям", + "thumbnail-settings": "Выберите настройки..." }, "descriptions": { - "name": "Отображение названия задачи", - "path-images": "Путь в системе ресурсов, который будет использоваться для открытия изображений. Все изображения в этой папке будут обрабатываться рекурсивно", + "name": "Отображаемое название задачи", + "path-images": "Путь в системе активов, который будет использоваться для поиска изображений. Все изображения в этой папке будут обработаны рекурсивно", "thumbnail-settings": "Список разрешений миниатюр" } }, @@ -40,40 +40,40 @@ "setting-managment": { "title": "Настройки миниатюр", "subtitle": "Управление настройками миниатюр", - "background": "фон", - "height": "высота", - "width": "ширина", + "background": "Фон", + "height": "Высота", + "width": "Ширина", "no-settings": "Нет настроек" }, "setting-detail": { - "title": "Подробное описание миниатюр", - "subtitle": "Управление параметрами настроек миниатюр", + "title": "Детали настройки миниатюр", + "subtitle": "Управление деталями настройки миниатюр", "labels": { "name": "Название", - "file-suffix": "Суффикс названия файла миниатюр", + "file-suffix": "Суффикс имени файла миниатюры", "resize-method": "Метод изменения размера", "width": "Ширина (пиксели)", "height": "Высота (пиксели)", "background-color": "Цвет фона", - "anchor-position": "Фиксированное Положение", + "anchor-position": "Позиция якоря", "jpeg-quality": "Качество JPEG" }, "placeholders": { "name": "Введите название опции", - "file-suffix": "Введите название суффикса", + "file-suffix": "Введите суффикс имени", "width": "Введите ширину", "height": "Введите высоту", "background-color": "Введите цвет фона" }, "discription": { - "name": "Отображение названия настройки", - "file-suffix": "Суффикс, который будет добавлен в конце исходного имени файла, отделяется символом '_'", + "name": "Отображаемое название настройки", + "file-suffix": "Суффикс, который будет добавлен к оригинальному имени файла, разделенный '_'", "resize-method": "Метод изменения размера, который будет использоваться для преобразования изображения", "width": "Ширина миниатюры в пикселях", "height": "Высота миниатюры в пикселях", - "background-color": "Цвет фона миниатюры - например, #FFFFFF", - "anchor-position": "Фиксированное положение при обрезке изображения", - "jpeg-quality": "Качество JPEG" + "background-color": "Цвет фона миниатюры, например, #FFFFFF", + "anchor-position": "Позиция якоря при обрезке изображения", + "jpeg-quality": "Качество выходного JPEG" }, "resize-method": { "fixed-size": "Фиксированный размер", @@ -82,15 +82,15 @@ "crop": "Обрезка" }, "anchor-position": { - "top-left": "Наверху Слева", - "top-center": "Наверху Посередине", - "top-right": "Наверху Справа", - "center-left": "Посередине Слева", - "center": "Посередине", - "center-right": "Посередине Справа", - "bottom-left": "Внизу Слева", - "bottom-center": "Внизу Посередине", - "bottom-right": "Внизу Справа" + "top-left": "Верхний левый", + "top-center": "Верхний центр", + "top-right": "Верхний правый", + "center-left": "Центр слева", + "center": "Центр", + "center-right": "Центр справа", + "bottom-left": "Нижний левый", + "bottom-center": "Нижний центр", + "bottom-right": "Нижний правый" }, "jpeg-quality": { "low": "Низкое", @@ -102,27 +102,27 @@ }, "dialogs": { "task-run": { - "title": "Создание миниатюр", - "msg1": "Выберите способ создания миниатюр. Опции:", - "msg2": "Метод изменений: создавать миниатюры только для новых или измененных изображений", - "msg3": "Полное изменение: принудительное создание для всех изображений", - "btn-changes": "Метод изменений", - "btn-regenerate": "Полное изменение" + "title": "Генерация миниатюр", + "msg1": "Выберите, как генерировать миниатюры. Опции:", + "msg2": "Обработка изменений: генерировать миниатюры только для новых или измененных изображений", + "msg3": "Регенерация: принудительная генерация для всех изображений", + "btn-changes": "Обработка изменений", + "btn-regenerate": "Регенерация" }, "select-folder": { - "title": "Путь созданных миниатюр к изображениям", + "title": "Путь к изображениям для генерации миниатюр", "msg1": "Вы можете выбрать только директорию и только одну." }, "task-save": { - "title": "Сохранение изменений", - "message": "Задание было изменено. Вы хотите сохранить изменения?" + "title": "Сохранить изменения", + "message": "Задача была изменена. Вы хотите сохранить изменения?" }, "task-delete": { "title": "Подтверждение удаления", - "message": "Вы уверены, что хотите удалить это задание?" + "message": "Вы уверены, что хотите удалить эту задачу?" }, "setting-save": { - "title": "Сохранение изменений", + "title": "Сохранить изменения", "message": "Настройка была изменена. Вы хотите сохранить изменения?" }, "setting-delete": { @@ -131,28 +131,41 @@ } }, "commands": { - "run": "Начать" + "run": "Запустить" } }, "permissions": { - "thumbnail:access": "Доступ к меню миниатюр", - "thumbnail:create": "Создание новой миниатюры", - "thumbnail:read": "Просмотр данных о миниатюре", - "thumbnail:update": "Изменение данных существующей миниатюры", - "thumbnail:delete": "Удаление данных миниатюры" + "thumbnail:access": "Открыть меню миниатюр", + "thumbnail:create": "Создать данные миниатюр", + "thumbnail:read": "Просмотр данных миниатюр", + "thumbnail:update": "Обновить данные миниатюр", + "thumbnail:delete": "Удалить данные миниатюр" }, "settings": { "ImageTools.Thumbnails.ImageProcessJobCronExpression": { - "title": "Выражение CRON для запуска задачи обработки изображений", - "description": "" + "description": "", + "title": "Cron выражение для планирования выполнения задачи обработки изображений" }, "ImageTools.Thumbnails.ProcessBatchSize": { - "title": "Количество изображений, обрабатываемых за один проход", + "title": "Размер партии", "description": "" }, "ImageTools.Thumbnails.EnableImageProcessJob": { - "title": "Использовать фоновую задачу для обработки изображений", - "description": "Указывает, требуется ли обрабатывать изображения в рамках фоновой задачи" + "title": "Включить задачу обработки изображений", + "description": "Флаг для активации фоновой задачи обработки изображений" + }, + "ImageTools.Thumbnails.EventBasedThumbnailGeneration": { + "title": "Включить генерацию миниатюр на основе событий", + "description": "Начать генерацию миниатюр сразу после добавления актива" + }, + "ImageTools.Thumbnails.AllowedImageFormats": { + "title": "Разрешенные форматы изображений", + "description": "Миниатюры будут создаваться только для указанных форматов. Для получения списка форматов изображений, поддерживаемых ImageSharp, пожалуйста, посетите следующую ссылку: https://docs.sixlabors.com/articles/imagesharp/imageformats.html" + } + }, + "module": { + "VirtoCommerce.ImageTools": { + "description": "Экспорт/Импорт сохраненных задач и опций" } } } diff --git a/tests/VirtoCommerce.ImageToolsModule.Tests/BlobChangesProviderTestBase.cs b/tests/VirtoCommerce.ImageToolsModule.Tests/BlobChangesProviderTestBase.cs index ceb887a..5119bdc 100644 --- a/tests/VirtoCommerce.ImageToolsModule.Tests/BlobChangesProviderTestBase.cs +++ b/tests/VirtoCommerce.ImageToolsModule.Tests/BlobChangesProviderTestBase.cs @@ -21,16 +21,19 @@ public abstract class BlobChangesProviderTestBase public Mock StorageProviderMock { get; private set; } public Mock ThumbnailOptionSearchServiceMock { get; private set; } + public Mock ImageServiceMock { get; private set; } protected BlobChangesProviderTestBase() { StorageProviderMock = new Mock(); ThumbnailOptionSearchServiceMock = new Mock(); + ImageServiceMock = new Mock(); } public IImagesChangesProvider GetBlobImagesChangesProvider(IEnumerable blobContents) { - StorageProviderMock.Setup(x => x.SearchAsync(It.IsAny(), It.IsAny())) + StorageProviderMock + .Setup(x => x.SearchAsync(It.IsAny(), It.IsAny())) .Returns((folderUrl, keyword) => { @@ -43,12 +46,14 @@ public IImagesChangesProvider GetBlobImagesChangesProvider(IEnumerable x.GetBlobInfoAsync(It.IsAny())) + StorageProviderMock + .Setup(x => x.GetBlobInfoAsync(It.IsAny())) .Returns( x => Task.FromResult(x.EndsWith(OptionSuffix) ? null : new BlobInfo() { }) ); - ThumbnailOptionSearchServiceMock.Setup(x => x.SearchAsync(It.IsAny(), It.IsAny())) + ThumbnailOptionSearchServiceMock + .Setup(x => x.SearchAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new ThumbnailOptionSearchResult() { TotalCount = 1, @@ -58,7 +63,11 @@ public IImagesChangesProvider GetBlobImagesChangesProvider(IEnumerable x.IsFileExtensionAllowedAsync(It.IsAny())) + .ReturnsAsync(true); + + var result = new BlobImagesChangesProvider(StorageProviderMock.Object, ThumbnailOptionSearchServiceMock.Object, ImageServiceMock.Object, GetPlatformMemoryCache()); return result; }