Add error handling to sqs.delete_message
This commit is contained in:
parent
c3cb411c07
commit
51117c948a
@ -7,9 +7,14 @@ class MessageNotInflight(Exception):
|
|||||||
status_code = 400
|
status_code = 400
|
||||||
|
|
||||||
|
|
||||||
class ReceiptHandleIsInvalid(Exception):
|
class ReceiptHandleIsInvalid(RESTError):
|
||||||
description = "The receipt handle provided is not valid."
|
code = 400
|
||||||
status_code = 400
|
|
||||||
|
def __init__(self):
|
||||||
|
super(ReceiptHandleIsInvalid, self).__init__(
|
||||||
|
'ReceiptHandleIsInvalid',
|
||||||
|
'The input receipt handle is invalid.'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class MessageAttributesInvalid(Exception):
|
class MessageAttributesInvalid(Exception):
|
||||||
|
@ -669,6 +669,10 @@ class SQSBackend(BaseBackend):
|
|||||||
|
|
||||||
def delete_message(self, queue_name, receipt_handle):
|
def delete_message(self, queue_name, receipt_handle):
|
||||||
queue = self.get_queue(queue_name)
|
queue = self.get_queue(queue_name)
|
||||||
|
|
||||||
|
if not any(message.receipt_handle == receipt_handle for message in queue._messages):
|
||||||
|
raise ReceiptHandleIsInvalid()
|
||||||
|
|
||||||
new_messages = []
|
new_messages = []
|
||||||
for message in queue._messages:
|
for message in queue._messages:
|
||||||
# Only delete message if it is not visible and the reciept_handle
|
# Only delete message if it is not visible and the reciept_handle
|
||||||
|
@ -118,7 +118,7 @@ class SQSResponse(BaseResponse):
|
|||||||
receipt_handle=receipt_handle,
|
receipt_handle=receipt_handle,
|
||||||
visibility_timeout=visibility_timeout
|
visibility_timeout=visibility_timeout
|
||||||
)
|
)
|
||||||
except (ReceiptHandleIsInvalid, MessageNotInflight) as e:
|
except MessageNotInflight as e:
|
||||||
return "Invalid request: {0}".format(e.description), dict(status=e.status_code)
|
return "Invalid request: {0}".format(e.description), dict(status=e.status_code)
|
||||||
|
|
||||||
template = self.response_template(CHANGE_MESSAGE_VISIBILITY_RESPONSE)
|
template = self.response_template(CHANGE_MESSAGE_VISIBILITY_RESPONSE)
|
||||||
|
@ -999,6 +999,36 @@ def test_delete_message_after_visibility_timeout():
|
|||||||
assert new_queue.count() == 0
|
assert new_queue.count() == 0
|
||||||
|
|
||||||
|
|
||||||
|
@mock_sqs
|
||||||
|
def test_delete_message_errors():
|
||||||
|
client = boto3.client('sqs', region_name='us-east-1')
|
||||||
|
response = client.create_queue(QueueName='test-queue')
|
||||||
|
queue_url = response['QueueUrl']
|
||||||
|
client.send_message(
|
||||||
|
QueueUrl=queue_url,
|
||||||
|
MessageBody='body'
|
||||||
|
)
|
||||||
|
response = client.receive_message(
|
||||||
|
QueueUrl=queue_url
|
||||||
|
)
|
||||||
|
receipt_handle = response['Messages'][0]['ReceiptHandle']
|
||||||
|
|
||||||
|
client.delete_message.when.called_with(
|
||||||
|
QueueUrl=queue_url + '-not-existing',
|
||||||
|
ReceiptHandle=receipt_handle
|
||||||
|
).should.throw(
|
||||||
|
ClientError,
|
||||||
|
'The specified queue does not exist for this wsdl version.'
|
||||||
|
)
|
||||||
|
|
||||||
|
client.delete_message.when.called_with(
|
||||||
|
QueueUrl=queue_url,
|
||||||
|
ReceiptHandle='not-existing'
|
||||||
|
).should.throw(
|
||||||
|
ClientError,
|
||||||
|
'The input receipt handle is invalid.'
|
||||||
|
)
|
||||||
|
|
||||||
@mock_sqs
|
@mock_sqs
|
||||||
def test_send_message_batch():
|
def test_send_message_batch():
|
||||||
client = boto3.client('sqs', region_name='us-east-1')
|
client = boto3.client('sqs', region_name='us-east-1')
|
||||||
|
Loading…
Reference in New Issue
Block a user