second first commit
This commit is contained in:
@@ -0,0 +1,240 @@
|
||||
"""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)
|
||||
Reference in New Issue
Block a user