Add tools/test-lib.
This starts to add direct test coverage on
zulip_bots/zulip_bots/lib.py.
It is not yet integrated into tools/test-main.
MODIFY
tools/run-mypy
tools/run-mypy
@@ -28,6 +28,8 @@ exclude = [
# Excluded out of laziness:
"zulip_bots/zulip_bots/terminal.py",
"zulip_bots/zulip_bots/simple_lib.py",
+ "zulip_bots/zulip_bots/lib_tests.py",
+ "tools/test-lib",
]
parser = argparse.ArgumentParser(description="Run mypy on files tracked by git.")

ADD
tools/test-lib
+#!/usr/bin/env python
+
+import coverage
+import os
+import sys
+import unittest
+
+from importlib import import_module
+
+def run_all():
+ TOOLS_DIR = os.path.dirname(os.path.abspath(__file__))
+ ROOT_DIR = os.path.abspath(os.path.join(TOOLS_DIR, '..'))
+ BOTS_DIR = os.path.join(ROOT_DIR, 'zulib_bots')
+ sys.path.insert(0, BOTS_DIR)
+
+ cov = coverage.Coverage(config_file="tools/.coveragerc")
+ cov.start()
+
+ module = import_module('zulip_bots.lib_tests')
+ suite = unittest.defaultTestLoader.loadTestsFromModule(module)
+
+ suite = unittest.TestSuite([suite])
+ runner = unittest.TextTestRunner(verbosity=2)
+ result = runner.run(suite)
+ if result.failures or result.errors:
+ sys.exit(1)
+
+ cov.stop()
+ cov.data_suffix = False # Disable suffix so that filename is .coverage
+ cov.save()
+ cov.html_report()
+ print("HTML report saved under directory 'htmlcov'.")
+
+if __name__ == '__main__':
+ run_all()

ADD
zulip_bots/zulip_bots/lib_tests.py
+from unittest import TestCase
+from zulip_bots.lib import (
+ ExternalBotHandler,
+ StateHandler,
+)
+
+class FakeClient:
+ def __init__(self):
+ self.storage = dict()
+
+ def get_profile(self):
+ return dict(
+ user_id='alice',
+ full_name='Alice',
+ email='alice@example.com',
+ )
+
+ def update_storage(self, payload):
+ new_data = payload['storage']
+ self.storage.update(new_data)
+
+ return dict(
+ result='success',
+ )
+
+ def get_storage(self):
+ return dict(
+ result='success',
+ storage=self.storage,
+ )
+
+ def send_message(self, message):
+ pass
+
+class LibTest(TestCase):
+ def test_basics(self):
+ client = FakeClient()
+
+ handler = ExternalBotHandler(
+ client=client,
+ root_dir=None,
+ bot_details=None,
+ bot_config_file=None
+ )
+
+ message = None
+ handler.send_message(message)
+
+ def test_state_handler(self):
+ client = FakeClient()
+
+ state_handler = StateHandler(client)
+ state_handler.put('key', [1, 2, 3])
+ val = state_handler.get('key')
+ self.assertEqual(val, [1, 2, 3])
+
+ # force us to get non-cached values
+ state_handler = StateHandler(client)
+ val = state_handler.get('key')
+ self.assertEqual(val, [1, 2, 3])

Add tools/test-lib.

This starts to add direct test coverage on
zulip_bots/zulip_bots/lib.py.

It is not yet integrated into tools/test-main.