You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.9 KiB
82 lines
2.9 KiB
import unittest
|
|
|
|
from britney2 import Suite, Suites, SuiteClass
|
|
from britney2.hints import HintParser, single_hint_taking_list_of_packages
|
|
from britney2.migrationitem import MigrationItemFactory
|
|
|
|
from . import HINTS_ALL, TEST_HINTER
|
|
|
|
SUITES = Suites(
|
|
Suite(SuiteClass.TARGET_SUITE, 'testing', "/somewhere/target", ''),
|
|
[Suite(SuiteClass.PRIMARY_SOURCE_SUITE, 'unstable', "/somewhere/source", '')],
|
|
)
|
|
|
|
|
|
def new_hint_parser():
|
|
mi_factory = MigrationItemFactory(SUITES)
|
|
return HintParser(mi_factory)
|
|
|
|
|
|
def parse_should_not_call_this_function(*args, **kwargs):
|
|
raise AssertionError("Should not be called")
|
|
|
|
|
|
class HintParsing(unittest.TestCase):
|
|
|
|
def test_parse_invalid_hints(self):
|
|
hint_parser = new_hint_parser()
|
|
|
|
hint_parser.register_hint_type('min-10-arg', parse_should_not_call_this_function, min_args=10)
|
|
hint_parser.register_hint_type('simple-hint', parse_should_not_call_this_function)
|
|
|
|
tests = [
|
|
{
|
|
'hint_text': 'min-10-arg foo bar',
|
|
'permissions': HINTS_ALL,
|
|
'error_message_contains': 'Needs at least 10 argument(s), got'
|
|
},
|
|
{
|
|
'hint_text': 'undefined-hint with some arguments',
|
|
'permissions': HINTS_ALL,
|
|
'error_message_contains': 'Unknown hint found in'
|
|
},
|
|
{
|
|
'hint_text': 'simple-hint foo/1.0',
|
|
'permissions': ['not-this-hint'],
|
|
'error_message_contains': 'not a part of the permitted hints for'
|
|
},
|
|
]
|
|
|
|
for test in tests:
|
|
with self.assertLogs() as cm:
|
|
hint_parser.parse_hints(TEST_HINTER, test['permissions'], 'test-parse-hint', [test['hint_text']])
|
|
|
|
assert len(cm.output) == 1
|
|
assert test['error_message_contains'] in cm.output[0]
|
|
assert hint_parser.hints.is_empty
|
|
|
|
def test_alias(self):
|
|
hint_parser = new_hint_parser()
|
|
hint_parser.register_hint_type('real-name',
|
|
single_hint_taking_list_of_packages,
|
|
aliases=['alias1', 'alias2']
|
|
)
|
|
hint_parser.parse_hints(TEST_HINTER,
|
|
HINTS_ALL,
|
|
'test-parse-hint',
|
|
[
|
|
'alias1 foo/1.0',
|
|
'alias2 bar/2.0',
|
|
])
|
|
hints = hint_parser.hints
|
|
# Aliased hints can be found by the real name
|
|
assert hints.search(type='real-name', package='foo', version='1.0')
|
|
assert hints.search(type='real-name', package='bar', version='2.0')
|
|
# But not by their alias
|
|
assert not hints.search(type='alias1', package='foo', version='1.0')
|
|
assert not hints.search(type='alias2', package='bar', version='2.0')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|