"""Tests for event handling logic.""" from unittest.mock import patch from content_utils.exceptions import InvalidMessageException import pytest from src.exceptions import ReviewQueueItemExplicitSkip from src.logic import event_handling @patch('src.logic.event_handling.get_graphql_connector') @patch('src.logic.event_handling.get_os_connector') def test_event_handler(mock_os, mock_graphql): """Test updating product information in OpenSearch.""" mock_record = {'operation': 'update', 'product_id': 1, 'review_queue_id': 1} event_handling.event_handler(mock_record) mock_graphql().get_indexable_product.assert_called_once_with({ 'product_id': 1, 'review_queue_id': 1 }) mock_os().patch_product.assert_called_once() @patch('src.logic.event_handling.get_graphql_connector') @patch('src.logic.event_handling.get_os_connector') def test_add_to_index(mock_get_os, mock_get_gql): """Test add to index.""" mock_get_gql.return_value.get_indexable_product.return_value = {'foo': 'bar'} event_handling.add_to_index({'product_id': 1, 'review_queue_id': 1}) mock_get_os.return_value.index_product.assert_called_once_with({'foo': 'bar'}) @patch('src.logic.event_handling.get_os_connector') def test_delete_from_index(mock_get_os): """Test delete from index.""" event_handling.delete_from_index({'product_id': 1}) mock_get_os.return_value.remove_product.assert_called_once_with(1) @patch('src.logic.event_handling.delete_from_index') def test_event_handler_handles_delete(mock_delete): """Test event handler handles delete.""" mock_record = {'operation': 'delete', 'product_id': 1} result = event_handling.event_handler(mock_record) mock_delete.assert_called_once_with({'operation': 'delete', 'product_id': 1}) assert result == 'Removed from index' @patch('src.logic.event_handling.add_to_index') def test_event_handler_handles_add(mock_add): """Test event handler handles add.""" mock_record = {'operation': 'add', 'product_id': 1} result = event_handling.event_handler(mock_record) mock_add.assert_called_once_with({'operation': 'add', 'product_id': 1}) assert result == 'Added to index' def test_event_handler_raises_unknown_operation(): """Test event handler raises with an unknown operation.""" with pytest.raises(InvalidMessageException) as e: event_handling.event_handler({'operation': 'foo'}) assert e.value.args[0] == 'Unhandled operation: foo' def test_event_handler_raises_no_operation(): """Test event handler raises with no operation.""" with pytest.raises(InvalidMessageException) as e: event_handling.event_handler({}) assert e.value.args[0] == 'missing "operation" in message body' @patch('src.logic.event_handling.config.SKIP_REVIEW_QUEUE_ITEMS', [1]) @patch('src.logic.event_handling.get_graphql_connector') @patch('src.logic.event_handling.get_os_connector') def test_event_handler_skips_explicit_review_queue_item(mock_os, mock_graphql): """Test event handler skips explicitly listed review queue items.""" mock_record = {'operation': 'update', 'product_id': 1, 'review_queue_id': 1} with pytest.raises(ReviewQueueItemExplicitSkip) as e: event_handling.event_handler(mock_record) assert e.value.args[0] == 'Explicit Skip: review_queue_id=1' mock_graphql().get_indexable_product.assert_not_called() mock_os().patch_product.assert_not_called() @patch('src.logic.event_handling.config.SKIP_REVIEW_QUEUE_ITEMS', [2]) @patch('src.logic.event_handling.get_graphql_connector') @patch('src.logic.event_handling.get_os_connector') def test_event_handler_does_not_skip_unlisted_review_queue_item(mock_os, mock_graphql): """Test event handler processes review queue items not in the skip list.""" mock_record = {'operation': 'update', 'product_id': 1, 'review_queue_id': 1} event_handling.event_handler(mock_record) mock_graphql().get_indexable_product.assert_called_once() mock_os().patch_product.assert_called_once()