|
| 1 | +import datetime |
| 2 | + |
| 3 | +import pytest |
| 4 | +from google.api_core.exceptions import InvalidArgument |
| 5 | +from google.protobuf.timestamp_pb2 import Timestamp |
| 6 | +from google.pubsub_v1 import PubsubMessage |
| 7 | + |
| 8 | +from google.cloud.pubsublite.cloudpubsub.message_transforms import PUBSUB_LITE_EVENT_TIME, to_cps_subscribe_message, \ |
| 9 | + encode_attribute_event_time, from_cps_publish_message |
| 10 | +from google.cloud.pubsublite_v1 import SequencedMessage, Cursor, PubSubMessage, AttributeValues |
| 11 | + |
| 12 | +NOT_UTF8 = bytes.fromhex('ffff') |
| 13 | + |
| 14 | + |
| 15 | +def test_invalid_subscribe_transform_key(): |
| 16 | + with pytest.raises(InvalidArgument): |
| 17 | + to_cps_subscribe_message( |
| 18 | + SequencedMessage(message=PubSubMessage(key=NOT_UTF8), publish_time=Timestamp(), cursor=Cursor(offset=10), |
| 19 | + size_bytes=10)) |
| 20 | + |
| 21 | + |
| 22 | +def test_invalid_subscribe_contains_magic_attribute(): |
| 23 | + with pytest.raises(InvalidArgument): |
| 24 | + to_cps_subscribe_message(SequencedMessage( |
| 25 | + message=PubSubMessage(key=b'def', attributes={PUBSUB_LITE_EVENT_TIME: AttributeValues(values=[b'abc'])}), |
| 26 | + publish_time=Timestamp(seconds=10), cursor=Cursor(offset=10), size_bytes=10)) |
| 27 | + |
| 28 | + |
| 29 | +def test_invalid_subscribe_contains_multiple_attributes(): |
| 30 | + with pytest.raises(InvalidArgument): |
| 31 | + to_cps_subscribe_message(SequencedMessage( |
| 32 | + message=PubSubMessage(key=b'def', attributes={'xyz': AttributeValues(values=[b'abc', b''])}), |
| 33 | + publish_time=Timestamp(seconds=10), cursor=Cursor(offset=10), size_bytes=10)) |
| 34 | + |
| 35 | + |
| 36 | +def test_invalid_subscribe_contains_non_utf8_attributes(): |
| 37 | + with pytest.raises(InvalidArgument): |
| 38 | + to_cps_subscribe_message(SequencedMessage( |
| 39 | + message=PubSubMessage(key=b'def', attributes={'xyz': AttributeValues(values=[NOT_UTF8])}), |
| 40 | + publish_time=Timestamp(seconds=10), cursor=Cursor(offset=10), size_bytes=10)) |
| 41 | + |
| 42 | + |
| 43 | +def test_subscribe_transform_correct(): |
| 44 | + expected = PubsubMessage( |
| 45 | + data=b'xyz', ordering_key='def', attributes={'x': 'abc', 'y': 'abc', |
| 46 | + PUBSUB_LITE_EVENT_TIME: encode_attribute_event_time( |
| 47 | + Timestamp(seconds=55).ToDatetime())}, |
| 48 | + message_id=str(10), publish_time=Timestamp(seconds=10)) |
| 49 | + result = to_cps_subscribe_message(SequencedMessage( |
| 50 | + message=PubSubMessage(data=b'xyz', key=b'def', event_time=Timestamp(seconds=55), |
| 51 | + attributes={'x': AttributeValues(values=[b'abc']), 'y': AttributeValues(values=[b'abc'])}), |
| 52 | + publish_time=Timestamp(seconds=10), cursor=Cursor(offset=10), size_bytes=10)) |
| 53 | + assert result == expected |
| 54 | + |
| 55 | + |
| 56 | +def test_publish_invalid_event_time(): |
| 57 | + with pytest.raises(InvalidArgument): |
| 58 | + from_cps_publish_message(PubsubMessage(attributes={PUBSUB_LITE_EVENT_TIME: 'probably not an encoded proto'})) |
| 59 | + |
| 60 | + |
| 61 | +def test_publish_valid_transform(): |
| 62 | + now = datetime.datetime.now() |
| 63 | + expected = PubSubMessage(data=b'xyz', key=b'def', event_time=now, |
| 64 | + attributes={'x': AttributeValues(values=[b'abc']), 'y': AttributeValues(values=[b'abc'])}) |
| 65 | + result = from_cps_publish_message(PubsubMessage( |
| 66 | + data=b'xyz', ordering_key='def', attributes={'x': 'abc', 'y': 'abc', |
| 67 | + PUBSUB_LITE_EVENT_TIME: encode_attribute_event_time( |
| 68 | + now)})) |
| 69 | + assert result == expected |
0 commit comments