blob: 69350e0e7c101f02212b92df4de04eb86150ecf3 [file] [log] [blame] [edit]
# -*- coding: utf-8 -*-
from mock import call, Mock
import pytest
from pyee import EventEmitter
from pyee.uplift import unwrap, uplift
class UpliftedEventEmitter(EventEmitter):
pass
def test_uplift_emit():
call_me = Mock()
base_ee = EventEmitter()
@base_ee.on("base_event")
def base_handler():
call_me("base event on base emitter")
@base_ee.on("shared_event")
def shared_base_handler():
call_me("shared event on base emitter")
uplifted_ee = uplift(UpliftedEventEmitter, base_ee)
assert isinstance(uplifted_ee, UpliftedEventEmitter), "Returns an uplifted emitter"
@uplifted_ee.on("uplifted_event")
def uplifted_handler():
call_me("uplifted event on uplifted emitter")
@uplifted_ee.on("shared_event")
def shared_uplifted_handler():
call_me("shared event on uplifted emitter")
# Events on uplifted proxy correctly
assert uplifted_ee.emit("base_event")
assert uplifted_ee.emit("shared_event")
assert uplifted_ee.emit("uplifted_event")
call_me.assert_has_calls(
[
call("base event on base emitter"),
call("shared event on uplifted emitter"),
call("shared event on base emitter"),
call("uplifted event on uplifted emitter"),
]
)
call_me.reset_mock()
# Events on underlying proxy correctly
assert base_ee.emit("base_event")
assert base_ee.emit("shared_event")
assert base_ee.emit("uplifted_event")
call_me.assert_has_calls(
[
call("base event on base emitter"),
call("shared event on base emitter"),
call("shared event on uplifted emitter"),
call("uplifted event on uplifted emitter"),
]
)
call_me.reset_mock()
# Quick check for unwrap
unwrap(uplifted_ee)
with pytest.raises(AttributeError):
getattr(uplifted_ee, "unwrap")
with pytest.raises(AttributeError):
getattr(base_ee, "unwrap")
assert not uplifted_ee.emit("base_event")
assert uplifted_ee.emit("shared_event")
assert uplifted_ee.emit("uplifted_event")
assert base_ee.emit("base_event")
assert base_ee.emit("shared_event")
assert not base_ee.emit("uplifted_event")
call_me.assert_has_calls(
[
# No listener for base event on uplifted
call("shared event on uplifted emitter"),
call("uplifted event on uplifted emitter"),
call("base event on base emitter"),
call("shared event on base emitter")
# No listener for uplifted event on uplifted
]
)
@pytest.mark.parametrize("error_handling", ["new", "underlying", "neither"])
def test_exception_handling(error_handling):
base_ee = EventEmitter()
uplifted_ee = uplift(UpliftedEventEmitter, base_ee, error_handling=error_handling)
# Exception handling always prefers uplifted
base_error = Exception("base error")
uplifted_error = Exception("uplifted error")
# Hold my beer
base_error_handler = Mock()
base_ee._emit_handle_potential_error = base_error_handler
# Hold my other beer
uplifted_error_handler = Mock()
uplifted_ee._emit_handle_potential_error = uplifted_error_handler
base_ee.emit("error", base_error)
uplifted_ee.emit("error", uplifted_error)
if error_handling == "new":
base_error_handler.assert_not_called()
uplifted_error_handler.assert_has_calls(
[call("error", base_error), call("error", uplifted_error)]
)
elif error_handling == "underlying":
base_error_handler.assert_has_calls(
[call("error", base_error), call("error", uplifted_error)]
)
uplifted_error_handler.assert_not_called()
elif error_handling == "neither":
base_error_handler.assert_called_once_with("error", base_error)
uplifted_error_handler.assert_called_once_with("error", uplifted_error)
else:
raise Exception("unrecognized setting")
@pytest.mark.parametrize(
"proxy_new_listener", ["both", "neither", "forward", "backward"]
)
def test_proxy_new_listener(proxy_new_listener):
call_me = Mock()
base_ee = EventEmitter()
uplifted_ee = uplift(
UpliftedEventEmitter, base_ee, proxy_new_listener=proxy_new_listener
)
@base_ee.on("new_listener")
def base_new_listener_handler(event, f):
assert event in ("event", "new_listener")
call_me("base new listener handler", f)
@uplifted_ee.on("new_listener")
def uplifted_new_listener_handler(event, f):
assert event in ("event", "new_listener")
call_me("uplifted new listener handler", f)
def fresh_base_handler():
pass
def fresh_uplifted_handler():
pass
base_ee.on("event", fresh_base_handler)
uplifted_ee.on("event", fresh_uplifted_handler)
if proxy_new_listener == "both":
call_me.assert_has_calls(
[
call("base new listener handler", fresh_base_handler),
call("uplifted new listener handler", fresh_base_handler),
call("uplifted new listener handler", fresh_uplifted_handler),
call("base new listener handler", fresh_uplifted_handler),
]
)
elif proxy_new_listener == "neither":
call_me.assert_has_calls(
[
call("base new listener handler", fresh_base_handler),
call("uplifted new listener handler", fresh_uplifted_handler),
]
)
elif proxy_new_listener == "forward":
call_me.assert_has_calls(
[
call("base new listener handler", fresh_base_handler),
call("uplifted new listener handler", fresh_base_handler),
call("uplifted new listener handler", fresh_uplifted_handler),
]
)
elif proxy_new_listener == "backward":
call_me.assert_has_calls(
[
call("base new listener handler", fresh_base_handler),
call("uplifted new listener handler", fresh_uplifted_handler),
call("base new listener handler", fresh_uplifted_handler),
]
)
else:
raise Exception("unrecognized proxy_new_listener")