@@ -331,6 +331,177 @@ func TestSQSQueueDetailAPIsExposeMessagesLeasesAndPurge(t *testing.T) {
331331 }
332332}
333333
334+ func TestSQSDashboardManagementAPIsCreateQueueAndSendMessage (t * testing.T ) {
335+ sqsServer := sqssvc .NewServer (sqssvc.Config {Addr : "127.0.0.1:9324" })
336+ server := NewServer (Config {}, newDashboardStore (nil , nil ))
337+ server .SetSQS (sqsServer )
338+ routes := server .routes ()
339+
340+ createRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues" , `{
341+ "input":{
342+ "QueueName":"dashboard-managed.fifo",
343+ "Attributes":{"FifoQueue":"true","ContentBasedDeduplication":"true","VisibilityTimeout":"30"},
344+ "Tags":{"source":"dashboard"}
345+ }
346+ }` )
347+ if createRec .Code != http .StatusOK {
348+ t .Fatalf ("create status = %d, body = %s" , createRec .Code , createRec .Body .String ())
349+ }
350+ if ! strings .Contains (createRec .Body .String (), `"QueueUrl"` ) || ! strings .Contains (createRec .Body .String (), "dashboard-managed.fifo" ) {
351+ t .Fatalf ("create body = %s" , createRec .Body .String ())
352+ }
353+
354+ sendRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues/dashboard-managed.fifo/messages" , `{
355+ "input":{
356+ "MessageBody":"dashboard send",
357+ "MessageGroupId":"workers",
358+ "MessageAttributes":{"kind":{"DataType":"String","StringValue":"test"}}
359+ }
360+ }` )
361+ if sendRec .Code != http .StatusOK {
362+ t .Fatalf ("send status = %d, body = %s" , sendRec .Code , sendRec .Body .String ())
363+ }
364+ if ! strings .Contains (sendRec .Body .String (), `"MessageId"` ) || ! strings .Contains (sendRec .Body .String (), `"MD5OfMessageAttributes"` ) {
365+ t .Fatalf ("send body = %s" , sendRec .Body .String ())
366+ }
367+
368+ messagesRec := performRequest (routes , http .MethodGet , "/api/sqs/queues/dashboard-managed.fifo/messages" )
369+ if messagesRec .Code != http .StatusOK {
370+ t .Fatalf ("messages status = %d, body = %s" , messagesRec .Code , messagesRec .Body .String ())
371+ }
372+ if ! strings .Contains (messagesRec .Body .String (), `"body":"dashboard send"` ) || ! strings .Contains (messagesRec .Body .String (), `"messageGroupId":"workers"` ) {
373+ t .Fatalf ("messages body = %s" , messagesRec .Body .String ())
374+ }
375+ }
376+
377+ func TestSQSDashboardSendMessageRejectsMismatchedQueueURL (t * testing.T ) {
378+ sqsServer := sqssvc .NewServer (sqssvc.Config {Addr : "127.0.0.1:9324" })
379+ server := NewServer (Config {}, newDashboardStore (nil , nil ))
380+ server .SetSQS (sqsServer )
381+ routes := server .routes ()
382+
383+ createRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues" , `{"input":{"QueueName":"dashboard-safe"}}` )
384+ if createRec .Code != http .StatusOK {
385+ t .Fatalf ("create status = %d, body = %s" , createRec .Code , createRec .Body .String ())
386+ }
387+
388+ sendRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues/dashboard-safe/messages" , `{
389+ "input":{"QueueUrl":"http://127.0.0.1:9324/000000000000/other","MessageBody":"wrong queue"}
390+ }` )
391+ if sendRec .Code != http .StatusBadRequest {
392+ t .Fatalf ("send status = %d, want %d, body = %s" , sendRec .Code , http .StatusBadRequest , sendRec .Body .String ())
393+ }
394+ if ! strings .Contains (sendRec .Body .String (), "QueueUrl must match" ) {
395+ t .Fatalf ("send body = %s" , sendRec .Body .String ())
396+ }
397+ }
398+
399+ func TestSQSDashboardManagementAPIsReceiveAndDeleteMessage (t * testing.T ) {
400+ sqsServer := sqssvc .NewServer (sqssvc.Config {Addr : "127.0.0.1:9324" })
401+ server := NewServer (Config {}, newDashboardStore (nil , nil ))
402+ server .SetSQS (sqsServer )
403+ routes := server .routes ()
404+
405+ createRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues" , `{"input":{"QueueName":"dashboard-receive"}}` )
406+ if createRec .Code != http .StatusOK {
407+ t .Fatalf ("create status = %d, body = %s" , createRec .Code , createRec .Body .String ())
408+ }
409+ sendRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues/dashboard-receive/messages" , `{
410+ "input":{"MessageBody":"dashboard receive","MessageAttributes":{"kind":{"DataType":"String","StringValue":"test"}}}
411+ }` )
412+ if sendRec .Code != http .StatusOK {
413+ t .Fatalf ("send status = %d, body = %s" , sendRec .Code , sendRec .Body .String ())
414+ }
415+
416+ receiveRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues/dashboard-receive/receive" , `{
417+ "input":{"MaxNumberOfMessages":1,"VisibilityTimeout":30,"WaitTimeSeconds":0,"AttributeNames":["All"],"MessageAttributeNames":["All"]}
418+ }` )
419+ if receiveRec .Code != http .StatusOK {
420+ t .Fatalf ("receive status = %d, body = %s" , receiveRec .Code , receiveRec .Body .String ())
421+ }
422+ var receiveBody struct {
423+ Messages []struct {
424+ MessageID string `json:"MessageId"`
425+ ReceiptHandle string `json:"ReceiptHandle"`
426+ Body string `json:"Body"`
427+ } `json:"Messages"`
428+ }
429+ if err := json .Unmarshal (receiveRec .Body .Bytes (), & receiveBody ); err != nil {
430+ t .Fatalf ("decode receive body: %v" , err )
431+ }
432+ if len (receiveBody .Messages ) != 1 || receiveBody .Messages [0 ].ReceiptHandle == "" || receiveBody .Messages [0 ].Body != "dashboard receive" {
433+ t .Fatalf ("receive body = %s" , receiveRec .Body .String ())
434+ }
435+
436+ deleteRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues/dashboard-receive/delete" , `{
437+ "input":{"ReceiptHandle":"` + receiveBody .Messages [0 ].ReceiptHandle + `"}
438+ }` )
439+ if deleteRec .Code != http .StatusOK {
440+ t .Fatalf ("delete status = %d, body = %s" , deleteRec .Code , deleteRec .Body .String ())
441+ }
442+
443+ afterDeleteRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues/dashboard-receive/receive" , `{
444+ "input":{"MaxNumberOfMessages":1,"WaitTimeSeconds":0}
445+ }` )
446+ if afterDeleteRec .Code != http .StatusOK {
447+ t .Fatalf ("after delete status = %d, body = %s" , afterDeleteRec .Code , afterDeleteRec .Body .String ())
448+ }
449+ if strings .Contains (afterDeleteRec .Body .String (), "dashboard receive" ) {
450+ t .Fatalf ("message was not deleted: %s" , afterDeleteRec .Body .String ())
451+ }
452+ }
453+
454+ func TestSQSDashboardManagementAPIsChangeMessageVisibility (t * testing.T ) {
455+ sqsServer := sqssvc .NewServer (sqssvc.Config {Addr : "127.0.0.1:9324" })
456+ server := NewServer (Config {}, newDashboardStore (nil , nil ))
457+ server .SetSQS (sqsServer )
458+ routes := server .routes ()
459+
460+ createRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues" , `{"input":{"QueueName":"dashboard-visibility"}}` )
461+ if createRec .Code != http .StatusOK {
462+ t .Fatalf ("create status = %d, body = %s" , createRec .Code , createRec .Body .String ())
463+ }
464+ sendRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues/dashboard-visibility/messages" , `{
465+ "input":{"MessageBody":"dashboard visibility"}
466+ }` )
467+ if sendRec .Code != http .StatusOK {
468+ t .Fatalf ("send status = %d, body = %s" , sendRec .Code , sendRec .Body .String ())
469+ }
470+ receiveRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues/dashboard-visibility/receive" , `{
471+ "input":{"MaxNumberOfMessages":1,"VisibilityTimeout":30,"WaitTimeSeconds":0}
472+ }` )
473+ if receiveRec .Code != http .StatusOK {
474+ t .Fatalf ("receive status = %d, body = %s" , receiveRec .Code , receiveRec .Body .String ())
475+ }
476+ var receiveBody struct {
477+ Messages []struct {
478+ ReceiptHandle string `json:"ReceiptHandle"`
479+ } `json:"Messages"`
480+ }
481+ if err := json .Unmarshal (receiveRec .Body .Bytes (), & receiveBody ); err != nil {
482+ t .Fatalf ("decode receive body: %v" , err )
483+ }
484+ if len (receiveBody .Messages ) != 1 || receiveBody .Messages [0 ].ReceiptHandle == "" {
485+ t .Fatalf ("receive body = %s" , receiveRec .Body .String ())
486+ }
487+
488+ changeRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues/dashboard-visibility/visibility" , `{
489+ "input":{"ReceiptHandle":"` + receiveBody .Messages [0 ].ReceiptHandle + `","VisibilityTimeout":0}
490+ }` )
491+ if changeRec .Code != http .StatusOK {
492+ t .Fatalf ("change visibility status = %d, body = %s" , changeRec .Code , changeRec .Body .String ())
493+ }
494+ againRec := performRequestWithBody (routes , http .MethodPost , "/api/sqs/queues/dashboard-visibility/receive" , `{
495+ "input":{"MaxNumberOfMessages":1,"WaitTimeSeconds":0}
496+ }` )
497+ if againRec .Code != http .StatusOK {
498+ t .Fatalf ("receive again status = %d, body = %s" , againRec .Code , againRec .Body .String ())
499+ }
500+ if ! strings .Contains (againRec .Body .String (), "dashboard visibility" ) {
501+ t .Fatalf ("message was not made visible: %s" , againRec .Body .String ())
502+ }
503+ }
504+
334505func TestSQSQueuesAPIMarksDisabled (t * testing.T ) {
335506 server := NewServer (Config {}, newDashboardStore (nil , nil ))
336507
0 commit comments