Browse Source

Webp support. (#797)

pull/800/head
Sebastian Stehle 4 years ago
committed by GitHub
parent
commit
b3a85c0196
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      backend/src/Squidex.Domain.Apps.Entities/Apps/DomainObject/AppCommandMiddleware.cs
  2. 6
      backend/src/Squidex.Domain.Apps.Entities/Assets/ImageAssetMetadataSource.cs
  3. 2
      backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj
  4. 13
      backend/src/Squidex/Areas/Api/Controllers/Apps/AppsController.cs
  5. 2
      backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs
  6. 8
      backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetContentQueryDto.cs
  7. 19
      backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ProfileController.cs
  8. 10
      backend/src/Squidex/Config/Domain/AssetServices.cs
  9. 10
      backend/src/Squidex/Squidex.csproj
  10. 6
      backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/DomainObject/AppCommandMiddlewareTests.cs
  11. 18
      backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/ImageAssetMetadataSourceTests.cs
  12. 110
      backend/tools/TestSuite/TestSuite.ApiTests/AssetFormatTests.cs
  13. BIN
      backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleGIFImage_40kbmb.gif
  14. BIN
      backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_100kb.webp
  15. BIN
      backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_150kb.gif
  16. BIN
      backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_400kb.png
  17. BIN
      backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_400kb.tiff
  18. BIN
      backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_600kb.tga
  19. BIN
      backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_62kb.jpg
  20. BIN
      backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_700kb.bmp
  21. BIN
      backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleJPGImage_50kbmb.jpg
  22. BIN
      backend/tools/TestSuite/TestSuite.ApiTests/Assets/SamplePNGImage_100kbmb.png
  23. 29
      backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj
  24. 6
      backend/tools/TestSuite/TestSuite.Shared/Fixtures/AssetFixture.cs
  25. 1
      frontend/app/shared/components/assets/asset.component.scss

4
backend/src/Squidex.Domain.Apps.Entities/Apps/DomainObject/AppCommandMiddleware.cs

@ -1,4 +1,4 @@
// ==========================================================================
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
@ -58,7 +58,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.DomainObject
await using (var uploadStream = file.OpenRead())
{
var image = await assetThumbnailGenerator.GetImageInfoAsync(uploadStream);
var image = await assetThumbnailGenerator.GetImageInfoAsync(uploadStream, file.MimeType);
if (image == null)
{

6
backend/src/Squidex.Domain.Apps.Entities/Assets/ImageAssetMetadataSource.cs

@ -55,11 +55,13 @@ namespace Squidex.Domain.Apps.Entities.Assets
{
if (command.Type == AssetType.Unknown || command.Type == AssetType.Image)
{
var mimeType = command.File.MimeType;
ImageInfo? imageInfo = null;
await using (var uploadStream = command.File.OpenRead())
{
imageInfo = await assetThumbnailGenerator.GetImageInfoAsync(uploadStream);
imageInfo = await assetThumbnailGenerator.GetImageInfoAsync(uploadStream, mimeType);
}
if (imageInfo != null)
@ -72,7 +74,7 @@ namespace Squidex.Domain.Apps.Entities.Assets
await using (var uploadStream = command.File.OpenRead())
{
imageInfo = await assetThumbnailGenerator.FixOrientationAsync(uploadStream, tempFile.Stream);
imageInfo = await assetThumbnailGenerator.FixOrientationAsync(uploadStream, mimeType, tempFile.Stream);
}
command.File.Dispose();

2
backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj

@ -31,7 +31,7 @@
<PackageReference Include="NJsonSchema" Version="10.5.2" />
<PackageReference Include="OpenTelemetry.Api" Version="1.1.0" />
<PackageReference Include="RefactoringEssentials" Version="5.6.0" PrivateAssets="all" />
<PackageReference Include="Squidex.Assets" Version="1.10.0" />
<PackageReference Include="Squidex.Assets" Version="2.0.0" />
<PackageReference Include="Squidex.Caching" Version="1.8.0" />
<PackageReference Include="Squidex.Hosting.Abstractions" Version="2.3.0" />
<PackageReference Include="Squidex.Log" Version="1.6.0" />

13
backend/src/Squidex/Areas/Api/Controllers/Apps/AppsController.cs

@ -29,7 +29,12 @@ namespace Squidex.Areas.Api.Controllers.Apps
[ApiExplorerSettings(GroupName = nameof(Apps))]
public sealed class AppsController : ApiController
{
private static readonly ResizeOptions ResizeOptions = new ResizeOptions { Width = 50, Height = 50, Mode = ResizeMode.Crop };
private static readonly ResizeOptions ResizeOptions = new ResizeOptions
{
TargetWidth = 50,
TargetHeight = 50,
Mode = ResizeMode.Crop
};
private readonly IAppImageStore appImageStore;
private readonly IAppProvider appProvider;
private readonly IAssetStore assetStore;
@ -218,7 +223,7 @@ namespace Squidex.Areas.Api.Controllers.Apps
{
await using (var destinationStream = GetTempStream())
{
await ResizeAsync(resizedAsset, destinationStream);
await ResizeAsync(resizedAsset, App.Image.MimeType, destinationStream);
await destinationStream.CopyToAsync(body, ct);
}
@ -232,7 +237,7 @@ namespace Squidex.Areas.Api.Controllers.Apps
};
}
private async Task ResizeAsync(string resizedAsset, FileStream destinationStream)
private async Task ResizeAsync(string resizedAsset, string mimeType, FileStream destinationStream)
{
#pragma warning disable MA0040 // Flow the cancellation token
await using (var sourceStream = GetTempStream())
@ -245,7 +250,7 @@ namespace Squidex.Areas.Api.Controllers.Apps
using (Telemetry.Activities.StartActivity("ResizeImage"))
{
await assetThumbnailGenerator.CreateThumbnailAsync(sourceStream, destinationStream, ResizeOptions);
await assetThumbnailGenerator.CreateThumbnailAsync(sourceStream, mimeType, destinationStream, ResizeOptions);
destinationStream.Position = 0;
}

2
backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs

@ -224,7 +224,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
{
try
{
await assetThumbnailGenerator.CreateThumbnailAsync(sourceStream, stream, resizeOptions);
await assetThumbnailGenerator.CreateThumbnailAsync(sourceStream, asset.MimeType, stream, resizeOptions);
stream.Position = 0;
}
catch

8
backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetContentQueryDto.cs

@ -81,12 +81,6 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
[FromQuery(Name = "nofocus")]
public bool IgnoreFocus { get; set; }
/// <summary>
/// True to not use JPEG encoding when quality is set and the image is not a JPEG. Default: false.
/// </summary>
[FromQuery(Name = "keepformat")]
public bool KeepFormat { get; set; }
/// <summary>
/// True to force a new resize even if it already stored.
/// </summary>
@ -109,6 +103,8 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
result.FocusX = x;
result.FocusY = y;
result.TargetWidth = Width;
result.TargetHeight = Height;
return result;
}

19
backend/src/Squidex/Areas/IdentityServer/Controllers/Profile/ProfileController.cs

@ -26,7 +26,12 @@ namespace Squidex.Areas.IdentityServer.Controllers.Profile
[Authorize]
public sealed class ProfileController : IdentityServerController
{
private static readonly ResizeOptions ResizeOptions = new ResizeOptions { Width = 128, Height = 128, Mode = ResizeMode.Crop };
private static readonly ResizeOptions ResizeOptions = new ResizeOptions
{
TargetWidth = 128,
TargetHeight = 128,
Mode = ResizeMode.Crop
};
private readonly IUserPictureStore userPictureStore;
private readonly IUserService userService;
private readonly IAssetThumbnailGenerator assetThumbnailGenerator;
@ -144,9 +149,9 @@ namespace Squidex.Areas.IdentityServer.Controllers.Profile
await userService.AddLoginAsync(id, externalLogin, HttpContext.RequestAborted);
}
private async Task UpdatePictureAsync(List<IFormFile> file, string id)
private async Task UpdatePictureAsync(List<IFormFile> files, string id)
{
if (file.Count != 1)
if (files.Count != 1)
{
throw new ValidationException(T.Get("validation.onlyOneFile"));
}
@ -155,7 +160,13 @@ namespace Squidex.Areas.IdentityServer.Controllers.Profile
{
try
{
await assetThumbnailGenerator.CreateThumbnailAsync(file[0].OpenReadStream(), thumbnailStream, ResizeOptions);
var file = files[0];
await using (var stream = file.OpenReadStream())
{
await assetThumbnailGenerator.CreateThumbnailAsync(stream, file.ContentType, thumbnailStream, ResizeOptions,
HttpContext.RequestAborted);
}
thumbnailStream.Position = 0;
}

10
backend/src/Squidex/Config/Domain/AssetServices.cs

@ -9,6 +9,7 @@ using FluentFTP;
using MongoDB.Driver;
using MongoDB.Driver.GridFS;
using Squidex.Assets;
using Squidex.Assets.ImageMagick;
using Squidex.Assets.ImageSharp;
using Squidex.Domain.Apps.Entities;
using Squidex.Domain.Apps.Entities.Assets;
@ -177,7 +178,14 @@ namespace Squidex.Config.Domain
}
});
services.AddSingletonAs<ImageSharpAssetThumbnailGenerator>()
var thumbnailGenerator = new CompositeThumbnailGenerator(
new IAssetThumbnailGenerator[]
{
new ImageSharpThumbnailGenerator(),
new ImageMagickThumbnailGenerator()
});
services.AddSingletonAs(c => thumbnailGenerator)
.As<IAssetThumbnailGenerator>();
services.AddSingletonAs(c => new DelegateInitializer(

10
backend/src/Squidex/Squidex.csproj

@ -70,11 +70,11 @@
<PackageReference Include="OrleansDashboard.EmbeddedAssets" Version="3.6.1" />
<PackageReference Include="RefactoringEssentials" Version="5.6.0" PrivateAssets="all" />
<PackageReference Include="ReportGenerator" Version="5.0.0" PrivateAssets="all" />
<PackageReference Include="Squidex.Assets.Azure" Version="1.10.0" />
<PackageReference Include="Squidex.Assets.GoogleCloud" Version="1.10.0" />
<PackageReference Include="Squidex.Assets.FTP" Version="1.10.0" />
<PackageReference Include="Squidex.Assets.Mongo" Version="1.10.0" />
<PackageReference Include="Squidex.Assets.S3" Version="1.10.0" />
<PackageReference Include="Squidex.Assets.Azure" Version="2.0.0" />
<PackageReference Include="Squidex.Assets.GoogleCloud" Version="2.0.0" />
<PackageReference Include="Squidex.Assets.FTP" Version="2.0.0" />
<PackageReference Include="Squidex.Assets.Mongo" Version="2.0.0" />
<PackageReference Include="Squidex.Assets.S3" Version="2.0.0" />
<PackageReference Include="Squidex.Caching.Orleans" Version="1.8.0" />
<PackageReference Include="Squidex.ClientLibrary" Version="7.5.0" />
<PackageReference Include="Squidex.Hosting" Version="2.3.0" />

6
backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/DomainObject/AppCommandMiddlewareTests.cs

@ -62,8 +62,8 @@ namespace Squidex.Domain.Apps.Entities.Apps.DomainObject
{
var file = new NoopAssetFile();
A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(A<Stream>._))
.Returns(new ImageInfo(100, 100, false));
A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(A<Stream>._, file.MimeType, default))
.Returns(new ImageInfo(100, 100, false, ImageFormat.PNG));
await HandleAsync(new UploadAppImage { File = file }, None.Value);
@ -78,7 +78,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.DomainObject
var command = new UploadAppImage { File = file };
A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(A<Stream>._))
A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(A<Stream>._, file.MimeType, default))
.Returns(Task.FromResult<ImageInfo?>(null));
await Assert.ThrowsAsync<ValidationException>(() => HandleAsync(sut, command));

18
backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/ImageAssetMetadataSourceTests.cs

@ -35,7 +35,7 @@ namespace Squidex.Domain.Apps.Entities.Assets
await sut.EnhanceAsync(command);
A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(A<Stream>._))
A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(A<Stream>._, file.MimeType, default))
.MustHaveHappened();
}
@ -54,8 +54,8 @@ namespace Squidex.Domain.Apps.Entities.Assets
{
var command = new CreateAsset { File = file };
A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(stream))
.Returns(new ImageInfo(800, 600, false));
A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(stream, file.MimeType, default))
.Returns(new ImageInfo(800, 600, false, ImageFormat.PNG));
await sut.EnhanceAsync(command);
@ -63,7 +63,7 @@ namespace Squidex.Domain.Apps.Entities.Assets
Assert.Equal(600, command.Metadata.GetPixelHeight());
Assert.Equal(AssetType.Image, command.Type);
A.CallTo(() => assetThumbnailGenerator.FixOrientationAsync(stream, A<Stream>._))
A.CallTo(() => assetThumbnailGenerator.FixOrientationAsync(stream, file.MimeType, A<Stream>._, default))
.MustNotHaveHappened();
}
@ -72,11 +72,11 @@ namespace Squidex.Domain.Apps.Entities.Assets
{
var command = new CreateAsset { File = file };
A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(stream))
.Returns(new ImageInfo(600, 800, true));
A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(stream, file.MimeType, default))
.Returns(new ImageInfo(600, 800, true, ImageFormat.PNG));
A.CallTo(() => assetThumbnailGenerator.FixOrientationAsync(stream, A<Stream>._))
.Returns(new ImageInfo(800, 600, true));
A.CallTo(() => assetThumbnailGenerator.FixOrientationAsync(stream, file.MimeType, A<Stream>._, default))
.Returns(new ImageInfo(800, 600, true, ImageFormat.PNG));
await sut.EnhanceAsync(command);
@ -84,7 +84,7 @@ namespace Squidex.Domain.Apps.Entities.Assets
Assert.Equal(600, command.Metadata.GetPixelHeight());
Assert.Equal(AssetType.Image, command.Type);
A.CallTo(() => assetThumbnailGenerator.FixOrientationAsync(stream, A<Stream>._))
A.CallTo(() => assetThumbnailGenerator.FixOrientationAsync(stream, file.MimeType, A<Stream>._, default))
.MustHaveHappened();
}

110
backend/tools/TestSuite/TestSuite.ApiTests/AssetFormatTests.cs

@ -9,6 +9,7 @@ using Squidex.ClientLibrary.Management;
using TestSuite.Fixtures;
using Xunit;
#pragma warning disable xUnit1004 // Test methods should not be skipped
#pragma warning disable SA1300 // Element should begin with upper-case letter
#pragma warning disable CS0618 // Type or member is obsolete
@ -24,60 +25,82 @@ namespace TestSuite.ApiTests
}
[Fact]
public async Task Should_upload_image_gif()
public async Task Should_upload_image_gif_without_extension()
{
var asset = await _.UploadFileAsync("Assets/SampleGIFImage_40kbmb.gif", "image/gif");
var asset = await _.UploadFileAsync("Assets/SampleImage_150kb.gif", "image/gif", Guid.NewGuid().ToString());
// Should parse image metadata.
Assert.True(asset.IsImage);
Assert.Equal(312, asset.PixelHeight);
Assert.Equal(312, asset.PixelWidth);
Assert.Equal(312L, asset.Metadata["pixelHeight"]);
Assert.Equal(312L, asset.Metadata["pixelWidth"]);
Assert.Equal(600L, (long)asset.PixelWidth);
Assert.Equal(600L, asset.Metadata["pixelWidth"]);
Assert.Equal(400L, (long)asset.PixelHeight);
Assert.Equal(400L, asset.Metadata["pixelHeight"]);
Assert.Equal(AssetType.Image, asset.Type);
}
[Fact]
public async Task Should_upload_image_gif_without_extension()
public async Task Should_upload_image_gif_and_resize()
{
var asset = await _.UploadFileAsync("Assets/SampleGIFImage_40kbmb.gif", "image/gif", Guid.NewGuid().ToString());
var asset = await _.UploadFileAsync("Assets/SampleImage_150kb.gif", "image/gif");
// Should parse image metadata.
Assert.True(asset.IsImage);
Assert.Equal(312, asset.PixelHeight);
Assert.Equal(312, asset.PixelWidth);
Assert.Equal(312L, asset.Metadata["pixelHeight"]);
Assert.Equal(312L, asset.Metadata["pixelWidth"]);
Assert.Equal(AssetType.Image, asset.Type);
await AssetImageAsync(asset);
}
[Fact]
public async Task Should_upload_image_png()
public async Task Should_upload_image_png_and_resize()
{
var asset = await _.UploadFileAsync("Assets/SamplePNGImage_100kbmb.png", "image/png");
var asset = await _.UploadFileAsync("Assets/SampleImage_400kb.png", "image/png");
// Should parse image metadata.
Assert.True(asset.IsImage);
Assert.Equal(170, asset.PixelHeight);
Assert.Equal(272, asset.PixelWidth);
Assert.Equal(170L, asset.Metadata["pixelHeight"]);
Assert.Equal(272L, asset.Metadata["pixelWidth"]);
Assert.Equal(AssetType.Image, asset.Type);
await AssetImageAsync(asset);
}
[Fact]
public async Task Should_upload_image_jpg_and_resize()
{
var asset = await _.UploadFileAsync("Assets/SampleImage_62kb.jpg", "image/jpg");
await AssetImageAsync(asset);
Assert.Equal(79L, asset.Metadata["imageQuality"]);
}
[Fact]
public async Task Should_upload_image_jpg()
public async Task Should_upload_image_webp_and_resize()
{
var asset = await _.UploadFileAsync("Assets/SampleImage_100kb.webp", "image/jpg");
await AssetImageAsync(asset);
}
[Fact]
public async Task Should_upload_image_tiff_and_resize()
{
var asset = await _.UploadFileAsync("Assets/SampleImage_400kb.tiff", "image/jpg");
await AssetImageAsync(asset);
}
[Fact(Skip = "Not supported yet.")]
public async Task Should_upload_image_tg_and_resize()
{
var asset = await _.UploadFileAsync("Assets/SampleJPGImage_50kbmb.jpg", "image/jpg");
var asset = await _.UploadFileAsync("Assets/SampleImage_600kb.tga", "image/jpg");
await AssetImageAsync(asset);
}
private async Task AssetImageAsync(AssetDto asset)
{
// Should parse image metadata.
Assert.True(asset.IsImage);
Assert.Equal(300, asset.PixelHeight);
Assert.Equal(300, asset.PixelWidth);
Assert.Equal(300L, asset.Metadata["pixelHeight"]);
Assert.Equal(300L, asset.Metadata["pixelWidth"]);
Assert.Equal(96L, asset.Metadata["imageQuality"]);
Assert.Equal(600L, (long)asset.PixelWidth);
Assert.Equal(600L, asset.Metadata["pixelWidth"]);
Assert.Equal(400L, (long)asset.PixelHeight);
Assert.Equal(400L, asset.Metadata["pixelHeight"]);
Assert.Equal(AssetType.Image, asset.Type);
var resized = await GetResizedLengthAsync(asset.Id, 100, 100);
Assert.True(resized < asset.FileSize * .25);
}
[Fact]
@ -87,10 +110,10 @@ namespace TestSuite.ApiTests
// Should parse image metadata and fix orientation.
Assert.True(asset.IsImage);
Assert.Equal(135, asset.PixelHeight);
Assert.Equal(600, asset.PixelWidth);
Assert.Equal(135L, asset.Metadata["pixelHeight"]);
Assert.Equal(600L, (long)asset.PixelWidth);
Assert.Equal(600L, asset.Metadata["pixelWidth"]);
Assert.Equal(135L, (long)asset.PixelHeight);
Assert.Equal(135L, asset.Metadata["pixelHeight"]);
Assert.Equal(79L, asset.Metadata["imageQuality"]);
Assert.Equal(AssetType.Image, asset.Type);
}
@ -151,5 +174,24 @@ namespace TestSuite.ApiTests
// Should not parse yet.
Assert.Equal(AssetType.Unknown, asset.Type);
}
private async Task<long> GetResizedLengthAsync(string imageId, int width, int height)
{
var url = $"{_.ClientManager.GenerateImageUrl(imageId)}?width={width}&height={height}";
using (var httpClient = _.ClientManager.CreateHttpClient())
{
var response = await httpClient.GetAsync(url);
await using (var stream = await response.Content.ReadAsStreamAsync())
{
var buffer = new MemoryStream();
await stream.CopyToAsync(buffer);
return buffer.Length;
}
}
}
}
}

BIN
backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleGIFImage_40kbmb.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

BIN
backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_100kb.webp

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

BIN
backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_150kb.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

BIN
backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_400kb.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 KiB

BIN
backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_400kb.tiff

Binary file not shown.

BIN
backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_600kb.tga

Binary file not shown.

BIN
backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_62kb.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleImage_700kb.bmp

Binary file not shown.

After

Width:  |  Height:  |  Size: 703 KiB

BIN
backend/tools/TestSuite/TestSuite.ApiTests/Assets/SampleJPGImage_50kbmb.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

BIN
backend/tools/TestSuite/TestSuite.ApiTests/Assets/SamplePNGImage_100kbmb.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

29
backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj

@ -5,6 +5,14 @@
<LangVersion>10.0</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<None Remove="Assets\SampleImage_BMP_3MB - Copy.bmp" />
<None Remove="Assets\SampleImage_GIF_500kb - Copy.gif" />
<None Remove="Assets\SampleImage_JPG_200kb - Copy.jpg" />
<None Remove="Assets\SampleImage_PNG_1mb - Copy.png" />
<None Remove="Assets\SampleImage_TGA_2mb - Copy.tga" />
<None Remove="Assets\SampleImage_WEBP_350kb - Copy.webp" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Meziantou.Analyzer" Version="1.0.676">
<PrivateAssets>all</PrivateAssets>
@ -40,6 +48,27 @@
<None Update="Assets\SampleGIFImage_40kbmb.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Assets\SampleImage_100kb.webp">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Assets\SampleImage_150kb.gif">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Assets\SampleImage_400kb.tiff">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Assets\SampleImage_400kb.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Assets\SampleImage_600kb.tga">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Assets\SampleImage_62kb.jpg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Assets\SampleImage_700kb.bmp">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Assets\SampleJPGImage_50kbmb.jpg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

6
backend/tools/TestSuite/TestSuite.Shared/Fixtures/AssetFixture.cs

@ -30,7 +30,7 @@ namespace TestSuite.Fixtures
response.EnsureSuccessStatusCode();
using (var stream = await response.Content.ReadAsStreamAsync())
await using (var stream = await response.Content.ReadAsStreamAsync())
{
await stream.CopyToAsync(temp);
}
@ -43,7 +43,7 @@ namespace TestSuite.Fixtures
{
var fileInfo = new FileInfo(path);
using (var stream = fileInfo.OpenRead())
await using (var stream = fileInfo.OpenRead())
{
var upload = new FileParameter(stream, fileName ?? RandomName(fileInfo.Extension), asset.MimeType);
@ -55,7 +55,7 @@ namespace TestSuite.Fixtures
{
var fileInfo = new FileInfo(path);
using (var stream = fileInfo.OpenRead())
await using (var stream = fileInfo.OpenRead())
{
var upload = new FileParameter(stream, fileName ?? RandomName(fileInfo.Extension), mimeType);

1
frontend/app/shared/components/assets/asset.component.scss

@ -138,6 +138,7 @@ $list-height: 2.25rem;
.overlay {
@include overlay;
cursor: pointer;
font-size: $font-smallest;
font-weight: normal;

Loading…
Cancel
Save