Page MenuHomePhabricator

test_recentchanges_default and test_recentchanges_ns_default fails on autoblock user IDs
Closed, ResolvedPublic

Description

See https://travis-ci.org/wikimedia/pywikibot/jobs/514032926
see also: https://api.travis-ci.org/v3/job/517082653/log.txt

=================================== FAILURES ===================================
_______________ TestFactoryGenerator.test_recentchanges_default ________________

self = <tests.pagegenerators_tests.TestFactoryGenerator testMethod=test_recentchanges_default>

    def test_recentchanges_default(self):
        """Test recentchanges generator with default setting."""
        gf = pagegenerators.GeneratorFactory(site=self.site)
        gf.handleArg('-recentchanges:60')
        gen = gf.getCombinedGenerator()
        self.assertIsNotNone(gen)
>       self.assertPagesInNamespacesAll(gen, {0, 1, 2}, skip=True)

tests/pagegenerators_tests.py:1014: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/aspects.py:252: in assertPagesInNamespacesAll
    page_namespaces = [page.namespace() for page in gen]
tests/aspects.py:252: in <listcomp>
    page_namespaces = [page.namespace() for page in gen]
pywikibot/tools/__init__.py:1161: in filter_unique
    if (key(item) if key else item) not in container:
pywikibot/pagegenerators.py:422: in <lambda>
    filter_unique, key=lambda page: '{}:{}:{}'.format(*page._cmpkey()))
pywikibot/page.py:413: in _cmpkey
    return (self.site, self.namespace(), self.title())
pywikibot/page.py:220: in site
    return self._link.site
pywikibot/page.py:5755: in site
    self.parse()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[InvalidTitle("'User:#11' has no title.") raised in repr()] Link object at 0x7f601f32b278>

    def parse(self):
        """
        Parse wikitext of the link.
    
        Called internally when accessing attributes.
        """
        self._site = self._source
        self._namespace = self._defaultns
        self._is_interwiki = False
        ns_prefix = False
    
        old_position = int(self._text.startswith(':'))
        colon_position = self._text.find(':', old_position)
        first_other_site = None
        while colon_position >= 0:
            prefix = self._text[old_position:colon_position].lower()
            # All spaces after a prefix are discarded
            colon_position += 1
            while (len(self._text) > colon_position
                    and self._text[colon_position] == ' '):
                colon_position += 1
            ns = self._site.namespaces.lookup_name(prefix)
            if ns:
                if len(self._text) <= colon_position:
                    raise pywikibot.InvalidTitle(
                        "'{0}' has no title.".format(self._text))
                self._namespace = ns
                ns_prefix = True
                old_position = colon_position
                break
    
            try:
                newsite = self._site.interwiki(prefix)
            except KeyError:
                break  # text before : doesn't match any known prefix
            except SiteDefinitionError as e:
                raise SiteDefinitionError(
                    '{0} is not a local page on {1}, and the interwiki '
                    'prefix {2} is not supported by Pywikibot!\n{3}'
                    .format(self._text, self._site, prefix, e))
            else:
                if first_other_site:
                    if not self._site.local_interwiki(prefix):
                        raise pywikibot.InvalidTitle(
                            '{0} links to a non local site {1} via an '
                            'interwiki link to {2}.'.format(
                                self._text, newsite, first_other_site))
                elif newsite != self._source:
                    first_other_site = newsite
                self._site = newsite
                self._is_interwiki = True
            old_position = colon_position
            colon_position = self._text.find(':', old_position)
    
        # Remove any namespaces/interwiki prefixes
        t = self._text[old_position:]
    
        if '#' in t:
            t, sec = t.split('#', 1)
            t, self._section = t.rstrip(), sec.lstrip()
        else:
            self._section = None
    
        if ns_prefix:
            # 'namespace:' is not a valid title
            if not t:
                raise pywikibot.InvalidTitle(
>                   "'{0}' has no title.".format(self._text))
E               pywikibot.exceptions.InvalidTitle: 'User:#11' has no title.

pywikibot/page.py:5694: InvalidTitle
______________ TestFactoryGenerator.test_recentchanges_ns_default ______________

self = <tests.pagegenerators_tests.TestFactoryGenerator testMethod=test_recentchanges_ns_default>

    def test_recentchanges_ns_default(self):
        """Test recentchanges generator."""
        gf = pagegenerators.GeneratorFactory(site=self.site)
        gf.handleArg('-recentchanges:50')
        gen = gf.getCombinedGenerator()
        self.assertIsNotNone(gen)
>       self.assertPagesInNamespacesAll(gen, {0, 1, 2}, skip=True)

tests/pagegenerators_tests.py:1030: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
tests/aspects.py:252: in assertPagesInNamespacesAll
    page_namespaces = [page.namespace() for page in gen]
tests/aspects.py:252: in <listcomp>
    page_namespaces = [page.namespace() for page in gen]
pywikibot/tools/__init__.py:1161: in filter_unique
    if (key(item) if key else item) not in container:
pywikibot/pagegenerators.py:422: in <lambda>
    filter_unique, key=lambda page: '{}:{}:{}'.format(*page._cmpkey()))
pywikibot/page.py:413: in _cmpkey
    return (self.site, self.namespace(), self.title())
pywikibot/page.py:220: in site
    return self._link.site
pywikibot/page.py:5755: in site
    self.parse()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <[InvalidTitle("'User:#11' has no title.") raised in repr()] Link object at 0x7f601f1e3d30>

    def parse(self):
        """
        Parse wikitext of the link.
    
        Called internally when accessing attributes.
        """
        self._site = self._source
        self._namespace = self._defaultns
        self._is_interwiki = False
        ns_prefix = False
    
        old_position = int(self._text.startswith(':'))
        colon_position = self._text.find(':', old_position)
        first_other_site = None
        while colon_position >= 0:
            prefix = self._text[old_position:colon_position].lower()
            # All spaces after a prefix are discarded
            colon_position += 1
            while (len(self._text) > colon_position
                    and self._text[colon_position] == ' '):
                colon_position += 1
            ns = self._site.namespaces.lookup_name(prefix)
            if ns:
                if len(self._text) <= colon_position:
                    raise pywikibot.InvalidTitle(
                        "'{0}' has no title.".format(self._text))
                self._namespace = ns
                ns_prefix = True
                old_position = colon_position
                break
    
            try:
                newsite = self._site.interwiki(prefix)
            except KeyError:
                break  # text before : doesn't match any known prefix
            except SiteDefinitionError as e:
                raise SiteDefinitionError(
                    '{0} is not a local page on {1}, and the interwiki '
                    'prefix {2} is not supported by Pywikibot!\n{3}'
                    .format(self._text, self._site, prefix, e))
            else:
                if first_other_site:
                    if not self._site.local_interwiki(prefix):
                        raise pywikibot.InvalidTitle(
                            '{0} links to a non local site {1} via an '
                            'interwiki link to {2}.'.format(
                                self._text, newsite, first_other_site))
                elif newsite != self._source:
                    first_other_site = newsite
                self._site = newsite
                self._is_interwiki = True
            old_position = colon_position
            colon_position = self._text.find(':', old_position)
    
        # Remove any namespaces/interwiki prefixes
        t = self._text[old_position:]
    
        if '#' in t:
            t, sec = t.split('#', 1)
            t, self._section = t.rstrip(), sec.lstrip()
        else:
            self._section = None
    
        if ns_prefix:
            # 'namespace:' is not a valid title
            if not t:
                raise pywikibot.InvalidTitle(
>                   "'{0}' has no title.".format(self._text))
E               pywikibot.exceptions.InvalidTitle: 'User:#11' has no title.

pywikibot/page.py:5694: InvalidTitle

See also T195730

Event Timeline

Xqt triaged this task as High priority.Apr 1 2019, 12:26 PM

Yeah, this is still an issue, but once it will hide from RC, the tests will pass again. Not sure what to do here anyway.

Yeah, this is still an issue, but once it will hide from RC, the tests will pass again. Not sure what to do here anyway.

Two ideas:

  • skip these tests on wsbeta and wpbeta
  • improve the hashmethod not to fail with autoblock user titles

Change 502192 had a related patch set uploaded (by Xqt; owner: Xqt):
[pywikibot/core@master] [tests] Skip some tests for wpbeta and wsbeta

https://gerrit.wikimedia.org/r/502192

Change 502192 merged by jenkins-bot:
[pywikibot/core@master] [tests] Skip some tests for wpbeta and wsbeta

https://gerrit.wikimedia.org/r/502192