diff --git a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/Internal/AmazonSqsQueueTests.cs b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/Internal/AmazonSqsQueueTests.cs index 84e2ecad6..0198daa9e 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs.Tests/Internal/AmazonSqsQueueTests.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs.Tests/Internal/AmazonSqsQueueTests.cs @@ -66,7 +66,8 @@ public void configure_request() { MaxNumberOfMessages = 8, VisibilityTimeout = 3, - WaitTimeSeconds = 11 + WaitTimeSeconds = 11, + MessageAttributeNames = ["All"], }; var request = new ReceiveMessageRequest(); @@ -76,6 +77,39 @@ public void configure_request() request.VisibilityTimeout.ShouldBe(endpoint.VisibilityTimeout); request.MaxNumberOfMessages.ShouldBe(endpoint.MaxNumberOfMessages); request.WaitTimeSeconds.ShouldBe(endpoint.WaitTimeSeconds); + request.MessageAttributeNames.ShouldBe(endpoint.MessageAttributeNames); + } + + [Fact] + public void default_message_attribute_names_is_null_on_endpoint() + { + new AmazonSqsQueue("foo", new AmazonSqsTransport()) + .MessageAttributeNames.ShouldBeNull(); + } + + [Fact] + public void configure_request_does_not_set_message_attribute_names_when_null() + { + var endpoint = new AmazonSqsQueue("foo", new AmazonSqsTransport()); + var request = new ReceiveMessageRequest(); + + endpoint.ConfigureRequest(request); + + request.MessageAttributeNames.ShouldBeNull(); + } + + [Fact] + public void configure_request_does_not_set_when_empty_list() + { + var endpoint = new AmazonSqsQueue("foo", new AmazonSqsTransport()) + { + MessageAttributeNames = [] + }; + var request = new ReceiveMessageRequest(); + + endpoint.ConfigureRequest(request); + + request.MessageAttributeNames.ShouldBeNull(); } } diff --git a/src/Transports/AWS/Wolverine.AmazonSqs/Internal/AmazonSqsQueue.cs b/src/Transports/AWS/Wolverine.AmazonSqs/Internal/AmazonSqsQueue.cs index 648d249f1..3a051b5d4 100644 --- a/src/Transports/AWS/Wolverine.AmazonSqs/Internal/AmazonSqsQueue.cs +++ b/src/Transports/AWS/Wolverine.AmazonSqs/Internal/AmazonSqsQueue.cs @@ -90,6 +90,13 @@ public int VisibilityTimeout /// public string? DeadLetterQueueName { get; set; } = AmazonSqsTransport.DeadLetterQueueName; + /// + /// Optional list of message attribute names to request in ReceiveMessage. + /// Use "All" to retrieve all message attributes. If null or empty, nothing is requested. + /// (Attention: this is different from .) + /// + public List? MessageAttributeNames { get; set; } + public async ValueTask CheckAsync() { var response = await _parent.Client!.GetQueueUrlAsync(QueueName); @@ -299,6 +306,11 @@ internal void ConfigureRequest(ReceiveMessageRequest request) request.WaitTimeSeconds = WaitTimeSeconds; request.MaxNumberOfMessages = MaxNumberOfMessages; request.VisibilityTimeout = VisibilityTimeout; + + if (MessageAttributeNames is { Count: > 0 }) + { + request.MessageAttributeNames = MessageAttributeNames; + } } public async Task TeardownAsync(IAmazonSQS client, CancellationToken token)