[tests] switch to pytest

This commit is contained in:
Tobias Witek 2020-06-20 14:53:44 +02:00
parent b2e92d816d
commit 39fa7788b4
37 changed files with 1009 additions and 2259 deletions

View file

@ -8,10 +8,10 @@ python:
before_install:
- sudo apt-get -qq update
install:
- pip install -U coverage==4.3
- pip install -U coverage==4.3 pytest
- pip install codeclimate-test-reporter
script:
- coverage run --source=. -m unittest discover -v
- coverage run --source=. -m pytest tests -v
- CODECLIMATE_REPO_TOKEN=40cb00907f7a10e04868e856570bb997ab9c42fd3b63d980f2b2269433195fdf codeclimate-test-reporter
addons:
code_climate:

View file

@ -1,4 +1,4 @@
#!/bin/bash
coverage run --source=. -m unittest discover -v -b
coverage run --source=. -m pytest tests -v
coverage report -m

View file

@ -1,4 +0,0 @@
import bumblebee_status.discover
bumblebee_status.discover.discover()

View file

@ -1,102 +0,0 @@
import os
import pytest
import core.config
@pytest.fixture
def defaultConfig():
return core.config.Config([])
def test_module():
modules = ["module-1", "module-2", "module-3"]
cfg = core.config.Config(["-m"] + modules)
assert cfg.modules() == modules
def test_module_ordering_maintained():
modules = ["module-1", "module-5", "module-7"]
more_modules = ["module-0", "module-2", "aaa"]
cfg = core.config.Config(["-m"] + modules + ["-m"] + more_modules)
assert cfg.modules() == modules + more_modules
def test_default_interval(defaultConfig):
assert defaultConfig.interval() == 1
def test_interval():
interval = 4
cfg = core.config.Config(["-p", "interval={}".format(interval)])
assert cfg.interval() == interval
def test_floating_interval():
interval = 4.5
cfg = core.config.Config(["-p", "interval={}".format(interval)])
assert cfg.interval() == interval
def test_default_theme(defaultConfig):
assert defaultConfig.theme() == "default"
def test_theme():
theme_name = "sample-theme"
cfg = core.config.Config(["-t", theme_name])
assert cfg.theme() == theme_name
def test_default_iconset(defaultConfig):
assert defaultConfig.iconset() == "auto"
def test_iconset():
iconset_name = "random-iconset"
cfg = core.config.Config(["-i", iconset_name])
assert cfg.iconset() == iconset_name
def test_reverse(defaultConfig):
assert defaultConfig.reverse() == False
cfg = core.config.Config(["-r"])
assert cfg.reverse() == True
def test_logfile(defaultConfig):
assert defaultConfig.logfile() is None
logfile = "some-random-logfile"
cfg = core.config.Config(["-f", logfile])
assert cfg.logfile() == logfile
def test_all_modules():
modules = core.config.all_modules()
assert len(modules) > 0
for module in modules:
pyname = "{}.py".format(module)
base = os.path.abspath(
os.path.join(
os.path.dirname(os.path.realpath(__file__)),
"..",
"..",
"bumblebee_status",
"modules",
)
)
assert os.path.exists(os.path.join(base, "contrib", pyname)) \
or os.path.exists(os.path.join(base, "core", pyname))
def test_list_output(mocker):
mocker.patch("core.config.sys")
cfg = core.config.Config(["-l", "themes"])
cfg = core.config.Config(["-l", "modules"])
cfg = core.config.Config(["-l", "modules-rst"])
def test_missing_parameter():
cfg = core.config.Config(["-p", "test.key"])
assert cfg.get("test.key") == None
assert cfg.get("test.key", "no-value-set") == "no-value-set"
#
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,103 +0,0 @@
import pytest
import core.decorators
import core.widget
import core.module
import core.config
@pytest.fixture
def module():
class TestModule(core.module.Module):
@core.decorators.never
def __init__(self, config=None, theme=None):
config = core.config.Config([])
super().__init__(config, theme, core.widget.Widget(self.get))
self.text = ""
@core.decorators.scrollable
def get(self, widget):
return self.text
module = TestModule()
module.set("scrolling.width", 10)
return module
def test_never(module):
assert module.parameter("interval") == "never"
def test_no_text(module):
assert module.text == ""
assert module.get(module.widget()) == ""
def test_smaller(module):
module.text = "test"
assert module.parameter("scrolling.width") > len(module.text)
assert module.get(module.widget()) == module.text
def test_bigger(module):
module.text = "this is a really really long sample text"
maxwidth = module.parameter("scrolling.width")
assert maxwidth < len(module.text)
assert module.get(module.widget()) == module.text[:maxwidth]
def test_bounce(module):
module.text = "abcd"
module.set("scrolling.width", 2)
assert module.get(module.widget()) == "ab"
assert module.get(module.widget()) == "bc"
assert module.get(module.widget()) == "cd"
assert module.get(module.widget()) == "bc"
assert module.get(module.widget()) == "ab"
assert module.get(module.widget()) == "bc"
assert module.get(module.widget()) == "cd"
assert module.get(module.widget()) == "bc"
assert module.get(module.widget()) == "ab"
def test_nobounce(module):
module.set("scrolling.bounce", False)
module.set("scrolling.width", 2)
module.text = "abcd"
assert module.get(module.widget()) == "ab"
assert module.get(module.widget()) == "bc"
assert module.get(module.widget()) == "cd"
assert module.get(module.widget()) == "ab"
assert module.get(module.widget()) == "bc"
assert module.get(module.widget()) == "cd"
def test_completely_changed_data(module):
module.text = "abcd"
module.set("scrolling.width", 2)
assert module.get(module.widget()) == "ab"
assert module.get(module.widget()) == "bc"
module.text = "wxyz"
assert module.get(module.widget()) == "wx"
assert module.get(module.widget()) == "xy"
def test_slightly_changed_data(module):
module.text = "this is a sample song (0:00)"
module.set("scrolling.width", 10)
assert module.get(module.widget()) == module.text[0:10]
module.text = "this is a sample song (0:01)"
assert module.get(module.widget()) == module.text[1:11]
module.text = "this is a sample song (0:02)"
assert module.get(module.widget()) == module.text[2:12]
module.text = "this is a sample song (0:13)"
assert module.get(module.widget()) == module.text[3:13]
module.text = "this is a different song (0:13)"
assert module.get(module.widget()) == module.text[0:10]
def test_n_plus_one(module):
module.text = "10 letters"
module.set("scrolling.width", 9)
assert module.get(module.widget()) == module.text[0:9]
assert module.get(module.widget()) == module.text[1:10]
assert module.get(module.widget()) == module.text[0:9]
assert module.get(module.widget()) == module.text[1:10]
assert module.get(module.widget()) == module.text[0:9]
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,73 +0,0 @@
import pytest
import core.event
@pytest.fixture
def someEvent():
class Event():
def __init__(self):
core.event.clear()
self.id = "some event"
self.called = 0
self.call_args = []
self.call_kwargs = []
def callback(self, *args, **kwargs):
self.called += 1
if args:
self.call_args.append(list(args))
if kwargs:
self.call_kwargs.append(kwargs)
return Event()
def test_simple_callback(someEvent):
assert someEvent.called == 0
core.event.register(someEvent.id, someEvent.callback)
core.event.register(someEvent.id, someEvent.callback)
core.event.trigger(someEvent.id)
assert someEvent.called == 2
def test_args_callback(someEvent):
core.event.register(someEvent.id, someEvent.callback, "a", "b")
core.event.trigger(someEvent.id)
assert someEvent.called == 1
assert len(someEvent.call_args) == 1
assert someEvent.call_args[0] == ["a", "b"]
def test_kwargs_callback(someEvent):
core.event.register(
someEvent.id, someEvent.callback, "a", "b", key1="test", key2="another"
)
core.event.trigger(someEvent.id)
assert someEvent.called == 1
assert len(someEvent.call_args) == 1
assert someEvent.call_args[0] == ["a", "b"]
assert len(someEvent.call_kwargs) == 1
assert someEvent.call_kwargs[0] == { "key1": "test", "key2": "another" }
def test_arg_trigger(someEvent):
core.event.register(someEvent.id, someEvent.callback)
core.event.trigger(someEvent.id, "a", "b")
assert someEvent.called == 1
assert len(someEvent.call_args) == 1
assert someEvent.call_args[0] == ["a", "b"]
def test_kwargs_trigger(someEvent):
core.event.register(someEvent.id, someEvent.callback)
core.event.trigger(someEvent.id, "a", "c", key1="test", key2="something")
assert someEvent.called == 1
assert len(someEvent.call_args) == 1
assert someEvent.call_args[0] == ["a", "c"]
assert len(someEvent.call_kwargs) == 1
assert someEvent.call_kwargs[0] == { "key1": "test", "key2": "something" }
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,104 +0,0 @@
import pytest
import core.input
@pytest.fixture
def obj():
return core.input.Object()
@pytest.fixture
def obj2():
return core.input.Object()
@pytest.fixture
def cb(mocker):
return mocker.MagicMock()
@pytest.fixture
def cb2(mocker):
return mocker.MagicMock()
def event(input_object):
return {"button": core.input.LEFT_MOUSE, "instance": input_object.id}
def event2(input_object):
return {"button": core.input.RIGHT_MOUSE, "instance": input_object.id}
def test_callable_gets_called(obj, cb):
core.input.register(obj, event(obj)["button"], cb)
core.input.trigger(event(obj))
cb.assert_called_once_with(event(obj))
def test_nonexistent_callback(obj, obj2, cb):
core.input.register(obj, event(obj)["button"], cb)
core.input.trigger(event(obj2))
cb.assert_not_called()
def test_different_events(obj, obj2, cb, cb2):
core.input.register(obj, event(obj)["button"], cb)
core.input.register(obj, event2(obj)["button"], cb)
core.input.register(obj2, event(obj)["button"], cb2)
core.input.register(obj2, event2(obj)["button"], cb2)
core.input.trigger(event(obj))
core.input.trigger(event2(obj))
cb.assert_any_call(event(obj))
cb.assert_any_call(event2(obj))
cb2.assert_not_called()
def test_multiple_registrations(obj, cb, cb2):
core.input.register(obj, event(obj)["button"], cb)
core.input.register(obj, event(obj)["button"], cb2)
core.input.trigger(event(obj))
cb.assert_called_once_with(event(obj))
cb2.assert_called_once_with(event(obj))
def test_event_names():
assert core.input.button_name(core.input.LEFT_MOUSE) == "left-mouse"
assert core.input.button_name(core.input.RIGHT_MOUSE) == "right-mouse"
assert core.input.button_name(core.input.MIDDLE_MOUSE) == "middle-mouse"
assert core.input.button_name(core.input.WHEEL_UP) == "wheel-up"
assert core.input.button_name(core.input.WHEEL_DOWN) == "wheel-down"
assert core.input.button_name(12345) == "n/a"
def test_non_callable_callback(mocker, obj):
cli = mocker.patch("core.input.util.cli")
cli.execute.return_value = ""
core.input.register(obj, event(obj)["button"], "sample-command")
core.input.trigger(event(obj))
cli.execute.assert_called_once_with("sample-command", wait=False, shell=True)
def test_non_existent_callback(mocker, obj):
cli = mocker.patch("core.input.util.cli")
cli.execute.return_value = ""
cli.execute.side_effect = RuntimeError("some-error")
core.input.register(obj, event(obj)["button"], "sample-command")
core.input.trigger(event(obj))
cli.execute.assert_called_once_with("sample-command", wait=False, shell=True)
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,177 +0,0 @@
import pytest
import sys
import shlex
import core.module
import core.widget
import core.config
import core.input
@pytest.fixture(autouse=True)
def clear_events():
core.event.clear()
@pytest.fixture
def empty_config():
return core.config.Config([])
@pytest.fixture
def widget_a():
return core.widget.Widget("randomwWidget content", name="A")
@pytest.fixture
def widget_b():
return core.widget.Widget("another randomwWidget content", name="B")
class SampleModule(core.module.Module):
def update(self):
if self.fail:
raise Exception(self.error)
pass
def test_loadinvalid_module(mocker):
config = mocker.MagicMock()
module = core.module.load(module_name="i-do-not-exist", config=config)
assert module.__class__.__module__ == "core.module"
assert module.__class__.__name__ == "Error"
@pytest.mark.skipif(
sys.version_info.major == 3 and sys.version_info.minor in [4, 5],
reason="importlib error reporting in Python 3.{4,5} different",
)
def test_importerror(mocker):
importlib = mocker.patch("core.module.importlib")
importlib.import_module.side_effect = ImportError("some-error")
config = mocker.MagicMock()
module = core.module.load(module_name="test", config=config)
assert module.__class__.__name__ == "Error"
assert module.widget().full_text() == "test: some-error"
def test_loadvalid_module():
module = core.module.load(module_name="test")
assert module.__class__.__module__ == "modules.core.test"
assert module.__class__.__name__ == "Module"
assert module.state(None) == []
def test_empty_widgets():
module = core.module.Module(widgets=[])
assert module.widgets() == []
def test_error_widget():
cfg = core.config.Config(shlex.split("-p test_module.foo=5"))
module = core.module.Error("test-mod", "xyz", config=cfg)
full_text = module.full_text(module.widget())
assert module.state(None) == ["critical"]
assert "test-mod" in full_text
assert "xyz" in full_text
def test_single_widget(widget_a):
module = core.module.Module(widgets=widget_a)
assert module.widgets() == [widget_a]
def test_widget_list(widget_a, widget_b):
module = core.module.Module(widgets=[widget_a, widget_b])
assert module.widgets() == [widget_a, widget_b]
def test_module_Name():
module = SampleModule()
assert module.name == "test_module"
assert module.module_name == "test_module"
def testvalid_parameter():
cfg = core.config.Config(shlex.split("-p test_module.foo=5"))
module = SampleModule(config=cfg)
assert module.parameter("foo") == "5"
def test_default_parameter(empty_config):
module = SampleModule(config=empty_config)
assert module.parameter("foo", "default") == "default"
def test_default_is_none(empty_config):
module = SampleModule(config=empty_config)
assert module.parameter("foo") == None
def test_error_widget(empty_config):
module = SampleModule(config=empty_config)
module.fail = True
module.error = "!!"
module.update_wrapper()
assert len(module.widgets()) == 1
assert module.widget().full_text() == "error: !!"
def test_get_widget_by_name(empty_config, widget_a, widget_b):
module = SampleModule(config=empty_config, widgets=[widget_a, widget_b])
assert module.widget(widget_a.name) == widget_a
assert module.widget(widget_b.name) == widget_b
assert module.widget("i-do-not-exist") == None
assert module.widget() == widget_a
def test_default_thresholds(empty_config, widget_a, widget_b):
module = SampleModule(config=empty_config, widgets=[widget_a, widget_b])
assert module.threshold_state(100, 80, 99) == "critical"
assert module.threshold_state(100, 80, 100) == "warning"
assert module.threshold_state(81, 80, 100) == "warning"
assert module.threshold_state(80, 80, 100) == None
assert module.threshold_state(10, 80, 100) == None
def test_configured_callbacks(mocker, empty_config, widget_a, widget_b):
module = SampleModule(config=empty_config, widgets=[widget_a, widget_b])
cmd = "sample-tool arg1 arg2 arg3"
module.set("left-click", cmd)
module.register_callbacks()
cli = mocker.patch("core.input.util.cli")
cli.execute.return_value = ""
core.input.trigger(
{"button": core.input.LEFT_MOUSE, "instance": module.id,}
)
cli.execute.assert_called_once_with(cmd, wait=False, shell=True)
def test_configured_callbacks_with_parameters(mocker, empty_config, widget_a):
module = SampleModule(config=empty_config, widgets=[widget_a])
cmd = "sample-tool {instance} {name}"
module.set("left-click", cmd)
module.register_callbacks()
cli = mocker.patch("core.input.util.cli")
cli.execute.return_value = ""
core.input.trigger(
{"button": core.input.LEFT_MOUSE, "instance": module.id, "name": "sample-name",}
)
cli.execute.assert_called_once_with(
cmd.format(instance=module.id, name="sample-name"), wait=False, shell=True,
)
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,173 +0,0 @@
import json
import pytest
import core.event
import core.config
import core.output
import core.module
class SampleModule(core.module.Module):
pass
@pytest.fixture(autouse=True)
def clear_events():
core.event.clear()
@pytest.fixture
def i3():
return core.output.i3()
@pytest.fixture
def module_a(mocker):
widget = mocker.MagicMock()
widget.full_text.return_value = "test"
return SampleModule(
config=core.config.Config([]), widgets=[widget, widget, widget]
)
@pytest.fixture
def paddedTheme():
return core.theme.Theme(raw_data={"defaults": {"padding": " "}})
@pytest.fixture
def separatorTheme():
return core.theme.Theme(
raw_data={
"defaults": {"separator": "***", "fg": "red", "bg": "blue"}
}
)
@pytest.fixture
def block_a(separatorTheme, module_a):
return core.output.block(
theme=separatorTheme,
module=module_a,
widget=module_a.widget(),
)
#def setUp(self):
# self.i3 = core.output.i3()
# widget = unittest.mock.MagicMock()
# widget.full_text.return_value = "test"
# self.someModule = SampleModule(
# config=core.config.Config([]), widgets=[widget, widget, widget]
# )
# self.separator = "***"
#
def test_start(i3):
all_data = i3.start()
data = all_data["blocks"]
assert data["version"] == 1
assert data["click_events"] == True
assert all_data["suffix"] == "\n["
def test_stop(i3):
assert i3.stop()["suffix"] == "\n]"
def test_no_modules_by_default(i3):
assert i3.modules() == []
def test_register_single_module(i3, module_a):
i3.modules(module_a)
assert i3.modules() == [module_a]
def test_register_multiple_modules(i3, module_a):
i3.modules([module_a, module_a, module_a])
assert i3.modules() == [module_a, module_a, module_a]
def test_draw_existing_module(mocker, i3):
i3.test_draw = mocker.MagicMock(
return_value={"blocks": {"test": True}, "suffix": "end"}
)
i3.draw("test_draw")
i3.test_draw.assert_called_once_with()
def test_empty_status_line(i3):
data = i3.statusline()
assert data["blocks"] == []
assert data["suffix"] == ","
def test_statusline(i3, module_a):
i3.modules([module_a, module_a, module_a])
i3.update()
data = i3.statusline()
assert len(data["blocks"]) == len(module_a.widgets())*3
def test_padding(i3, paddedTheme, module_a):
i3.theme(paddedTheme)
blk = core.output.block(
i3.theme(), module_a, module_a.widget()
)
blk.set("full_text", "abc")
result = blk.dict()["full_text"]
assert result == " abc "
def test_no_separator(i3, module_a):
result = i3.separator_block(module_a, module_a.widget())
assert result == []
def test_separator(i3, separatorTheme, module_a):
i3.theme(separatorTheme)
result = i3.separator_block(module_a, module_a.widget())
assert len(result) == 1
assert result[0].dict()["full_text"] == "***"
assert result[0].dict().get("_decorator") == True
assert result[0].dict()["color"] == separatorTheme.get("bg", module_a.widget())
def test_dump_json(mocker):
obj = mocker.MagicMock()
obj.dict = mocker.MagicMock()
core.output.dump_json(obj)
obj.dict_assert_called_once_with()
def test_assign():
src = {"a": "x", "b": "y", "c": "z"}
dst = {}
core.output.assign(src, dst, "a")
assert src["a"] == dst["a"]
core.output.assign(src, dst, "123", "b")
assert src["b"] == dst["123"]
core.output.assign(src, dst, "blub", default="def")
assert dst["blub"] == "def"
def test_pango_detection(block_a):
assert block_a.is_pango({}) == False
assert block_a.is_pango({ "pango": {} }) == True
def test_pangoize(block_a):
assert block_a.pangoize("test") == "test"
assert not "markup" in block_a.dict()
pango = block_a.pangoize(
{"pango": {"attr": "blub", "x": "y", "full_text": "test"}}
)
assert 'attr="blub"' in pango
assert 'x="y"' in pango
assert "<span " in pango
assert ">test</span>" in pango
assert block_a.dict()["markup"] == "pango"
def test_padding(block_a):
block_a.set("padding", "***")
block_a.set("full_text", "test")
assert block_a.dict()["full_text"] == "***test***"
def test_pre_suffix(block_a):
block_a.set("padding", "*")
block_a.set("prefix", "pre")
block_a.set("suffix", "suf")
block_a.set("full_text", "test")
assert block_a.dict()["full_text"] == "*pre*test*suf*"
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,175 +0,0 @@
import pytest
import types
import core.theme
import core.event
import core.widget
import core.module
class SampleModule(core.module.Module):
def __init__(self, widgets, config=core.config.Config([]), theme=None):
super().__init__(config, theme, widgets)
self.name = "test"
@pytest.fixture(autouse=True)
def clear_events():
core.event.clear()
@pytest.fixture
def defaultsTheme():
return {"defaults": {"fg": "red", "bg": "black"}}
@pytest.fixture
def cycleTheme():
return {
"cycle": [
{"fg": "red", "bg": "black"},
{"fg": "black", "bg": "red"},
{"fg": "white", "bg": "blue"},
]
}
@pytest.fixture
def colorTheme():
return {"colors": [{"red": "#ff0000", "blue": "#0000ff"}]}
@pytest.fixture
def walTheme():
return {"colors": ["wal"]}
@pytest.fixture
def cycleValueTheme():
return {"defaults": {"fg": ["red", "green", "blue"]}}
@pytest.fixture
def stateTheme():
return {"warning": {"fg": "yellow"}, "critical": {"fg": "red"}}
@pytest.fixture
def overlayTheme():
return {
"load": {"prefix": "a"},
"test": {"load": {"prefix": "b"}, "prefix": "x"},
}
def test_invalid_theme():
with pytest.raises(RuntimeError):
core.theme.Theme("this-theme-does-not-exist")
def test_valid_theme():
theme = core.theme.Theme("default")
assert theme.name == "default"
def test_defaults(defaultsTheme):
theme = core.theme.Theme(raw_data=defaultsTheme)
assert theme.get("fg") == defaultsTheme["defaults"]["fg"]
assert theme.get("bg") == defaultsTheme["defaults"]["bg"]
def test_cycle(mocker, cycleTheme):
theme = core.theme.Theme(raw_data=cycleTheme)
assert theme.get("bg", "previous") == None
assert theme.get("fg") == cycleTheme["cycle"][0]["fg"]
assert theme.get("bg") == cycleTheme["cycle"][0]["bg"]
core.event.trigger("next-widget")
assert theme.get("bg", "previous") == cycleTheme["cycle"][0]["bg"]
core.event.trigger("next-widget")
assert theme.get("fg") == cycleTheme["cycle"][2]["fg"]
assert theme.get("bg") == cycleTheme["cycle"][2]["bg"]
stdout = mocker.patch("core.output.sys.stdout")
core.event.trigger("draw")
assert theme.get("fg") == cycleTheme["cycle"][0]["fg"]
assert theme.get("bg") == cycleTheme["cycle"][0]["bg"]
def test_custom_iconset(defaultsTheme):
theme = core.theme.Theme(raw_data=defaultsTheme)
assert theme.get("padding") != "aaa"
assert theme.get("fg") != "blue"
theme = core.theme.Theme(
raw_data=defaultsTheme, iconset={"defaults": {"padding": "aaa", "fg": "blue"}}
)
assert theme.get("padding") == "aaa"
assert theme.get("fg") == "blue" # test override
def test_colors(defaultsTheme, colorTheme):
theme = core.theme.Theme(raw_data=defaultsTheme)
assert theme.keywords() == {}
theme = core.theme.Theme(raw_data=colorTheme)
assert theme.keywords() == colorTheme["colors"][0]
def test_wal_colors(mocker, walTheme):
io = mocker.patch("core.theme.io")
os = mocker.patch("core.theme.os")
os.path.isfile.return_value = True
io.open.return_value = mocker.MagicMock()
io.open.return_value.__enter__.return_value.read.return_value = """
{ "colors": { "red": "#ff0000" } }
"""
theme = core.theme.Theme(raw_data=walTheme)
assert theme.keywords() == {"red": "#ff0000"}
def test_wal_special(mocker, walTheme):
io = mocker.patch("core.theme.io")
os = mocker.patch("core.theme.os")
os.path.isfile.return_value = True
io.open.return_value.__enter__.return_value.read.return_value = """
{ "special": { "background": "#ff0000" } }
"""
theme = core.theme.Theme(raw_data=walTheme)
assert theme.keywords() == {"background": "#ff0000"}
def test_cycle_value(cycleValueTheme):
widget = core.widget.Widget()
expected = cycleValueTheme["defaults"]["fg"]
theme = core.theme.Theme(raw_data=cycleValueTheme)
for i in range(0, len(expected) * 3):
assert theme.get("fg", widget) == expected[i%len(expected)]
# ensure multiple invocations are OK
assert theme.get("fg", widget) == expected[i%len(expected)]
core.event.trigger("draw")
def test_state(stateTheme):
widget = core.widget.Widget()
theme = core.theme.Theme(raw_data=stateTheme)
assert theme.get("fg", widget) == None
widget.state = types.MethodType(lambda self: ["warning"], widget)
assert theme.get("fg", widget) == stateTheme["warning"]["fg"]
widget.state = types.MethodType(lambda self: ["critical"], widget)
assert theme.get("fg", widget) == stateTheme["critical"]["fg"]
def test_overlay(overlayTheme):
widget = core.widget.Widget()
module = SampleModule(widget)
theme = core.theme.Theme(raw_data=overlayTheme)
assert theme.get("prefix", widget) == overlayTheme[module.name]["prefix"]
widget.state = types.MethodType(lambda self: ["load"], widget)
assert theme.get("prefix", widget) == overlayTheme[module.name]["load"]["prefix"]
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,97 +0,0 @@
import pytest
import core.widget
import core.module
import core.config
class SampleModule(core.module.Module):
def __init__(self, widgets, config=core.config.Config([]), theme=None):
super().__init__(config, theme, widgets)
self.states = []
def update(self):
if self.fail:
raise Exception(self.error)
pass
def state(self, widget):
return self.states
@pytest.fixture
def widget_a():
return core.widget.Widget("some random value")
#class widget(unittest.TestCase):
# def setUp(self):
# self.someValue = "some random value"
# self.someOtherValue = "some different value"
# self.callbackReturnValue = "callback return value"
# self.someWidget = core.widget.Widget(full_text=self.someValue)
# self.someCallback = unittest.mock.MagicMock(
# return_value=self.callbackReturnValue
# )
#
# self.assertNotEqual(self.someValue, self.someOtherValue)
def test_text_fulltext():
widget = core.widget.Widget(full_text="this is some value")
assert widget.full_text() == "this is some value"
def test_set_fulltext(widget_a):
assert widget_a.full_text() != "new value"
widget_a.full_text("new value")
assert widget_a.full_text() == "new value"
def test_callable_fulltext(mocker):
callback = mocker.MagicMock(return_value="callback returns")
widget = core.widget.Widget(full_text=callback)
assert widget.full_text() == "callback returns"
callback.assert_called_once_with(widget)
def test_set_callable_fulltext(mocker, widget_a):
callback = mocker.MagicMock(return_value="this is a test")
widget_a.full_text(callback)
assert widget_a.full_text() == "this is a test"
callback.assert_called_once_with(widget_a)
def test_state_defaults_to_empty(widget_a):
assert widget_a.state() == []
def test_single_widget_state(widget_a):
widget_a.set("state", "state1")
assert widget_a.state() == ["state1"]
def test_multiple_widget_states(widget_a):
widget_a.set("state", ["state1", "state2"])
assert widget_a.state() == ["state1", "state2"]
def test_widget_module_state(widget_a):
module = SampleModule(widgets=widget_a)
widget_a.set("state", ["state1", "state2"])
module.states = "x"
assert widget_a.state() == ["state1", "state2", "x"]
module.states = ["a", "b"]
assert widget_a.state() == ["state1", "state2", "a", "b"]
def test_multiple_widget_themes():
widget1 = core.widget.Widget(full_text="a")
widget2 = core.widget.Widget(full_text="b")
widget3 = core.widget.Widget(full_text="c")
module = SampleModule(widgets=[widget1, widget2, widget3])
module.set("theme.test", "1,2,3")
module.set("theme.test2", "x")
assert widget1.theme("test") == "1"
assert widget2.theme("test") == "2"
assert widget3.theme("test") == "3"
assert widget1.theme("test2") == "x"
assert widget2.theme("test2") == None
assert widget3.theme("test2") == None
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,50 +0,0 @@
import pytest
from util.algorithm import *
@pytest.fixture
def someData():
return {"a": 100, "b": 200, "c": [1, 2, 3]}
@pytest.fixture
def differentData():
return {"x": 20, "y": "bla", "z": ["a", "b"]}
@pytest.fixture
def moreData():
return {"n": 100}
@pytest.fixture
def overlapData():
return {"a": 200, "c": [1, 2, 4]}
def test_merge_with_empty(someData):
assert merge(someData, {}) == someData
assert merge(someData, None) == None
def test_merge_no_overwrite(someData, differentData):
result = merge(someData, differentData)
for k in someData:
assert someData[k] == result[k]
for k in self.differentData:
assert differentData[k] == result[k]
def test_merge_multiple(someData, differentData, moreData):
result = merge(someData, differentData, moreData)
for k in someData:
assert someData[k] == result[k]
for k in differentData:
assert differentData[k] == result[k]
for k in moreData:
assert moreData[k] == result[k]
def merge_overlap(someData, overlapData):
result = merge(someData, overlapData)
for k in someData:
if not k in self.overlapData:
assert someData[k] == result[k]
for k in self.overlapData:
assert overlapData[k] == result[k]
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,27 +0,0 @@
import pytest
import util.cli
def test_valid_command():
assert util.cli.execute("echo test") == "test\n"
def test_utf_command():
rv = util.cli.execute("echo ÖPmŧß")
assert util.cli.execute("echo ÖPmŧß") == "ÖPmŧß\n"
def test_invalid_command():
with pytest.raises(RuntimeError):
util.cli.execute("i-do-not-exist")
def test_command_exit_code():
with pytest.raises(RuntimeError):
util.cli.execute("cat i-do-not-exist")
def test_command_exit_code_no_error():
util.cli.execute("cat i-do-not-exist", ignore_errors=True)
def test_async():
assert util.cli.execute("echo test", wait=False) == ""
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,113 +0,0 @@
import pytest
from util.format import *
def test_int_from_string():
assert asint("100") == 100
assert asint("-100") == -100
assert asint("0") == 0
def test_int_from_none():
assert asint(None) == 0
def test_int_from_int():
assert asint(100) == 100
assert asint(-100) == -100
assert asint(0) == 0
def test_int_minimum():
assert asint(100, minimum=10) == 100
assert asint(100, minimum=100) == 100
assert asint(5, minimum=10) == 10
def test_int_maximum():
assert asint(100, maximum=200) == 100
assert asint(100, maximum=100) == 100
assert asint(200, maximum=100) == 100
def test_true_from_str():
assert asbool("true") == True
assert asbool(True) == True
assert asbool("t") == True
assert asbool("1") == True
assert asbool("yes") == True
assert asbool("y") == True
assert asbool("on") == True
def test_false_from_str():
assert asbool("false") == False
assert asbool(False) == False
assert asbool("f") == False
assert asbool("0") == False
assert asbool("no") == False
assert asbool("n") == False
assert asbool("off") == False
assert asbool(None) == False
def test_list_from_None():
assert aslist(None) == []
def test_list_from_list():
assert aslist([1, 2, 3] == [1, 2, 3])
def test_list_from_str():
assert aslist("12,13,14") == ["12", "13", "14"]
def test_byteformat():
assert byte(500) == "500.00B"
assert byte(1024) == "1.00KiB"
assert byte(1024, "{:.0f}") == "1KiB"
assert byte(1024 + 512) == "1.50KiB"
assert byte(1024 * 1024 * 2 + 1024 * 512) == "2.50MiB"
assert byte(1024 * 1024 * 1024 * 4 + 1024 * 1024 * 512) == "4.50GiB"
assert byte(1024 * 1024 * 1024 * 1024 * 2) == "2048.00GiB"
def test_duration():
assert duration(4 * 60 * 60 + 20 * 60) == "04:20:00"
assert duration(4 * 60 * 60 + 20 * 60, unit=True) == "04:20:00h"
assert duration(4 * 60 * 60 + 20 * 60, compact=True, unit=True) == "04:20h"
assert duration(20 * 60) == "20:00"
assert duration(20 * 60, unit=True) == "20:00m"
assert duration(20 * 60, compact=True, unit=True) == "20:00m"
assert duration(20) == "00:20"
assert duration(20, unit=True) == "00:20m"
assert duration(20, compact=True, unit=True) == "00:20m"
assert duration(-1) == "n/a"
def test_seconds():
assert seconds(10) == 10
assert seconds("10") == 10
assert seconds("5m") == 300
assert seconds("5m20s") == 320
assert seconds("4h") == 4 * 3600
assert seconds("4h5m22s") == 4 * 3600 + 5 * 60 + 22
assert seconds("4h5m") == 4 * 3600 + 5 * 60
def test_temperature():
assert astemperature(10) == "10°C"
assert astemperature(10, "metric") == "10°C"
assert astemperature(-100, "imperial") == "-100°F"
assert astemperature(-100, "kelvin") == "-100°K"
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,57 +0,0 @@
import pytest
import json
import util.location
@pytest.fixture
def urllib_req(mocker):
util.location.reset()
return mocker.patch("util.location.urllib.request")
@pytest.fixture
def primaryLocation():
return {
"country": "Middle Earth",
"longitude": "10.0",
"latitude": "20.5",
"ip": "127.0.0.1",
}
@pytest.fixture
def secondaryLocation():
return {
"country_name": "Rivia",
"longitude": "-10.0",
"latitude": "-23",
"ip": "127.0.0.6",
}
def test_primary_provider(urllib_req, primaryLocation):
urllib_req.urlopen.return_value.read.return_value = json.dumps(primaryLocation)
assert util.location.country() == primaryLocation["country"]
assert util.location.coordinates() == (
primaryLocation["latitude"],
primaryLocation["longitude"],
)
assert util.location.public_ip() == primaryLocation["ip"]
def test_secondary_provider(mocker, urllib_req, secondaryLocation):
urlopen = mocker.MagicMock()
urlopen.read.return_value = json.dumps(secondaryLocation)
urllib_req.urlopen.side_effect = [RuntimeError(), urlopen]
assert util.location.country() == secondaryLocation["country_name"]
assert util.location.coordinates() == (
secondaryLocation["latitude"],
secondaryLocation["longitude"],
)
assert util.location.public_ip() == secondaryLocation["ip"]
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,48 +0,0 @@
import pytest
import util.store
@pytest.fixture
def emptyStore():
return util.store.Store()
@pytest.fixture
def store():
return util.store.Store()
def test_get_of_unset_key(emptyStore):
assert emptyStore.get("any-key") == None
assert emptyStore.get("any-key", "default-value") == "default-value"
def test_get_of_set_key(store):
store.set("key", "value")
assert store.get("key") == "value"
def test_overwrite_set(store):
store.set("key", "value 1")
store.set("key", "value 2")
assert store.get("key") == "value 2"
def test_unused_keys(store):
store.set("key 1", "value x")
store.set("key 2", "value y")
assert store.unused_keys() == sorted(["key 1", "key 2"])
store.get("key 2")
assert store.unused_keys() == ["key 1"]
store.get("key 1")
assert store.unused_keys() == []
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,3 +1,4 @@
import bumblebee_status.discover
bumblebee_status.discover.discover()

View file

@ -1,89 +1,102 @@
import os
import unittest
import pytest
import core.config
@pytest.fixture
def defaultConfig():
return core.config.Config([])
class config(unittest.TestCase):
def setUp(self):
self.someModules = ["b", "x", "a"]
self.moreModules = ["this", "module", "here"]
self.someTheme = "some-theme"
self.someIconset = "some-iconset"
self.defaultConfig = core.config.Config([])
def test_module():
modules = ["module-1", "module-2", "module-3"]
def test_module(self):
cfg = core.config.Config(["-m"] + self.someModules)
self.assertEqual(self.someModules, cfg.modules())
cfg = core.config.Config(["-m"] + modules)
def test_module_ordering_maintained(self):
cfg = core.config.Config(["-m"] + self.someModules + ["-m"] + self.moreModules)
self.assertEqual(self.someModules + self.moreModules, cfg.modules())
assert cfg.modules() == modules
def test_default_interval(self):
self.assertEqual(1, self.defaultConfig.interval())
def test_module_ordering_maintained():
modules = ["module-1", "module-5", "module-7"]
more_modules = ["module-0", "module-2", "aaa"]
def test_interval(self):
cfg = core.config.Config(["-p", "interval=4"])
self.assertEqual(4, cfg.interval())
cfg = core.config.Config(["-m"] + modules + ["-m"] + more_modules)
def test_float_interval(self):
cfg = core.config.Config(["-p", "interval=0.5"])
self.assertEqual(0.5, cfg.interval())
assert cfg.modules() == modules + more_modules
def test_default_theme(self):
self.assertEqual("default", self.defaultConfig.theme())
def test_default_interval(defaultConfig):
assert defaultConfig.interval() == 1
def test_theme(self):
cfg = core.config.Config(["-t", self.someTheme])
self.assertEqual(self.someTheme, cfg.theme())
def test_interval():
interval = 4
cfg = core.config.Config(["-p", "interval={}".format(interval)])
def test_default_iconset(self):
self.assertEqual("auto", self.defaultConfig.iconset())
assert cfg.interval() == interval
def test_iconset(self):
cfg = core.config.Config(["-i", self.someIconset])
self.assertEqual(self.someIconset, cfg.iconset())
def test_floating_interval():
interval = 4.5
cfg = core.config.Config(["-p", "interval={}".format(interval)])
def test_right_to_left(self):
cfg = core.config.Config(["-r"])
self.assertTrue(cfg.reverse())
self.assertFalse(self.defaultConfig.reverse())
assert cfg.interval() == interval
def test_logfile(self):
cfg = core.config.Config(["-f", "my-custom-logfile"])
self.assertEqual(None, self.defaultConfig.logfile())
self.assertEqual("my-custom-logfile", cfg.logfile())
def test_default_theme(defaultConfig):
assert defaultConfig.theme() == "default"
def test_all_modules(self):
modules = core.config.all_modules()
self.assertGreater(len(modules), 0)
for module in modules:
pyname = "{}.py".format(module)
base = os.path.abspath(
os.path.join(
os.path.dirname(os.path.realpath(__file__)),
"..",
"..",
"bumblebee_status",
"modules",
)
)
self.assertTrue(
os.path.exists(os.path.join(base, "contrib", pyname))
or os.path.exists(os.path.join(base, "core", pyname))
def test_theme():
theme_name = "sample-theme"
cfg = core.config.Config(["-t", theme_name])
assert cfg.theme() == theme_name
def test_default_iconset(defaultConfig):
assert defaultConfig.iconset() == "auto"
def test_iconset():
iconset_name = "random-iconset"
cfg = core.config.Config(["-i", iconset_name])
assert cfg.iconset() == iconset_name
def test_reverse(defaultConfig):
assert defaultConfig.reverse() == False
cfg = core.config.Config(["-r"])
assert cfg.reverse() == True
def test_logfile(defaultConfig):
assert defaultConfig.logfile() is None
logfile = "some-random-logfile"
cfg = core.config.Config(["-f", logfile])
assert cfg.logfile() == logfile
def test_all_modules():
modules = core.config.all_modules()
assert len(modules) > 0
for module in modules:
pyname = "{}.py".format(module)
base = os.path.abspath(
os.path.join(
os.path.dirname(os.path.realpath(__file__)),
"..",
"..",
"bumblebee_status",
"modules",
)
)
assert os.path.exists(os.path.join(base, "contrib", pyname)) \
or os.path.exists(os.path.join(base, "core", pyname))
def test_list_output(self):
with unittest.mock.patch("core.config.sys") as sys:
cfg = core.config.Config(["-l", "themes"])
cfg = core.config.Config(["-l", "modules"])
cfg = core.config.Config(["-l", "modules-rst"])
# TODO: think of some plausibility testing here
def test_missing_parameter(self):
cfg = core.config.Config(["-p", "test.key"])
self.assertEqual("no-value-set", cfg.get("test.key", "no-value-set"))
def test_list_output(mocker):
mocker.patch("core.config.sys")
cfg = core.config.Config(["-l", "themes"])
cfg = core.config.Config(["-l", "modules"])
cfg = core.config.Config(["-l", "modules-rst"])
def test_missing_parameter():
cfg = core.config.Config(["-p", "test.key"])
assert cfg.get("test.key") == None
assert cfg.get("test.key", "no-value-set") == "no-value-set"
#
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,99 +1,103 @@
import unittest
import pytest
import core.decorators
import core.widget
import core.module
import core.config
@pytest.fixture
def module():
class TestModule(core.module.Module):
@core.decorators.never
def __init__(self, config=None, theme=None):
config = core.config.Config([])
super().__init__(config, theme, core.widget.Widget(self.get))
self.text = ""
class TestModule(core.module.Module):
@core.decorators.never
def __init__(self, config=None, theme=None):
config = core.config.Config([])
super().__init__(config, theme, core.widget.Widget(self.get))
self.text = ""
@core.decorators.scrollable
def get(self, widget):
return self.text
module = TestModule()
module.set("scrolling.width", 10)
return module
@core.decorators.scrollable
def get(self, widget):
return self.text
def test_never(module):
assert module.parameter("interval") == "never"
def test_no_text(module):
assert module.text == ""
assert module.get(module.widget()) == ""
class config(unittest.TestCase):
def setUp(self):
self.module = TestModule()
self.widget = self.module.widget()
self.width = 10
self.module.set("scrolling.width", self.width)
def test_smaller(module):
module.text = "test"
assert module.parameter("scrolling.width") > len(module.text)
assert module.get(module.widget()) == module.text
def test_never(self):
self.module = TestModule()
self.assertEqual("never", self.module.parameter("interval"))
def test_bigger(module):
module.text = "this is a really really long sample text"
maxwidth = module.parameter("scrolling.width")
assert maxwidth < len(module.text)
assert module.get(module.widget()) == module.text[:maxwidth]
def test_no_text(self):
self.assertEqual("", self.module.text)
self.assertEqual("", self.module.get(self.widget))
def test_bounce(module):
module.text = "abcd"
module.set("scrolling.width", 2)
assert module.get(module.widget()) == "ab"
assert module.get(module.widget()) == "bc"
assert module.get(module.widget()) == "cd"
assert module.get(module.widget()) == "bc"
assert module.get(module.widget()) == "ab"
assert module.get(module.widget()) == "bc"
assert module.get(module.widget()) == "cd"
assert module.get(module.widget()) == "bc"
assert module.get(module.widget()) == "ab"
def test_smaller(self):
self.module.text = "test"
self.assertLess(len(self.module.text), self.width)
self.assertEqual("test", self.module.get(self.widget))
def test_nobounce(module):
module.set("scrolling.bounce", False)
module.set("scrolling.width", 2)
module.text = "abcd"
def test_bigger(self):
self.module.text = "abcdefghijklmnopqrst"
self.assertGreater(len(self.module.text), self.width)
self.assertEqual(self.module.text[: self.width], self.module.get(self.widget))
assert module.get(module.widget()) == "ab"
assert module.get(module.widget()) == "bc"
assert module.get(module.widget()) == "cd"
assert module.get(module.widget()) == "ab"
assert module.get(module.widget()) == "bc"
assert module.get(module.widget()) == "cd"
def test_bounce(self):
self.module.text = "abcd"
self.module.set("scrolling.width", 2)
self.assertEqual("ab", self.module.get(self.widget))
self.assertEqual("bc", self.module.get(self.widget))
self.assertEqual("cd", self.module.get(self.widget))
self.assertEqual("bc", self.module.get(self.widget))
self.assertEqual("ab", self.module.get(self.widget))
self.assertEqual("bc", self.module.get(self.widget))
self.assertEqual("cd", self.module.get(self.widget))
self.assertEqual("bc", self.module.get(self.widget))
self.assertEqual("ab", self.module.get(self.widget))
def test_completely_changed_data(module):
module.text = "abcd"
module.set("scrolling.width", 2)
def test_nobounce(self):
self.module.set("scrolling.bounce", False)
self.module.text = "abcd"
self.module.set("scrolling.width", 2)
self.assertEqual("ab", self.module.get(self.widget))
self.assertEqual("bc", self.module.get(self.widget))
self.assertEqual("cd", self.module.get(self.widget))
self.assertEqual("ab", self.module.get(self.widget))
self.assertEqual("bc", self.module.get(self.widget))
self.assertEqual("cd", self.module.get(self.widget))
assert module.get(module.widget()) == "ab"
assert module.get(module.widget()) == "bc"
def test_changed_data(self):
self.module.text = "abcd"
self.module.set("scrolling.width", 2)
self.assertEqual("ab", self.module.get(self.widget))
self.assertEqual("bc", self.module.get(self.widget))
self.module.text = "wxyz"
self.assertEqual("wx", self.module.get(self.widget))
module.text = "wxyz"
assert module.get(module.widget()) == "wx"
assert module.get(module.widget()) == "xy"
def test_minimum_changed_data(self):
self.module.text = "this is a sample song (0:00)"
self.module.set("scrolling.width", 10)
self.assertEqual(self.module.text[0:10], self.module.get(self.widget))
self.module.text = "this is a sample song (0:01)"
self.assertEqual(self.module.text[1:11], self.module.get(self.widget))
self.module.text = "this is a sample song (0:12)"
self.assertEqual(self.module.text[2:12], self.module.get(self.widget))
self.module.text = "this is a different song (0:12)"
self.assertEqual(self.module.text[0:10], self.module.get(self.widget))
def test_slightly_changed_data(module):
module.text = "this is a sample song (0:00)"
module.set("scrolling.width", 10)
def test_n_plus_one(self):
self.module.text = "10 letters"
self.module.set("scrolling.width", 9)
self.assertEqual(self.module.text[0:9], self.module.get(self.widget))
self.assertEqual(self.module.text[1:10], self.module.get(self.widget))
self.assertEqual(self.module.text[0:9], self.module.get(self.widget))
self.assertEqual(self.module.text[1:10], self.module.get(self.widget))
self.assertEqual(self.module.text[0:9], self.module.get(self.widget))
assert module.get(module.widget()) == module.text[0:10]
module.text = "this is a sample song (0:01)"
assert module.get(module.widget()) == module.text[1:11]
module.text = "this is a sample song (0:02)"
assert module.get(module.widget()) == module.text[2:12]
module.text = "this is a sample song (0:13)"
assert module.get(module.widget()) == module.text[3:13]
module.text = "this is a different song (0:13)"
assert module.get(module.widget()) == module.text[0:10]
def test_n_plus_one(module):
module.text = "10 letters"
module.set("scrolling.width", 9)
assert module.get(module.widget()) == module.text[0:9]
assert module.get(module.widget()) == module.text[1:10]
assert module.get(module.widget()) == module.text[0:9]
assert module.get(module.widget()) == module.text[1:10]
assert module.get(module.widget()) == module.text[0:9]
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,62 +1,73 @@
import unittest
import pytest
import core.event
@pytest.fixture
def someEvent():
class Event():
def __init__(self):
core.event.clear()
self.id = "some event"
self.called = 0
self.call_args = []
self.call_kwargs = []
class event(unittest.TestCase):
def setUp(self):
self.someEvent = "event"
self.called = {}
self.params = []
core.event.clear()
def callback(self, *args, **kwargs):
self.called += 1
if args:
self.call_args.append(list(args))
if kwargs:
self.call_kwargs.append(kwargs)
def callback1(self):
self.called["callback1"] = True
return Event()
def callback2(self):
self.called["callback2"] = True
def callback_args(self, val1, val2):
self.called["callback_args"] = True
self.params = [val1, val2]
def test_simple_callback(someEvent):
assert someEvent.called == 0
def callback_kwargs(self, val1, val2, key1=None, key2=None):
self.called["callback_kwargs"] = True
self.params = [val1, val2, key1, key2]
core.event.register(someEvent.id, someEvent.callback)
core.event.register(someEvent.id, someEvent.callback)
def test_simple_callback(self):
core.event.register(self.someEvent, self.callback1)
core.event.register(self.someEvent, self.callback2)
core.event.trigger(someEvent.id)
core.event.trigger(self.someEvent)
assert someEvent.called == 2
self.assertEqual(2, len(self.called.keys()))
def test_args_callback(someEvent):
core.event.register(someEvent.id, someEvent.callback, "a", "b")
core.event.trigger(someEvent.id)
def test_arg_callback(self):
core.event.register(self.someEvent, self.callback_args, "a", "b")
core.event.trigger(self.someEvent)
self.assertEqual(1, len(self.called.keys()))
self.assertEqual(["a", "b"], self.params)
assert someEvent.called == 1
assert len(someEvent.call_args) == 1
assert someEvent.call_args[0] == ["a", "b"]
def test_kwargs_callback(self):
core.event.register(
self.someEvent, self.callback_kwargs, "a", "b", key1="test", key2="x"
)
core.event.trigger(self.someEvent)
self.assertEqual(1, len(self.called.keys()))
self.assertEqual(["a", "b", "test", "x"], self.params)
def test_kwargs_callback(someEvent):
core.event.register(
someEvent.id, someEvent.callback, "a", "b", key1="test", key2="another"
)
core.event.trigger(someEvent.id)
def test_arg_trigger(self):
core.event.register(self.someEvent, self.callback_args)
core.event.trigger(self.someEvent, "a", "b")
self.assertEqual(1, len(self.called.keys()))
self.assertEqual(["a", "b"], self.params)
assert someEvent.called == 1
assert len(someEvent.call_args) == 1
assert someEvent.call_args[0] == ["a", "b"]
assert len(someEvent.call_kwargs) == 1
assert someEvent.call_kwargs[0] == { "key1": "test", "key2": "another" }
def test_kwargs_trigger(self):
core.event.register(self.someEvent, self.callback_kwargs)
core.event.trigger(self.someEvent, "a", "b", key1="test", key2="x")
self.assertEqual(1, len(self.called.keys()))
self.assertEqual(["a", "b", "test", "x"], self.params)
def test_arg_trigger(someEvent):
core.event.register(someEvent.id, someEvent.callback)
core.event.trigger(someEvent.id, "a", "b")
assert someEvent.called == 1
assert len(someEvent.call_args) == 1
assert someEvent.call_args[0] == ["a", "b"]
def test_kwargs_trigger(someEvent):
core.event.register(someEvent.id, someEvent.callback)
core.event.trigger(someEvent.id, "a", "c", key1="test", key2="something")
assert someEvent.called == 1
assert len(someEvent.call_args) == 1
assert someEvent.call_args[0] == ["a", "c"]
assert len(someEvent.call_kwargs) == 1
assert someEvent.call_kwargs[0] == { "key1": "test", "key2": "something" }
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,90 +1,104 @@
import unittest
import pytest
import core.input
class config(unittest.TestCase):
def setUp(self):
self.inputObject = core.input.Object()
self.anotherObject = core.input.Object()
self.someEvent = {
"button": core.input.LEFT_MOUSE,
"instance": self.inputObject.id,
}
self.anotherEvent = {
"button": core.input.RIGHT_MOUSE,
"instance": self.inputObject.id,
}
self.callback = unittest.mock.MagicMock()
self.callback2 = unittest.mock.MagicMock()
self.someCommand = "some sample command"
@pytest.fixture
def obj():
return core.input.Object()
def test_callable_gets_called(self):
core.input.register(self.inputObject, self.someEvent["button"], self.callback)
core.input.trigger(self.someEvent)
self.callback.assert_called_once_with(self.someEvent)
def test_nonexistent_callback(self):
core.input.register(self.inputObject, self.someEvent["button"], self.callback)
core.input.trigger(self.anotherEvent)
self.callback.assert_not_called()
@pytest.fixture
def obj2():
return core.input.Object()
def test_different_events(self):
core.input.register(self.inputObject, self.someEvent["button"], self.callback)
core.input.register(
self.inputObject, self.anotherEvent["button"], self.callback
)
core.input.register(
self.anotherObject, self.someEvent["button"], self.callback2
)
core.input.register(
self.anotherObject, self.anotherEvent["button"], self.callback2
)
core.input.trigger(self.someEvent)
core.input.trigger(self.anotherEvent)
self.callback.assert_any_call(self.someEvent)
self.callback.assert_any_call(self.anotherEvent)
self.callback2.assert_not_called()
def test_multiple_registrations(self):
core.input.register(self.inputObject, self.someEvent["button"], self.callback)
core.input.register(self.inputObject, self.someEvent["button"], self.callback2)
core.input.trigger(self.someEvent)
self.callback.assert_called_once_with(self.someEvent)
self.callback2.assert_called_once_with(self.someEvent)
@pytest.fixture
def cb(mocker):
return mocker.MagicMock()
def test_event_names(self):
self.assertEqual(core.input.button_name(core.input.LEFT_MOUSE), "left-mouse")
self.assertEqual(core.input.button_name(core.input.RIGHT_MOUSE), "right-mouse")
self.assertEqual(
core.input.button_name(core.input.MIDDLE_MOUSE), "middle-mouse"
)
self.assertEqual(core.input.button_name(core.input.WHEEL_UP), "wheel-up")
self.assertEqual(core.input.button_name(core.input.WHEEL_DOWN), "wheel-down")
self.assertEqual(core.input.button_name(12345), "n/a")
def test_non_callable_callback(self):
with unittest.mock.patch("core.input.util.cli") as cli:
cli.execute.return_value = ""
core.input.register(
self.inputObject, self.someEvent["button"], self.someCommand
)
core.input.trigger(self.someEvent)
cli.execute.assert_called_once_with(
self.someCommand, wait=False, shell=True
)
@pytest.fixture
def cb2(mocker):
return mocker.MagicMock()
def test_non_existent_callback(self):
with unittest.mock.patch("core.input.util.cli") as cli:
cli.execute.return_value = ""
cli.execute.side_effect = RuntimeError("some-error")
core.input.register(
self.inputObject, self.someEvent["button"], self.someCommand
)
try:
core.input.trigger(self.someEvent)
except Exception:
self.fail("input module propagated exception")
def event(input_object):
return {"button": core.input.LEFT_MOUSE, "instance": input_object.id}
def event2(input_object):
return {"button": core.input.RIGHT_MOUSE, "instance": input_object.id}
def test_callable_gets_called(obj, cb):
core.input.register(obj, event(obj)["button"], cb)
core.input.trigger(event(obj))
cb.assert_called_once_with(event(obj))
def test_nonexistent_callback(obj, obj2, cb):
core.input.register(obj, event(obj)["button"], cb)
core.input.trigger(event(obj2))
cb.assert_not_called()
def test_different_events(obj, obj2, cb, cb2):
core.input.register(obj, event(obj)["button"], cb)
core.input.register(obj, event2(obj)["button"], cb)
core.input.register(obj2, event(obj)["button"], cb2)
core.input.register(obj2, event2(obj)["button"], cb2)
core.input.trigger(event(obj))
core.input.trigger(event2(obj))
cb.assert_any_call(event(obj))
cb.assert_any_call(event2(obj))
cb2.assert_not_called()
def test_multiple_registrations(obj, cb, cb2):
core.input.register(obj, event(obj)["button"], cb)
core.input.register(obj, event(obj)["button"], cb2)
core.input.trigger(event(obj))
cb.assert_called_once_with(event(obj))
cb2.assert_called_once_with(event(obj))
def test_event_names():
assert core.input.button_name(core.input.LEFT_MOUSE) == "left-mouse"
assert core.input.button_name(core.input.RIGHT_MOUSE) == "right-mouse"
assert core.input.button_name(core.input.MIDDLE_MOUSE) == "middle-mouse"
assert core.input.button_name(core.input.WHEEL_UP) == "wheel-up"
assert core.input.button_name(core.input.WHEEL_DOWN) == "wheel-down"
assert core.input.button_name(12345) == "n/a"
def test_non_callable_callback(mocker, obj):
cli = mocker.patch("core.input.util.cli")
cli.execute.return_value = ""
core.input.register(obj, event(obj)["button"], "sample-command")
core.input.trigger(event(obj))
cli.execute.assert_called_once_with("sample-command", wait=False, shell=True)
def test_non_existent_callback(mocker, obj):
cli = mocker.patch("core.input.util.cli")
cli.execute.return_value = ""
cli.execute.side_effect = RuntimeError("some-error")
core.input.register(obj, event(obj)["button"], "sample-command")
core.input.trigger(event(obj))
cli.execute.assert_called_once_with("sample-command", wait=False, shell=True)
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,4 +1,4 @@
import unittest
import pytest
import sys
import shlex
@ -9,175 +9,169 @@ import core.config
import core.input
class TestModule(core.module.Module):
@pytest.fixture(autouse=True)
def clear_events():
core.event.clear()
@pytest.fixture
def empty_config():
return core.config.Config([])
@pytest.fixture
def widget_a():
return core.widget.Widget("randomwWidget content", name="A")
@pytest.fixture
def widget_b():
return core.widget.Widget("another randomwWidget content", name="B")
class SampleModule(core.module.Module):
def update(self):
if self.fail:
raise Exception(self.error)
pass
class module(unittest.TestCase):
def setUp(self):
core.event.clear()
self.invalidModuleName = "invalid-module-name"
self.validModuleName = "test"
self.someWidget = core.widget.Widget("randomeWidgetContent", name="A")
self.anotherWidget = core.widget.Widget("more Widget content", name="B")
self.unusedWidgetName = "C"
def test_loadinvalid_module(mocker):
config = mocker.MagicMock()
module = core.module.load(module_name="i-do-not-exist", config=config)
assert module.__class__.__module__ == "core.module"
assert module.__class__.__name__ == "Error"
def test_loadinvalid_module(self):
config = unittest.mock.MagicMock()
module = core.module.load(module_name=self.invalidModuleName, config=config)
self.assertEqual(
"core.module", module.__class__.__module__, "module must be a module object"
)
self.assertEqual(
"Error",
module.__class__.__name__,
"an invalid module must be a core.module.Error",
)
@unittest.skipIf(
sys.version_info.major == 3 and sys.version_info.minor in [4, 5],
"importlib error reporting in Python 3.{4,5} different",
@pytest.mark.skipif(
sys.version_info.major == 3 and sys.version_info.minor in [4, 5],
reason="importlib error reporting in Python 3.{4,5} different",
)
def test_importerror(mocker):
importlib = mocker.patch("core.module.importlib")
importlib.import_module.side_effect = ImportError("some-error")
config = mocker.MagicMock()
module = core.module.load(module_name="test", config=config)
assert module.__class__.__name__ == "Error"
assert module.widget().full_text() == "test: some-error"
def test_loadvalid_module():
module = core.module.load(module_name="test")
assert module.__class__.__module__ == "modules.core.test"
assert module.__class__.__name__ == "Module"
assert module.state(None) == []
def test_empty_widgets():
module = core.module.Module(widgets=[])
assert module.widgets() == []
def test_error_widget():
cfg = core.config.Config(shlex.split("-p test_module.foo=5"))
module = core.module.Error("test-mod", "xyz", config=cfg)
full_text = module.full_text(module.widget())
assert module.state(None) == ["critical"]
assert "test-mod" in full_text
assert "xyz" in full_text
def test_single_widget(widget_a):
module = core.module.Module(widgets=widget_a)
assert module.widgets() == [widget_a]
def test_widget_list(widget_a, widget_b):
module = core.module.Module(widgets=[widget_a, widget_b])
assert module.widgets() == [widget_a, widget_b]
def test_module_Name():
module = SampleModule()
assert module.name == "test_module"
assert module.module_name == "test_module"
def testvalid_parameter():
cfg = core.config.Config(shlex.split("-p test_module.foo=5"))
module = SampleModule(config=cfg)
assert module.parameter("foo") == "5"
def test_default_parameter(empty_config):
module = SampleModule(config=empty_config)
assert module.parameter("foo", "default") == "default"
def test_default_is_none(empty_config):
module = SampleModule(config=empty_config)
assert module.parameter("foo") == None
def test_error_widget(empty_config):
module = SampleModule(config=empty_config)
module.fail = True
module.error = "!!"
module.update_wrapper()
assert len(module.widgets()) == 1
assert module.widget().full_text() == "error: !!"
def test_get_widget_by_name(empty_config, widget_a, widget_b):
module = SampleModule(config=empty_config, widgets=[widget_a, widget_b])
assert module.widget(widget_a.name) == widget_a
assert module.widget(widget_b.name) == widget_b
assert module.widget("i-do-not-exist") == None
assert module.widget() == widget_a
def test_default_thresholds(empty_config, widget_a, widget_b):
module = SampleModule(config=empty_config, widgets=[widget_a, widget_b])
assert module.threshold_state(100, 80, 99) == "critical"
assert module.threshold_state(100, 80, 100) == "warning"
assert module.threshold_state(81, 80, 100) == "warning"
assert module.threshold_state(80, 80, 100) == None
assert module.threshold_state(10, 80, 100) == None
def test_configured_callbacks(mocker, empty_config, widget_a, widget_b):
module = SampleModule(config=empty_config, widgets=[widget_a, widget_b])
cmd = "sample-tool arg1 arg2 arg3"
module.set("left-click", cmd)
module.register_callbacks()
cli = mocker.patch("core.input.util.cli")
cli.execute.return_value = ""
core.input.trigger(
{"button": core.input.LEFT_MOUSE, "instance": module.id,}
)
def test_importerror(self):
with unittest.mock.patch("core.module.importlib") as importlib:
importlib.import_module.side_effect = ImportError("some-error")
config = unittest.mock.MagicMock()
module = core.module.load(module_name=self.validModuleName, config=config)
module.widget().full_text()
self.assertEqual(
"Error",
module.__class__.__name__,
"an invalid module must be a core.module.Error",
)
self.assertEqual(module.widget().full_text(), "test: some-error")
cli.execute.assert_called_once_with(cmd, wait=False, shell=True)
def test_loadvalid_module(self):
module = core.module.load(module_name=self.validModuleName)
self.assertEqual(
"modules.core.{}".format(self.validModuleName),
module.__class__.__module__,
"module must be a modules.core.<name> object",
)
self.assertEqual(
"Module",
module.__class__.__name__,
"a valid module must have a Module class",
)
self.assertEqual([], module.state(None), "default state of module is empty")
def test_empty_widgets(self):
module = core.module.Module(widgets=[])
self.assertEqual([], module.widgets())
def test_configured_callbacks_with_parameters(mocker, empty_config, widget_a):
module = SampleModule(config=empty_config, widgets=[widget_a])
def test_error_widget(self):
cfg = core.config.Config(shlex.split("-p test_module.foo=5"))
module = core.module.Error(cfg, "test-mod", "xyz")
self.assertEqual(
["critical"], module.state(None), "error module must have critical state"
)
full_text = module.full_text(module.widget())
self.assertTrue("test-mod" in full_text)
self.assertTrue("xyz" in full_text)
cmd = "sample-tool {instance} {name}"
module.set("left-click", cmd)
module.register_callbacks()
def test_single_widget(self):
module = core.module.Module(widgets=self.someWidget)
self.assertEqual([self.someWidget], module.widgets())
cli = mocker.patch("core.input.util.cli")
cli.execute.return_value = ""
core.input.trigger(
{"button": core.input.LEFT_MOUSE, "instance": module.id, "name": "sample-name",}
)
def test_widget_list(self):
module = core.module.Module(widgets=[self.someWidget, self.anotherWidget])
self.assertEqual([self.someWidget, self.anotherWidget], module.widgets())
def test_module_Name(self):
module = TestModule()
self.assertEqual("test_module", module.name, "module has wrong name")
self.assertEqual("test_module", module.module_name, "module has wrong name")
def testvalid_parameter(self):
cfg = core.config.Config(shlex.split("-p test_module.foo=5"))
module = TestModule(config=cfg)
self.assertEqual(5, int(module.parameter("foo")))
def test_default_parameter(self):
cfg = core.config.Config([])
module = TestModule(config=cfg)
self.assertEqual("default", module.parameter("foo", "default"))
def test_default_is_none(self):
cfg = core.config.Config([])
module = TestModule(config=cfg)
self.assertEqual(None, module.parameter("foo"))
def test_error_widget(self):
cfg = core.config.Config([])
module = TestModule(config=cfg)
module.fail = True
module.error = "!!"
module.update_wrapper()
self.assertEqual(1, len(module.widgets()))
self.assertEqual("error: !!", module.widget().full_text())
def test_get_widget_by_name(self):
cfg = core.config.Config([])
module = TestModule(config=cfg, widgets=[self.someWidget, self.anotherWidget])
self.assertEqual(self.someWidget, module.widget(self.someWidget.name))
self.assertEqual(self.anotherWidget, module.widget(self.anotherWidget.name))
self.assertEqual(None, module.widget(self.unusedWidgetName))
self.assertEqual(self.someWidget, module.widget())
def test_default_thresholds(self):
cfg = core.config.Config([])
module = TestModule(config=cfg, widgets=[self.someWidget, self.anotherWidget])
self.assertEqual("critical", module.threshold_state(100, 80, 99))
self.assertEqual("warning", module.threshold_state(100, 80, 100))
self.assertEqual("warning", module.threshold_state(81, 80, 100))
self.assertEqual(None, module.threshold_state(80, 80, 100))
self.assertEqual(None, module.threshold_state(10, 80, 100))
def test_configured_callbacks(self):
cfg = core.config.Config([])
module = TestModule(config=cfg, widgets=[self.someWidget, self.anotherWidget])
cmd = "sample-tool arg1 arg2 arg3"
module.set("left-click", cmd)
module.register_callbacks()
with unittest.mock.patch("core.input.util.cli") as cli:
cli.execute.return_value = ""
core.input.trigger(
{"button": core.input.LEFT_MOUSE, "instance": module.id,}
)
cli.execute.assert_called_once_with(cmd, wait=False, shell=True)
def test_configured_callbacks_with_parameters(self):
cfg = core.config.Config([])
module = TestModule(config=cfg, widgets=[self.someWidget])
cmd = "sample-tool {instance} {name}"
module.set("left-click", cmd)
module.register_callbacks()
with unittest.mock.patch("core.input.util.cli") as cli:
cli.execute.return_value = ""
core.input.trigger(
{
"button": core.input.LEFT_MOUSE,
"instance": module.id,
"name": "sample-name",
}
)
cli.execute.assert_called_once_with(
cmd.format(instance=module.id, name="sample-name"),
wait=False,
shell=True,
)
cli.execute.assert_called_once_with(
cmd.format(instance=module.id, name="sample-name"), wait=False, shell=True,
)
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,162 +1,173 @@
import json
import unittest
import pytest
import core.event
import core.config
import core.output
import core.module
class TestModule(core.module.Module):
class SampleModule(core.module.Module):
pass
@pytest.fixture(autouse=True)
def clear_events():
core.event.clear()
class i3(unittest.TestCase):
def setUp(self):
self.i3 = core.output.i3()
widget = unittest.mock.MagicMock()
widget.full_text.return_value = "test"
self.someModule = TestModule(
config=core.config.Config([]), widgets=[widget, widget, widget]
)
self.paddedTheme = core.theme.Theme(raw_data={"defaults": {"padding": " "}})
self.separator = "***"
self.separatorTheme = core.theme.Theme(
raw_data={
"defaults": {"separator": self.separator, "fg": "red", "bg": "blue"}
}
)
self.someBlock = core.output.block(
theme=self.separatorTheme,
module=self.someModule,
widget=self.someModule.widget(),
)
@pytest.fixture
def i3():
return core.output.i3()
def test_start(self):
core.event.clear()
@pytest.fixture
def module_a(mocker):
widget = mocker.MagicMock()
widget.full_text.return_value = "test"
return SampleModule(
config=core.config.Config([]), widgets=[widget, widget, widget]
)
all_data = self.i3.start()
data = all_data["blocks"]
self.assertEqual(1, data["version"], "i3bar protocol version 1 expected")
self.assertTrue(data["click_events"], "click events should be enabled")
self.assertEqual("\n[", all_data["suffix"])
@pytest.fixture
def paddedTheme():
return core.theme.Theme(raw_data={"defaults": {"padding": " "}})
def test_stop(self):
self.assertEqual(
"\n]", self.i3.stop()["suffix"], "wrong i3bar protocol during stop"
)
@pytest.fixture
def separatorTheme():
return core.theme.Theme(
raw_data={
"defaults": {"separator": "***", "fg": "red", "bg": "blue"}
}
)
def test_no_modules_by_default(self):
self.assertEqual(
0, len(self.i3.modules()), "module list should be empty by default"
)
@pytest.fixture
def block_a(separatorTheme, module_a):
return core.output.block(
theme=separatorTheme,
module=module_a,
widget=module_a.widget(),
)
def test_register_single_module(self):
self.i3.modules(self.someModule)
self.assertEqual(
1, len(self.i3.modules()), "setting single module does not work"
)
#def setUp(self):
# self.i3 = core.output.i3()
# widget = unittest.mock.MagicMock()
# widget.full_text.return_value = "test"
# self.someModule = SampleModule(
# config=core.config.Config([]), widgets=[widget, widget, widget]
# )
# self.separator = "***"
#
def test_start(i3):
all_data = i3.start()
data = all_data["blocks"]
def test_register_multiple_modules(self):
self.i3.modules([self.someModule, self.someModule, self.someModule])
self.assertEqual(3, len(self.i3.modules()), "setting module list does not work")
assert data["version"] == 1
assert data["click_events"] == True
assert all_data["suffix"] == "\n["
def test_draw_existing_module(self):
self.i3.test_draw = unittest.mock.MagicMock(
return_value={"blocks": {"test": True}, "suffix": "end"}
)
self.i3.draw("test_draw")
self.i3.test_draw.assert_called_once_with()
def test_stop(i3):
assert i3.stop()["suffix"] == "\n]"
def test_empty_status_line(self):
data = self.i3.statusline()
self.assertEqual(
[], data["blocks"], "expected empty list of status line entries"
)
self.assertEqual(",", data["suffix"], 'expected "," as suffix')
def test_no_modules_by_default(i3):
assert i3.modules() == []
def test_statusline(self):
self.i3.modules([self.someModule, self.someModule, self.someModule])
self.i3.update()
data = self.i3.statusline()
self.assertEqual(
len(self.someModule.widgets()) * 3,
len(data["blocks"]),
"wrong number of widgets",
)
def test_register_single_module(i3, module_a):
i3.modules(module_a)
def test_padding(self):
self.i3.theme(self.paddedTheme)
blk = core.output.block(
self.i3.theme(), self.someModule, self.someModule.widget()
)
blk.set("full_text", "abc")
result = blk.dict()["full_text"]
self.assertEqual(" abc ", result)
assert i3.modules() == [module_a]
def test_no_separator(self):
result = self.i3.separator_block(self.someModule, self.someModule.widget())
self.assertEqual([], result)
def test_register_multiple_modules(i3, module_a):
i3.modules([module_a, module_a, module_a])
assert i3.modules() == [module_a, module_a, module_a]
def test_separator(self):
self.i3.theme(self.separatorTheme)
result = self.i3.separator_block(self.someModule, self.someModule.widget())
self.assertEqual(1, len(result))
self.assertEqual("***", result[0].dict()["full_text"])
self.assertTrue(result[0].dict().get("_decorator", False))
self.assertEqual(
self.separatorTheme.get("bg", self.someModule.widget()),
result[0].dict()["color"],
)
def test_draw_existing_module(mocker, i3):
i3.test_draw = mocker.MagicMock(
return_value={"blocks": {"test": True}, "suffix": "end"}
)
i3.draw("test_draw")
i3.test_draw.assert_called_once_with()
def test_dump_json(self):
obj = unittest.mock.MagicMock()
obj.dict = unittest.mock.MagicMock()
core.output.dump_json(obj)
obj.dict_assert_called_once_with()
def test_empty_status_line(i3):
data = i3.statusline()
def test_assign(self):
src = {"a": "x", "b": "y", "c": "z"}
dst = {}
assert data["blocks"] == []
assert data["suffix"] == ","
core.output.assign(src, dst, "a")
self.assertEqual(dst["a"], src["a"])
def test_statusline(i3, module_a):
i3.modules([module_a, module_a, module_a])
i3.update()
data = i3.statusline()
assert len(data["blocks"]) == len(module_a.widgets())*3
core.output.assign(src, dst, "123", "b")
self.assertEqual(dst["123"], src["b"])
def test_padding(i3, paddedTheme, module_a):
i3.theme(paddedTheme)
blk = core.output.block(
i3.theme(), module_a, module_a.widget()
)
blk.set("full_text", "abc")
result = blk.dict()["full_text"]
assert result == " abc "
core.output.assign(src, dst, "blub", default="def")
self.assertEqual("def", dst["blub"])
def test_no_separator(i3, module_a):
result = i3.separator_block(module_a, module_a.widget())
assert result == []
def test_pango_detection(self):
self.assertFalse(self.someBlock.is_pango({}))
self.assertTrue(self.someBlock.is_pango({"pango": {}}))
def test_separator(i3, separatorTheme, module_a):
i3.theme(separatorTheme)
result = i3.separator_block(module_a, module_a.widget())
def test_pangoize(self):
self.assertEqual("test", self.someBlock.pangoize("test"))
self.assertFalse("markup" in self.someBlock.dict())
assert len(result) == 1
assert result[0].dict()["full_text"] == "***"
assert result[0].dict().get("_decorator") == True
assert result[0].dict()["color"] == separatorTheme.get("bg", module_a.widget())
pango = self.someBlock.pangoize(
{"pango": {"attr": "blub", "x": "y", "full_text": "test"}}
)
self.assertTrue('attr="blub"' in pango)
self.assertTrue('x="y"' in pango)
self.assertTrue("<span " in pango)
self.assertTrue(">test</span>" in pango)
self.assertEqual("pango", self.someBlock.dict()["markup"])
def test_dump_json(mocker):
obj = mocker.MagicMock()
obj.dict = mocker.MagicMock()
core.output.dump_json(obj)
obj.dict_assert_called_once_with()
def test_padding(self):
self.someBlock.set("padding", "***")
self.someBlock.set("full_text", "test")
def test_assign():
src = {"a": "x", "b": "y", "c": "z"}
dst = {}
self.assertEqual("***test***", self.someBlock.dict()["full_text"])
core.output.assign(src, dst, "a")
assert src["a"] == dst["a"]
def test_pre_suffix(self):
self.someBlock.set("padding", "*")
self.someBlock.set("prefix", "pre")
self.someBlock.set("suffix", "suf")
self.someBlock.set("full_text", "test")
core.output.assign(src, dst, "123", "b")
assert src["b"] == dst["123"]
self.assertEqual("*pre*test*suf*", self.someBlock.dict()["full_text"])
core.output.assign(src, dst, "blub", default="def")
assert dst["blub"] == "def"
def test_pango_detection(block_a):
assert block_a.is_pango({}) == False
assert block_a.is_pango({ "pango": {} }) == True
def test_pangoize(block_a):
assert block_a.pangoize("test") == "test"
assert not "markup" in block_a.dict()
pango = block_a.pangoize(
{"pango": {"attr": "blub", "x": "y", "full_text": "test"}}
)
assert 'attr="blub"' in pango
assert 'x="y"' in pango
assert "<span " in pango
assert ">test</span>" in pango
assert block_a.dict()["markup"] == "pango"
def test_padding(block_a):
block_a.set("padding", "***")
block_a.set("full_text", "test")
assert block_a.dict()["full_text"] == "***test***"
def test_pre_suffix(block_a):
block_a.set("padding", "*")
block_a.set("prefix", "pre")
block_a.set("suffix", "suf")
block_a.set("full_text", "test")
assert block_a.dict()["full_text"] == "*pre*test*suf*"
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,4 +1,4 @@
import unittest
import pytest
import types
import core.theme
@ -7,139 +7,169 @@ import core.widget
import core.module
class TestModule(core.module.Module):
class SampleModule(core.module.Module):
def __init__(self, widgets, config=core.config.Config([]), theme=None):
super().__init__(config, theme, widgets)
self.name = "test"
@pytest.fixture(autouse=True)
def clear_events():
core.event.clear()
class theme(unittest.TestCase):
def setUp(self):
core.event.clear()
self.invalidThemeName = "this-theme-does-not-exist"
self.validThemeName = "default"
self.defaultsTheme = {"defaults": {"fg": "red", "bg": "black"}}
self.cycleTheme = {
"cycle": [
{"fg": "red", "bg": "black"},
{"fg": "black", "bg": "red"},
{"fg": "white", "bg": "blue"},
]
}
self.colorTheme = {"colors": [{"red": "#ff0000", "blue": "#0000ff"}]}
self.walTheme = {"colors": ["wal"]}
self.cycleValueTheme = {"defaults": {"fg": ["red", "green", "blue"]}}
self.stateTheme = {"warning": {"fg": "yellow"}, "critical": {"fg": "red"}}
self.overlayTheme = {
"load": {"prefix": "a"},
"test": {"load": {"prefix": "b"}, "prefix": "x"},
}
@pytest.fixture
def defaultsTheme():
return {"defaults": {"fg": "red", "bg": "black"}}
def test_invalid_theme(self):
with self.assertRaises(RuntimeError):
core.theme.Theme(self.invalidThemeName)
@pytest.fixture
def cycleTheme():
return {
"cycle": [
{"fg": "red", "bg": "black"},
{"fg": "black", "bg": "red"},
{"fg": "white", "bg": "blue"},
]
}
def test_valid_theme(self):
theme = core.theme.Theme(self.validThemeName)
self.assertEqual(self.validThemeName, theme.name)
@pytest.fixture
def colorTheme():
return {"colors": [{"red": "#ff0000", "blue": "#0000ff"}]}
def test_defaults(self):
theme = core.theme.Theme(raw_data=self.defaultsTheme)
self.assertEqual(self.defaultsTheme["defaults"]["fg"], theme.get("fg"))
self.assertEqual(self.defaultsTheme["defaults"]["bg"], theme.get("bg"))
@pytest.fixture
def walTheme():
return {"colors": ["wal"]}
def test_cycle(self):
theme = core.theme.Theme(raw_data=self.cycleTheme)
self.assertEqual(None, theme.get("prev-bg"))
self.assertEqual(self.cycleTheme["cycle"][0]["fg"], theme.get("fg"))
self.assertEqual(self.cycleTheme["cycle"][0]["bg"], theme.get("bg"))
core.event.trigger("next-widget")
self.assertEqual(self.cycleTheme["cycle"][0]["bg"], theme.get("bg", "previous"))
core.event.trigger("next-widget")
self.assertEqual(self.cycleTheme["cycle"][2]["fg"], theme.get("fg"))
self.assertEqual(self.cycleTheme["cycle"][2]["bg"], theme.get("bg"))
@pytest.fixture
def cycleValueTheme():
return {"defaults": {"fg": ["red", "green", "blue"]}}
with unittest.mock.patch("core.output.sys.stdout"):
core.event.trigger("draw")
self.assertEqual(self.cycleTheme["cycle"][0]["fg"], theme.get("fg"))
self.assertEqual(self.cycleTheme["cycle"][0]["bg"], theme.get("bg"))
@pytest.fixture
def stateTheme():
return {"warning": {"fg": "yellow"}, "critical": {"fg": "red"}}
def test_custom_iconset(self):
theme = core.theme.Theme(raw_data=self.defaultsTheme)
self.assertNotEqual("aaa", theme.get("padding"))
theme = core.theme.Theme(
raw_data=self.defaultsTheme, iconset={"defaults": {"padding": "aaa"}}
)
self.assertEqual("aaa", theme.get("padding"))
@pytest.fixture
def overlayTheme():
return {
"load": {"prefix": "a"},
"test": {"load": {"prefix": "b"}, "prefix": "x"},
}
def test_colors(self):
theme = core.theme.Theme(raw_data=self.defaultsTheme)
self.assertEqual({}, theme.keywords())
theme = core.theme.Theme(raw_data=self.colorTheme)
self.assertEqual(self.colorTheme["colors"][0], theme.keywords())
def test_invalid_theme():
with pytest.raises(RuntimeError):
core.theme.Theme("this-theme-does-not-exist")
def test_wal_colors(self):
with unittest.mock.patch("core.theme.io") as io:
with unittest.mock.patch("core.theme.os") as os:
os.path.isfile.return_value = True
io.open.return_value = unittest.mock.MagicMock()
io.open.return_value.__enter__.return_value.read.return_value = """
{ "colors": { "red": "#ff0000" } }
"""
def test_valid_theme():
theme = core.theme.Theme("default")
assert theme.name == "default"
theme = core.theme.Theme(raw_data=self.walTheme)
self.assertEqual({"red": "#ff0000"}, theme.keywords())
def test_defaults(defaultsTheme):
theme = core.theme.Theme(raw_data=defaultsTheme)
def test_wal_special(self):
with unittest.mock.patch("core.theme.io") as io:
with unittest.mock.patch("core.theme.os") as os:
os.path.isfile.return_value = True
io.open.return_value.__enter__.return_value.read.return_value = """
{ "special": { "background": "#ff0000" } }
"""
assert theme.get("fg") == defaultsTheme["defaults"]["fg"]
assert theme.get("bg") == defaultsTheme["defaults"]["bg"]
theme = core.theme.Theme(raw_data=self.walTheme)
self.assertEqual({"background": "#ff0000"}, theme.keywords())
def test_cycle(mocker, cycleTheme):
theme = core.theme.Theme(raw_data=cycleTheme)
def test_cycle_value(self):
widget = core.widget.Widget()
expected = self.cycleValueTheme["defaults"]["fg"]
theme = core.theme.Theme(raw_data=self.cycleValueTheme)
assert theme.get("bg", "previous") == None
assert theme.get("fg") == cycleTheme["cycle"][0]["fg"]
assert theme.get("bg") == cycleTheme["cycle"][0]["bg"]
for i in range(0, len(expected) * 3):
self.assertEqual(expected[i % len(expected)], theme.get("fg", widget))
self.assertEqual(
expected[i % len(expected)], theme.get("fg", widget)
) # ensure multiple invocations are OK
core.event.trigger("draw")
core.event.trigger("next-widget")
def test_state(self):
widget = core.widget.Widget()
theme = core.theme.Theme(raw_data=self.stateTheme)
assert theme.get("bg", "previous") == cycleTheme["cycle"][0]["bg"]
self.assertEqual(None, theme.get("fg", widget))
core.event.trigger("next-widget")
widget.state = types.MethodType(lambda self: ["warning"], widget)
self.assertEqual(self.stateTheme["warning"]["fg"], theme.get("fg", widget))
assert theme.get("fg") == cycleTheme["cycle"][2]["fg"]
assert theme.get("bg") == cycleTheme["cycle"][2]["bg"]
widget.state = types.MethodType(lambda self: ["critical"], widget)
self.assertEqual(self.stateTheme["critical"]["fg"], theme.get("fg", widget))
stdout = mocker.patch("core.output.sys.stdout")
def test_overlay(self):
widget = core.widget.Widget()
module = TestModule(widget)
theme = core.theme.Theme(raw_data=self.overlayTheme)
core.event.trigger("draw")
self.assertEqual(
self.overlayTheme[module.name]["prefix"], theme.get("prefix", widget)
)
assert theme.get("fg") == cycleTheme["cycle"][0]["fg"]
assert theme.get("bg") == cycleTheme["cycle"][0]["bg"]
widget.state = types.MethodType(lambda self: ["load"], widget)
def test_custom_iconset(defaultsTheme):
theme = core.theme.Theme(raw_data=defaultsTheme)
self.assertEqual(
self.overlayTheme[module.name]["load"]["prefix"],
theme.get("prefix", widget),
)
assert theme.get("padding") != "aaa"
assert theme.get("fg") != "blue"
theme = core.theme.Theme(
raw_data=defaultsTheme, iconset={"defaults": {"padding": "aaa", "fg": "blue"}}
)
assert theme.get("padding") == "aaa"
assert theme.get("fg") == "blue" # test override
def test_colors(defaultsTheme, colorTheme):
theme = core.theme.Theme(raw_data=defaultsTheme)
assert theme.keywords() == {}
theme = core.theme.Theme(raw_data=colorTheme)
assert theme.keywords() == colorTheme["colors"][0]
def test_wal_colors(mocker, walTheme):
io = mocker.patch("core.theme.io")
os = mocker.patch("core.theme.os")
os.path.isfile.return_value = True
io.open.return_value = mocker.MagicMock()
io.open.return_value.__enter__.return_value.read.return_value = """
{ "colors": { "red": "#ff0000" } }
"""
theme = core.theme.Theme(raw_data=walTheme)
assert theme.keywords() == {"red": "#ff0000"}
def test_wal_special(mocker, walTheme):
io = mocker.patch("core.theme.io")
os = mocker.patch("core.theme.os")
os.path.isfile.return_value = True
io.open.return_value.__enter__.return_value.read.return_value = """
{ "special": { "background": "#ff0000" } }
"""
theme = core.theme.Theme(raw_data=walTheme)
assert theme.keywords() == {"background": "#ff0000"}
def test_cycle_value(cycleValueTheme):
widget = core.widget.Widget()
expected = cycleValueTheme["defaults"]["fg"]
theme = core.theme.Theme(raw_data=cycleValueTheme)
for i in range(0, len(expected) * 3):
assert theme.get("fg", widget) == expected[i%len(expected)]
# ensure multiple invocations are OK
assert theme.get("fg", widget) == expected[i%len(expected)]
core.event.trigger("draw")
def test_state(stateTheme):
widget = core.widget.Widget()
theme = core.theme.Theme(raw_data=stateTheme)
assert theme.get("fg", widget) == None
widget.state = types.MethodType(lambda self: ["warning"], widget)
assert theme.get("fg", widget) == stateTheme["warning"]["fg"]
widget.state = types.MethodType(lambda self: ["critical"], widget)
assert theme.get("fg", widget) == stateTheme["critical"]["fg"]
def test_overlay(overlayTheme):
widget = core.widget.Widget()
module = SampleModule(widget)
theme = core.theme.Theme(raw_data=overlayTheme)
assert theme.get("prefix", widget) == overlayTheme[module.name]["prefix"]
widget.state = types.MethodType(lambda self: ["load"], widget)
assert theme.get("prefix", widget) == overlayTheme[module.name]["load"]["prefix"]
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,12 +1,11 @@
import unittest
import unittest.mock
import pytest
import core.widget
import core.module
import core.config
class TestModule(core.module.Module):
class SampleModule(core.module.Module):
def __init__(self, widgets, config=core.config.Config([]), theme=None):
super().__init__(config, theme, widgets)
self.states = []
@ -19,77 +18,80 @@ class TestModule(core.module.Module):
def state(self, widget):
return self.states
@pytest.fixture
def widget_a():
return core.widget.Widget("some random value")
class widget(unittest.TestCase):
def setUp(self):
self.someValue = "some random value"
self.someOtherValue = "some different value"
self.callbackReturnValue = "callback return value"
self.someWidget = core.widget.Widget(full_text=self.someValue)
self.someCallback = unittest.mock.MagicMock(
return_value=self.callbackReturnValue
)
#class widget(unittest.TestCase):
# def setUp(self):
# self.someValue = "some random value"
# self.someOtherValue = "some different value"
# self.callbackReturnValue = "callback return value"
# self.someWidget = core.widget.Widget(full_text=self.someValue)
# self.someCallback = unittest.mock.MagicMock(
# return_value=self.callbackReturnValue
# )
#
# self.assertNotEqual(self.someValue, self.someOtherValue)
self.assertNotEqual(self.someValue, self.someOtherValue)
def test_text_fulltext():
widget = core.widget.Widget(full_text="this is some value")
assert widget.full_text() == "this is some value"
def tearDown(self):
pass
def test_set_fulltext(widget_a):
assert widget_a.full_text() != "new value"
widget_a.full_text("new value")
assert widget_a.full_text() == "new value"
def test_text_fulltext(self):
newWidget = core.widget.Widget(full_text=self.someValue)
self.assertEqual(self.someValue, newWidget.full_text())
def test_callable_fulltext(mocker):
callback = mocker.MagicMock(return_value="callback returns")
widget = core.widget.Widget(full_text=callback)
assert widget.full_text() == "callback returns"
callback.assert_called_once_with(widget)
def test_set_fulltext(self):
self.assertNotEqual(self.someOtherValue, self.someWidget.full_text())
self.someWidget.full_text(self.someOtherValue)
self.assertEqual(self.someOtherValue, self.someWidget.full_text())
def test_set_callable_fulltext(mocker, widget_a):
callback = mocker.MagicMock(return_value="this is a test")
widget_a.full_text(callback)
assert widget_a.full_text() == "this is a test"
callback.assert_called_once_with(widget_a)
def test_callable_fulltext(self):
newWidget = core.widget.Widget(full_text=self.someCallback)
self.assertEqual(newWidget.full_text(), self.callbackReturnValue)
self.someCallback.assert_called_once_with(newWidget)
def test_state_defaults_to_empty(widget_a):
assert widget_a.state() == []
def test_set_callable_fulltext(self):
self.someWidget.full_text(self.someCallback)
self.assertEqual(self.someWidget.full_text(), self.callbackReturnValue)
self.someCallback.assert_called_once_with(self.someWidget)
def test_single_widget_state(widget_a):
widget_a.set("state", "state1")
assert widget_a.state() == ["state1"]
def test_state_defaults_to_empty(self):
self.assertEqual([], self.someWidget.state())
def test_multiple_widget_states(widget_a):
widget_a.set("state", ["state1", "state2"])
assert widget_a.state() == ["state1", "state2"]
def test_single_widget_state(self):
self.someWidget.set("state", "state1")
self.assertEqual(["state1"], self.someWidget.state())
def test_widget_module_state(widget_a):
module = SampleModule(widgets=widget_a)
widget_a.set("state", ["state1", "state2"])
def test_multiple_widget_states(self):
self.someWidget.set("state", ["state1", "state2"])
self.assertEqual(["state1", "state2"], self.someWidget.state())
module.states = "x"
assert widget_a.state() == ["state1", "state2", "x"]
def test_widget_module_state(self):
module = TestModule(widgets=self.someWidget)
self.someWidget.set("state", ["state1", "state2"])
module.states = ["a", "b"]
assert widget_a.state() == ["state1", "state2", "a", "b"]
module.states = "x"
self.assertEqual(["state1", "state2", "x"], self.someWidget.state())
module.states = ["a", "b"]
self.assertEqual(["state1", "state2", "a", "b"], self.someWidget.state())
def test_multiple_widget_themes():
widget1 = core.widget.Widget(full_text="a")
widget2 = core.widget.Widget(full_text="b")
widget3 = core.widget.Widget(full_text="c")
def test_multiple_widget_themes(self):
widget1 = core.widget.Widget(full_text="a")
widget2 = core.widget.Widget(full_text="b")
widget3 = core.widget.Widget(full_text="c")
module = SampleModule(widgets=[widget1, widget2, widget3])
module.set("theme.test", "1,2,3")
module.set("theme.test2", "x")
module = TestModule(widgets=[widget1, widget2, widget3])
module.set("theme.test", "1,2,3")
module.set("theme.test2", "x")
assert widget1.theme("test") == "1"
assert widget2.theme("test") == "2"
assert widget3.theme("test") == "3"
self.assertEqual("1", widget1.theme("test"))
self.assertEqual("2", widget2.theme("test"))
self.assertEqual("3", widget3.theme("test"))
self.assertEqual("x", widget1.theme("test2"))
self.assertEqual(None, widget2.theme("test2"))
self.assertEqual(None, widget3.theme("test2"))
assert widget1.theme("test2") == "x"
assert widget2.theme("test2") == None
assert widget3.theme("test2") == None
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,21 +0,0 @@
import unittest
import core.config
import modules.contrib.kernel
class kernel(unittest.TestCase):
def setUp(self):
self.someKernel = "this-is-my-kernel"
self.module = modules.contrib.kernel.Module(
config=core.config.Config([]), theme=None
)
def test_full_text(self):
with unittest.mock.patch("modules.contrib.kernel.platform") as platform:
platform.release.return_value = self.someKernel
self.assertEqual(1, len(self.module.widgets()))
self.assertEqual(self.someKernel, self.module.widget().full_text())
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

View file

@ -1,42 +1,50 @@
import unittest
import pytest
from util.algorithm import *
@pytest.fixture
def someData():
return {"a": 100, "b": 200, "c": [1, 2, 3]}
class algorithm(unittest.TestCase):
def setUp(self):
self.someData = {"a": 100, "b": 200, "c": [1, 2, 3]}
self.differentData = {"x": 20, "y": "bla", "z": ["a", "b"]}
self.moreData = {"n": 100}
self.overlapData = {"a": 200, "c": [1, 2, 4]}
@pytest.fixture
def differentData():
return {"x": 20, "y": "bla", "z": ["a", "b"]}
def test_merge_with_empty(self):
self.assertEqual(self.someData, merge(self.someData, {}))
self.assertEqual(None, merge(self.someData, None))
@pytest.fixture
def moreData():
return {"n": 100}
def test_merge_no_overwrite(self):
result = merge(self.someData, self.differentData)
for k in self.someData:
self.assertEqual(result[k], self.someData[k])
@pytest.fixture
def overlapData():
return {"a": 200, "c": [1, 2, 4]}
def test_merge_with_empty(someData):
assert merge(someData, {}) == someData
assert merge(someData, None) == None
def test_merge_no_overwrite(someData, differentData):
result = merge(someData, differentData)
for k in someData:
assert someData[k] == result[k]
for k in self.differentData:
self.assertEqual(result[k], self.differentData[k])
assert differentData[k] == result[k]
def test_merge_multiple(self):
result = merge(self.someData, self.differentData, self.moreData)
for k in self.someData:
self.assertEqual(result[k], self.someData[k])
for k in self.differentData:
self.assertEqual(result[k], self.differentData[k])
for k in self.moreData:
self.assertEqual(result[k], self.moreData[k])
def test_merge_multiple(someData, differentData, moreData):
result = merge(someData, differentData, moreData)
for k in someData:
assert someData[k] == result[k]
for k in differentData:
assert differentData[k] == result[k]
for k in moreData:
assert moreData[k] == result[k]
def merge_overlap(self):
result = merge(self.someData, self.overlapData)
for k in self.someData:
def merge_overlap(someData, overlapData):
result = merge(someData, overlapData)
for k in someData:
if not k in self.overlapData:
self.assertEqual(result[k], self.someData[k])
assert someData[k] == result[k]
for k in self.overlapData:
self.assertEqual(result[k], self.overlapData[k])
assert overlapData[k] == result[k]
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,43 +1,27 @@
import unittest
import pytest
import util.cli
def test_valid_command():
assert util.cli.execute("echo test") == "test\n"
class cli(unittest.TestCase):
def setUp(self):
self.nonExistentCommand = "i-do-not-exist"
self.validCommand = "echo test"
self.validCommandOutput = "test\n"
self.utfCommand = "echo ÖPmŧß"
self.utfCommandOutput = "ÖPmŧß\n"
def test_utf_command():
rv = util.cli.execute("echo ÖPmŧß")
assert util.cli.execute("echo ÖPmŧß") == "ÖPmŧß\n"
def test_valid_command(self):
rv = util.cli.execute(self.validCommand)
self.assertEqual(self.validCommandOutput, rv)
def test_invalid_command():
with pytest.raises(RuntimeError):
util.cli.execute("i-do-not-exist")
def test_utf_command(self):
rv = util.cli.execute(self.utfCommand)
self.assertEqual(self.utfCommandOutput, rv)
def test_command_exit_code():
with pytest.raises(RuntimeError):
util.cli.execute("cat i-do-not-exist")
def test_invalid_command(self):
with self.assertRaises(RuntimeError):
util.cli.execute(self.nonExistentCommand)
def test_command_exit_code_no_error():
util.cli.execute("cat i-do-not-exist", ignore_errors=True)
def test_command_exit_code(self):
with self.assertRaises(RuntimeError):
util.cli.execute("cat {}".format(self.nonExistentCommand))
def test_command_exit_code_no_error(self):
try:
util.cli.execute(
"cat {}".format(self.nonExistentCommand), ignore_errors=True
)
except Exception:
self.fail("exception was thrown")
def test_async(self):
rv = util.cli.execute(self.validCommand, wait=False)
self.assertEqual("", rv)
def test_async():
assert util.cli.execute("echo test", wait=False) == ""
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,103 +1,113 @@
import unittest
import pytest
from util.format import *
class format(unittest.TestCase):
def test_int_from_string(self):
self.assertEqual(100, asint("100"))
self.assertEqual(-100, asint("-100"))
self.assertEqual(0, asint("0"))
def test_int_from_string():
assert asint("100") == 100
assert asint("-100") == -100
assert asint("0") == 0
def test_int_from_none(self):
self.assertEqual(0, asint(None))
def test_int_from_int(self):
self.assertEqual(100, asint(100))
self.assertEqual(-100, asint(-100))
self.assertEqual(0, asint(0))
def test_int_from_none():
assert asint(None) == 0
def test_int_minimum(self):
self.assertEqual(100, asint(100, minimum=10))
self.assertEqual(100, asint(100, minimum=100))
self.assertEqual(10, asint(5, minimum=10))
def test_int_maximum(self):
self.assertEqual(100, asint(100, maximum=200))
self.assertEqual(100, asint(100, maximum=100))
self.assertEqual(100, asint(200, maximum=100))
def test_int_from_int():
assert asint(100) == 100
assert asint(-100) == -100
assert asint(0) == 0
def test_true_from_str(self):
self.assertTrue(asbool("true"))
self.assertTrue(asbool(True))
self.assertTrue(asbool("t"))
self.assertTrue(asbool("1"))
self.assertTrue(asbool("yes"))
self.assertTrue(asbool("y"))
self.assertTrue(asbool("on"))
def test_false_from_str(self):
self.assertFalse(asbool("false"))
self.assertFalse(asbool(False))
self.assertFalse(asbool("f"))
self.assertFalse(asbool("0"))
self.assertFalse(asbool("no"))
self.assertFalse(asbool("n"))
self.assertFalse(asbool("off"))
self.assertFalse(asbool(None))
def test_int_minimum():
assert asint(100, minimum=10) == 100
assert asint(100, minimum=100) == 100
assert asint(5, minimum=10) == 10
def test_list_from_None(self):
self.assertEqual([], aslist(None))
def test_list_from_list(self):
self.assertEqual([1, 2, 3], aslist([1, 2, 3]))
def test_int_maximum():
assert asint(100, maximum=200) == 100
assert asint(100, maximum=100) == 100
assert asint(200, maximum=100) == 100
def test_list_from_str(self):
self.assertEqual(["12", "13", "14"], aslist("12,13,14"))
def test_byteformat(self):
self.assertEqual("500.00B", byte(500))
self.assertEqual("1.00KiB", byte(1024))
self.assertEqual("1KiB", byte(1024, "{:.0f}"))
self.assertEqual("1.50KiB", byte(1024 + 512))
self.assertEqual("2.50MiB", byte(1024 * 1024 * 2 + 1024 * 512))
self.assertEqual("4.50GiB", byte(1024 * 1024 * 1024 * 4 + 1024 * 1024 * 512))
self.assertEqual("2048.00GiB", byte(1024 * 1024 * 1024 * 1024 * 2))
def test_true_from_str():
assert asbool("true") == True
assert asbool(True) == True
assert asbool("t") == True
assert asbool("1") == True
assert asbool("yes") == True
assert asbool("y") == True
assert asbool("on") == True
def test_duration(self):
self.assertEqual("04:20:00", duration(4 * 60 * 60 + 20 * 60))
self.assertEqual("04:20:00h", duration(4 * 60 * 60 + 20 * 60, unit=True))
self.assertEqual(
"04:20h", duration(4 * 60 * 60 + 20 * 60, compact=True, unit=True)
)
self.assertEqual("20:00", duration(20 * 60))
self.assertEqual("20:00m", duration(20 * 60, unit=True))
self.assertEqual("20:00m", duration(20 * 60, compact=True, unit=True))
def test_false_from_str():
assert asbool("false") == False
assert asbool(False) == False
assert asbool("f") == False
assert asbool("0") == False
assert asbool("no") == False
assert asbool("n") == False
assert asbool("off") == False
assert asbool(None) == False
self.assertEqual("00:20", duration(20))
self.assertEqual("00:20m", duration(20, unit=True))
self.assertEqual("00:20m", duration(20, compact=True, unit=True))
self.assertEqual("n/a", duration(-1))
def test_list_from_None():
assert aslist(None) == []
def test_seconds(self):
self.assertEqual(10, seconds(10))
self.assertEqual(10, seconds("10"))
self.assertEqual(300, seconds("5m"))
self.assertEqual(320, seconds("5m20s"))
def test_list_from_list():
assert aslist([1, 2, 3] == [1, 2, 3])
self.assertEqual(4 * 3600, seconds("4h"))
self.assertEqual(4 * 3600 + 5 * 60 + 22, seconds("4h5m22s"))
self.assertEqual(4 * 3600 + 5 * 60, seconds("4h5m"))
def test_list_from_str():
assert aslist("12,13,14") == ["12", "13", "14"]
def test_temperature(self):
self.assertEqual("10°C", astemperature(10))
self.assertEqual("10°C", astemperature(10, "metric"))
self.assertEqual("-100°F", astemperature(-100, "imperial"))
self.assertEqual("-100°K", astemperature("-100", "kelvin"))
def test_byteformat():
assert byte(500) == "500.00B"
assert byte(1024) == "1.00KiB"
assert byte(1024, "{:.0f}") == "1KiB"
assert byte(1024 + 512) == "1.50KiB"
assert byte(1024 * 1024 * 2 + 1024 * 512) == "2.50MiB"
assert byte(1024 * 1024 * 1024 * 4 + 1024 * 1024 * 512) == "4.50GiB"
assert byte(1024 * 1024 * 1024 * 1024 * 2) == "2048.00GiB"
def test_duration():
assert duration(4 * 60 * 60 + 20 * 60) == "04:20:00"
assert duration(4 * 60 * 60 + 20 * 60, unit=True) == "04:20:00h"
assert duration(4 * 60 * 60 + 20 * 60, compact=True, unit=True) == "04:20h"
assert duration(20 * 60) == "20:00"
assert duration(20 * 60, unit=True) == "20:00m"
assert duration(20 * 60, compact=True, unit=True) == "20:00m"
assert duration(20) == "00:20"
assert duration(20, unit=True) == "00:20m"
assert duration(20, compact=True, unit=True) == "00:20m"
assert duration(-1) == "n/a"
def test_seconds():
assert seconds(10) == 10
assert seconds("10") == 10
assert seconds("5m") == 300
assert seconds("5m20s") == 320
assert seconds("4h") == 4 * 3600
assert seconds("4h5m22s") == 4 * 3600 + 5 * 60 + 22
assert seconds("4h5m") == 4 * 3600 + 5 * 60
def test_temperature():
assert astemperature(10) == "10°C"
assert astemperature(10, "metric") == "10°C"
assert astemperature(-100, "imperial") == "-100°F"
assert astemperature(-100, "kelvin") == "-100°K"
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,51 +1,57 @@
import unittest
import pytest
import json
import urllib.request
import util.location
class location(unittest.TestCase):
def setUp(self):
patcher = unittest.mock.patch("util.location.urllib.request")
self.addCleanup(patcher.stop)
self.request = patcher.start()
util.location.reset()
@pytest.fixture
def urllib_req(mocker):
util.location.reset()
return mocker.patch("util.location.urllib.request")
self.primary = {
"country": "Middle Earth",
"longitude": "10.0",
"latitude": "20.5",
"ip": "127.0.0.1",
}
self.secondary = {
"country_name": "Rivia",
"longitude": "-10.0",
"latitude": "-23",
"ip": "127.0.0.6",
}
def test_primary_provider(self):
self.request.urlopen.return_value.read.return_value = json.dumps(self.primary)
util.location.country()
self.assertEqual(self.primary["country"], util.location.country())
self.assertEqual(
(self.primary["latitude"], self.primary["longitude"]),
util.location.coordinates(),
)
self.assertEqual(self.primary["ip"], util.location.public_ip())
@pytest.fixture
def primaryLocation():
return {
"country": "Middle Earth",
"longitude": "10.0",
"latitude": "20.5",
"ip": "127.0.0.1",
}
def test_secondary_provider(self):
urlopen = unittest.mock.MagicMock()
urlopen.read.return_value = json.dumps(self.secondary)
self.request.urlopen.side_effect = [RuntimeError(), urlopen]
self.assertEqual(self.secondary["country_name"], util.location.country())
self.assertEqual(
(self.secondary["latitude"], self.secondary["longitude"]),
util.location.coordinates(),
)
self.assertEqual(self.secondary["ip"], util.location.public_ip())
@pytest.fixture
def secondaryLocation():
return {
"country_name": "Rivia",
"longitude": "-10.0",
"latitude": "-23",
"ip": "127.0.0.6",
}
def test_primary_provider(urllib_req, primaryLocation):
urllib_req.urlopen.return_value.read.return_value = json.dumps(primaryLocation)
assert util.location.country() == primaryLocation["country"]
assert util.location.coordinates() == (
primaryLocation["latitude"],
primaryLocation["longitude"],
)
assert util.location.public_ip() == primaryLocation["ip"]
def test_secondary_provider(mocker, urllib_req, secondaryLocation):
urlopen = mocker.MagicMock()
urlopen.read.return_value = json.dumps(secondaryLocation)
urllib_req.urlopen.side_effect = [RuntimeError(), urlopen]
assert util.location.country() == secondaryLocation["country_name"]
assert util.location.coordinates() == (
secondaryLocation["latitude"],
secondaryLocation["longitude"],
)
assert util.location.public_ip() == secondaryLocation["ip"]
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4

View file

@ -1,62 +1,48 @@
import unittest
import pytest
import util.store
class store(unittest.TestCase):
def setUp(self):
self.store = util.store.Store()
@pytest.fixture
def emptyStore():
return util.store.Store()
self.unusedKey = "someRandomUnusedKey"
self.someKey = "someRandomKey"
self.someOtherKey = "anotherRandomKey"
self.someValue = "someRandomValue"
self.someOtherValue = "anotherRandomValue"
def test_get_of_unset_key(self):
self.assertEqual(
None, self.store.get(self.unusedKey), "default value expected to be None"
)
self.assertEqual(
self.someValue,
self.store.get(self.unusedKey, self.someValue),
"wrong user-provided default value returned",
)
@pytest.fixture
def store():
return util.store.Store()
def test_get_of_set_key(self):
self.assertNotEqual(self.someValue, None)
self.store.set(self.someKey, self.someValue)
self.assertEqual(
self.someValue,
self.store.get(self.someKey),
"unexpected value for existing key",
)
def test_get_of_unset_key(emptyStore):
assert emptyStore.get("any-key") == None
assert emptyStore.get("any-key", "default-value") == "default-value"
def test_overwrite_set(self):
self.assertNotEqual(self.someValue, None)
self.assertNotEqual(self.someOtherValue, self.someValue)
self.store.set(self.someKey, self.someValue)
self.store.set(self.someKey, self.someOtherValue)
self.assertEqual(
self.someOtherValue,
self.store.get(self.someKey),
"unexpected value for existing key",
)
def test_get_of_set_key(store):
store.set("key", "value")
assert store.get("key") == "value"
def test_unused_keys(self):
self.assertNotEqual(self.someKey, self.someOtherKey)
self.store.set(self.someKey, self.someValue)
self.store.set(self.someOtherKey, self.someOtherValue)
def test_overwrite_set(store):
store.set("key", "value 1")
store.set("key", "value 2")
self.assertEqual(
sorted(self.store.unused_keys()), sorted([self.someKey, self.someOtherKey])
)
assert store.get("key") == "value 2"
self.store.get(self.someKey)
self.assertEqual(self.store.unused_keys(), [self.someOtherKey])
def test_unused_keys(store):
store.set("key 1", "value x")
store.set("key 2", "value y")
assert store.unused_keys() == sorted(["key 1", "key 2"])
store.get("key 2")
assert store.unused_keys() == ["key 1"]
store.get("key 1")
assert store.unused_keys() == []
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4