"""Unit tests for UPCProvisioner.""" from unittest.mock import MagicMock from unittest.mock import patch from product.config import SQS_QUEUE_NAME from product.models import upc_provisioner def test_retrieve_upc(sqs): """Test the retrieve_upc method of the UPCProvisioner class. This method should pull a UPC off the queue and delete said UPC from the queue """ sqs.create_queue(QueueName=SQS_QUEUE_NAME) sqs.send_message( QueueUrl=sqs.get_queue_url(QueueName=SQS_QUEUE_NAME)['QueueUrl'], MessageBody='1234') upc = upc_provisioner.retrieve_upc() assert upc.status == 200 assert upc.message == {'upc': '1234'} def test_retrieve_upc_returns_404_when_there_are_no_upcs(mocker, sqs): """Test the retrieve_upc method returns None when there are no UPCs. This should test that the retrieve_upc method returns 404 status when there are no UPCs retrieved from the upc sqs queue. """ sqs.create_queue(QueueName=SQS_QUEUE_NAME) # it's better to test that the delete message method was called mocked = mocker.patch.object( upc_provisioner, '_delete_message_from_sqs') upc = upc_provisioner.retrieve_upc() assert upc.status == 404 mocked.assert_not_called() def test_retrieve_upc_returns_500_from_private_retrieve_upc_exception(sqs): """Test _retrieve_upc_from_sqs method returns 500. This should test that retrieve_upc method returns 500 after getting an exception from _retrieve_upc_from_sqs """ with patch( 'product.models.upc_provisioner._retrieve_upc_from_sqs', side_effect=Exception('something happened') ): sqs.create_queue(QueueName=SQS_QUEUE_NAME) resp = upc_provisioner.retrieve_upc() assert resp.status == 500 def test_retrieve_upc_returns_500_from_private_delete_from_sqs_exception(sqs): """Test the retrieve_upc returns 500. This should test that retrieve_upc method returns 500 after getting an exception from _delete_message_from_sqs """ with patch( 'product.models.upc_provisioner._delete_message_from_sqs', side_effect=Exception('something happened') ): sqs.create_queue(QueueName=SQS_QUEUE_NAME) sqs.send_message( QueueUrl=sqs.get_queue_url(QueueName=SQS_QUEUE_NAME)['QueueUrl'], MessageBody='1234') resp = upc_provisioner.retrieve_upc() assert resp.status == 500 @patch('product.connectors.mysql._db_session') def test_set_claimed_upc_to_used_success(db_session): """Test that session.execute is successfully called.""" upc = 123456789123 session = MagicMock() db_session.return_value = session upc_provisioner.set_claimed_upc_to_used(upc) session.execute.assert_called_once_with( upc_provisioner.SET_UPC_TO_USED, {'upc': upc})