using NetVips; using PrivaPub.Domain.Media; namespace PrivaPub.Tests.Domain { public class MediaProcessingTests { static byte[] JpegWithMetadata(int width, int height) { using var image = (Image.Black(width, height, bands: 3) + new double[] { 200, 40, 90 }).Cast(Enums.BandFormat.Uchar); using var tagged = image.Mutate(m => { m.Set(GValue.GStrType, "exif-ifd0-ImageDescription", "where I live"); m.Set(GValue.GStrType, "exif-ifd0-Artist", "Alice Smith"); m.Set(GValue.GStrType, "exif-ifd2-UserComment", "at home"); m.Set(GValue.BlobType, "xmp-data", System.Text.Encoding.UTF8.GetBytes("")); }); return tagged.WriteToBuffer(".jpg"); } [Fact] public void Uploaded_images_lose_every_kind_of_metadata() { var input = JpegWithMetadata(800, 600); using (var original = Image.NewFromBuffer(input)) Assert.Contains("exif-data", original.GetFields()); var processed = MediaService.ProcessImage(input, 4096, 640, animated: false); using var output = Image.NewFromBuffer(processed.Bytes); var fields = output.GetFields(); Assert.DoesNotContain("exif-data", fields); Assert.DoesNotContain("xmp-data", fields); Assert.DoesNotContain("iptc-data", fields); Assert.DoesNotContain(fields, f => f.StartsWith("exif-ifd")); Assert.Equal((800, 600), (processed.Width, processed.Height)); Assert.Equal("image/jpeg", processed.ContentType); using var preview = Image.NewFromBuffer(processed.Preview); Assert.Equal(640, Math.Max(preview.Width, preview.Height)); Assert.DoesNotContain("exif-data", preview.GetFields()); } [Fact] public void Large_images_are_capped() { var processed = MediaService.ProcessImage(JpegWithMetadata(5000, 2500), 4096, 640, animated: false); Assert.Equal((4096, 2048), (processed.Width, processed.Height)); } [Fact] public void A_blurhash_is_well_formed() { var processed = MediaService.ProcessImage(JpegWithMetadata(64, 64), 4096, 640, animated: false); Assert.Equal(28, processed.Blurhash.Length); Assert.Equal('L', processed.Blurhash[0]); } [Fact] public void A_white_image_encodes_white_as_its_average() { var pixels = Enumerable.Range(0, 16 * 16).SelectMany(_ => new byte[] { 255, 255, 255 }).ToArray(); var hash = Blurhash.Encode(pixels, 16, 16); Assert.Equal(28, hash.Length); Assert.Equal("TSUA", hash[2..6]); } } }