Skip to content

Commit

Permalink
SQS receive method
Browse files Browse the repository at this point in the history
* Add SQS receive method
* Add corresponding unit tests and fixtures
* Rename fixtures for greater clarity with the new fixtures

* https://mitlibraries.atlassian.net/browse/DLSPP-114
  • Loading branch information
ehanson8 committed Oct 27, 2021
1 parent 70c6cb0 commit a64421a
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 15 deletions.
12 changes: 12 additions & 0 deletions awd/sqs.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,18 @@ def send(self, queue_url, message_attributes, message_body):
logger.debug(f"Response from SQS queue: {response}")
return response

def receive(self, queue_url):
"""Send message via SQS."""
logger.debug(f"Receiving messages from SQS queue: {queue_url}")
response = self.client.receive_message(
QueueUrl=queue_url,
)
logger.debug(
f"{len(response['Messages'])} messages retrieved from SQS queue: {queue_url}"
)
for message in response["Messages"]:
yield message


def create_dss_message_attributes(package_id, submission_source, output_queue):
"""Create attributes for a DSpace Submission Service message."""
Expand Down
53 changes: 47 additions & 6 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,18 +90,59 @@ def dspace_metadata():


@pytest.fixture()
def dss_message_attributes_example():
dss_message_attributes = {
def result_error_body():
result_error_body = {
"ResultType": "error",
"ErrorTimestamp": "Thu Sep 10 17:56:39 UTC 2021",
"ErrorInfo": "Error occurred while posting item to DSpace",
"ExceptionMessage": "500 Server Error: Internal Server Error'",
"ExceptionTraceback": "Full unformatted stack trace of the Exception",
}
return result_error_body


@pytest.fixture()
def result_message_attributes():
result_message_attributes = {
"PackageID": {"DataType": "String", "StringValue": "09876"},
"SubmissionSource": {"DataType": "String", "StringValue": "Submission system"},
}
return result_message_attributes


@pytest.fixture()
def result_message_body():
result_message_body = {
"ResultType": "success",
"ItemHandle": "1721.1/131022",
"lastModified": "Thu Sep 09 17:56:39 UTC 2021",
"Bitstreams": [
{
"BitstreamName": "baker_report.pdf",
"BitstreamUUID": "a1b2c3d4e5",
"BitstreamChecksum": {
"value": "a4e0f4930dfaff904fa3c6c85b0b8ecc",
"checkSumAlgorithm": "MD5",
},
}
],
}
return result_message_body


@pytest.fixture()
def submission_message_attributes():
submission_message_attributes = {
"PackageID": {"DataType": "String", "StringValue": "123"},
"SubmissionSource": {"DataType": "String", "StringValue": "Submission system"},
"OutputQueue": {"DataType": "String", "StringValue": "DSS queue"},
}
return dss_message_attributes
return submission_message_attributes


@pytest.fixture()
def dss_message_body_example():
dss_message_body = {
def submission_message_body():
submission_message_body = {
"SubmissionSystem": "DSpace",
"CollectionHandle": "123.4/5678",
"MetadataLocation": "mock://bucket/456.json",
Expand All @@ -113,7 +154,7 @@ def dss_message_body_example():
}
],
}
return dss_message_body
return submission_message_body


@pytest.fixture()
Expand Down
38 changes: 29 additions & 9 deletions tests/test_sqs.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,41 +6,61 @@
from awd import sqs


@mock_sqs
def test_sqs_receive_success(
sqs_client, result_message_attributes, result_message_body
):
sqs = boto3.resource("sqs", region_name="us-east-1")
sqs_queue = sqs.create_queue(QueueName="mock-output-queue")
sqs_client.send(sqs_queue.url, {}, result_message_body)
messages = sqs_client.receive(sqs_queue.url)
for message in messages:
assert message["Body"] == str(result_message_body)


@mock_sqs
def test_sqs_receive_failure(sqs_client, result_error_body):
with pytest.raises(ClientError):
messages = sqs_client.receive("none-existent")
for message in messages:
pass


@mock_sqs
def test_sqs_send_success(
sqs_client, dss_message_attributes_example, dss_message_body_example
sqs_client, submission_message_attributes, submission_message_body
):
sqs = boto3.resource("sqs", region_name="us-east-1")
sqs_queue = sqs.create_queue(QueueName="mock-queue")
sqs_queue = sqs.create_queue(QueueName="mock-input-queue")
response = sqs_client.send(
sqs_queue.url, dss_message_attributes_example, dss_message_body_example
sqs_queue.url, submission_message_attributes, submission_message_body
)
assert response["ResponseMetadata"]["HTTPStatusCode"] == 200


@mock_sqs
def test_sqs_send_failure(
sqs_client, dss_message_attributes_example, dss_message_body_example
sqs_client, submission_message_attributes, submission_message_body
):
with pytest.raises(ClientError):
sqs_client.send(
"non-existent", dss_message_attributes_example, dss_message_body_example
"non-existent", submission_message_attributes, submission_message_body
)


def test_create_dss_message_attributes(dss_message_attributes_example):
def test_create_dss_message_attributes(submission_message_attributes):
dss_message_attributes = sqs.create_dss_message_attributes(
"123", "Submission system", "DSS queue"
)
assert dss_message_attributes == dss_message_attributes_example
assert dss_message_attributes == submission_message_attributes


def test_create_dss_message_body(dss_message_body_example):
def test_create_dss_message_body(submission_message_body):
dss_message_body = sqs.create_dss_message_body(
"DSpace",
"123.4/5678",
"mock://bucket/456.json",
"456.pdf",
"mock://bucket/456.pdf",
)
assert dss_message_body == dss_message_body_example
assert dss_message_body == submission_message_body

0 comments on commit a64421a

Please sign in to comment.