diff options
Diffstat (limited to 'test/helper.py')
| -rw-r--r-- | test/helper.py | 65 | 
1 files changed, 42 insertions, 23 deletions
| diff --git a/test/helper.py b/test/helper.py index 62cb3ce02..c416f388c 100644 --- a/test/helper.py +++ b/test/helper.py @@ -57,9 +57,9 @@ class FakeYDL(YoutubeDL):          # Different instances of the downloader can't share the same dictionary          # some test set the "sublang" parameter, which would break the md5 checks.          params = get_params(override=override) -        super(FakeYDL, self).__init__(params) +        super(FakeYDL, self).__init__(params, auto_init=False)          self.result = [] -         +      def to_screen(self, s, skip_eol=None):          print(s) @@ -72,32 +72,24 @@ class FakeYDL(YoutubeDL):      def expect_warning(self, regex):          # Silence an expected warning matching a regex          old_report_warning = self.report_warning +          def report_warning(self, message): -            if re.match(regex, message): return +            if re.match(regex, message): +                return              old_report_warning(message)          self.report_warning = types.MethodType(report_warning, self)  def gettestcases(include_onlymatching=False):      for ie in youtube_dl.extractor.gen_extractors(): -        t = getattr(ie, '_TEST', None) -        if t: -            assert not hasattr(ie, '_TESTS'), \ -                '%s has _TEST and _TESTS' % type(ie).__name__ -            tests = [t] -        else: -            tests = getattr(ie, '_TESTS', []) -        for t in tests: -            if not include_onlymatching and t.get('only_matching', False): -                continue -            t['name'] = type(ie).__name__[:-len('IE')] -            yield t +        for tc in ie.get_testcases(include_onlymatching): +            yield tc  md5 = lambda s: hashlib.md5(s.encode('utf-8')).hexdigest() -def expect_info_dict(self, expected_dict, got_dict): +def expect_info_dict(self, got_dict, expected_dict):      for info_field, expected in expected_dict.items():          if isinstance(expected, compat_str) and expected.startswith('re:'):              got = got_dict.get(info_field) @@ -114,14 +106,28 @@ def expect_info_dict(self, expected_dict, got_dict):          elif isinstance(expected, type):              got = got_dict.get(info_field)              self.assertTrue(isinstance(got, expected), -                '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)) +            elif isinstance(expected, compat_str) and expected.startswith('mincount:'): +                got = got_dict.get(info_field) +                self.assertTrue( +                    isinstance(got, list), +                    'Expected field %s to be a list, but it is of type %s' % ( +                        info_field, type(got).__name__)) +                expected_num = int(expected.partition(':')[2]) +                assertGreaterEqual( +                    self, len(got), expected_num, +                    'Expected %d items in field %s, but only got %d' % ( +                        expected_num, info_field, len(got) +                    ) +                ) +                continue              else:                  got = got_dict.get(info_field)              self.assertEqual(expected, got, -                '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': @@ -133,19 +139,20 @@ def expect_info_dict(self, expected_dict, got_dict):      # 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)) -        for key, value in got_dict.items() -        if value and key in ('title', 'description', 'uploader', 'upload_date', 'timestamp', 'uploader_id', 'location')) +                          for key, value in got_dict.items() +                          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:          def _repr(v):              if isinstance(v, compat_str): -                return "'%s'" % v.replace('\\', '\\\\').replace("'", "\\'") +                return "'%s'" % v.replace('\\', '\\\\').replace("'", "\\'").replace('\n', '\\n')              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) +        write_string( +            '\n\'info_dict\': {\n' + info_dict_str + '}\n', out=sys.stderr)          self.assertFalse(              missing_keys,              'Missing keys in test definition: %s' % ( @@ -158,7 +165,9 @@ def assertRegexpMatches(self, text, regexp, msg=None):      else:          m = re.match(regexp, text)          if not m: -            note = 'Regexp didn\'t match: %r not found in %r' % (regexp, text) +            note = 'Regexp didn\'t match: %r not found' % (regexp) +            if len(text) < 1000: +                note += ' in %r' % text              if msg is None:                  msg = note              else: @@ -171,3 +180,13 @@ def assertGreaterEqual(self, got, expected, msg=None):          if msg is None:              msg = '%r not greater than or equal to %r' % (got, expected)          self.assertTrue(got >= expected, msg) + + +def expect_warnings(ydl, warnings_re): +    real_warning = ydl.report_warning + +    def _report_warning(w): +        if not any(re.search(w_re, w) for w_re in warnings_re): +            real_warning(w) + +    ydl.report_warning = _report_warning | 
