Skip to content

Commit a8265c1

Browse files
dhumphreys01Admiral-Piett
authored andcommitted
Add PurgeQueueV1 for JSON support
1 parent dcf9236 commit a8265c1

File tree

12 files changed

+321
-44
lines changed

12 files changed

+321
-44
lines changed

app/gosqs/get_queue_attributes.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ func GetQueueAttributesV1(req *http.Request) (int, interfaces.AbstractResponseBo
6161
queueAttributes := make([]models.Attribute, 0, 0)
6262

6363
app.SyncQueues.RLock()
64+
defer app.SyncQueues.RUnlock()
6465
queue, ok := app.SyncQueues.Queues[queueName]
6566
if !ok {
6667
log.Errorf("Get Queue URL: %s queue does not exist!!!", queueName)
67-
app.SyncQueues.RUnlock()
6868
return createErrorResponseV1(ErrInvalidParameterValue.Type)
6969
}
7070

@@ -126,7 +126,6 @@ func GetQueueAttributesV1(req *http.Request) (int, interfaces.AbstractResponseBo
126126
attr := models.Attribute{Name: "RedrivePolicy", Value: fmt.Sprintf(`{"maxReceiveCount":"%d", "deadLetterTargetArn":"%s"}`, queue.MaxReceiveCount, queue.DeadLetterQueue.Arn)}
127127
queueAttributes = append(queueAttributes, attr)
128128
}
129-
app.SyncQueues.RUnlock()
130129

131130
respStruct := models.GetQueueAttributesResponse{
132131
models.BASE_XMLNS,

app/gosqs/gosqs.go

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -362,36 +362,6 @@ func DeleteQueue(w http.ResponseWriter, req *http.Request) {
362362
}
363363
}
364364

365-
func PurgeQueue(w http.ResponseWriter, req *http.Request) {
366-
// Sent response type
367-
w.Header().Set("Content-Type", "application/xml")
368-
369-
// Retrieve FormValues required
370-
queueUrl := getQueueFromPath(req.FormValue("QueueUrl"), req.URL.String())
371-
372-
uriSegments := strings.Split(queueUrl, "/")
373-
queueName := uriSegments[len(uriSegments)-1]
374-
375-
log.Println("Purging Queue:", queueName)
376-
377-
app.SyncQueues.Lock()
378-
if _, ok := app.SyncQueues.Queues[queueName]; ok {
379-
app.SyncQueues.Queues[queueName].Messages = nil
380-
app.SyncQueues.Queues[queueName].Duplicates = make(map[string]time.Time)
381-
respStruct := app.PurgeQueueResponse{"http://queue.amazonaws.com/doc/2012-11-05/", app.ResponseMetadata{RequestId: "00000000-0000-0000-0000-000000000000"}}
382-
enc := xml.NewEncoder(w)
383-
enc.Indent(" ", " ")
384-
if err := enc.Encode(respStruct); err != nil {
385-
log.Printf("error: %v\n", err)
386-
createErrorResponse(w, req, "GeneralError")
387-
}
388-
} else {
389-
log.Println("Purge Queue:", queueName, ", queue does not exist!!!")
390-
createErrorResponse(w, req, "QueueNotFound")
391-
}
392-
app.SyncQueues.Unlock()
393-
}
394-
395365
func GetQueueUrl(w http.ResponseWriter, req *http.Request) {
396366
// Sent response type
397367
w.Header().Set("Content-Type", "application/xml")

app/gosqs/purge_queue.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package gosqs
2+
3+
import (
4+
"net/http"
5+
"strings"
6+
"time"
7+
8+
"github.com/Admiral-Piett/goaws/app/interfaces"
9+
"github.com/Admiral-Piett/goaws/app/models"
10+
"github.com/Admiral-Piett/goaws/app/utils"
11+
12+
"github.com/Admiral-Piett/goaws/app"
13+
log "github.com/sirupsen/logrus"
14+
)
15+
16+
func PurgeQueueV1(req *http.Request) (int, interfaces.AbstractResponseBody) {
17+
requestBody := models.NewPurgeQueueRequest()
18+
ok := utils.REQUEST_TRANSFORMER(requestBody, req, false)
19+
if !ok {
20+
log.Error("Invalid Request - PurgeQueueV1")
21+
return createErrorResponseV1(ErrInvalidParameterValue.Type)
22+
}
23+
24+
uriSegments := strings.Split(requestBody.QueueUrl, "/")
25+
queueName := uriSegments[len(uriSegments)-1]
26+
27+
app.SyncQueues.Lock()
28+
defer app.SyncQueues.Unlock()
29+
if _, ok := app.SyncQueues.Queues[queueName]; !ok {
30+
log.Errorf("Purge Queue: %s, queue does not exist!!!", queueName)
31+
return createErrorResponseV1("QueueNotFound")
32+
}
33+
34+
log.Infof("Purging Queue: %s", queueName)
35+
app.SyncQueues.Queues[queueName].Messages = nil
36+
app.SyncQueues.Queues[queueName].Duplicates = make(map[string]time.Time)
37+
38+
respStruct := models.PurgeQueueResponse{
39+
Xmlns: models.BASE_XMLNS,
40+
Metadata: models.BASE_RESPONSE_METADATA,
41+
}
42+
return http.StatusOK, respStruct
43+
}

app/gosqs/purge_queue_test.go

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package gosqs
2+
3+
import (
4+
"fmt"
5+
"net/http"
6+
"testing"
7+
"time"
8+
9+
"github.com/Admiral-Piett/goaws/app/conf"
10+
11+
"github.com/Admiral-Piett/goaws/app"
12+
"github.com/Admiral-Piett/goaws/app/fixtures"
13+
"github.com/Admiral-Piett/goaws/app/interfaces"
14+
"github.com/Admiral-Piett/goaws/app/models"
15+
"github.com/Admiral-Piett/goaws/app/utils"
16+
"github.com/stretchr/testify/assert"
17+
)
18+
19+
func TestPurgeQueueV1_success(t *testing.T) {
20+
conf.LoadYamlConfig("../conf/mock-data/mock-config.yaml", "BaseUnitTests")
21+
defer func() {
22+
utils.ResetApp()
23+
utils.REQUEST_TRANSFORMER = utils.TransformRequest
24+
}()
25+
26+
utils.REQUEST_TRANSFORMER = func(resultingStruct interfaces.AbstractRequestBody, req *http.Request, emptyRequestValid bool) (success bool) {
27+
v := resultingStruct.(*models.PurgeQueueRequest)
28+
*v = models.PurgeQueueRequest{
29+
QueueUrl: fmt.Sprintf("%s/%s", fixtures.BASE_URL, "unit-queue1"),
30+
}
31+
return true
32+
}
33+
34+
// Put a message on the queue
35+
targetQueue := app.SyncQueues.Queues["unit-queue1"]
36+
app.SyncQueues.Lock()
37+
targetQueue.Messages = []app.Message{app.Message{}}
38+
targetQueue.Duplicates = map[string]time.Time{
39+
"dedupe-id": time.Now(),
40+
}
41+
app.SyncQueues.Unlock()
42+
43+
expectedResponse := models.PurgeQueueResponse{
44+
Xmlns: models.BASE_XMLNS,
45+
Metadata: models.BASE_RESPONSE_METADATA,
46+
}
47+
48+
_, r := utils.GenerateRequestInfo("POST", "/", nil, true)
49+
code, response := PurgeQueueV1(r)
50+
51+
assert.Equal(t, http.StatusOK, code)
52+
assert.Equal(t, expectedResponse, response)
53+
54+
assert.Nil(t, targetQueue.Messages)
55+
assert.Equal(t, map[string]time.Time{}, targetQueue.Duplicates)
56+
}
57+
58+
func TestPurgeQueueV1_success_no_messages_on_queue(t *testing.T) {
59+
conf.LoadYamlConfig("../conf/mock-data/mock-config.yaml", "BaseUnitTests")
60+
defer func() {
61+
utils.ResetApp()
62+
utils.REQUEST_TRANSFORMER = utils.TransformRequest
63+
}()
64+
65+
utils.REQUEST_TRANSFORMER = func(resultingStruct interfaces.AbstractRequestBody, req *http.Request, emptyRequestValid bool) (success bool) {
66+
v := resultingStruct.(*models.PurgeQueueRequest)
67+
*v = models.PurgeQueueRequest{
68+
QueueUrl: fmt.Sprintf("%s/%s", fixtures.BASE_URL, "unit-queue1"),
69+
}
70+
return true
71+
}
72+
73+
expectedResponse := models.PurgeQueueResponse{
74+
Xmlns: models.BASE_XMLNS,
75+
Metadata: models.BASE_RESPONSE_METADATA,
76+
}
77+
78+
_, r := utils.GenerateRequestInfo("POST", "/", nil, true)
79+
code, response := PurgeQueueV1(r)
80+
81+
assert.Equal(t, http.StatusOK, code)
82+
assert.Equal(t, expectedResponse, response)
83+
84+
targetQueue := app.SyncQueues.Queues["unit-queue1"]
85+
assert.Nil(t, targetQueue.Messages)
86+
assert.Equal(t, map[string]time.Time{}, targetQueue.Duplicates)
87+
}
88+
89+
func TestPurgeQueueV1_request_transformer_error(t *testing.T) {
90+
conf.LoadYamlConfig("../conf/mock-data/mock-config.yaml", "BaseUnitTests")
91+
defer func() {
92+
utils.ResetApp()
93+
utils.REQUEST_TRANSFORMER = utils.TransformRequest
94+
}()
95+
96+
utils.REQUEST_TRANSFORMER = func(resultingStruct interfaces.AbstractRequestBody, req *http.Request, emptyRequestValid bool) (success bool) {
97+
return false
98+
}
99+
100+
_, r := utils.GenerateRequestInfo("POST", "/", nil, true)
101+
code, _ := PurgeQueueV1(r)
102+
103+
assert.Equal(t, http.StatusBadRequest, code)
104+
}
105+
106+
func TestPurgeQueueV1_requested_queue_does_not_exist(t *testing.T) {
107+
conf.LoadYamlConfig("../conf/mock-data/mock-config.yaml", "BaseUnitTests")
108+
defer func() {
109+
utils.ResetApp()
110+
utils.REQUEST_TRANSFORMER = utils.TransformRequest
111+
}()
112+
113+
utils.REQUEST_TRANSFORMER = func(resultingStruct interfaces.AbstractRequestBody, req *http.Request, emptyRequestValid bool) (success bool) {
114+
v := resultingStruct.(*models.PurgeQueueRequest)
115+
*v = models.PurgeQueueRequest{
116+
QueueUrl: fmt.Sprintf("%s/%s", fixtures.BASE_URL, "garbage"),
117+
}
118+
return true
119+
}
120+
121+
_, r := utils.GenerateRequestInfo("POST", "/", nil, true)
122+
code, _ := PurgeQueueV1(r)
123+
124+
assert.Equal(t, http.StatusBadRequest, code)
125+
}

app/gosqs/send_message.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func SendMessageV1(req *http.Request) (int, interfaces.AbstractResponseBody) {
2121
requestBody := models.NewSendMessageRequest()
2222
ok := utils.REQUEST_TRANSFORMER(requestBody, req, false)
2323
if !ok {
24-
log.Error("Invalid Request - CreateQueueV1")
24+
log.Error("Invalid Request - SendMessageV1")
2525
return createErrorResponseV1(ErrInvalidParameterValue.Type)
2626
}
2727
messageBody := requestBody.MessageBody

app/models/models.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,3 +445,13 @@ type DeleteMessageRequest struct {
445445
}
446446

447447
func (r *DeleteMessageRequest) SetAttributesFromForm(values url.Values) {}
448+
449+
func NewPurgeQueueRequest() *PurgeQueueRequest {
450+
return &PurgeQueueRequest{}
451+
}
452+
453+
type PurgeQueueRequest struct {
454+
QueueUrl string `json:"QueueUrl" schema:"QueueUrl"`
455+
}
456+
457+
func (r *PurgeQueueRequest) SetAttributesFromForm(values url.Values) {}

app/models/responses.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,3 +236,17 @@ func (r SetQueueAttributesResponse) GetResult() interface{} {
236236
func (r SetQueueAttributesResponse) GetRequestId() string {
237237
return r.Metadata.RequestId
238238
}
239+
240+
/*** Purge Queue Response */
241+
type PurgeQueueResponse struct {
242+
Xmlns string `xml:"xmlns,attr,omitempty"`
243+
Metadata app.ResponseMetadata `xml:"ResponseMetadata,omitempty"`
244+
}
245+
246+
func (r PurgeQueueResponse) GetResult() interface{} {
247+
return nil
248+
}
249+
250+
func (r PurgeQueueResponse) GetRequestId() string {
251+
return r.Metadata.RequestId
252+
}

app/router/router.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,14 @@ var routingTableV1 = map[string]func(r *http.Request) (int, interfaces.AbstractR
7171
"ReceiveMessage": sqs.ReceiveMessageV1,
7272
"ChangeMessageVisibility": sqs.ChangeMessageVisibilityV1,
7373
"DeleteMessage": sqs.DeleteMessageV1,
74+
"PurgeQueue": sqs.PurgeQueueV1,
7475
}
7576

7677
var routingTable = map[string]http.HandlerFunc{
7778
// SQS
7879
"SendMessageBatch": sqs.SendMessageBatch,
7980
"DeleteMessageBatch": sqs.DeleteMessageBatch,
8081
"GetQueueUrl": sqs.GetQueueUrl,
81-
"PurgeQueue": sqs.PurgeQueue,
8282
"DeleteQueue": sqs.DeleteQueue,
8383

8484
// SNS

app/router/router_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,13 +268,13 @@ func TestActionHandler_v0_xml(t *testing.T) {
268268
"ReceiveMessage": sqs.ReceiveMessageV1,
269269
"DeleteMessage": sqs.DeleteMessageV1,
270270
"ChangeMessageVisibility": sqs.ChangeMessageVisibilityV1,
271+
"PurgeQueue": sqs.PurgeQueueV1,
271272
}
272273
routingTable = map[string]http.HandlerFunc{
273274
// SQS
274275
"SendMessageBatch": sqs.SendMessageBatch,
275276
"DeleteMessageBatch": sqs.DeleteMessageBatch,
276277
"GetQueueUrl": sqs.GetQueueUrl,
277-
"PurgeQueue": sqs.PurgeQueue,
278278
"DeleteQueue": sqs.DeleteQueue,
279279

280280
// SNS

app/sqs_messages.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,6 @@ type SendMessageBatchResponse struct {
5959
Metadata ResponseMetadata `xml:"ResponseMetadata,omitempty"`
6060
}
6161

62-
/*** Purge Queue Response */
63-
type PurgeQueueResponse struct {
64-
Xmlns string `xml:"xmlns,attr,omitempty"`
65-
Metadata ResponseMetadata `xml:"ResponseMetadata,omitempty"`
66-
}
67-
6862
/*** Get Queue Url Response */
6963
type GetQueueUrlResult struct {
7064
QueueUrl string `xml:"QueueUrl,omitempty"`

smoke_tests/sqs_create_queue_test.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@ import (
2727
"github.com/gavv/httpexpect/v2"
2828
)
2929

30-
// TODO - Is there a way to also capture the defaults we set and/or load from the config here? (review the xml
31-
// code below)
32-
// NOTE: Actually I think you can just adjust the app.CurrentEnvironment memory space...it travels across tests it seems.
3330
func Test_CreateQueueV1_json_no_attributes(t *testing.T) {
3431
server := generateServer()
3532
defer func() {

0 commit comments

Comments
 (0)