Files
SQS-service/app/gosqs/send_message_batch_test.go
T
Naeel c3ba2dcae4 chore: initial import from sless/shared-sqs (v0.1.14)
- Standalone SQS-service repository
- Multi-tenant message queue service, AWS SQS compatible
- Based on GoAws, with mutable tenants, auth, WebUI, Redis persistence
- Ready for independent development and deployment
- See doc/ and README.md for architecture and usage
2026-04-10 16:47:27 +03:00

347 lines
10 KiB
Go

package gosqs
import (
"fmt"
"net/http"
"testing"
"shared-sqs/app/conf"
"shared-sqs/app/fixtures"
"shared-sqs/app/interfaces"
"shared-sqs/app/models"
"shared-sqs/app/test"
"shared-sqs/app/utils"
"github.com/stretchr/testify/assert"
)
func TestSendMessageBatchV1_Success(t *testing.T) {
conf.LoadYamlConfig("../conf/mock-data/mock-config.yaml", "BaseUnitTests")
defer func() {
models.ResetApp()
utils.REQUEST_TRANSFORMER = utils.TransformRequest
}()
sendMessageRequest_success := models.SendMessageBatchRequest{
Entries: []models.SendMessageBatchRequestEntry{
{
Id: "test-msg-with-non-attribute",
MessageBody: "test%20message%20body%201",
},
{
Id: "test-msg-with-single-attirbute",
MessageBody: "test%20message%20body%202",
MessageAttributes: map[string]models.MessageAttribute{
"my-attribute-name": {
DataType: "String",
StringValue: "my-attribute-string-value",
},
},
},
{
Id: "test-msg-with-multi-attirbute",
MessageBody: "test%20message%20body%203",
MessageAttributes: map[string]models.MessageAttribute{
"my-attribute-name-1": {
BinaryValue: "binary-value-1",
DataType: "Binary",
},
"my-attribute-name-2": {
DataType: "String",
StringValue: "my-attribute-string-value-2",
},
},
},
},
QueueUrl: fmt.Sprintf("%s/%s", fixtures.BASE_URL, "unit-queue1"),
}
utils.REQUEST_TRANSFORMER = func(resultingStruct interfaces.AbstractRequestBody, req *http.Request, emptyRequestValid bool) (success bool) {
v := resultingStruct.(*models.SendMessageBatchRequest)
*v = sendMessageRequest_success
return true
}
_, r := test.GenerateRequestInfo("POST", "/", nil, true)
status, response := SendMessageBatchV1(r)
sendMessageBatchResponse, ok := response.(models.SendMessageBatchResponse)
assert.Equal(t, http.StatusOK, status)
assert.True(t, ok)
resultEntry := sendMessageBatchResponse.Result.Entry
assert.Equal(t, 3, len(resultEntry))
assert.Contains(t, resultEntry[0].Id, "test-msg-with-non-attribute")
assert.Contains(t, resultEntry[1].Id, "test-msg-with-single-attirbute")
assert.Contains(t, resultEntry[2].Id, "test-msg-with-multi-attirbute")
assert.Empty(t, resultEntry[0].SequenceNumber)
assert.Empty(t, resultEntry[1].SequenceNumber)
assert.Empty(t, resultEntry[2].SequenceNumber)
}
func TestSendMessageBatchV1_Success_Fifo_Queue(t *testing.T) {
conf.LoadYamlConfig("../conf/mock-data/mock-config.yaml", "BaseUnitTests")
defer func() {
models.ResetApp()
utils.REQUEST_TRANSFORMER = utils.TransformRequest
}()
sendMessageRequest_success := models.SendMessageBatchRequest{
Entries: []models.SendMessageBatchRequestEntry{
{
Id: "test_msg_001",
MessageBody: "test%20message%20body%201",
},
{
Id: "test_msg_002",
MessageBody: "test%20message%20body%202",
},
{
Id: "test_msg_003",
MessageBody: "test%20message%20body%203",
},
},
QueueUrl: fmt.Sprintf("%s/%s", fixtures.BASE_URL, "fifo-queue-1"),
}
utils.REQUEST_TRANSFORMER = func(resultingStruct interfaces.AbstractRequestBody, req *http.Request, emptyRequestValid bool) (success bool) {
v := resultingStruct.(*models.SendMessageBatchRequest)
*v = sendMessageRequest_success
return true
}
q := &models.Queue{
Name: "fifo-queue-1",
MaximumMessageSize: 1024,
IsFIFO: true,
}
models.SyncQueues.Queues["fifo-queue-1"] = q
_, r := test.GenerateRequestInfo("POST", "/", nil, true)
status, response := SendMessageBatchV1(r)
sendMessageBatchResponse, ok := response.(models.SendMessageBatchResponse)
assert.Equal(t, http.StatusOK, status)
assert.True(t, ok)
resultEntry := sendMessageBatchResponse.Result.Entry
assert.Equal(t, 3, len(resultEntry))
assert.Contains(t, resultEntry[0].Id, "test_msg_001")
assert.NotEmpty(t, resultEntry[0].SequenceNumber)
assert.Contains(t, resultEntry[1].Id, "test_msg_002")
assert.NotEmpty(t, resultEntry[1].SequenceNumber)
assert.Contains(t, resultEntry[2].Id, "test_msg_003")
assert.NotEmpty(t, resultEntry[2].SequenceNumber)
}
func TestSendMessageBatchV1_Error_QueueNotFound(t *testing.T) {
conf.LoadYamlConfig("../conf/mock-data/mock-config.yaml", "BaseUnitTests")
defer func() {
models.ResetApp()
utils.REQUEST_TRANSFORMER = utils.TransformRequest
}()
sendMessageRequest_not_found_queue := models.SendMessageBatchRequest{
Entries: []models.SendMessageBatchRequestEntry{
{
Id: "test_msg_001",
MessageBody: "test%20message%20body%201",
},
{
Id: "test_msg_002",
MessageBody: "test%20message%20body%202",
},
{
Id: "test_msg_003",
MessageBody: "test%20message%20body%203",
},
},
QueueUrl: fmt.Sprintf("%s/%s", fixtures.BASE_URL, "not-exist-queue1"),
}
utils.REQUEST_TRANSFORMER = func(resultingStruct interfaces.AbstractRequestBody, req *http.Request, emptyRequestValid bool) (success bool) {
v := resultingStruct.(*models.SendMessageBatchRequest)
*v = sendMessageRequest_not_found_queue
return true
}
expected := models.ErrorResult{
Type: "Not Found",
Code: "AWS.SimpleQueueService.NonExistentQueue",
Message: "The specified queue does not exist for this wsdl version.",
}
_, r := test.GenerateRequestInfo("POST", "/", nil, true)
status, response := SendMessageBatchV1(r)
errorResult := response.GetResult().(models.ErrorResult)
assert.Equal(t, http.StatusBadRequest, status)
assert.Equal(t, expected, errorResult)
}
func TestSendMessageBatchV1_Error_NoEntry(t *testing.T) {
conf.LoadYamlConfig("../conf/mock-data/mock-config.yaml", "BaseUnitTests")
defer func() {
models.ResetApp()
utils.REQUEST_TRANSFORMER = utils.TransformRequest
}()
sendMessageRequest_no_entry := models.SendMessageBatchRequest{
QueueUrl: fmt.Sprintf("%s/%s", fixtures.BASE_URL, "unit-queue1"),
}
utils.REQUEST_TRANSFORMER = func(resultingStruct interfaces.AbstractRequestBody, req *http.Request, emptyRequestValid bool) (success bool) {
v := resultingStruct.(*models.SendMessageBatchRequest)
*v = sendMessageRequest_no_entry
return true
}
expected := models.ErrorResult{
Type: "EmptyBatchRequest",
Code: "AWS.SimpleQueueService.EmptyBatchRequest",
Message: "The batch request doesn't contain any entries.",
}
_, r := test.GenerateRequestInfo("POST", "/", nil, true)
status, response := SendMessageBatchV1(r)
errorResult := response.GetResult().(models.ErrorResult)
assert.Equal(t, http.StatusBadRequest, status)
assert.Equal(t, expected, errorResult)
}
func TestSendMessageBatchV1_Error_IdNotDistinct(t *testing.T) {
conf.LoadYamlConfig("../conf/mock-data/mock-config.yaml", "BaseUnitTests")
defer func() {
models.ResetApp()
utils.REQUEST_TRANSFORMER = utils.TransformRequest
}()
sendMessageRequest_no_entry := models.SendMessageBatchRequest{
Entries: []models.SendMessageBatchRequestEntry{
{
Id: "test_msg_001",
MessageBody: "test%20message%20body%201",
},
{
Id: "test_msg_001",
MessageBody: "test%20message%20body%202",
},
{
Id: "test_msg_001",
MessageBody: "test%20message%20body%203",
},
},
QueueUrl: fmt.Sprintf("%s/%s", fixtures.BASE_URL, "unit-queue1"),
}
utils.REQUEST_TRANSFORMER = func(resultingStruct interfaces.AbstractRequestBody, req *http.Request, emptyRequestValid bool) (success bool) {
v := resultingStruct.(*models.SendMessageBatchRequest)
*v = sendMessageRequest_no_entry
return true
}
expected := models.ErrorResult{
Type: "BatchEntryIdsNotDistinct",
Code: "AWS.SimpleQueueService.BatchEntryIdsNotDistinct",
Message: "Two or more batch entries in the request have the same Id.",
}
_, r := test.GenerateRequestInfo("POST", "/", nil, true)
status, response := SendMessageBatchV1(r)
errorResult := response.GetResult().(models.ErrorResult)
assert.Equal(t, http.StatusBadRequest, status)
assert.Equal(t, expected, errorResult)
}
func TestSendMessageBatchV1_Error_TooManyEntries(t *testing.T) {
conf.LoadYamlConfig("../conf/mock-data/mock-config.yaml", "BaseUnitTests")
defer func() {
models.ResetApp()
utils.REQUEST_TRANSFORMER = utils.TransformRequest
}()
sendMessageRequest_success := models.SendMessageBatchRequest{
Entries: []models.SendMessageBatchRequestEntry{
{
Id: "test_msg_001",
MessageBody: "test%20message%20body%201",
},
{
Id: "test_msg_002",
MessageBody: "test%20message%20body%202",
},
{
Id: "test_msg_003",
MessageBody: "test%20message%20body%203",
},
{
Id: "test_msg_004",
MessageBody: "test%20message%20body%204",
},
{
Id: "test_msg_005",
MessageBody: "test%20message%20body%205",
},
{
Id: "test_msg_006",
MessageBody: "test%20message%20body%206",
},
{
Id: "test_msg_007",
MessageBody: "test%20message%20body%207",
},
{
Id: "test_msg_008",
MessageBody: "test%20message%20body%208",
},
{
Id: "test_msg_009",
MessageBody: "test%20message%20body%209",
},
{
Id: "test_msg_010",
MessageBody: "test%20message%20body%210",
},
{
Id: "test_msg_011",
MessageBody: "test%20message%20body%211",
},
},
QueueUrl: fmt.Sprintf("%s/%s", fixtures.BASE_URL, "unit-queue1"),
}
utils.REQUEST_TRANSFORMER = func(resultingStruct interfaces.AbstractRequestBody, req *http.Request, emptyRequestValid bool) (success bool) {
v := resultingStruct.(*models.SendMessageBatchRequest)
*v = sendMessageRequest_success
return true
}
expected := models.ErrorResult{
Type: "TooManyEntriesInBatchRequest",
Code: "AWS.SimpleQueueService.TooManyEntriesInBatchRequest",
Message: "Maximum number of entries per request are 10.",
}
_, r := test.GenerateRequestInfo("POST", "/", nil, true)
status, response := SendMessageBatchV1(r)
errorResult := response.GetResult().(models.ErrorResult)
assert.Equal(t, http.StatusBadRequest, status)
assert.Equal(t, expected, errorResult)
}
func TestSendMessageBatchV1_Error_transformer(t *testing.T) {
conf.LoadYamlConfig("../conf/mock-data/mock-config.yaml", "BaseUnitTests")
defer func() {
models.ResetApp()
utils.REQUEST_TRANSFORMER = utils.TransformRequest
}()
utils.REQUEST_TRANSFORMER = func(resultingStruct interfaces.AbstractRequestBody, req *http.Request, emptyRequestValid bool) (success bool) {
return false
}
_, r := test.GenerateRequestInfo("POST", "/", nil, true)
code, _ := SendMessageBatchV1(r)
assert.Equal(t, http.StatusBadRequest, code)
}