File: awsquerycompatible_test.go

package info (click to toggle)
golang-github-aws-aws-sdk-go 1.49.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 312,636 kB
  • sloc: makefile: 120
file content (112 lines) | stat: -rw-r--r-- 3,458 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//go:build go1.13
// +build go1.13

package awsquerycompatible

import (
	"errors"
	"io"
	"io/ioutil"
	"net/http"
	"strings"
	"testing"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awserr"
	"github.com/aws/aws-sdk-go/aws/corehandlers"
	"github.com/aws/aws-sdk-go/aws/request"
	"github.com/aws/aws-sdk-go/awstesting/unit"
	"github.com/aws/aws-sdk-go/service/sqs"
)

func TestAWSQuery(t *testing.T) {
	cases := map[string]struct {
		statusCode   int
		responseBody interface {
			io.Reader
			Len() int
		}
		headers         map[string]string
		expectErrorCode string
	}{
		"when header is present": {
			statusCode:      400,
			responseBody:    strings.NewReader(`{"__type":"com.amazonaws.awsquerycompatible#QueueDeletedRecently", "message":"Some user-visible message"}`),
			expectErrorCode: sqs.ErrCodeQueueDeletedRecently,
			headers:         map[string]string{"x-amzn-query-error": "AWS.SimpleQueueService.QueueDeletedRecently;Sender"},
		},
		"for unmodeled error code": {
			statusCode:      400,
			responseBody:    strings.NewReader(`{"__type":"com.amazonaws.awsquerycompatible#AccessDeniedException", "message":"Some user-visible message"}`),
			expectErrorCode: "AccessDenied",
			headers:         map[string]string{"x-amzn-query-error": "AccessDenied;Sender"},
		},
		"when header is not present": {
			statusCode:      400,
			responseBody:    strings.NewReader(`{"__type":"com.amazonaws.awsquerycompatible#AccessDeniedException", "message":"Some user-visible message"}`),
			expectErrorCode: "AccessDeniedException",
			headers:         map[string]string{},
		},
		"when header is nil": {
			statusCode:      400,
			responseBody:    strings.NewReader(`{"__type":"com.amazonaws.awsquerycompatible#AccessDeniedException", "message":"Some user-visible message"}`),
			expectErrorCode: "AccessDeniedException",
			headers:         nil,
		},
		"when header is malformed": {
			statusCode:      400,
			responseBody:    strings.NewReader(`{"__type":"com.amazonaws.awsquerycompatible#QueueDeletedRecently", "message":"Some user-visible message"}`),
			expectErrorCode: "QueueDeletedRecently",
			headers:         map[string]string{"x-amzn-query-error": "AWS.SimpleQueueService.QueueDeletedRecently-Sender"},
		},
	}

	for name, c := range cases {
		t.Run(name, func(t *testing.T) {
			client := New(unit.Session.Copy(), &aws.Config{
				MaxRetries: aws.Int(0),
			})

			client.Handlers.Send.Swap(corehandlers.SendHandler.Name, request.NamedHandler{
				Name: corehandlers.SendHandler.Name,
				Fn: func(r *request.Request) {
					r.HTTPResponse = &http.Response{
						StatusCode: c.statusCode,
						ContentLength: func() int64 {
							if c.responseBody == nil {
								return 0
							}
							return int64(c.responseBody.Len())
						}(),
						Header: func() http.Header {
							h := http.Header{}
							if c.headers != nil {
								for key, value := range c.headers {
									h.Set(key, value)
								}
							}
							return h
						}(),
						Body: ioutil.NopCloser(c.responseBody),
					}
				},
			})

			_, err := client.CreateQueue(&CreateQueueInput{
				QueueName: aws.String("queueName"),
			})
			if err == nil {
				t.Fatalf("expect error, got none")
			}

			var awsErr awserr.RequestFailure
			if !errors.As(err, &awsErr) {
				t.Fatalf("expect RequestFailure error, got %#v", err)
			}

			if e, a := c.expectErrorCode, awsErr.Code(); e != a {
				t.Errorf("expect %v code, got %v", e, a)
			}
		})
	}
}