def test_submodules(self): """Test another module apart from query having submodules.""" pi = api.ParamInfo(self.site) self.assertFalse(pi._modules) pi.fetch(['query']) self.assertIn('query', pi._modules) self.assertIsInstance(pi._modules['query'], frozenset) self.assertIn('revisions', pi._modules['query']) self.assertEqual(pi.submodules('query'), pi.query_modules) for mod in pi.submodules('query', True): self.assertEqual(mod[:6], 'query+') self.assertEqual(mod[6:], pi[mod]['name']) self.assertEqual(mod, pi[mod]['path']) with patch.object(pywikibot, 'warning') as w: self.assertRaises(KeyError, pi.__getitem__, 'query+foobar') # The warning message may be different with older MW versions. self.assertIn('API warning (paraminfo): ', w.call_args[0][0]) self.assertRaises(KeyError, pi.submodules, 'edit')
def test_init_query_first(self): """Test init where it first adds query and then main.""" def patched_generate_submodules(modules): # Change the query such that query is handled before main modules = set(modules) if 'main' in modules: assert 'query' in modules modules.discard('main') modules = list(modules) + ['main'] else: assert 'query' not in modules original_generate_submodules(modules) pi = api.ParamInfo(self.site, {'query', 'main'}) self.assertIsEmpty(pi) original_generate_submodules = pi._generate_submodules pi._generate_submodules = patched_generate_submodules pi._init() self.assertIn('main', pi._paraminfo) self.assertIn('query', pi._paraminfo)
def test_with_invalid_module(self): """Test requesting different kind of invalid modules.""" site = self.get_site() pi = api.ParamInfo(site) self.assertIsEmpty(pi) with patch.object(pywikibot, 'warning') as w: pi.fetch('foobar') with self.assertRaises(KeyError): pi.__getitem__('foobar') with self.assertRaises(KeyError): pi.__getitem__('foobar+foobar') # The warning message may be different with older MW versions. self.assertIn('API warning (paraminfo): ', w.call_args[0][0]) self.assertNotIn('foobar', pi._paraminfo) self.assertIn('main', pi._paraminfo) self.assertIn('paraminfo', pi._paraminfo) self.assertLength(pi, pi.preloaded_modules)
def test_other_submodule(self): """Test another module apart from query having submodules.""" pi = api.ParamInfo(self.site) self.assertFalse(pi._modules) pi.fetch(['query']) self.assertNotIn('flow', pi._modules) pi.fetch(['flow']) self.assertIn('flow', pi._modules) other_modules = set() for modules in pi._modules.values(): self.assertIsInstance(modules, frozenset) other_modules |= modules other_modules -= pi.action_modules other_modules -= pi.query_modules self.assertLessEqual(other_modules & pi.submodules('flow'), pi.submodules('flow')) with suppress_warnings( r'pywikibot.data.api.ParamInfo.modules is deprecated; ' r'use submodules\(\) or module_paths instead.'): self.assertFalse(other_modules & pi.modules)
def test_with_module_revisions(self): site = self.get_site() pi = api.ParamInfo(site) self.assertEqual(len(pi), 0) pi.fetch(['revisions']) self.assertIn('revisions', pi) self.assertIn('main', pi) self.assertIn('paraminfo', pi) self.assertEqual(len(pi), 1 + len(pi.preloaded_modules)) self.assertEqual(pi['revisions']['prefix'], 'rv') param = pi.parameter('revisions', 'prop') self.assertIsInstance(param, dict) self.assertEqual(param['name'], 'prop') self.assertNotIn('deprecated', param) self.assertIsInstance(param['type'], list) self.assertIn('user', param['type'])
def test_with_invalid_module(self): """Test requesting different kind of invalid modules.""" site = self.get_site() pi = api.ParamInfo(site) self.assertEqual(len(pi), 0) with patch.object(pywikibot, 'warning') as w: pi.fetch('foobar') self.assertRaises(KeyError, pi.__getitem__, 'foobar') self.assertRaises(KeyError, pi.__getitem__, 'foobar+foobar') # The warning message may be different with older MW versions. self.assertIn('API warning (paraminfo): ', w.call_args[0][0]) self.assertNotIn('foobar', pi._paraminfo) self.assertIn('main', pi._paraminfo) self.assertIn('paraminfo', pi._paraminfo) if self.site.mw_version < '1.12': return self.assertEqual(len(pi), len(pi.preloaded_modules))
def test_with_module_revisions(self): """Test requesting the module revisions.""" site = self.get_site() pi = api.ParamInfo(site) self.assertIsEmpty(pi) pi.fetch(['revisions']) self.assertIn('query+revisions', pi._paraminfo) self.assertIn('main', pi._paraminfo) self.assertIn('paraminfo', pi._paraminfo) self.assertLength(pi, 1 + len(pi.preloaded_modules)) self.assertEqual(pi['revisions']['prefix'], 'rv') param = pi.parameter('revisions', 'prop') self.assertIsInstance(param, dict) self.assertEqual(param['name'], 'prop') self.assertNotIn('deprecated', param) self.assertIsInstance(param['type'], list) self.assertIn('user', param['type'])
def test_with_module_info(self): """Test requesting the module info.""" site = self.get_site() pi = api.ParamInfo(site) self.assertEqual(len(pi), 0) pi.fetch(['info']) self.assertIn('query+info', pi._paraminfo) self.assertIn('main', pi._paraminfo) self.assertIn('paraminfo', pi._paraminfo) self.assertEqual(len(pi), 1 + len(pi.preloaded_modules)) self.assertEqual(pi['info']['prefix'], 'in') param = pi.parameter('info', 'prop') self.assertIsInstance(param, dict) self.assertEqual(param['name'], 'prop') self.assertNotIn('deprecated', param) self.assertIsInstance(param['type'], list) self.assertIn('protection', param['type'])
def test_with_invalid_module(self): """Test requesting different kind of invalid modules.""" site = self.get_site() pi = api.ParamInfo(site) self.assertEqual(len(pi), 0) with patch.object(pywikibot, 'warning') as w: pi.fetch('foobar') self.assertRaises(KeyError, pi.__getitem__, 'foobar') self.assertRaises(KeyError, pi.__getitem__, 'foobar+foobar') # The warning message does not end with a '.' in older MW versions. self.assertIn( 'API warning (paraminfo): ' 'The module "main" does not have a submodule "foobar"', w.call_args[0][0]) self.assertNotIn('foobar', pi._paraminfo) self.assertIn('main', pi._paraminfo) self.assertIn('paraminfo', pi._paraminfo) if MediaWikiVersion(self.site.version()) < MediaWikiVersion("1.12"): return self.assertEqual(len(pi), len(pi.preloaded_modules))
def test_init_pageset(self): """Test initializing with only the pageset.""" site = self.get_site() self.assertNotIn('query', api.ParamInfo.init_modules) pi = api.ParamInfo(site, {'pageset'}) self.assertNotIn('query', api.ParamInfo.init_modules) self.assertIsEmpty(pi) pi._init() self.assertIn('main', pi._paraminfo) self.assertIn('paraminfo', pi._paraminfo) self.assertIn('pageset', pi._paraminfo) if 'query' in pi.preloaded_modules: self.assertIn('query', pi._paraminfo) self.assertLength(pi, 4) else: self.assertNotIn('query', pi._paraminfo) self.assertLength(pi, 3) self.assertLength(pi, pi.preloaded_modules) generators_param = pi.parameter('pageset', 'generator') self.assertGreater(len(generators_param['type']), 1)
def test_query_modules_with_limits(self): """Test query_modules_with_limits property.""" site = self.get_site() pi = api.ParamInfo(site) self.assertIn('revisions', pi.query_modules_with_limits) self.assertNotIn('info', pi.query_modules_with_limits)