using Ludarium.Infrastructure; using Ludarium.Domain; namespace Ludarium.IntegrationTests; public sealed class GameArtworkStoreTests { [Fact] public async Task StoresValidatedArtworkAndRejectsUnknownPayloads() { var root = Path.Combine(Path.GetTempPath(), "ludarium-artwork-tests", Guid.NewGuid().ToString("N")); try { var store = new GameArtworkStore(root); var gameId = Guid.NewGuid(); var png = new byte[] { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 1, 2, 3, 4 }; await using var content = new MemoryStream(png); Assert.Equal("image/png", await store.SaveAsync(gameId, content, png.Length, CancellationToken.None, "Libretro")); Assert.Equal("Libretro", store.GetSource(gameId)); var described = Assert.IsType(await store.DescribeAsync(gameId, "Libretro", "exact-test", Confidence.High, CancellationToken.None)); var jpeg = new byte[] { 0xff, 0xd8, 0xff, 1, 2, 3, 4 }; await using (var replacement = new MemoryStream(jpeg)) await store.SaveAsync(gameId, replacement, jpeg.Length, CancellationToken.None, "Uploaded"); var preserved = Assert.IsType(await store.OpenAsync(gameId, CancellationToken.None, described.Id, false)); Assert.Equal("image/png", preserved.ContentType); await preserved.Content.DisposeAsync(); var saved = await store.OpenAsync(gameId, CancellationToken.None); Assert.NotNull(saved); Assert.Equal("image/jpeg", saved.ContentType); Assert.Equal(jpeg.Length, saved.Length); await saved.Content.DisposeAsync(); Assert.True(store.Delete(gameId)); Assert.False(store.Delete(gameId)); await using var invalid = new MemoryStream("not-an-image"u8.ToArray()); await Assert.ThrowsAsync(() => store.SaveAsync(Guid.NewGuid(), invalid, invalid.Length, CancellationToken.None)); } finally { if (Directory.Exists(root)) Directory.Delete(root, true); } } }