platypush/tests/test_event_parse.py
Fabio Manganiello 245472a4c5
Better event hooks filters.
- Support for nested attributes on event hook conditions. Things like
  these are now possible:

```
from platypush.event.hook import hook
from platypush.message.event.entities import EntityUpdateEvent

@hook(EntityUpdateEvent, entity={"external_id": "system:cpu"})
def on_cpu_update_event(event: EntityUpdateEvent, **_):
    print(event.args["entity"]["percent"])
```

- The scoring/regex extraction/partial string match logic in
  `_matches_argument` is actually only needed for
  `SpeechRecognizedEvent`. Other events don't need these features, and
  event hooks may be actually triggered unexpectedly in case of partial
  matches. Therefore, the "complex" `_matches_argument` has been moved
  as an override only for `SpeechRecognizedEvent`, and all the other
  events will perform simple key-value matching.
2023-04-26 01:45:58 +02:00

94 lines
2.2 KiB
Python

import pytest
from platypush.event.hook import EventCondition
from platypush.message.event.assistant import SpeechRecognizedEvent
from platypush.message.event.ping import PingEvent
def test_event_parse():
"""
Test for the events/conditions matching logic.
"""
condition = EventCondition.build(
{
'type': 'platypush.message.event.ping.PingEvent',
'message': 'This is a test message',
}
)
event = PingEvent(message=condition.args['message'])
result = event.matches_condition(condition)
assert result.is_match
event = PingEvent(message="This is not a test message")
result = event.matches_condition(condition)
assert not result.is_match
def test_nested_event_condition():
"""
Verify that nested event conditions work as expected.
"""
condition = EventCondition.build(
{
'type': 'platypush.message.event.ping.PingEvent',
'message': {
'foo': 'bar',
},
}
)
event = PingEvent(
message={
'foo': 'bar',
'baz': 'clang',
}
)
assert event.matches_condition(condition).is_match
event = PingEvent(
message={
'something': 'else',
}
)
assert not event.matches_condition(condition).is_match
event = PingEvent(
message={
'foo': 'baz',
}
)
assert not event.matches_condition(condition).is_match
def test_speech_recognized_event_parse():
"""
Test the event parsing and text extraction logic for the
SpeechRecognizedEvent.
"""
condition = EventCondition.build(
{
'type': 'platypush.message.event.assistant.SpeechRecognizedEvent',
'phrase': 'This is (the)? answer: ${answer}',
}
)
event = SpeechRecognizedEvent(phrase="GARBAGE GARBAGE this is the answer: 42")
result = event.matches_condition(condition)
assert result.is_match
assert 'answer' in result.parsed_args
assert result.parsed_args['answer'] == '42'
event = PingEvent(phrase="what is not the answer? 43")
result = event.matches_condition(condition)
assert not result.is_match
if __name__ == '__main__':
pytest.main()
# vim:sw=4:ts=4:et: