diff --git a/.gitignore b/.gitignore index b6e4761..36e68da 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,6 @@ dmypy.json # Pyre type checker .pyre/ + +# Bazel local cache/files ignore. +bazel-* \ No newline at end of file diff --git a/WORKSPACE b/WORKSPACE index 5960a4c..9712e76 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,11 +1,12 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +# Load python specific bazel rules. http_archive( name = "rules_python", url = "https://github.com/bazelbuild/rules_python/releases/download/0.1.0/rules_python-0.1.0.tar.gz", sha256 = "b6d46438523a3ec0f3cead544190ee13223a52f6a6765a29eae7b7cc24cc83a0", ) - load("@rules_python//python:pip.bzl", "pip_install") pip_install( diff --git a/wgkex/worker/BUILD b/wgkex/worker/BUILD index 49cd760..d62932b 100644 --- a/wgkex/worker/BUILD +++ b/wgkex/worker/BUILD @@ -45,3 +45,21 @@ py_test( requirement("mock"), ], ) + +py_binary( + name = "app", + srcs = ["app.py"], + deps = [ + ":mqtt", + "//wgkex/config:config", + ], +) + +py_test( + name = "app_test", + srcs = ["app_test.py"], + deps = [ + ":app", + requirement("mock"), + ], +) diff --git a/wgkex/worker/app.py b/wgkex/worker/app.py index 3c826a0..7f91a2f 100644 --- a/wgkex/worker/app.py +++ b/wgkex/worker/app.py @@ -1,15 +1,27 @@ -#!/usr/bin/env python3 +"""Initialises the MQTT worker.""" +import wgkex.config.config as config +from wgkex.worker import mqtt -from wgkex.config import load_config -from wgkex.worker.mqtt import connect as mqtt -config = load_config() +class Error(Exception): + """Base Exception handling class.""" -def main(): +class DomainsNotInConfig(Error): + """If no domains exist in configuration file.""" + - mqtt(config.get("domains")) +def main(): + """Starts MQTT listener. + + Raises: + DomainsNotInConfig: If no domains were found in configuration file. + """ + domains = config.load_config().get("domains") + if not domains: + raise DomainsNotInConfig("Could not locate domains in configuration.") + mqtt.connect(domains) if __name__ == "__main__": diff --git a/wgkex/worker/app_test.py b/wgkex/worker/app_test.py new file mode 100644 index 0000000..b4f7366 --- /dev/null +++ b/wgkex/worker/app_test.py @@ -0,0 +1,28 @@ +"""Unit tests for app.py""" +import unittest +import mock +import app + + +class AppTest(unittest.TestCase): + @mock.patch.object(app.config, "load_config") + @mock.patch.object(app.mqtt, "connect", autospec=True) + def test_main_success(self, connect_mock, config_mock): + """Ensure we can execute main.""" + connect_mock.return_value = None + config_mock.return_value = dict(domains=["domain.one"]) + app.main() + connect_mock.assert_called_with(["domain.one"]) + + @mock.patch.object(app.config, "load_config") + @mock.patch.object(app.mqtt, "connect", autospec=True) + def test_main_fails_no_domain(self, connect_mock, config_mock): + """Ensure we fail when domains are not configured.""" + connect_mock.return_value = None + config_mock.return_value = dict(domains=None) + with self.assertRaises(app.DomainsNotInConfig): + app.main() + + +if __name__ == "__main__": + unittest.main()