From 2f7b654d5757ea21ece14664382f04ce0be723a4 Mon Sep 17 00:00:00 2001 From: s3lph <1375407-s3lph@users.noreply.gitlab.com> Date: Fri, 15 Apr 2022 23:40:11 +0200 Subject: [PATCH] Add config parsing unit tests --- multischleuder/conflict.py | 6 +- multischleuder/main.py | 6 +- multischleuder/test/test_config.py | 127 +++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 5 deletions(-) create mode 100644 multischleuder/test/test_config.py diff --git a/multischleuder/conflict.py b/multischleuder/conflict.py index 8c8c4bd..44a2bd0 100644 --- a/multischleuder/conflict.py +++ b/multischleuder/conflict.py @@ -107,7 +107,7 @@ class ConflictMessage: class KeyConflictResolution: - def __init__(self, smtp: 'SmtpClient', interval: int, statefile: str, template: str): + def __init__(self, smtp: SmtpClient, interval: int, statefile: str, template: str): self._smtp = smtp self._interval: int = interval self._state_file: str = statefile @@ -118,7 +118,7 @@ class KeyConflictResolution: def resolve(self, target: str, mail_from: str, - subscriptions: List['SchleuderSubscriber']) -> List['SchleuderSubscriber']: + subscriptions: List[SchleuderSubscriber]) -> List[SchleuderSubscriber]: subs: Dict[str, List[SchleuderSubscriber]] = OrderedDict() for s in subscriptions: subs.setdefault(s.email, []).append(s) @@ -128,7 +128,7 @@ class KeyConflictResolution: def _resolve(self, target: str, mail_from: str, - subscriptions: List['SchleuderSubscriber']) -> 'SchleuderSubscriber': + subscriptions: List[SchleuderSubscriber]) -> SchleuderSubscriber: if len(subscriptions) == 1: return subscriptions[0] if len({s.key.blob for s in subscriptions}) == 1: diff --git a/multischleuder/main.py b/multischleuder/main.py index f8a32e6..c4e415f 100644 --- a/multischleuder/main.py +++ b/multischleuder/main.py @@ -5,6 +5,7 @@ import argparse import yaml +from multischleuder import __version__ from multischleuder.api import SchleuderApi from multischleuder.conflict import KeyConflictResolution from multischleuder.processor import MultiList @@ -39,13 +40,13 @@ def parse_config(ns: argparse.Namespace) -> List['MultiList']: api.dry_run() smtp_config = c.get('smtp', {}) - smtp = SmtpClient.parse(**smtp_config) + smtp = SmtpClient.parse(smtp_config) kcr_config = c.get('conflict', {}) kcr = KeyConflictResolution(smtp, **kcr_config) lists = [] - for clist in c['lists']: + for clist in c.get('lists', []): ml = parse_list_config(api, kcr, clist) lists.append(ml) return lists @@ -56,6 +57,7 @@ def main(): ap.add_argument('--config', '-c', type=str, default='/etc/multischleuder/config.yml') ap.add_argument('--dry-run', '-n', action='store_true', default=False) ap.add_argument('--verbose', '-v', action='store_true', default=False) + ap.add_argument('--version', action='version', version=__version__) ns = ap.parse_args(sys.argv[1:]) if ns.verbose: logger = logging.getLogger().setLevel('DEBUG') diff --git a/multischleuder/test/test_config.py b/multischleuder/test/test_config.py new file mode 100644 index 0000000..0672d88 --- /dev/null +++ b/multischleuder/test/test_config.py @@ -0,0 +1,127 @@ + +import unittest +from unittest.mock import MagicMock, mock_open, patch + +from multischleuder.main import parse_config, parse_list_config +from multischleuder.test.test_api import _KEY_RESPONSE, _LIST_RESPONSE, _SUBSCRIBER_RESPONSE + + +_MINIMAL = ''' +api: + url: https://localhost:4443 + token: securetoken +conflict: + interval: 3600 + statefile: /tmp/state.json + template: '' +''' + + +_CONFIG = '''--- + +api: + url: https://localhost:4443 + token: securetoken + cafile: /tmp/ca.pem + +smtp: + host: smtp.example.org + port: 26 + tls: STARTTLS + username: multischleuder@example.org + password: supersecurepassword + +conflict: + interval: 3600 + statefile: /tmp/state.json + template: | + Dear {subscriber} + This is a test and should not be used in production: + {affected} + If you ever receive this text via email, notify your admin: + {chosen} + Regards, {schleuder} + +lists: + + - target: test-global@schleuder.example.org + from: test-global-owner@schleuder.example.org + sources: + - test-north@schleuder.example.org + - test-east@schleuder.example.org + - test-south@schleuder.example.org + - test-west@schleuder.example.org + unmanaged: + - admin@example.org + banned: + - aspammer@example.org + - anotherspammer@example.org + + - target: test2-global@schleuder.example.org + from: test2-global-owner@schleuder.example.org + sources: + - test-north@schleuder.example.org + - test-south@schleuder.example.org + unmanaged: + - admin@example.org + - admin2@example.org + banned: [] + +''' + + +class TestSchleuderTypes(unittest.TestCase): + + def test_parse_minimal_config(self): + ns = MagicMock() + ns.config = '/tmp/config.yml' + ns.dry_run = False + ns.verbose = False + with patch('builtins.open', mock_open(read_data=_MINIMAL)) as mock: + lists = parse_config(ns) + self.assertEqual(0, len(lists)) + + def test_parse_config(self): + ns = MagicMock() + ns.config = '/tmp/config.yml' + ns.dry_run = False + ns.verbose = False + with patch('builtins.open', mock_open(read_data=_CONFIG)) as mock: + lists = parse_config(ns) + + self.assertEqual(2, len(lists)) + list1, list2 = lists + self.assertEqual('https://localhost:4443', list1._api._url) + self.assertEqual('Basic c2NobGV1ZGVyOnNlY3VyZXRva2Vu', list2._api._headers['Authorization']) + self.assertEqual('/tmp/ca.pem', list1._api._cafile) + self.assertEqual(False, list1._api._dry_run) + self.assertEqual(3600, list2._kcr._interval) + self.assertEqual('/tmp/state.json', list1._kcr._state_file) + self.assertIn('Regards, {schleuder}', list2._kcr._template) + + self.assertEqual('test-global@schleuder.example.org', list1._target) + self.assertEqual('test-global-owner@schleuder.example.org', list1._mail_from) + self.assertEqual(['admin@example.org'], list1._unmanaged) + self.assertEqual(['aspammer@example.org', 'anotherspammer@example.org'], list1._banned) + self.assertEqual(4, len(list1._sources)) + self.assertIn('test-north@schleuder.example.org', list1._sources) + self.assertIn('test-east@schleuder.example.org', list1._sources) + self.assertIn('test-south@schleuder.example.org', list1._sources) + self.assertIn('test-west@schleuder.example.org', list1._sources) + + self.assertEqual('test2-global@schleuder.example.org', list2._target) + self.assertEqual('test2-global-owner@schleuder.example.org', list2._mail_from) + self.assertEqual(['admin@example.org', 'admin2@example.org'], list2._unmanaged) + self.assertEqual([], list2._banned) + self.assertEqual(2, len(list2._sources)) + self.assertIn('test-north@schleuder.example.org', list2._sources) + self.assertIn('test-south@schleuder.example.org', list2._sources) + + def test_parse_dry_run(self): + ns = MagicMock() + ns.config = '/tmp/config.yml' + ns.dry_run = True + ns.verbose = False + with patch('builtins.open', mock_open(read_data=_CONFIG)) as mock: + lists = parse_config(ns) + self.assertEqual(True, lists[0]._api._dry_run)