"""Unit tests for the product events.""" import random import pytest from product_digital import config from product_digital.models import product_events from product_digital.models.product_events import _default_on_delivery @pytest.fixture def product_id(): """Arbitrary product id.""" return 1000 class TestCreateProductEventKeyAndPayload: """Test _create_product_event_key_and_payload function.""" def test_product_id_only(self, product_id): """Test with product_id param.""" key, payload = product_events._create_product_event_key_and_payload( product_id) assert key == f'product_id_{product_id}' assert payload == dict(product_id=product_id) def test_product_id_and_non_existing_properties(self, product_id): """Test with non-existing properties.""" non_existing_properties = {'prop1': 1, 'prop2': 'value'} key, payload = product_events._create_product_event_key_and_payload( product_id, **non_existing_properties) assert key == f'product_id_{product_id}' assert payload == dict(product_id=product_id) def test_product_id_and_existing_properties(self, product_id): """Test with non-existing properties.""" existing_properties = { key: random.randint(0, 100) for key in product_events._OPTIONAL_PAYLOAD_PROPERTIES} expected_payload = dict(product_id=product_id, **existing_properties) key, payload = product_events._create_product_event_key_and_payload( product_id, **existing_properties) assert key == f'product_id_{product_id}' assert payload == expected_payload class TestEmitDigitalProductEvent: """Test emit_digital_product_event function.""" @pytest.fixture def product_producer_mock(self, mocker): """Mock ProductProducer class.""" return mocker.patch.object(product_events, 'digital_product_producer') @pytest.fixture def payload_properties(self): """Payload properties fixture.""" return { 'upc': 193483866024, 'product_name': 'my product', } @pytest.fixture def time_mock(self, mocker): """Mock time module.""" return mocker.patch.object(product_events, 'time', return_value=123) def test_emit_digital_product_event( self, mocker, product_producer_mock, product_id, payload_properties, time_mock, test_request_context): """Test emit_digital_product_event.""" operation_type = product_events.OperationType.CREATE operation_context = product_events.OperationContext.COPY event_key = f'product_id_{product_id}' event_value = { 'operation': { 'type': operation_type, 'timestamp': time_mock.return_value * 1000, 'context': operation_context, 'identity_id': 'foo', }, 'payload': {'product_id': product_id, **payload_properties} } product_events.emit_digital_product_event( product_id=product_id, operation_type=operation_type, operation_context=operation_context, **payload_properties) product_producer_mock.produce.assert_called_once_with( config.KAFKA_DIGITAL_PRODUCT_TOPIC, event_key, event_value, callback=_default_on_delivery)