2015-01-19 22:25:04 +00:00
|
|
|
|
|
|
|
using System;
|
2017-07-27 13:27:54 +00:00
|
|
|
using System.Collections.Generic;
|
2014-04-19 15:09:22 +00:00
|
|
|
using System.IO;
|
|
|
|
using System.Linq;
|
2015-03-14 10:13:35 +00:00
|
|
|
using System.Net;
|
|
|
|
using FluentAssertions;
|
2014-04-19 15:09:22 +00:00
|
|
|
using Moq;
|
|
|
|
using NUnit.Framework;
|
|
|
|
using NzbDrone.Common.Disk;
|
|
|
|
using NzbDrone.Common.Http;
|
|
|
|
using NzbDrone.Core.Download;
|
2016-02-14 16:55:32 +00:00
|
|
|
using NzbDrone.Core.Download.Clients.Blackhole;
|
2017-07-27 13:27:54 +00:00
|
|
|
using NzbDrone.Core.MediaFiles;
|
2015-03-14 10:13:35 +00:00
|
|
|
using NzbDrone.Test.Common;
|
2014-04-19 15:09:22 +00:00
|
|
|
|
|
|
|
namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole
|
|
|
|
{
|
|
|
|
|
|
|
|
[TestFixture]
|
|
|
|
public class UsenetBlackholeFixture : DownloadClientFixtureBase<UsenetBlackhole>
|
|
|
|
{
|
|
|
|
protected string _completedDownloadFolder;
|
|
|
|
protected string _blackholeFolder;
|
|
|
|
protected string _filePath;
|
|
|
|
|
|
|
|
[SetUp]
|
|
|
|
public void Setup()
|
|
|
|
{
|
|
|
|
_completedDownloadFolder = @"c:\blackhole\completed".AsOsAgnostic();
|
|
|
|
_blackholeFolder = @"c:\blackhole\nzb".AsOsAgnostic();
|
|
|
|
_filePath = (@"c:\blackhole\nzb\" + _title + ".nzb").AsOsAgnostic();
|
|
|
|
|
2016-02-14 16:55:32 +00:00
|
|
|
Mocker.SetConstant<IScanWatchFolder>(Mocker.Resolve<ScanWatchFolder>());
|
|
|
|
|
2014-04-19 15:09:22 +00:00
|
|
|
Subject.Definition = new DownloadClientDefinition();
|
|
|
|
Subject.Definition.Settings = new UsenetBlackholeSettings
|
|
|
|
{
|
|
|
|
NzbFolder = _blackholeFolder,
|
|
|
|
WatchFolder = _completedDownloadFolder
|
|
|
|
};
|
2015-03-14 10:13:35 +00:00
|
|
|
|
|
|
|
Mocker.GetMock<IDiskProvider>()
|
|
|
|
.Setup(c => c.OpenWriteStream(It.IsAny<string>()))
|
|
|
|
.Returns(() => new FileStream(GetTempFilePath(), FileMode.Create));
|
2017-07-27 13:27:54 +00:00
|
|
|
|
|
|
|
Mocker.GetMock<IDiskScanService>().Setup(c => c.FilterFiles(It.IsAny<string>(), It.IsAny<IEnumerable<string>>()))
|
|
|
|
.Returns<string, IEnumerable<string>>((b, s) => s.ToList());
|
2014-04-19 15:09:22 +00:00
|
|
|
}
|
|
|
|
|
2014-09-07 11:37:50 +00:00
|
|
|
protected void GivenFailedDownload()
|
2014-04-19 15:09:22 +00:00
|
|
|
{
|
2014-09-11 23:49:41 +00:00
|
|
|
Mocker.GetMock<IHttpClient>()
|
2015-03-14 10:13:35 +00:00
|
|
|
.Setup(c => c.Get(It.IsAny<HttpRequest>()))
|
2014-04-19 15:09:22 +00:00
|
|
|
.Throws(new WebException());
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void GivenCompletedItem()
|
|
|
|
{
|
|
|
|
var targetDir = Path.Combine(_completedDownloadFolder, _title);
|
2014-05-13 17:57:46 +00:00
|
|
|
|
2014-04-19 15:09:22 +00:00
|
|
|
Mocker.GetMock<IDiskProvider>()
|
|
|
|
.Setup(c => c.GetDirectories(_completedDownloadFolder))
|
|
|
|
.Returns(new[] { targetDir });
|
|
|
|
|
|
|
|
Mocker.GetMock<IDiskProvider>()
|
|
|
|
.Setup(c => c.GetFiles(targetDir, SearchOption.AllDirectories))
|
2016-02-14 16:55:32 +00:00
|
|
|
.Returns(new[] { Path.Combine(targetDir, "somefile.mkv") });
|
2014-04-19 15:09:22 +00:00
|
|
|
|
|
|
|
Mocker.GetMock<IDiskProvider>()
|
|
|
|
.Setup(c => c.GetFileSize(It.IsAny<string>()))
|
|
|
|
.Returns(1000000);
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void completed_download_should_have_required_properties()
|
|
|
|
{
|
2016-02-14 16:55:32 +00:00
|
|
|
Subject.ScanGracePeriod = TimeSpan.Zero;
|
|
|
|
|
2014-04-19 15:09:22 +00:00
|
|
|
GivenCompletedItem();
|
|
|
|
|
|
|
|
var result = Subject.GetItems().Single();
|
|
|
|
|
|
|
|
VerifyCompleted(result);
|
2017-03-31 16:52:30 +00:00
|
|
|
|
|
|
|
result.CanBeRemoved.Should().BeTrue();
|
|
|
|
result.CanMoveFiles.Should().BeTrue();
|
2014-04-19 15:09:22 +00:00
|
|
|
}
|
|
|
|
|
2016-02-14 16:55:32 +00:00
|
|
|
[Test]
|
|
|
|
public void partial_download_should_have_required_properties()
|
|
|
|
{
|
|
|
|
GivenCompletedItem();
|
|
|
|
|
|
|
|
var result = Subject.GetItems().Single();
|
|
|
|
|
|
|
|
VerifyPostprocessing(result);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-05-13 17:57:46 +00:00
|
|
|
[Test]
|
|
|
|
public void should_return_category()
|
|
|
|
{
|
|
|
|
GivenCompletedItem();
|
|
|
|
|
|
|
|
var result = Subject.GetItems().Single();
|
|
|
|
|
|
|
|
// We must have a category or CDH won't pick it up.
|
|
|
|
result.Category.Should().NotBeNullOrWhiteSpace();
|
|
|
|
}
|
|
|
|
|
2014-04-19 15:09:22 +00:00
|
|
|
[Test]
|
|
|
|
public void Download_should_download_file_if_it_doesnt_exist()
|
|
|
|
{
|
|
|
|
var remoteEpisode = CreateRemoteEpisode();
|
|
|
|
|
|
|
|
Subject.Download(remoteEpisode);
|
|
|
|
|
2016-02-29 23:33:28 +00:00
|
|
|
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Once());
|
2015-03-14 10:13:35 +00:00
|
|
|
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(_filePath), Times.Once());
|
|
|
|
Mocker.GetMock<IHttpClient>().Verify(c => c.DownloadFile(It.IsAny<string>(), It.IsAny<string>()), Times.Never());
|
2014-04-19 15:09:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void Download_should_replace_illegal_characters_in_title()
|
|
|
|
{
|
|
|
|
var illegalTitle = "Saturday Night Live - S38E08 - Jeremy Renner/Maroon 5 [SDTV]";
|
|
|
|
var expectedFilename = Path.Combine(_blackholeFolder, "Saturday Night Live - S38E08 - Jeremy Renner+Maroon 5 [SDTV]" + Path.GetExtension(_filePath));
|
|
|
|
|
|
|
|
var remoteEpisode = CreateRemoteEpisode();
|
|
|
|
remoteEpisode.Release.Title = illegalTitle;
|
|
|
|
|
|
|
|
Subject.Download(remoteEpisode);
|
|
|
|
|
2016-02-29 23:33:28 +00:00
|
|
|
Mocker.GetMock<IHttpClient>().Verify(c => c.Get(It.Is<HttpRequest>(v => v.Url.FullUri == _downloadUrl)), Times.Once());
|
2015-03-14 10:13:35 +00:00
|
|
|
Mocker.GetMock<IDiskProvider>().Verify(c => c.OpenWriteStream(expectedFilename), Times.Once());
|
|
|
|
Mocker.GetMock<IHttpClient>().Verify(c => c.DownloadFile(It.IsAny<string>(), It.IsAny<string>()), Times.Never());
|
2014-04-19 15:09:22 +00:00
|
|
|
}
|
|
|
|
|
2015-01-19 22:25:04 +00:00
|
|
|
[Test]
|
|
|
|
public void RemoveItem_should_delete_file()
|
|
|
|
{
|
|
|
|
GivenCompletedItem();
|
|
|
|
|
|
|
|
Mocker.GetMock<IDiskProvider>()
|
|
|
|
.Setup(c => c.FileExists(It.IsAny<string>()))
|
|
|
|
.Returns(true);
|
|
|
|
|
|
|
|
Subject.RemoveItem("_Droned.S01E01.Pilot.1080p.WEB-DL-DRONE_0", true);
|
|
|
|
|
|
|
|
Mocker.GetMock<IDiskProvider>()
|
|
|
|
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Once());
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void RemoveItem_should_delete_directory()
|
|
|
|
{
|
|
|
|
GivenCompletedItem();
|
|
|
|
|
2015-05-01 22:19:15 +00:00
|
|
|
Mocker.GetMock<IDiskProvider>()
|
|
|
|
.Setup(c => c.FolderExists(It.IsAny<string>()))
|
|
|
|
.Returns(true);
|
|
|
|
|
2015-01-19 22:25:04 +00:00
|
|
|
Subject.RemoveItem("_Droned.S01E01.Pilot.1080p.WEB-DL-DRONE_0", true);
|
|
|
|
|
|
|
|
Mocker.GetMock<IDiskProvider>()
|
|
|
|
.Verify(c => c.DeleteFolder(It.IsAny<string>(), true), Times.Once());
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
2015-05-01 22:19:15 +00:00
|
|
|
public void RemoveItem_should_ignore_if_unknown_item()
|
2015-01-19 22:25:04 +00:00
|
|
|
{
|
2015-05-01 22:19:15 +00:00
|
|
|
Subject.RemoveItem("_Droned.S01E01.Pilot.1080p.WEB-DL-DRONE_0", true);
|
2015-01-19 22:25:04 +00:00
|
|
|
|
|
|
|
Mocker.GetMock<IDiskProvider>()
|
|
|
|
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Never());
|
|
|
|
|
|
|
|
Mocker.GetMock<IDiskProvider>()
|
|
|
|
.Verify(c => c.DeleteFolder(It.IsAny<string>(), true), Times.Never());
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void RemoveItem_should_throw_if_deleteData_is_false()
|
|
|
|
{
|
|
|
|
GivenCompletedItem();
|
|
|
|
|
|
|
|
Assert.Throws<NotSupportedException>(() => Subject.RemoveItem("_Droned.S01E01.Pilot.1080p.WEB-DL-DRONE_0", false));
|
|
|
|
|
|
|
|
Mocker.GetMock<IDiskProvider>()
|
|
|
|
.Verify(c => c.DeleteFile(It.IsAny<string>()), Times.Never());
|
|
|
|
|
|
|
|
Mocker.GetMock<IDiskProvider>()
|
|
|
|
.Verify(c => c.DeleteFolder(It.IsAny<string>(), true), Times.Never());
|
|
|
|
}
|
|
|
|
|
2014-09-07 11:37:50 +00:00
|
|
|
[Test]
|
|
|
|
public void should_return_status_with_outputdirs()
|
|
|
|
{
|
|
|
|
var result = Subject.GetStatus();
|
|
|
|
|
|
|
|
result.IsLocalhost.Should().BeTrue();
|
|
|
|
result.OutputRootFolders.Should().NotBeNull();
|
|
|
|
result.OutputRootFolders.First().Should().Be(_completedDownloadFolder);
|
|
|
|
}
|
2014-04-19 15:09:22 +00:00
|
|
|
}
|
|
|
|
}
|