feat: event attribute get operation support (#165)
* feat: get operation support Signed-off-by: Alexander Tkachev <sasha64sasha@gmail.com> * docs: event get operation Signed-off-by: Alexander Tkachev <sasha64sasha@gmail.com> * test: extract dummy attributes into a fixture Signed-off-by: Alexander Tkachev <sasha64sasha@gmail.com> * test: extract common dummy data into consts Signed-off-by: Alexander Tkachev <sasha64sasha@gmail.com> * test: event get operation Signed-off-by: Alexander Tkachev <sasha64sasha@gmail.com> * docs: return value Signed-off-by: Alexander Tkachev <sasha64sasha@gmail.com> * test: remove assertion Signed-off-by: Alexander Tkachev <sasha64sasha@gmail.com> * test: move dummy data into fixtures Signed-off-by: Alexander Tkachev <sasha64sasha@gmail.com> * style: black formatting Signed-off-by: Alexander Tkachev <sasha64sasha@gmail.com> * style: black formatting Signed-off-by: Alexander Tkachev <sasha64sasha@gmail.com> * docs: fix bad grammar Signed-off-by: Alexander Tkachev <sasha64sasha@gmail.com> * test: style fix line too long Signed-off-by: Alexander Tkachev <sasha64sasha@gmail.com> * style: fix line too long Signed-off-by: Alexander Tkachev <sasha64sasha@gmail.com>
This commit is contained in:
parent
aee384bf43
commit
8483e8e310
|
@ -77,6 +77,22 @@ class CloudEvent:
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
return self._attributes[key]
|
return self._attributes[key]
|
||||||
|
|
||||||
|
def get(
|
||||||
|
self, key: str, default: typing.Optional[typing.Any] = None
|
||||||
|
) -> typing.Optional[typing.Any]:
|
||||||
|
"""
|
||||||
|
Retrieves an event attribute value for the given key.
|
||||||
|
Returns the default value if not attribute for the given key exists.
|
||||||
|
|
||||||
|
MUST NOT throw an exception when the key does not exist.
|
||||||
|
|
||||||
|
:param key: The event attribute name.
|
||||||
|
:param default: The default value to be returned when
|
||||||
|
no attribute with the given key exists.
|
||||||
|
:returns: The event attribute value if exists, default value otherwise.
|
||||||
|
"""
|
||||||
|
return self._attributes.get(key, default)
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
def __setitem__(self, key, value):
|
||||||
self._attributes[key] = value
|
self._attributes[key] = value
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,14 @@ from cloudevents.http import CloudEvent
|
||||||
from cloudevents.http.util import _json_or_string
|
from cloudevents.http.util import _json_or_string
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("specversion", ["0.3", "1.0"])
|
@pytest.fixture(params=["0.3", "1.0"])
|
||||||
def test_http_cloudevent_equality(specversion):
|
def specversion(request):
|
||||||
attributes = {
|
return request.param
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def dummy_attributes(specversion):
|
||||||
|
return {
|
||||||
"source": "<source>",
|
"source": "<source>",
|
||||||
"specversion": specversion,
|
"specversion": specversion,
|
||||||
"id": "my-id",
|
"id": "my-id",
|
||||||
|
@ -16,48 +21,55 @@ def test_http_cloudevent_equality(specversion):
|
||||||
"datacontenttype": "application/json",
|
"datacontenttype": "application/json",
|
||||||
"subject": "my-subject",
|
"subject": "my-subject",
|
||||||
}
|
}
|
||||||
data = '{"name":"john"}'
|
|
||||||
event1 = CloudEvent(attributes, data)
|
|
||||||
event2 = CloudEvent(attributes, data)
|
@pytest.fixture()
|
||||||
|
def my_dummy_data():
|
||||||
|
return '{"name":"john"}'
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def your_dummy_data():
|
||||||
|
return '{"name":"paul"}'
|
||||||
|
|
||||||
|
|
||||||
|
def test_http_cloudevent_equality(
|
||||||
|
dummy_attributes, my_dummy_data, your_dummy_data
|
||||||
|
):
|
||||||
|
data = my_dummy_data
|
||||||
|
event1 = CloudEvent(dummy_attributes, data)
|
||||||
|
event2 = CloudEvent(dummy_attributes, data)
|
||||||
assert event1 == event2
|
assert event1 == event2
|
||||||
# Test different attributes
|
# Test different attributes
|
||||||
for key in attributes:
|
for key in dummy_attributes:
|
||||||
if key == "specversion":
|
if key == "specversion":
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
attributes[key] = f"noise-{key}"
|
dummy_attributes[key] = f"noise-{key}"
|
||||||
event3 = CloudEvent(attributes, data)
|
event3 = CloudEvent(dummy_attributes, data)
|
||||||
event2 = CloudEvent(attributes, data)
|
event2 = CloudEvent(dummy_attributes, data)
|
||||||
assert event2 == event3
|
assert event2 == event3
|
||||||
assert event1 != event2 and event3 != event1
|
assert event1 != event2 and event3 != event1
|
||||||
|
|
||||||
# Test different data
|
# Test different data
|
||||||
data = '{"name":"paul"}'
|
data = your_dummy_data
|
||||||
event3 = CloudEvent(attributes, data)
|
event3 = CloudEvent(dummy_attributes, data)
|
||||||
event2 = CloudEvent(attributes, data)
|
event2 = CloudEvent(dummy_attributes, data)
|
||||||
assert event2 == event3
|
assert event2 == event3
|
||||||
assert event1 != event2 and event3 != event1
|
assert event1 != event2 and event3 != event1
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("specversion", ["0.3", "1.0"])
|
def test_http_cloudevent_mutates_equality(
|
||||||
def test_http_cloudevent_mutates_equality(specversion):
|
dummy_attributes, my_dummy_data, your_dummy_data
|
||||||
attributes = {
|
):
|
||||||
"source": "<source>",
|
data = my_dummy_data
|
||||||
"specversion": specversion,
|
event1 = CloudEvent(dummy_attributes, data)
|
||||||
"id": "my-id",
|
event2 = CloudEvent(dummy_attributes, data)
|
||||||
"time": "tomorrow",
|
event3 = CloudEvent(dummy_attributes, data)
|
||||||
"type": "tests.cloudevents.override",
|
|
||||||
"datacontenttype": "application/json",
|
|
||||||
"subject": "my-subject",
|
|
||||||
}
|
|
||||||
data = '{"name":"john"}'
|
|
||||||
event1 = CloudEvent(attributes, data)
|
|
||||||
event2 = CloudEvent(attributes, data)
|
|
||||||
event3 = CloudEvent(attributes, data)
|
|
||||||
|
|
||||||
assert event1 == event2
|
assert event1 == event2
|
||||||
# Test different attributes
|
# Test different attributes
|
||||||
for key in attributes:
|
for key in dummy_attributes:
|
||||||
if key == "specversion":
|
if key == "specversion":
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
|
@ -67,8 +79,8 @@ def test_http_cloudevent_mutates_equality(specversion):
|
||||||
assert event1 != event2 and event3 != event1
|
assert event1 != event2 and event3 != event1
|
||||||
|
|
||||||
# Test different data
|
# Test different data
|
||||||
event2.data = '{"name":"paul"}'
|
event2.data = your_dummy_data
|
||||||
event3.data = '{"name":"paul"}'
|
event3.data = your_dummy_data
|
||||||
assert event2 == event3
|
assert event2 == event3
|
||||||
assert event1 != event2 and event3 != event1
|
assert event1 != event2 and event3 != event1
|
||||||
|
|
||||||
|
@ -119,3 +131,49 @@ def test_cloudevent_general_overrides():
|
||||||
|
|
||||||
def test_none_json_or_string():
|
def test_none_json_or_string():
|
||||||
assert _json_or_string(None) is None
|
assert _json_or_string(None) is None
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def dummy_event(dummy_attributes, my_dummy_data):
|
||||||
|
return CloudEvent(attributes=dummy_attributes, data=my_dummy_data)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def non_exiting_attribute_name(dummy_event):
|
||||||
|
result = "nonexisting"
|
||||||
|
assert result not in dummy_event
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_operation_on_non_existing_attribute_must_not_raise_exception(
|
||||||
|
dummy_event, non_exiting_attribute_name
|
||||||
|
):
|
||||||
|
dummy_event.get(non_exiting_attribute_name)
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_must_return_attribute_value_if_exists(dummy_event):
|
||||||
|
assert dummy_event.get("source") == dummy_event["source"]
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_operation_on_non_existing_attribute_must_return_none_by_default(
|
||||||
|
dummy_event, non_exiting_attribute_name
|
||||||
|
):
|
||||||
|
assert dummy_event.get(non_exiting_attribute_name) is None
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_operation_on_non_existing_attribute_must_return_default_value_if_given(
|
||||||
|
dummy_event, non_exiting_attribute_name
|
||||||
|
):
|
||||||
|
dummy_value = "Hello World"
|
||||||
|
assert (
|
||||||
|
dummy_event.get(non_exiting_attribute_name, dummy_value) == dummy_value
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_operation_on_non_existing_attribute_should_not_copy_default_value(
|
||||||
|
dummy_event, non_exiting_attribute_name
|
||||||
|
):
|
||||||
|
dummy_value = object()
|
||||||
|
assert (
|
||||||
|
dummy_event.get(non_exiting_attribute_name, dummy_value) is dummy_value
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue