202 lines
6.2 KiB
Python
202 lines
6.2 KiB
Python
# -*- 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")
|