From e72cae83fedd089d2ddc5a074fb586a9411a98ad Mon Sep 17 00:00:00 2001 From: "Jordan K. Wilson" Date: Fri, 30 May 2025 11:24:27 +1200 Subject: [PATCH] feat: add ability to set message visibility --- aws/sqs/sqs.go | 13 +++++++++++++ aws/sqs/sqs_integration_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/aws/sqs/sqs.go b/aws/sqs/sqs.go index e7c963b..cc10211 100644 --- a/aws/sqs/sqs.go +++ b/aws/sqs/sqs.go @@ -211,6 +211,19 @@ func (s *SQS) Delete(queueURL, receiptHandle string) error { return err } +// SetMessageVisibility sets the visibility timeout for a message. +func (s *SQS) SetMessageVisibility(queueURL, receiptHandle string, visibilityTimeout int32) error { + params := sqs.ChangeMessageVisibilityInput{ + QueueUrl: aws.String(queueURL), + ReceiptHandle: aws.String(receiptHandle), + VisibilityTimeout: visibilityTimeout, + } + + _, err := s.client.ChangeMessageVisibility(context.TODO(), ¶ms) + + return err +} + // Send sends the message body to the SQS queue referred to by queueURL. func (s *SQS) Send(queueURL string, body string) error { params := sqs.SendMessageInput{ diff --git a/aws/sqs/sqs_integration_test.go b/aws/sqs/sqs_integration_test.go index 320a115..90e13f3 100644 --- a/aws/sqs/sqs_integration_test.go +++ b/aws/sqs/sqs_integration_test.go @@ -851,3 +851,29 @@ func TestDeleteQueue(t *testing.T) { assert.Nil(t, err) assert.Panics(t, func() { awsCmdDeleteQueue(newQueueUrl) }) } + +func TestMessageVisibility(t *testing.T) { + // ARRANGE + setup() + defer teardown() + + client, err := New() + require.Nil(t, err, "error with test setup") + + require.Nil(t, client.Send(awsCmdQueueURL(), testMessage), "error with test setup") + + // receive, with visibility timeout of 5min + receivedMessage, err := client.Receive(awsCmdQueueURL(), 5*60) + + require.Nil(t, err, "error with test setup") + require.Equal(t, awsCmdQueueCount(), 0) + + // ACTION + // set visibility timeout to 10 s + client.SetMessageVisibility(awsCmdQueueURL(), receivedMessage.ReceiptHandle, 10) + + // ASSERT + assert.Equal(t, awsCmdQueueCount(), 0) // not visible yet + time.Sleep(11 * time.Second) + assert.Equal(t, awsCmdQueueCount(), 1) // message visible now +}