using System; using Emby.Server.Implementations.Dto; using Emby.Server.Implementations.Playlists; using Jellyfin.Data.Enums; using MediaBrowser.Common; using MediaBrowser.Controller.Chapters; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.MediaEncoding; using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Trickplay; using MediaBrowser.Model.Entities; using Moq; using Xunit; namespace Jellyfin.Server.Implementations.Tests.Dto; public class DtoServiceImageInheritanceTests { [Fact] public void GetBaseItemDto_PlaylistsUserViewWithDisplayParentPrimary_UsesDisplayParentPrimaryImage() { var displayParent = new PlaylistsFolder { Id = Guid.NewGuid(), ImageInfos = [ new ItemImageInfo { Type = ImageType.Primary, Path = "/images/playlists-custom.jpg", DateModified = new DateTime(2026, 1, 15, 12, 0, 0, DateTimeKind.Utc) } ] }; var userView = new UserView { Id = Guid.NewGuid(), ViewType = CollectionType.playlists, DisplayParentId = displayParent.Id, ImageInfos = [ new ItemImageInfo { Type = ImageType.Primary, Path = "/images/generated.png", DateModified = new DateTime(2026, 1, 10, 12, 0, 0, DateTimeKind.Utc) } ] }; var dtoService = BuildDtoService(displayParent); var dto = dtoService.GetBaseItemDto(userView, new DtoOptions(false)); Assert.NotNull(dto.ParentPrimaryImageItemId); Assert.Equal(displayParent.Id, dto.ParentPrimaryImageItemId); Assert.Equal("/images/playlists-custom.jpg", dto.ParentPrimaryImageTag); Assert.False(dto.ImageTags?.ContainsKey(ImageType.Primary)); } [Fact] public void GetBaseItemDto_PlaylistsUserViewWithoutDisplayParentPrimary_KeepsOwnPrimaryImage() { var displayParent = new PlaylistsFolder { Id = Guid.NewGuid(), ImageInfos = [] }; var userView = new UserView { Id = Guid.NewGuid(), ViewType = CollectionType.playlists, DisplayParentId = displayParent.Id, ImageInfos = [ new ItemImageInfo { Type = ImageType.Primary, Path = "/images/generated.png", DateModified = new DateTime(2026, 1, 10, 12, 0, 0, DateTimeKind.Utc) } ] }; var dtoService = BuildDtoService(displayParent); var dto = dtoService.GetBaseItemDto(userView, new DtoOptions(false)); Assert.Null(dto.ParentPrimaryImageItemId); Assert.Null(dto.ParentPrimaryImageTag); Assert.NotNull(dto.ImageTags); Assert.True(dto.ImageTags.ContainsKey(ImageType.Primary)); Assert.Equal("/images/generated.png", dto.ImageTags[ImageType.Primary]); } private static DtoService BuildDtoService(BaseItem displayParent) { var libraryManager = new Mock(); var userDataManager = new Mock(); var imageProcessor = new Mock(); var providerManager = new Mock(); var recordingsManager = new Mock(); var appHost = new Mock(); var mediaSourceManager = new Mock(); var liveTvManager = new Mock(); var trickplayManager = new Mock(); var chapterManager = new Mock(); var logger = new Mock>(); libraryManager .Setup(x => x.GetItemById(displayParent.Id)) .Returns(displayParent); imageProcessor .Setup(x => x.GetImageCacheTag(It.IsAny(), It.IsAny())) .Returns((_, image) => image.Path); return new DtoService( logger.Object, libraryManager.Object, userDataManager.Object, imageProcessor.Object, providerManager.Object, recordingsManager.Object, appHost.Object, mediaSourceManager.Object, new Lazy(() => liveTvManager.Object), trickplayManager.Object, chapterManager.Object); } }