From 0416060643bdca11533bc123c423595dbe635ead Mon Sep 17 00:00:00 2001
From: Mark McDowall <mark@mcdowall.ca>
Date: Sun, 5 May 2019 13:01:16 -0700
Subject: [PATCH] Tests for repack fix and improve behaviour when release group
 is unknown

---
 .../RepackSpecificationFixture.cs             | 44 ++++++++++++++++++-
 .../ParserTests/QualityParserFixture.cs       |  1 +
 .../Specifications/RepackSpecification.cs     | 12 ++++-
 3 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/src/NzbDrone.Core.Test/DecisionEngineTests/RepackSpecificationFixture.cs b/src/NzbDrone.Core.Test/DecisionEngineTests/RepackSpecificationFixture.cs
index 181095020..d5f329552 100644
--- a/src/NzbDrone.Core.Test/DecisionEngineTests/RepackSpecificationFixture.cs
+++ b/src/NzbDrone.Core.Test/DecisionEngineTests/RepackSpecificationFixture.cs
@@ -84,7 +84,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
         }
 
         [Test]
-        public void should_return_false_if_is_a_repack_for_existing_file()
+        public void should_return_false_if_is_a_repack_for_a_different_file()
         {
             _parsedEpisodeInfo.Quality.Revision.IsRepack = true;
             _episodes.First().EpisodeFileId = 1;
@@ -102,5 +102,47 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
                    .Should()
                    .BeFalse();
         }
+
+        [Test]
+        public void should_return_false_if_release_group_for_existing_file_is_unknown()
+        {
+            _parsedEpisodeInfo.Quality.Revision.IsRepack = true;
+            _episodes.First().EpisodeFileId = 1;
+            _episodes.First().EpisodeFile = Builder<EpisodeFile>.CreateNew()
+                                                                .With(e => e.ReleaseGroup = "")
+                                                                .Build();
+
+            var remoteEpisode = Builder<RemoteEpisode>.CreateNew()
+                                                      .With(e => e.ParsedEpisodeInfo = _parsedEpisodeInfo)
+                                                      .With(e => e.Episodes = _episodes)
+                                                      .Build();
+
+            Subject.IsSatisfiedBy(remoteEpisode, null)
+                   .Accepted
+                   .Should()
+                   .BeFalse();
+        }
+
+        [Test]
+        public void should_return_false_if_release_group_for_release_is_unknown()
+        {
+            _parsedEpisodeInfo.Quality.Revision.IsRepack = true;
+            _parsedEpisodeInfo.ReleaseGroup = null;
+
+            _episodes.First().EpisodeFileId = 1;
+            _episodes.First().EpisodeFile = Builder<EpisodeFile>.CreateNew()
+                                                                .With(e => e.ReleaseGroup = "Sonarr")
+                                                                .Build();
+
+            var remoteEpisode = Builder<RemoteEpisode>.CreateNew()
+                                                      .With(e => e.ParsedEpisodeInfo = _parsedEpisodeInfo)
+                                                      .With(e => e.Episodes = _episodes)
+                                                      .Build();
+
+            Subject.IsSatisfiedBy(remoteEpisode, null)
+                   .Accepted
+                   .Should()
+                   .BeFalse();
+        }
     }
 }
diff --git a/src/NzbDrone.Core.Test/ParserTests/QualityParserFixture.cs b/src/NzbDrone.Core.Test/ParserTests/QualityParserFixture.cs
index 873294657..5249f1ef3 100644
--- a/src/NzbDrone.Core.Test/ParserTests/QualityParserFixture.cs
+++ b/src/NzbDrone.Core.Test/ParserTests/QualityParserFixture.cs
@@ -377,6 +377,7 @@ namespace NzbDrone.Core.Test.ParserTests
         [TestCase("Series Title S04E87 REPACK 720p HDTV x264 aAF", true)]
         [TestCase("Series.Title.S04E87.REPACK.720p.HDTV.x264-aAF", true)]
         [TestCase("Series.Title.S04E87.PROPER.720p.HDTV.x264-aAF", false)]
+        [TestCase("The.Expanse.S01E07.RERIP.720p.BluRay.x264-DEMAND", true)]
         public void should_be_able_to_parse_repack(string title, bool isRepack)
         {
             var result = QualityParser.ParseQuality(title);
diff --git a/src/NzbDrone.Core/DecisionEngine/Specifications/RepackSpecification.cs b/src/NzbDrone.Core/DecisionEngine/Specifications/RepackSpecification.cs
index 0f4cb7e42..f5fece28f 100644
--- a/src/NzbDrone.Core/DecisionEngine/Specifications/RepackSpecification.cs
+++ b/src/NzbDrone.Core/DecisionEngine/Specifications/RepackSpecification.cs
@@ -31,7 +31,17 @@ namespace NzbDrone.Core.DecisionEngine.Specifications
                 var releaseGroup = subject.ParsedEpisodeInfo.ReleaseGroup;
                 var fileReleaseGroup = file.ReleaseGroup;
 
-                if (fileReleaseGroup.IsNotNullOrWhiteSpace() && !fileReleaseGroup.Equals(releaseGroup, StringComparison.InvariantCultureIgnoreCase))
+                if (fileReleaseGroup.IsNullOrWhiteSpace())
+                {
+                    return Decision.Reject("Unable to determine release group for the existing file");
+                }
+
+                if (releaseGroup.IsNullOrWhiteSpace())
+                {
+                    return Decision.Reject("Unable to determine release group for this release");
+                }
+
+                if (!fileReleaseGroup.Equals(releaseGroup, StringComparison.InvariantCultureIgnoreCase))
                 {
                     _logger.Debug("Release is a repack for a different release group. Release Group: {0}. File release group: {0}", releaseGroup, fileReleaseGroup);
                     return Decision.Reject("Release is a repack for a different release group. Release Group: {0}. File release group: {0}", releaseGroup, fileReleaseGroup);