diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/helper.py | 29 | ||||
| -rw-r--r-- | test/test_download.py | 4 | ||||
| -rw-r--r-- | test/test_utils.py | 34 | ||||
| -rw-r--r-- | test/test_youtube_signature.py | 12 | 
4 files changed, 55 insertions, 24 deletions
| diff --git a/test/helper.py b/test/helper.py index 7f3ab8438..62cb3ce02 100644 --- a/test/helper.py +++ b/test/helper.py @@ -1,3 +1,5 @@ +from __future__ import unicode_literals +  import errno  import io  import hashlib @@ -12,6 +14,7 @@ from youtube_dl import YoutubeDL  from youtube_dl.utils import (      compat_str,      preferredencoding, +    write_string,  ) @@ -40,10 +43,10 @@ def report_warning(message):      If stderr is a tty file the 'WARNING:' will be colored      '''      if sys.stderr.isatty() and os.name != 'nt': -        _msg_header = u'\033[0;33mWARNING:\033[0m' +        _msg_header = '\033[0;33mWARNING:\033[0m'      else: -        _msg_header = u'WARNING:' -    output = u'%s %s\n' % (_msg_header, message) +        _msg_header = 'WARNING:' +    output = '%s %s\n' % (_msg_header, message)      if 'b' in getattr(sys.stderr, 'mode', '') or sys.version_info[0] < 3:          output = output.encode(preferredencoding())      sys.stderr.write(output) @@ -103,22 +106,22 @@ def expect_info_dict(self, expected_dict, got_dict):              self.assertTrue(                  isinstance(got, compat_str), -                u'Expected a %s object, but got %s for field %s' % ( +                'Expected a %s object, but got %s for field %s' % (                      compat_str.__name__, type(got).__name__, info_field))              self.assertTrue(                  match_rex.match(got), -                u'field %s (value: %r) should match %r' % (info_field, got, match_str)) +                'field %s (value: %r) should match %r' % (info_field, got, match_str))          elif isinstance(expected, type):              got = got_dict.get(info_field)              self.assertTrue(isinstance(got, expected), -                u'Expected type %r for field %s, but got value %r of type %r' % (expected, info_field, got, type(got))) +                'Expected type %r for field %s, but got value %r of type %r' % (expected, info_field, got, type(got)))          else:              if isinstance(expected, compat_str) and expected.startswith('md5:'):                  got = 'md5:' + md5(got_dict.get(info_field))              else:                  got = got_dict.get(info_field)              self.assertEqual(expected, got, -                u'invalid value for field %s, expected %r, got %r' % (info_field, expected, got)) +                'invalid value for field %s, expected %r, got %r' % (info_field, expected, got))      # Check for the presence of mandatory fields      if got_dict.get('_type') != 'playlist': @@ -126,7 +129,7 @@ def expect_info_dict(self, expected_dict, got_dict):              self.assertTrue(got_dict.get(key), 'Missing mandatory field %s' % key)      # Check for mandatory fields that are automatically set by YoutubeDL      for key in ['webpage_url', 'extractor', 'extractor_key']: -        self.assertTrue(got_dict.get(key), u'Missing field: %s' % key) +        self.assertTrue(got_dict.get(key), 'Missing field: %s' % key)      # Are checkable fields missing from the test case definition?      test_info_dict = dict((key, value if not isinstance(value, compat_str) or len(value) < 250 else 'md5:' + md5(value)) @@ -134,7 +137,15 @@ def expect_info_dict(self, expected_dict, got_dict):          if value and key in ('title', 'description', 'uploader', 'upload_date', 'timestamp', 'uploader_id', 'location'))      missing_keys = set(test_info_dict.keys()) - set(expected_dict.keys())      if missing_keys: -        sys.stderr.write(u'\n"info_dict": ' + json.dumps(test_info_dict, ensure_ascii=False, indent=4) + u'\n') +        def _repr(v): +            if isinstance(v, compat_str): +                return "'%s'" % v.replace('\\', '\\\\').replace("'", "\\'") +            else: +                return repr(v) +        info_dict_str = ''.join( +            '    %s: %s,\n' % (_repr(k), _repr(v)) +            for k, v in test_info_dict.items()) +        write_string('\n"info_dict": {' + info_dict_str + '}\n', out=sys.stderr)          self.assertFalse(              missing_keys,              'Missing keys in test definition: %s' % ( diff --git a/test/test_download.py b/test/test_download.py index 2b8ac6975..8178015ea 100644 --- a/test/test_download.py +++ b/test/test_download.py @@ -139,7 +139,9 @@ def generator(test_case):              if is_playlist:                  self.assertEqual(res_dict['_type'], 'playlist') +                self.assertTrue('entries' in res_dict)                  expect_info_dict(self, test_case.get('info_dict', {}), res_dict) +              if 'playlist_mincount' in test_case:                  assertGreaterEqual(                      self, @@ -188,7 +190,7 @@ def generator(test_case):                  expect_info_dict(self, tc.get('info_dict', {}), info_dict)          finally:              try_rm_tcs_files() -            if is_playlist and res_dict is not None: +            if is_playlist and res_dict is not None and res_dict.get('entries'):                  # Remove all other files that may have been extracted if the                  # extractor returns full results even with extract_flat                  res_tcs = [{'info_dict': e} for e in res_dict['entries']] diff --git a/test/test_utils.py b/test/test_utils.py index 3efbed29d..bcca0efea 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -22,7 +22,8 @@ from youtube_dl.utils import (      fix_xml_ampersands,      get_meta_content,      orderedSet, -    PagedList, +    OnDemandPagedList, +    InAdvancePagedList,      parse_duration,      read_batch_urls,      sanitize_filename, @@ -43,6 +44,7 @@ from youtube_dl.utils import (      limit_length,      escape_rfc3986,      escape_url, +    js_to_json,  ) @@ -137,6 +139,7 @@ class TestUtil(unittest.TestCase):          self.assertEqual(unified_strdate('Dec 14, 2012'), '20121214')          self.assertEqual(unified_strdate('2012/10/11 01:56:38 +0000'), '20121011')          self.assertEqual(unified_strdate('1968-12-10'), '19681210') +        self.assertEqual(unified_strdate('28/01/2014 21:00:00 +0100'), '20140128')      def test_find_xpath_attr(self):          testxml = '''<root> @@ -246,10 +249,14 @@ class TestUtil(unittest.TestCase):                  for i in range(firstid, upto):                      yield i -            pl = PagedList(get_page, pagesize) +            pl = OnDemandPagedList(get_page, pagesize)              got = pl.getslice(*sliceargs)              self.assertEqual(got, expected) +            iapl = InAdvancePagedList(get_page, size // pagesize + 1, pagesize) +            got = iapl.getslice(*sliceargs) +            self.assertEqual(got, expected) +          testPL(5, 2, (), [0, 1, 2, 3, 4])          testPL(5, 2, (1,), [1, 2, 3, 4])          testPL(5, 2, (2,), [2, 3, 4]) @@ -325,5 +332,28 @@ class TestUtil(unittest.TestCase):          )          self.assertEqual(escape_url('http://vimeo.com/56015672#at=0'), 'http://vimeo.com/56015672#at=0') +    def test_js_to_json_realworld(self): +        inp = '''{ +            'clip':{'provider':'pseudo'} +        }''' +        self.assertEqual(js_to_json(inp), '''{ +            "clip":{"provider":"pseudo"} +        }''') +        json.loads(js_to_json(inp)) + +        inp = '''{ +            'playlist':[{'controls':{'all':null}}] +        }''' +        self.assertEqual(js_to_json(inp), '''{ +            "playlist":[{"controls":{"all":null}}] +        }''') + +    def test_js_to_json_edgecases(self): +        on = js_to_json("{abc_def:'1\\'\\\\2\\\\\\'3\"4'}") +        self.assertEqual(json.loads(on), {"abc_def": "1'\\2\\'3\"4"}) + +        on = js_to_json('{"abc": true}') +        self.assertEqual(json.loads(on), {'abc': True}) +  if __name__ == '__main__':      unittest.main() diff --git a/test/test_youtube_signature.py b/test/test_youtube_signature.py index 604e76ab6..df2cb09f2 100644 --- a/test/test_youtube_signature.py +++ b/test/test_youtube_signature.py @@ -48,18 +48,6 @@ _TESTS = [          'A52CB8B320D22032ABB3A41D773D2B6342034902.A22E87CDD37DBE75A5E52412DC874AC16A7CFCA2',      ),      ( -        'http://s.ytimg.com/yts/swfbin/player-vfl5vIhK2/watch_as3.swf', -        'swf', -        86, -        'O1I3456789abcde0ghijklmnopqrstuvwxyzABCDEFGHfJKLMN2PQRSTUVWXY\\!"#$%&\'()*+,-./:;<=>?' -    ), -    ( -        'http://s.ytimg.com/yts/swfbin/player-vflmDyk47/watch_as3.swf', -        'swf', -        'F375F75BF2AFDAAF2666E43868D46816F83F13E81C46.3725A8218E446A0DECD33F79DC282994D6AA92C92C9', -        '9C29AA6D499282CD97F33DCED0A644E8128A5273.64C18E31F38361864D86834E6662FAADFA2FB57F' -    ), -    (          'https://s.ytimg.com/yts/jsbin/html5player-en_US-vflBb0OQx.js',          'js',          84, | 
