music-dl/src/test/test_extractors.py

101 lines
3.6 KiB
Python

# -*- coding: utf-8 -*-
""" Unittests for extractors present in MusicDL. """
from __future__ import unicode_literals
import sys
import unittest
import re
import i18n
import extractors
from extractors import baseFile
# Pytohn 2/3 compat
if sys.version[0] == "2":
strtype = unicode
else:
strtype = str
class extractorsTestCase(unittest.TestCase):
def setUp(self):
""" Configure i18n functions for avoiding a traceback later. """
i18n.setup()
def search(self, extractor_name, search_query="piano", skip_validation=False):
""" Search a video in the passed extractor name. """
# Test basic instance stuff.
extractor_instance = getattr(extractors, extractor_name).interface()
extractor_instance.search(search_query)
self.assertIsInstance(extractor_instance.results, list)
self.assertNotEqual(len(extractor_instance.results), 0)
self.assertIsInstance(len(extractor_instance.results), int)
# Take and test validity of the first item.
item = extractor_instance.results[0]
self.assertIsInstance(item, baseFile.song)
self.assertIsInstance(item.title, strtype)
self.assertNotEqual(item.title, "")
if extractor_name == "youtube": # Duration is only available for youtube.
self.assertIsInstance(item.duration, strtype)
self.assertNotEqual(item.duration, "")
self.assertIsInstance(item.url, strtype)
self.assertNotEqual(item.url, "")
if extractor_name == "youtube" and skip_validation == False:
match = re.search("((?<=(v|V)/)|(?<=be/)|(?<=(\?|\&)v=)|(?<=embed/))([\w-]+)", item.url)
self.assertNotEqual(match, None)
formatted_track = item.format_track()
self.assertIsInstance(formatted_track, strtype)
self.assertNotEquals(formatted_track, "")
item.get_download_url()
self.assertIsInstance(item.download_url, strtype)
self.assertNotEquals(item.download_url, "")
def search_blank(self, extractor_name, search_query=""):
""" Attempt to search in any extractor by passing a blank string. """
extractor_instance = getattr(extractors, extractor_name).interface()
self.assertRaises(ValueError, extractor_instance.search, search_query)
def test_youtube_search(self):
""" Testing a Youtube search. """
self.search("youtube")
def test_youtube_search_unicode(self):
""" Testing a Youtube search using unicode characters. """
self.search("youtube", "Пианино")
def test_youtube_search_blank(self):
""" Testing a youtube search when text is blank or not passed. """
self.search_blank("youtube")
def test_youtube_direct_link(self):
""" Testing a search in youtube by passing a direct link. """
self.search("youtube", "https://www.youtube.com/watch?v=hwDiI9p9L-g")
def test_youtube_playlist(self):
""" Testing a youtube search by passing a link to a playlist. """
self.search("youtube", "https://www.youtube.com/playlist?list=PLqivnvaruBVH8fqI5JU9h5jZKV-32bbEn", skip_validation=True)
def test_mailru_search(self):
""" Testing a mail.ru search. """
self.search("mailru")
def test_mailru_search_unicode(self):
""" Testing a mail.ru search with unicode characters. """
self.search("mailru", "Пианино")
def test_mailru_search_blank(self):
""" Testing a mail.ru search when text is blank. """
self.search_blank("mailru")
def test_zaycev_search(self):
""" Testing a search made in zaycev.net """
self.search("zaycev")
def test_zaycev_search_unicode(self):
""" Testing a search made in zaycev.net with unicode characters. """
self.search("zaycev", "Пианино")
def test_zaycev_search_blank(self):
""" Testing a search in zaycev.net when text is blank. """
self.search_blank("zaycev")
if __name__ == "__main__":
unittest.main()