aboutsummaryrefslogtreecommitdiff
path: root/tests/Jellyfin.Server.Implementations.Tests/IO/FileRefresherTests.cs
blob: fd5f8e41605ba89b23644e71583153fc72af3e72 (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
using System;
using System.IO;
using System.Threading.Tasks;
using Emby.Server.Implementations.IO;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Configuration;
using Microsoft.Extensions.Logging.Abstractions;
using Moq;
using Xunit;

namespace Jellyfin.Server.Implementations.Tests.IO;

public class FileRefresherTests
{
    [Fact]
    public async Task ProcessPathChanges_PathLookupThrows_StillRefreshesRemainingPaths()
    {
        var tempDir = Directory.CreateTempSubdirectory("filerefresher");
        try
        {
            // Ordered so the failing path is dequeued first.
            var failingPath = Path.Combine(tempDir.FullName, "failing", "episode.mkv");
            var workingPath = Directory.CreateDirectory(Path.Combine(tempDir.FullName, "working")).FullName;

            var workingItem = new Folder { Path = workingPath, Name = "working" };
            var workingItemFound = new TaskCompletionSource();

            var libraryManager = new Mock<ILibraryManager>(MockBehavior.Loose);
            libraryManager.Setup(x => x.FindByPath(failingPath, null))
                .Throws(new ObjectDisposedException("IServiceProvider"));
            libraryManager.Setup(x => x.FindByPath(workingPath, null))
                .Returns(workingItem)
                .Callback(() => workingItemFound.TrySetResult());

            var configurationManager = new Mock<IServerConfigurationManager>(MockBehavior.Loose);
            configurationManager.Setup(x => x.Configuration)
                .Returns(new ServerConfiguration { LibraryMonitorDelay = 1 });

            using var refresher = new FileRefresher(
                failingPath,
                configurationManager.Object,
                libraryManager.Object,
                NullLogger.Instance);
            refresher.AddPath(workingPath);

            await workingItemFound.Task.WaitAsync(TimeSpan.FromSeconds(30), TestContext.Current.CancellationToken);

            libraryManager.Verify(x => x.FindByPath(failingPath, null), Times.Once);
        }
        finally
        {
            tempDir.Delete(true);
        }
    }
}