aboutsummaryrefslogtreecommitdiff
path: root/tests/Jellyfin.Server.Implementations.Tests/Entities/UserViewBuilderTests.cs
blob: 54fec0a0d39583cea296cec708f1eb5e91e14a30 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using System;
using System.Collections.Generic;
using System.Linq;
using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library;
using Moq;
using Xunit;

namespace Jellyfin.Server.Implementations.Tests.Entities;

public sealed class UserViewBuilderTests
{
    private static readonly User _user = new("view-filter-test", "provider", "reset");

    [Fact]
    public void Filter_IsPlayed_CountsAMovieWatchedOnAnAlternateVersionAsPlayed()
    {
        // The primary carries no played row of its own; the version that was watched is another file.
        var onlyWatchedOnAlternate = new Movie { Id = Guid.NewGuid(), Name = "Watched as a second cut" };
        var watched = new Movie { Id = Guid.NewGuid(), Name = "Watched outright" };
        var unwatched = new Movie { Id = Guid.NewGuid(), Name = "Not watched" };

        var items = new BaseItem[] { onlyWatchedOnAlternate, watched, unwatched };

        var userDataManager = new Mock<IUserDataManager>();
        userDataManager
            .Setup(m => m.GetUserData(_user, It.IsAny<BaseItem>()))
            .Returns((User _, BaseItem item) => new UserItemData { Key = item.Id.ToString("N"), Played = item.Id.Equals(watched.Id) });
        userDataManager
            .Setup(m => m.GetResumeUserDataBatch(It.IsAny<IReadOnlyList<BaseItem>>(), _user))
            .Returns(new Dictionary<Guid, VersionResumeData>
            {
                [onlyWatchedOnAlternate.Id] = new(Guid.NewGuid(), new UserItemData { Key = "alternate", Played = true })
            });

        var libraryManager = new Mock<ILibraryManager>();

        var played = UserViewBuilder.Filter(
            items,
            _user,
            new InternalItemsQuery(_user) { IsPlayed = true },
            userDataManager.Object,
            libraryManager.Object).ToList();

        var unplayed = UserViewBuilder.Filter(
            items,
            _user,
            new InternalItemsQuery(_user) { IsPlayed = false },
            userDataManager.Object,
            libraryManager.Object).ToList();

        // The alternate's playback settles the movie, exactly as the item's own dto reports it.
        Assert.Equal([onlyWatchedOnAlternate.Id, watched.Id], played.Select(i => i.Id));
        Assert.Equal([unwatched.Id], unplayed.Select(i => i.Id));
    }
}