2011-06-22 07:44:57 +02:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2013-03-04 00:18:43 +01:00
|
|
|
|
using System.Linq;
|
2011-06-22 07:44:57 +02:00
|
|
|
|
using FizzWare.NBuilder;
|
|
|
|
|
using FluentAssertions;
|
|
|
|
|
using Moq;
|
|
|
|
|
using NUnit.Framework;
|
2011-11-13 05:07:06 +01:00
|
|
|
|
using NzbDrone.Common;
|
2013-03-01 08:03:41 +01:00
|
|
|
|
using NzbDrone.Core.MediaFiles;
|
2013-04-15 03:41:39 +02:00
|
|
|
|
using NzbDrone.Core.Parser;
|
|
|
|
|
using NzbDrone.Core.Parser.Model;
|
2013-02-27 04:19:22 +01:00
|
|
|
|
using NzbDrone.Core.Qualities;
|
2013-02-19 07:01:03 +01:00
|
|
|
|
using NzbDrone.Core.Tv;
|
2011-06-22 07:44:57 +02:00
|
|
|
|
using NzbDrone.Core.Providers;
|
|
|
|
|
using NzbDrone.Core.Test.Framework;
|
|
|
|
|
|
2012-08-29 17:34:51 +02:00
|
|
|
|
namespace NzbDrone.Core.Test.ProviderTests.DiskScanProviderTests
|
2011-06-22 07:44:57 +02:00
|
|
|
|
{
|
2013-04-01 08:22:16 +02:00
|
|
|
|
|
2013-04-15 07:27:32 +02:00
|
|
|
|
public class ImportFileFixture : CoreTest<DiskScanService>
|
2011-06-22 07:44:57 +02:00
|
|
|
|
{
|
2012-10-14 02:36:16 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
|
|
|
|
|
private long _fileSize = 80.Megabytes();
|
|
|
|
|
private Series _fakeSeries;
|
|
|
|
|
private List<Episode> _fakeEpisodes;
|
|
|
|
|
private Episode _fakeEpisode;
|
2013-02-08 02:47:24 +01:00
|
|
|
|
|
|
|
|
|
[SetUp]
|
|
|
|
|
public void Setup()
|
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
_fakeSeries = Builder<Series>
|
2013-02-08 02:47:24 +01:00
|
|
|
|
.CreateNew()
|
|
|
|
|
.Build();
|
2012-10-20 03:42:42 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
_fakeEpisode = Builder<Episode>
|
|
|
|
|
.CreateNew()
|
|
|
|
|
.Build();
|
2011-06-22 07:44:57 +02:00
|
|
|
|
|
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
_fakeEpisodes = Builder<Episode>.CreateListOfSize(2)
|
|
|
|
|
.All()
|
|
|
|
|
.With(c => c.SeasonNumber = 3)
|
|
|
|
|
.With(e => e.EpisodeFile = new EpisodeFile())
|
|
|
|
|
.BuildList();
|
2013-04-01 08:22:16 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenNewFile();
|
2011-06-22 07:44:57 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenVideoDuration(TimeSpan.FromMinutes(20));
|
2013-04-01 08:22:16 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenFileSize(_fileSize);
|
2011-06-22 07:44:57 +02:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
private void GivenFileSize(long size)
|
2011-06-22 07:44:57 +02:00
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
_fileSize = size;
|
2011-06-22 07:44:57 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
Mocker.GetMock<DiskProvider>()
|
|
|
|
|
.Setup(d => d.GetSize(It.IsAny<String>()))
|
|
|
|
|
.Returns(size);
|
2011-06-22 07:44:57 +02:00
|
|
|
|
}
|
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
private void GivenVideoDuration(TimeSpan duration)
|
2011-06-22 07:44:57 +02:00
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
Mocker.GetMock<IVideoFileInfoReader>()
|
|
|
|
|
.Setup(d => d.GetRunTime(It.IsAny<String>()))
|
|
|
|
|
.Returns(duration);
|
2011-06-22 07:44:57 +02:00
|
|
|
|
}
|
|
|
|
|
|
2013-04-01 08:22:16 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
private void GivenEpisodes(IEnumerable<Episode> episodes, QualityModel quality)
|
2011-06-22 07:44:57 +02:00
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
Mocker.GetMock<IParsingService>()
|
|
|
|
|
.Setup(c => c.GetEpisodes(It.IsAny<string>(), It.IsAny<Series>()))
|
|
|
|
|
.Returns(new LocalEpisode
|
|
|
|
|
{
|
|
|
|
|
Episodes = episodes.ToList(),
|
|
|
|
|
Quality = quality
|
|
|
|
|
});
|
2011-06-22 07:44:57 +02:00
|
|
|
|
}
|
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
private void GivenNewFile()
|
2011-06-22 07:44:57 +02:00
|
|
|
|
{
|
2013-03-01 08:03:41 +01:00
|
|
|
|
Mocker.GetMock<IMediaFileService>()
|
2011-06-22 07:44:57 +02:00
|
|
|
|
.Setup(p => p.Exists(It.IsAny<String>()))
|
|
|
|
|
.Returns(false);
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
[Test]
|
|
|
|
|
public void import_new_file_should_succeed()
|
2011-08-26 08:23:21 +02:00
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenEpisodes(new[] { _fakeEpisode }, new QualityModel());
|
2011-08-26 08:23:21 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
|
|
|
|
VerifyFileImport(result);
|
|
|
|
|
}
|
2011-08-26 08:23:21 +02:00
|
|
|
|
|
2013-04-01 08:22:16 +02:00
|
|
|
|
|
2011-08-26 08:23:21 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
[Test]
|
|
|
|
|
public void import_new_file_with_same_quality_should_succeed()
|
|
|
|
|
{
|
|
|
|
|
_fakeEpisode.EpisodeFile = new EpisodeFile { Quality = new QualityModel(Quality.SDTV) };
|
|
|
|
|
GivenEpisodes(new[] { _fakeEpisode }, new QualityModel(Quality.SDTV));
|
2013-04-01 08:22:16 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
|
|
|
|
VerifyFileImport(result);
|
2011-08-26 08:23:21 +02:00
|
|
|
|
}
|
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
[Test]
|
|
|
|
|
public void import_new_file_with_better_quality_should_succeed()
|
2011-08-26 08:23:21 +02:00
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
_fakeEpisode.EpisodeFile = new EpisodeFile { Quality = new QualityModel(Quality.SDTV) };
|
|
|
|
|
GivenEpisodes(new[] { _fakeEpisode }, new QualityModel(Quality.HDTV1080p));
|
2011-08-26 08:23:21 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
|
|
|
|
VerifyFileImport(result);
|
2011-08-26 08:23:21 +02:00
|
|
|
|
}
|
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
[Test]
|
|
|
|
|
public void import_new_file_episode_has_better_quality_should_skip()
|
2011-08-26 08:23:21 +02:00
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
_fakeEpisode.EpisodeFile = new EpisodeFile { Quality = new QualityModel(Quality.HDTV1080p) };
|
|
|
|
|
GivenEpisodes(new[] { _fakeEpisode }, new QualityModel(Quality.SDTV));
|
2011-08-26 08:23:21 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
2011-08-26 08:23:21 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
VerifySkipImport(result);
|
|
|
|
|
}
|
2011-08-26 08:23:21 +02:00
|
|
|
|
|
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
[Test]
|
|
|
|
|
public void import_unparsable_file_should_skip()
|
|
|
|
|
{
|
|
|
|
|
Mocker.GetMock<IParsingService>()
|
|
|
|
|
.Setup(c => c.GetEpisodes(It.IsAny<string>(), It.IsAny<Series>()))
|
|
|
|
|
.Returns<LocalEpisode>(null);
|
2013-04-01 08:22:16 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
2011-08-26 08:23:21 +02:00
|
|
|
|
|
2013-04-01 08:22:16 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
VerifySkipImport(result);
|
2011-08-26 08:23:21 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
2013-04-15 03:41:39 +02:00
|
|
|
|
public void import_existing_file_should_skip()
|
2011-08-26 08:23:21 +02:00
|
|
|
|
{
|
2013-03-01 08:03:41 +01:00
|
|
|
|
Mocker.GetMock<IMediaFileService>()
|
2011-08-26 08:23:21 +02:00
|
|
|
|
.Setup(p => p.Exists(It.IsAny<String>()))
|
2013-04-15 03:41:39 +02:00
|
|
|
|
.Returns(true);
|
2011-08-26 08:23:21 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
2013-04-01 08:22:16 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
VerifySkipImport(result);
|
2011-08-26 08:23:21 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
2013-04-15 03:41:39 +02:00
|
|
|
|
public void import_file_with_no_episode_in_db_should_skip()
|
2011-08-26 08:23:21 +02:00
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenEpisodes(new List<Episode>(), new QualityModel());
|
2011-08-26 08:23:21 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
2011-08-26 08:23:21 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
VerifySkipImport(result);
|
2011-08-26 08:23:21 +02:00
|
|
|
|
}
|
|
|
|
|
|
2012-10-17 09:39:06 +02:00
|
|
|
|
[Test]
|
2013-04-15 03:41:39 +02:00
|
|
|
|
public void import_new_multi_part_file_episode_with_better_quality_than_existing()
|
2012-10-17 09:39:06 +02:00
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
_fakeEpisodes[0].EpisodeFile = new EpisodeFile();
|
|
|
|
|
_fakeEpisodes[1].EpisodeFile = new EpisodeFile();
|
2013-04-01 08:22:16 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
_fakeEpisodes[0].EpisodeFile = new EpisodeFile { Quality = new QualityModel(Quality.SDTV) };
|
|
|
|
|
_fakeEpisodes[1].EpisodeFile = new EpisodeFile { Quality = new QualityModel(Quality.SDTV) };
|
2012-10-21 02:19:30 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenEpisodes(_fakeEpisodes, new QualityModel(Quality.HDTV1080p));
|
2012-10-17 09:39:06 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
2012-10-17 09:39:06 +02:00
|
|
|
|
|
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
VerifyFileImport(result);
|
2012-10-17 09:39:06 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
2013-04-15 03:41:39 +02:00
|
|
|
|
public void skip_import_new_multi_part_file_episode_existing_has_better_quality()
|
2012-10-17 09:39:06 +02:00
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
_fakeEpisodes[0].EpisodeFile = new EpisodeFile { Quality = new QualityModel(Quality.HDTV1080p) };
|
|
|
|
|
_fakeEpisodes[1].EpisodeFile = new EpisodeFile { Quality = new QualityModel(Quality.HDTV1080p) };
|
2012-10-17 09:39:06 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenEpisodes(_fakeEpisodes, new QualityModel(Quality.SDTV));
|
2012-10-17 09:39:06 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
2012-10-21 02:19:30 +02:00
|
|
|
|
|
2012-10-17 09:39:06 +02:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
VerifySkipImport(result);
|
2012-10-17 09:39:06 +02:00
|
|
|
|
}
|
2013-01-21 01:35:42 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
|
2013-01-21 01:35:42 +01:00
|
|
|
|
[Test]
|
2013-04-15 03:41:39 +02:00
|
|
|
|
public void should_skip_if_file_size_is_under_70MB_and_runTime_under_3_minutes()
|
2013-01-21 01:35:42 +01:00
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenFileSize(50.Megabytes());
|
|
|
|
|
GivenVideoDuration(TimeSpan.FromMinutes(1));
|
2013-01-21 01:35:42 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenEpisodes(new[] { _fakeEpisode }, new QualityModel(Quality.HDTV1080p));
|
2013-01-21 01:35:42 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
2013-01-21 01:35:42 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
VerifySkipImport(result);
|
2013-01-21 01:35:42 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
2013-01-26 08:18:42 +01:00
|
|
|
|
public void should_import_if_file_size_is_under_70MB_but_runTime_over_3_minutes()
|
2013-01-21 01:35:42 +01:00
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenFileSize(50.Megabytes());
|
|
|
|
|
GivenVideoDuration(TimeSpan.FromMinutes(20));
|
2013-01-21 01:35:42 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenEpisodes(new[] { _fakeEpisode }, new QualityModel(Quality.HDTV1080p));
|
2013-01-21 01:35:42 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
2013-01-21 01:35:42 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
VerifyFileImport(result);
|
2013-01-21 01:35:42 +01:00
|
|
|
|
Mocker.GetMock<DiskProvider>().Verify(p => p.DeleteFile(It.IsAny<string>()), Times.Never());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
2013-01-26 08:18:42 +01:00
|
|
|
|
public void should_import_if_file_size_is_over_70MB_but_runTime_under_3_minutes()
|
2013-01-21 01:35:42 +01:00
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenFileSize(100.Megabytes());
|
|
|
|
|
GivenVideoDuration(TimeSpan.FromMinutes(1));
|
2013-01-21 01:35:42 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenEpisodes(new[] { _fakeEpisode }, new QualityModel(Quality.HDTV1080p));
|
2013-01-21 01:35:42 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
2013-01-21 01:35:42 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
VerifyFileImport(result);
|
2013-01-21 01:35:42 +01:00
|
|
|
|
}
|
|
|
|
|
|
2013-02-08 02:47:24 +01:00
|
|
|
|
[Test]
|
|
|
|
|
public void should_import_special_even_if_file_size_is_under_70MB_and_runTime_under_3_minutes()
|
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenFileSize(10.Megabytes());
|
|
|
|
|
GivenVideoDuration(TimeSpan.FromMinutes(1));
|
2013-02-08 02:47:24 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
_fakeEpisode.SeasonNumber = 0;
|
2013-02-08 02:47:24 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenEpisodes(new[] { _fakeEpisode }, new QualityModel(Quality.HDTV1080p));
|
2013-02-08 02:47:24 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
2013-02-08 02:47:24 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
VerifyFileImport(result);
|
2013-02-08 02:47:24 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Test]
|
2013-04-15 03:41:39 +02:00
|
|
|
|
public void should_skip_if_daily_series_with_file_size_is_under_70MB_and_runTime_under_3_minutes()
|
2013-02-08 02:47:24 +01:00
|
|
|
|
{
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenFileSize(10.Megabytes());
|
|
|
|
|
GivenVideoDuration(TimeSpan.FromMinutes(1));
|
2013-02-08 02:47:24 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
_fakeEpisode.SeasonNumber = 0;
|
|
|
|
|
_fakeSeries.SeriesType = SeriesTypes.Daily;
|
2013-02-08 02:47:24 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
GivenEpisodes(new[] { _fakeEpisode }, new QualityModel(Quality.HDTV1080p));
|
2013-02-08 02:47:24 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
var result = Subject.ImportFile(_fakeSeries, "file.ext");
|
2013-02-08 02:47:24 +01:00
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
VerifySkipImport(result);
|
2013-02-08 02:47:24 +01:00
|
|
|
|
}
|
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
private void VerifyFileImport(EpisodeFile result)
|
2013-01-21 01:35:42 +01:00
|
|
|
|
{
|
|
|
|
|
result.Should().NotBeNull();
|
2013-04-15 03:41:39 +02:00
|
|
|
|
result.SeriesId.Should().Be(_fakeSeries.Id);
|
|
|
|
|
result.Size.Should().Be(_fileSize);
|
2013-01-21 01:35:42 +01:00
|
|
|
|
result.DateAdded.Should().HaveDay(DateTime.Now.Day);
|
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
Mocker.GetMock<IMediaFileService>().Verify(c => c.Add(result), Times.Once());
|
2013-01-21 01:35:42 +01:00
|
|
|
|
}
|
|
|
|
|
|
2013-04-15 03:41:39 +02:00
|
|
|
|
private void VerifySkipImport(EpisodeFile result)
|
2013-01-21 01:35:42 +01:00
|
|
|
|
{
|
|
|
|
|
result.Should().BeNull();
|
2013-03-01 08:03:41 +01:00
|
|
|
|
Mocker.GetMock<IMediaFileService>().Verify(p => p.Add(It.IsAny<EpisodeFile>()), Times.Never());
|
2013-01-21 01:35:42 +01:00
|
|
|
|
}
|
2011-06-22 07:44:57 +02:00
|
|
|
|
}
|
|
|
|
|
}
|