예제 #1
0
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()
예제 #2
0
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()
예제 #3
0
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()
예제 #4
0
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()
예제 #5
0
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()
예제 #6
0
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()
예제 #7
0
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()
예제 #8
0
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()
예제 #9
0
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()
예제 #10
0
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()
예제 #11
0
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()