From 00849aa4fa89bde6e2e26ba023622178178fd348 Mon Sep 17 00:00:00 2001 From: Tobi-wan Kenobi Date: Sun, 5 Mar 2017 13:01:28 +0100 Subject: [PATCH] [tests] Refactor setting up complex I/O mocking for modules Modules now only have to have a single setup/teardown line in their code to fully set up the I/O part of a test. --- tests/mocks.py | 25 +++++++++++++++++++++++-- tests/modules/test_brightness.py | 22 +++------------------- tests/modules/test_caffeine.py | 22 +++------------------- tests/modules/test_cmus.py | 22 +++------------------- tests/modules/test_cpu.py | 21 +++------------------ 5 files changed, 35 insertions(+), 77 deletions(-) diff --git a/tests/mocks.py b/tests/mocks.py index 5097e65..f5be753 100644 --- a/tests/mocks.py +++ b/tests/mocks.py @@ -3,15 +3,36 @@ import mock import json import shlex +import random import subprocess +from bumblebee.input import I3BarInput from bumblebee.output import Widget - -import random +from bumblebee.config import Config def rand(cnt): return "".join(random.choice("abcdefghijklmnopqrstuvwxyz0123456789") for i in range(cnt)) +def setup_test(test, Module): + test._stdin, test._select, test.stdin, test.select = epoll_mock("bumblebee.input") + + test.popen = MockPopen() + + test.config = Config() + test.input = I3BarInput() + test.engine = mock.Mock() + test.engine.input = test.input + test.input.need_event = True + test.module = Module(engine=test.engine, config={ "config": test.config }) + for widget in test.module.widgets(): + widget.link_module(test.module) + test.anyWidget = widget + +def teardown_test(test): + test._stdin.stop() + test._select.stop() + test.popen.cleanup() + def epoll_mock(module=""): if len(module) > 0: module = "{}.".format(module) diff --git a/tests/modules/test_brightness.py b/tests/modules/test_brightness.py index 81cc49a..b636d44 100644 --- a/tests/modules/test_brightness.py +++ b/tests/modules/test_brightness.py @@ -10,31 +10,15 @@ except ImportError: import tests.mocks as mocks -from bumblebee.config import Config -from bumblebee.input import I3BarInput, WHEEL_UP, WHEEL_DOWN +from bumblebee.input import WHEEL_UP, WHEEL_DOWN from bumblebee.modules.brightness import Module class TestBrightnessModule(unittest.TestCase): def setUp(self): - self._stdin, self._select, self.stdin, self.select = mocks.epoll_mock("bumblebee.input") - - self.popen = mocks.MockPopen() - - self.config = Config() - self.input = I3BarInput() - self.engine = mock.Mock() - self.engine.input = self.input - self.input.need_event = True - - self.module = Module(engine=self.engine, config={ "config": self.config }) - for widget in self.module.widgets(): - widget.link_module(self.module) - self.anyWidget = widget + mocks.setup_test(self, Module) def tearDown(self): - self._stdin.stop() - self._select.stop() - self.popen.cleanup() + mocks.teardown_test(self) def test_format(self): for widget in self.module.widgets(): diff --git a/tests/modules/test_caffeine.py b/tests/modules/test_caffeine.py index 6eaf228..e95e2ac 100644 --- a/tests/modules/test_caffeine.py +++ b/tests/modules/test_caffeine.py @@ -11,35 +11,19 @@ except ImportError: import tests.mocks as mocks -import bumblebee.input from bumblebee.config import Config -from bumblebee.input import I3BarInput, LEFT_MOUSE +from bumblebee.input import LEFT_MOUSE from bumblebee.modules.caffeine import Module class TestCaffeineModule(unittest.TestCase): def setUp(self): - self._stdin, self._select, self.stdin, self.select = mocks.epoll_mock("bumblebee.input") - - self.popen = mocks.MockPopen() - - self.input = I3BarInput() - self.engine = mock.Mock() - self.config = Config() - self.engine.input = self.input - self.engine.input.need_event = True - - self.module = Module(engine=self.engine, config={ "config": self.config }) - for widget in self.module.widgets(): - widget.link_module(self.module) - self.anyWidget = widget + mocks.setup_test(self, Module) self.xset_active = " timeout: 0 cycle: 123" self.xset_inactive = " timeout: 600 cycle: 123" def tearDown(self): - self._stdin.stop() - self._select.stop() - self.popen.cleanup() + mocks.teardown_test(self) def test_text(self): self.assertEquals(self.module.caffeine(self.anyWidget), "") diff --git a/tests/modules/test_cmus.py b/tests/modules/test_cmus.py index 01afdb4..e7118d1 100644 --- a/tests/modules/test_cmus.py +++ b/tests/modules/test_cmus.py @@ -5,26 +5,12 @@ import unittest import tests.mocks as mocks -from bumblebee.config import Config -from bumblebee.input import I3BarInput, LEFT_MOUSE +from bumblebee.input import LEFT_MOUSE from bumblebee.modules.cmus import Module class TestCmusModule(unittest.TestCase): def setUp(self): - self._stdin, self._select, self.stdin, self.select = mocks.epoll_mock("bumblebee.input") - - self.popen = mocks.MockPopen() - - self.config = Config() - self.input = I3BarInput() - self.engine = mock.Mock() - self.engine.input = self.input - self.input.need_event = True - - self.module = Module(engine=self.engine, config={ "config": self.config }) - for widget in self.module.widgets(): - widget.link_module(self.module) - self.anyWidget = widget + mocks.setup_test(self, Module) self.songTemplate = """ status {status} @@ -40,9 +26,7 @@ tag comment comment """ def tearDown(self): - self._stdin.stop() - self._select.stop() - self.popen.cleanup() + mocks.teardown_test(self) def test_read_song(self): self.popen.mock.communicate.return_value = ("song", None) diff --git a/tests/modules/test_cpu.py b/tests/modules/test_cpu.py index b53d2ad..da1d069 100644 --- a/tests/modules/test_cpu.py +++ b/tests/modules/test_cpu.py @@ -6,33 +6,18 @@ import mock import tests.mocks as mocks -from bumblebee.config import Config -from bumblebee.input import I3BarInput, LEFT_MOUSE +from bumblebee.input import LEFT_MOUSE from bumblebee.modules.cpu import Module class TestCPUModule(unittest.TestCase): def setUp(self): - self._stdin, self._select, self.stdin, self.select = mocks.epoll_mock("bumblebee.input") - - self.popen = mocks.MockPopen() + mocks.setup_test(self, Module) self._psutil = mock.patch("bumblebee.modules.cpu.psutil") self.psutil = self._psutil.start() - self.config = Config() - self.input = I3BarInput() - self.engine = mock.Mock() - self.engine.input = self.input - self.input.need_event = True - self.module = Module(engine=self.engine, config={ "config": self.config }) - for widget in self.module.widgets(): - widget.link_module(self.module) - self.anyWidget = widget - def tearDown(self): - self._stdin.stop() - self._select.stop() self._psutil.stop() - self.popen.cleanup() + mocks.teardown_test(self) def test_format(self): self.psutil.cpu_percent.return_value = 21.0