From 9c9b6ba07c26e972ab93f7369285c8dbb92e8f77 Mon Sep 17 00:00:00 2001
From: labrys <labrys@users.noreply.github.com>
Date: Wed, 9 Dec 2015 00:24:11 -0500
Subject: [PATCH] Add initial helper.isMediaFile tests Fix helper.isMediaFile
 fails for non-string filename arguments Removed unreachable break statement

---
 sickbeard/helpers.py   | 34 ++++++++++++---------
 tests/helpers_tests.py | 69 ++++++++++++++++++++++++++++++++++--------
 2 files changed, 75 insertions(+), 28 deletions(-)

diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py
index 4d86695a3..e1e191302 100644
--- a/sickbeard/helpers.py
+++ b/sickbeard/helpers.py
@@ -168,25 +168,29 @@ def isMediaFile(filename):
     """
 
     # ignore samples
-    if re.search(r'(^|[\W_])(?<!shomin.)(sample\d*)[\W_]', filename, re.I):
-        return False
+    try:
+        if re.search(r'(^|[\W_])(?<!shomin.)(sample\d*)[\W_]', filename, re.I):
+            return False
 
-    # ignore RARBG release intro
-    if re.search(r'^RARBG\.\w+\.(mp4|avi|txt)$', filename, re.I):
-        return False
+        # ignore RARBG release intro
+        if re.search(r'^RARBG\.\w+\.(mp4|avi|txt)$', filename, re.I):
+            return False
 
-    # ignore MAC OS's retarded "resource fork" files
-    if filename.startswith('._'):
-        return False
+        # ignore MAC OS's retarded "resource fork" files
+        if filename.startswith('._'):
+            return False
 
-    sepFile = filename.rpartition(".")
+        sepFile = filename.rpartition(".")
 
-    if re.search('extras?$', sepFile[0], re.I):
-        return False
+        if re.search('extras?$', sepFile[0], re.I):
+            return False
 
-    if sepFile[2].lower() in media_extensions:
-        return True
-    else:
+        if sepFile[2].lower() in media_extensions:
+            return True
+        else:
+            return False
+    except TypeError as error:  # Not a string
+        logger.log('Invalid filename. Filename must be a string. %s' % error, logger.DEBUG)  # pylint: disable=no-member
         return False
 
 
@@ -1282,7 +1286,6 @@ def mapIndexersToShow(showObj):
             logger.log(u"Found indexer mapping in cache for show: " + showObj.name, logger.DEBUG)
             mapped[int(curResult['mindexer'])] = int(curResult['mindexer_id'])
             return mapped
-            break
     else:
         sql_l = []
         for indexer in sickbeard.indexerApi().indexers:
@@ -1758,6 +1761,7 @@ def getTVDBFromID(indexer_id, indexer):
     else:
         return tvdb_id
 
+
 def is_ip_private(ip):
     priv_lo = re.compile("^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
     priv_24 = re.compile("^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$")
diff --git a/tests/helpers_tests.py b/tests/helpers_tests.py
index 85b3aac84..1ec1cb460 100755
--- a/tests/helpers_tests.py
+++ b/tests/helpers_tests.py
@@ -21,7 +21,7 @@
 """
 Test sickbeard.helpers
 
-Methods:
+Public Methods:
     fixGlob
     indentXML
     remove_non_release_groups
@@ -60,7 +60,6 @@ Methods:
     encrypt
     decrypt
     full_sanitizeSceneName
-    _check_against_names
     get_show
     is_hidden_folder
     real_path
@@ -72,8 +71,6 @@ Methods:
     restoreConfigZip
     mapIndexersToShow
     touchFile
-    _getTempDir
-    _setUpSession
     getURL
     download_file
     get_size
@@ -84,8 +81,13 @@ Methods:
     pretty_time_delta
     isFileLocked
     getDiskSpaceUsage
+Private Methods:
+    _check_against_names
+    _getTempDir
+    _setUpSession
 """
 
+from __future__ import print_function
 import os.path
 import sys
 import unittest
@@ -93,7 +95,8 @@ import unittest
 sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib')))
 sys.path.insert(1, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
 
-from sickbeard.helpers import remove_non_release_groups
+from sickbeard import helpers
+from sickrage.helper.common import media_extensions, subtitle_extensions
 
 TEST_RESULT = 'Show.Name.S01E01.HDTV.x264-RLSGROUP'
 TEST_CASES = {
@@ -163,7 +166,7 @@ def test_generator(test_strings):
         :return: test to run
         """
         for test_string in test_strings:
-            self.assertEqual(remove_non_release_groups(test_string), TEST_RESULT)
+            self.assertEqual(helpers.remove_non_release_groups(test_string), TEST_RESULT)
     return _test
 
 
@@ -258,12 +261,53 @@ class HelpersFileTests(unittest.TestCase):
     """
     Test file helpers
     """
-    @unittest.skip('Not yet implemented')
+
     def test_is_media_file(self):
         """
         Test isMediaFile
         """
-        pass
+        # TODO: Add unicode tests
+        # TODO: Add MAC OS resource fork tests
+        # TODO: Add RARBG release tests
+        # RARBG release intros should be ignored
+        # MAC OS's "resource fork" files should be ignored
+        # Extras should be ignored
+        # and the file extension should be in the list of media extensions
+
+        # Test all valid media extensions
+        temp_name = 'Show.Name.S01E01.HDTV.x264-RLSGROUP'
+        extension_tests = {'.'.join((temp_name, ext)): True for ext in media_extensions}
+        # ...and some invalid ones
+        other_extensions = ['txt', 'sfv', 'srr', 'rar', 'nfo', 'zip']
+        extension_tests.update({'.'.join((temp_name, ext)): False for ext in other_extensions + subtitle_extensions})
+
+        # Samples should be ignored
+        sample_tests = {  # Samples should be ignored, valid samples will return False
+            'Show.Name.S01E01.HDTV.sample.mkv': False,  # default case
+            'Show.Name.S01E01.HDTV.sAmPle.mkv': False,  # Ignore case
+            'Show.Name.S01E01.HDTV.samples.mkv': True,  # sample should not be plural
+            'Show.Name.S01E01.HDTVsample.mkv': True,  # no separation, can't identify as sample
+            'Sample.Show.Name.S01E01.HDTV.mkv': False,  # location doesn't matter
+            'Show.Name.Sample.S01E01.HDTV.sample.mkv': False,  # location doesn't matter
+            'Show.Name.S01E01.HDTV.sample1.mkv': False,  # numbered samples are ok
+            'Show.Name.S01E01.HDTV.sample12.mkv': False,  # numbered samples are ok
+            'Show.Name.S01E01.HDTV.sampleA.mkv': True,  # samples should not be indexed alphabetically
+        }
+
+        edge_cases = {
+            None: False,
+            '': False,
+            0: False,
+            1: False,
+            42: False,
+            123189274981274: False,
+            12.23: False,
+            ('this', 'is', 'a tuple'): False,
+        }
+
+        for cur_test in extension_tests, sample_tests, edge_cases:
+            for cur_name, expected_result in cur_test.items():
+                self.assertEqual(helpers.isMediaFile(cur_name), expected_result, cur_name)
 
     @unittest.skip('Not yet implemented')
     def test_is_file_locked(self):
@@ -640,12 +684,11 @@ class HelpersMiscTests(unittest.TestCase):
         """
         pass
 
-
 if __name__ == '__main__':
-    print "=================="
-    print "STARTING - Helpers TESTS"
-    print "=================="
-    print "######################################################################"
+    print("==================")
+    print("STARTING - Helpers TESTS")
+    print("==================")
+    print("######################################################################")
     for name, test_data in TEST_CASES.items():
         test_name = 'test_%s' % name
         test = test_generator(test_data)
-- 
GitLab