| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | using System;using System.IO;using System.Linq;using System.Net.Http;using System.Threading;using System.Threading.Tasks;using AutoFixture;using AutoFixture.AutoMoq;using Emby.Server.Implementations.Updates;using MediaBrowser.Model.Updates;using Moq;using Moq.Protected;using Xunit;namespace Jellyfin.Server.Implementations.Tests.Updates{    public class InstallationManagerTests    {        private readonly Fixture _fixture;        private readonly InstallationManager _installationManager;        public InstallationManagerTests()        {            var messageHandler = new Mock<HttpMessageHandler>();            messageHandler.Protected()                .Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())                .Returns<HttpRequestMessage, CancellationToken>(                    (m, _) =>                    {                        return Task.FromResult(new HttpResponseMessage()                        {                            Content = new StreamContent(File.OpenRead("Test Data/Updates/" + m.RequestUri?.Segments[^1]))                        });                    });            var http = new Mock<IHttpClientFactory>();            http.Setup(x => x.CreateClient(It.IsAny<string>()))                .Returns(new HttpClient(messageHandler.Object));            _fixture = new Fixture();            _fixture.Customize(new AutoMoqCustomization            {                ConfigureMembers = true            });            _fixture.Inject(http);            _installationManager = _fixture.Create<InstallationManager>();        }        [Fact]        public async Task GetPackages_Valid_Success()        {            PackageInfo[] packages = await _installationManager.GetPackages(                "Jellyfin Stable",                "https://repo.jellyfin.org/files/plugin/manifest.json",                false);            Assert.Equal(25, packages.Length);        }        [Fact]        public async Task FilterPackages_NameOnly_Success()        {            PackageInfo[] packages = await _installationManager.GetPackages(                "Jellyfin Stable",                "https://repo.jellyfin.org/files/plugin/manifest.json",                false);            packages = _installationManager.FilterPackages(packages, "Anime").ToArray();            Assert.Single(packages);        }        [Fact]        public async Task FilterPackages_GuidOnly_Success()        {            PackageInfo[] packages = await _installationManager.GetPackages(                "Jellyfin Stable",                "https://repo.jellyfin.org/files/plugin/manifest.json",                false);            packages = _installationManager.FilterPackages(packages, id: new Guid("a4df60c5-6ab4-412a-8f79-2cab93fb2bc5")).ToArray();            Assert.Single(packages);        }        [Fact]        public async Task InstallPackage_InvalidChecksum_ThrowsInvalidDataException()        {            var packageInfo = new InstallationInfo()            {                Name = "Test",                SourceUrl = "https://repo.jellyfin.org/releases/plugin/empty/empty.zip",                Checksum = "InvalidChecksum"            };            await Assert.ThrowsAsync<InvalidDataException>(() => _installationManager.InstallPackage(packageInfo, CancellationToken.None));        }        [Fact]        public async Task InstallPackage_Valid_Success()        {            var packageInfo = new InstallationInfo()            {                Name = "Test",                SourceUrl = "https://repo.jellyfin.org/releases/plugin/empty/empty.zip",                Checksum = "11b5b2f1a9ebc4f66d6ef19018543361"            };            var ex = await Record.ExceptionAsync(() => _installationManager.InstallPackage(packageInfo, CancellationToken.None));            Assert.Null(ex);        }    }}
 |