2022-02-19 21:05:56 -06:00
|
|
|
"""Test the EventManager class."""
|
2020-01-11 09:07:58 -06:00
|
|
|
|
2020-05-17 04:53:34 -05:00
|
|
|
import pytest
|
|
|
|
|
|
|
|
from sphinx.errors import ExtensionError
|
2020-01-11 09:07:58 -06:00
|
|
|
from sphinx.events import EventManager
|
|
|
|
|
|
|
|
|
|
|
|
def test_event_priority():
|
|
|
|
result = []
|
|
|
|
events = EventManager(object()) # pass an dummy object as an app
|
2023-12-28 00:41:32 -06:00
|
|
|
events.connect('builder-inited', lambda app: result.append(1), priority=500)
|
|
|
|
events.connect('builder-inited', lambda app: result.append(2), priority=500)
|
|
|
|
events.connect('builder-inited', lambda app: result.append(3), priority=200) # earlier
|
|
|
|
events.connect('builder-inited', lambda app: result.append(4), priority=700) # later
|
|
|
|
events.connect('builder-inited', lambda app: result.append(5), priority=500)
|
2020-01-11 09:07:58 -06:00
|
|
|
|
|
|
|
events.emit('builder-inited')
|
|
|
|
assert result == [3, 1, 2, 5, 4]
|
2020-05-17 04:53:34 -05:00
|
|
|
|
|
|
|
|
2022-07-03 19:56:14 -05:00
|
|
|
class FakeApp:
|
|
|
|
def __init__(self, pdb: bool = False):
|
|
|
|
self.pdb = pdb
|
|
|
|
|
|
|
|
|
2020-05-17 04:53:34 -05:00
|
|
|
def test_event_allowed_exceptions():
|
|
|
|
def raise_error(app):
|
|
|
|
raise RuntimeError
|
|
|
|
|
2022-07-03 19:56:14 -05:00
|
|
|
events = EventManager(FakeApp()) # pass an dummy object as an app
|
2020-05-17 04:53:34 -05:00
|
|
|
events.connect('builder-inited', raise_error, priority=500)
|
|
|
|
|
2021-09-07 19:15:25 -05:00
|
|
|
# all errors are converted to ExtensionError
|
2020-05-17 04:53:34 -05:00
|
|
|
with pytest.raises(ExtensionError):
|
|
|
|
events.emit('builder-inited')
|
|
|
|
|
|
|
|
# Allow RuntimeError (pass-through)
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
events.emit('builder-inited', allowed_exceptions=(RuntimeError,))
|
2022-07-03 19:56:14 -05:00
|
|
|
|
|
|
|
|
|
|
|
def test_event_pdb():
|
|
|
|
def raise_error(app):
|
|
|
|
raise RuntimeError
|
|
|
|
|
|
|
|
events = EventManager(FakeApp(pdb=True)) # pass an dummy object as an app
|
|
|
|
events.connect('builder-inited', raise_error, priority=500)
|
|
|
|
|
|
|
|
# errors aren't converted
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
events.emit('builder-inited')
|
|
|
|
|
|
|
|
# Allow RuntimeError (pass-through)
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
events.emit('builder-inited', allowed_exceptions=(RuntimeError,))
|