241 lines
8.8 KiB
Python
241 lines
8.8 KiB
Python
"""SNS topic integration tests."""
|
|
|
|
import time
|
|
|
|
import pytest
|
|
|
|
|
|
class TestSNSTopic:
|
|
"""Test SNS topic operations."""
|
|
|
|
def test_create_topic(self, sns_client, unique_name):
|
|
"""Test CreateTopic creates a topic with correct ARN."""
|
|
topic_name = f"pytest-sns-{unique_name}"
|
|
|
|
try:
|
|
response = sns_client.create_topic(Name=topic_name)
|
|
topic_arn = response["TopicArn"]
|
|
assert topic_name in topic_arn
|
|
finally:
|
|
sns_client.delete_topic(TopicArn=response["TopicArn"])
|
|
|
|
def test_list_topics(self, sns_client, unique_name):
|
|
"""Test ListTopics returns created topic."""
|
|
topic_name = f"pytest-sns-{unique_name}"
|
|
|
|
response = sns_client.create_topic(Name=topic_name)
|
|
topic_arn = response["TopicArn"]
|
|
try:
|
|
response = sns_client.list_topics()
|
|
assert any(t["TopicArn"] == topic_arn for t in response["Topics"])
|
|
finally:
|
|
sns_client.delete_topic(TopicArn=topic_arn)
|
|
|
|
def test_get_topic_attributes(self, sns_client, unique_name):
|
|
"""Test GetTopicAttributes returns topic details."""
|
|
topic_name = f"pytest-sns-{unique_name}"
|
|
|
|
response = sns_client.create_topic(Name=topic_name)
|
|
topic_arn = response["TopicArn"]
|
|
try:
|
|
response = sns_client.get_topic_attributes(TopicArn=topic_arn)
|
|
assert "TopicArn" in response["Attributes"]
|
|
finally:
|
|
sns_client.delete_topic(TopicArn=topic_arn)
|
|
|
|
def test_delete_topic(self, sns_client, unique_name):
|
|
"""Test DeleteTopic removes topic."""
|
|
topic_name = f"pytest-sns-{unique_name}"
|
|
|
|
response = sns_client.create_topic(Name=topic_name)
|
|
topic_arn = response["TopicArn"]
|
|
sns_client.delete_topic(TopicArn=topic_arn)
|
|
|
|
# Topic should not be in list
|
|
response = sns_client.list_topics()
|
|
assert not any(t["TopicArn"] == topic_arn for t in response.get("Topics", []))
|
|
|
|
|
|
class TestSNSSubscription:
|
|
"""Test SNS subscription operations."""
|
|
|
|
def test_subscribe_sqs(self, sns_client, sqs_client, unique_name):
|
|
"""Test Subscribe with SQS endpoint."""
|
|
topic_name = f"pytest-sns-{unique_name}"
|
|
queue_name = f"pytest-sns-queue-{unique_name}"
|
|
|
|
topic_response = sns_client.create_topic(Name=topic_name)
|
|
topic_arn = topic_response["TopicArn"]
|
|
|
|
queue_response = sqs_client.create_queue(QueueName=queue_name)
|
|
queue_url = queue_response["QueueUrl"]
|
|
queue_arn = sqs_client.get_queue_attributes(
|
|
QueueUrl=queue_url, AttributeNames=["QueueArn"]
|
|
)["Attributes"]["QueueArn"]
|
|
|
|
try:
|
|
response = sns_client.subscribe(
|
|
TopicArn=topic_arn, Protocol="sqs", Endpoint=queue_arn
|
|
)
|
|
sub_arn = response["SubscriptionArn"]
|
|
assert sub_arn
|
|
finally:
|
|
sns_client.delete_topic(TopicArn=topic_arn)
|
|
sqs_client.delete_queue(QueueUrl=queue_url)
|
|
|
|
def test_list_subscriptions_by_topic(self, sns_client, sqs_client, unique_name):
|
|
"""Test ListSubscriptionsByTopic returns subscriptions."""
|
|
topic_name = f"pytest-sns-{unique_name}"
|
|
queue_name = f"pytest-sns-queue-{unique_name}"
|
|
|
|
topic_response = sns_client.create_topic(Name=topic_name)
|
|
topic_arn = topic_response["TopicArn"]
|
|
|
|
queue_response = sqs_client.create_queue(QueueName=queue_name)
|
|
queue_url = queue_response["QueueUrl"]
|
|
queue_arn = sqs_client.get_queue_attributes(
|
|
QueueUrl=queue_url, AttributeNames=["QueueArn"]
|
|
)["Attributes"]["QueueArn"]
|
|
|
|
sub_response = sns_client.subscribe(
|
|
TopicArn=topic_arn, Protocol="sqs", Endpoint=queue_arn
|
|
)
|
|
sub_arn = sub_response["SubscriptionArn"]
|
|
|
|
try:
|
|
response = sns_client.list_subscriptions_by_topic(TopicArn=topic_arn)
|
|
assert any(
|
|
s["SubscriptionArn"] == sub_arn for s in response["Subscriptions"]
|
|
)
|
|
finally:
|
|
sns_client.unsubscribe(SubscriptionArn=sub_arn)
|
|
sns_client.delete_topic(TopicArn=topic_arn)
|
|
sqs_client.delete_queue(QueueUrl=queue_url)
|
|
|
|
def test_unsubscribe(self, sns_client, sqs_client, unique_name):
|
|
"""Test Unsubscribe removes subscription."""
|
|
topic_name = f"pytest-sns-{unique_name}"
|
|
queue_name = f"pytest-sns-queue-{unique_name}"
|
|
|
|
topic_response = sns_client.create_topic(Name=topic_name)
|
|
topic_arn = topic_response["TopicArn"]
|
|
|
|
queue_response = sqs_client.create_queue(QueueName=queue_name)
|
|
queue_url = queue_response["QueueUrl"]
|
|
queue_arn = sqs_client.get_queue_attributes(
|
|
QueueUrl=queue_url, AttributeNames=["QueueArn"]
|
|
)["Attributes"]["QueueArn"]
|
|
|
|
sub_response = sns_client.subscribe(
|
|
TopicArn=topic_arn, Protocol="sqs", Endpoint=queue_arn
|
|
)
|
|
sub_arn = sub_response["SubscriptionArn"]
|
|
|
|
try:
|
|
sns_client.unsubscribe(SubscriptionArn=sub_arn)
|
|
# Unsubscribe should succeed without exception
|
|
finally:
|
|
sns_client.delete_topic(TopicArn=topic_arn)
|
|
sqs_client.delete_queue(QueueUrl=queue_url)
|
|
|
|
|
|
class TestSNSPublish:
|
|
"""Test SNS publish operations."""
|
|
|
|
def test_publish(self, sns_client, unique_name):
|
|
"""Test Publish sends message and returns MessageId."""
|
|
topic_name = f"pytest-sns-{unique_name}"
|
|
|
|
topic_response = sns_client.create_topic(Name=topic_name)
|
|
topic_arn = topic_response["TopicArn"]
|
|
|
|
try:
|
|
response = sns_client.publish(
|
|
TopicArn=topic_arn,
|
|
Message="hello from pytest sns",
|
|
Subject="test",
|
|
)
|
|
assert response.get("MessageId")
|
|
finally:
|
|
sns_client.delete_topic(TopicArn=topic_arn)
|
|
|
|
def test_publish_sqs_delivery(self, sns_client, sqs_client, unique_name):
|
|
"""Test message is delivered to SQS subscription."""
|
|
topic_name = f"pytest-sns-{unique_name}"
|
|
queue_name = f"pytest-sns-queue-{unique_name}"
|
|
|
|
topic_response = sns_client.create_topic(Name=topic_name)
|
|
topic_arn = topic_response["TopicArn"]
|
|
|
|
queue_response = sqs_client.create_queue(QueueName=queue_name)
|
|
queue_url = queue_response["QueueUrl"]
|
|
queue_arn = sqs_client.get_queue_attributes(
|
|
QueueUrl=queue_url, AttributeNames=["QueueArn"]
|
|
)["Attributes"]["QueueArn"]
|
|
|
|
sub_response = sns_client.subscribe(
|
|
TopicArn=topic_arn, Protocol="sqs", Endpoint=queue_arn
|
|
)
|
|
sub_arn = sub_response["SubscriptionArn"]
|
|
|
|
try:
|
|
sns_client.publish(
|
|
TopicArn=topic_arn,
|
|
Message="hello from pytest sns",
|
|
Subject="test",
|
|
)
|
|
|
|
time.sleep(0.5)
|
|
response = sqs_client.receive_message(
|
|
QueueUrl=queue_url, MaxNumberOfMessages=1, WaitTimeSeconds=2
|
|
)
|
|
msgs = response.get("Messages", [])
|
|
assert len(msgs) > 0
|
|
assert "hello from pytest sns" in msgs[0]["Body"]
|
|
|
|
finally:
|
|
sns_client.unsubscribe(SubscriptionArn=sub_arn)
|
|
sns_client.delete_topic(TopicArn=topic_arn)
|
|
sqs_client.delete_queue(QueueUrl=queue_url)
|
|
|
|
def test_publish_with_message_attributes(self, sns_client, sqs_client, unique_name):
|
|
"""Test publish with message attributes delivered to SQS."""
|
|
topic_name = f"pytest-sns-{unique_name}"
|
|
queue_name = f"pytest-sns-queue-{unique_name}"
|
|
|
|
topic_response = sns_client.create_topic(Name=topic_name)
|
|
topic_arn = topic_response["TopicArn"]
|
|
|
|
queue_response = sqs_client.create_queue(QueueName=queue_name)
|
|
queue_url = queue_response["QueueUrl"]
|
|
queue_arn = sqs_client.get_queue_attributes(
|
|
QueueUrl=queue_url, AttributeNames=["QueueArn"]
|
|
)["Attributes"]["QueueArn"]
|
|
|
|
sub_response = sns_client.subscribe(
|
|
TopicArn=topic_arn, Protocol="sqs", Endpoint=queue_arn
|
|
)
|
|
sub_arn = sub_response["SubscriptionArn"]
|
|
|
|
try:
|
|
sns_client.publish(
|
|
TopicArn=topic_arn,
|
|
Message="msg with attrs",
|
|
MessageAttributes={
|
|
"my-attr": {"DataType": "String", "StringValue": "my-value"}
|
|
},
|
|
)
|
|
|
|
time.sleep(0.5)
|
|
response = sqs_client.receive_message(
|
|
QueueUrl=queue_url, MaxNumberOfMessages=1, WaitTimeSeconds=2
|
|
)
|
|
msgs = response.get("Messages", [])
|
|
assert len(msgs) > 0
|
|
assert "my-value" in msgs[0]["Body"]
|
|
|
|
finally:
|
|
sns_client.unsubscribe(SubscriptionArn=sub_arn)
|
|
sns_client.delete_topic(TopicArn=topic_arn)
|
|
sqs_client.delete_queue(QueueUrl=queue_url)
|