def test_successful_reprint(mocker, receive_messsage_unit_test_fixture): """ Tests good path for a valid reprint message that should be sent to the printer """ mock_ack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.ack') mock_nack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.nack') mocker.patch('google.cloud.firestore.Client') mock_print = mocker.patch('subprocess.run') data = base64.b64encode(b'1234') attributes = {"order_number": "1234", "event_date": TEST_EVENT_DATE, "reprint": "True"} msg = receive_messsage_unit_test_fixture(data, attributes) main.received_message_to_print(msg) mock_ack.assert_called_once() mock_nack.assert_not_called() mock_print.assert_called_once()
def test_other_attributes_but_no_order_number(mocker, receive_messsage_unit_test_fixture): """ Tests that a message received with insufficient message attributes (i.e. missing the order number) will be squelched """ mock_ack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.ack') mock_nack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.nack') mock_print = mocker.patch('subprocess.run') data = base64.b64encode(b'1234') attributes = {"another_attr": "abc123", "event_date": TEST_EVENT_DATE} msg = receive_messsage_unit_test_fixture(data, attributes) main.received_message_to_print(msg) mock_ack.assert_called_once() mock_nack.assert_not_called() mock_print.assert_not_called()
def test_missing_event_date(mocker, receive_messsage_unit_test_fixture): """ Tests that a message received with a missing event ID will not be printed and appropriately squelched """ mock_ack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.ack') mock_nack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.nack') mock_print = mocker.patch('subprocess.run') data = base64.b64encode(b'1234') attributes = {"order_number": "1234"} msg = receive_messsage_unit_test_fixture(data, attributes) main.received_message_to_print(msg) mock_ack.assert_called_once() mock_nack.assert_not_called() mock_print.assert_not_called()
def test_invalid_order_number(mocker, receive_messsage_unit_test_fixture): """ Tests that a message received with a non-integer order number will not be printed and appropriately squelched """ mock_ack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.ack') mock_nack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.nack') mock_print = mocker.patch('subprocess.run') data = base64.b64encode(b'1234') attributes = {"order_number": "not_a_number", "event_date": TEST_EVENT_DATE} msg = receive_messsage_unit_test_fixture(data, attributes) main.received_message_to_print(msg) mock_ack.assert_called_once() mock_nack.assert_not_called() mock_print.assert_not_called()
def test_no_message_attributes(mocker, receive_messsage_unit_test_fixture): """ Tests that a message received with no message attributes (i.e. missing the order number) will be squelched """ mock_ack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.ack') mock_nack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.nack') mock_print = mocker.patch('subprocess.run') data = base64.b64encode(b'1234') attributes = {} msg = receive_messsage_unit_test_fixture(data, attributes) main.received_message_to_print(msg) mock_ack.assert_called_once() mock_nack.assert_not_called() mock_print.assert_not_called()
def test_non_base64_data(mocker, receive_messsage_unit_test_fixture): """ Tests good path for a valid message that should be sent to the printer """ mock_ack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.ack') mock_nack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.nack') mock_client = mocker.patch('google.cloud.firestore.Client') mock_client.return_value.collection.return_value.where.return_value.stream.return_value = [] mock_print = mocker.patch('subprocess.run') data = b'%234' # % is not a valid character in a base64 string, so this should fail attributes = {"order_number": "1234", "event_date": TEST_EVENT_DATE} msg = receive_messsage_unit_test_fixture(data, attributes) main.received_message_to_print(msg) mock_ack.assert_called_once() mock_nack.assert_not_called() mock_print.assert_not_called()
def test_database_error_before_and_after_print(mocker, receive_messsage_unit_test_fixture): """ Tests that if an error occurs during interaction with the firestore DB, printing still succeeds and the message is acked""" mock_ack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.ack') mock_nack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.nack') mocker.patch('google.cloud.firestore.Client', side_effect=RuntimeError("Connection failed")) mock_print = mocker.patch('subprocess.run') data = base64.b64encode(b'1234') attributes = {"order_number": "1234", "event_date": TEST_EVENT_DATE} msg = receive_messsage_unit_test_fixture(data, attributes) main.received_message_to_print(msg) mock_ack.assert_called_once() mock_nack.assert_not_called() mock_print.assert_called_once()
def test_no_odd_messages_printed(mocker, receive_messsage_unit_test_fixture): """ Tests that a message received with an odd order number will not be printed when the command line value of 'even' was specified """ mock_ack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.ack') mock_nack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.nack') mock_print = mocker.patch('subprocess.run') data = base64.b64encode(b'1234') attributes = {"order_number": "5679", "event_date": TEST_EVENT_DATE} msg = receive_messsage_unit_test_fixture(data, attributes) main.ARGS.number = "even" main.received_message_to_print(msg) mock_ack.assert_not_called() mock_nack.assert_called_once() mock_print.assert_not_called()
def test_idempotent_impl(mocker, receive_messsage_unit_test_fixture): """ Tests the idempotent nature of the callback function; that is, that the same message received twice will only be printed once. """ mock_ack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.ack') mock_nack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.nack') mock_client = mocker.patch('google.cloud.firestore.Client') mock_client.return_value.collection.return_value.where.return_value.stream.return_value = ['1'] mock_print = mocker.patch('subprocess.run') data = base64.b64encode(b'1234') attributes = {"order_number": "1234", "event_date": TEST_EVENT_DATE} # reprint not specified here msg = receive_messsage_unit_test_fixture(data, attributes) main.received_message_to_print(msg) mock_ack.assert_called_once() mock_nack.assert_not_called() mock_print.assert_not_called()
def test_database_error_after_print(mocker, receive_messsage_unit_test_fixture): """ Tests that if an error occurs during interaction with the firestore DB after printing, sending the message ack still happens """ mock_ack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.ack') mock_nack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.nack') mock_client = mocker.patch('google.cloud.firestore.Client') mock_client.return_value.collection.return_value.where.return_value.stream.return_value = [] mock_client.return_value.collection.return_value.add.side_effect = RuntimeError("Error!") mock_print = mocker.patch('subprocess.run') data = base64.b64encode(b'1234') attributes = {"order_number": "1234", "event_date": TEST_EVENT_DATE} msg = receive_messsage_unit_test_fixture(data, attributes) main.received_message_to_print(msg) mock_ack.assert_called_once() mock_nack.assert_not_called() mock_print.assert_called_once()
def test_printer_failure(mocker, receive_messsage_unit_test_fixture): """ Tests that if there is a problem printing the label, we will place the request back on the subscription to be reprinted """ mock_ack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.ack') mock_nack = mocker.patch('google.cloud.pubsub_v1.subscriber.message.Message.nack') mock_client = mocker.patch('google.cloud.firestore.Client') mock_client.return_value.collection.return_value.where.return_value.stream.return_value = [] mock_shell_execute = mocker.patch('subprocess.run', side_effect=subprocess.CalledProcessError(cmd="gswin64.exe", returncode=1)) data = base64.b64encode(b'1234') attributes = {"order_number": "123", "event_date": TEST_EVENT_DATE} msg = receive_messsage_unit_test_fixture(data, attributes) main.received_message_to_print(msg) mock_shell_execute.assert_called_once() # ensure message is nacked, not acked to ensure we try to re-print this mock_ack.assert_not_called() mock_nack.assert_called_once()