- 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
347 lines
10 KiB
Go
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)
|
|
|
|
}
|