1package s3shared
2
3import (
4	"strings"
5	"testing"
6)
7
8func TestGetResponseErrorCode(t *testing.T) {
9	const xmlErrorResponse = `<Error>
10    <Type>Sender</Type>
11    <Code>InvalidGreeting</Code>
12    <Message>Hi</Message>
13    <HostId>bar-id</HostId>
14    <RequestId>foo-id</RequestId>
15</Error>`
16
17	const wrappedXMLErrorResponse = `<ErrorResponse><Error>
18    <Type>Sender</Type>
19    <Code>InvalidGreeting</Code>
20    <Message>Hi</Message>
21</Error>
22    <HostId>bar-id</HostId>
23    <RequestId>foo-id</RequestId>
24</ErrorResponse>`
25
26	cases := map[string]struct {
27		getErr                 func() (ErrorComponents, error)
28		expectedErrorCode      string
29		expectedErrorMessage   string
30		expectedErrorRequestID string
31		expectedErrorHostID    string
32	}{
33		"standard xml error": {
34			getErr: func() (ErrorComponents, error) {
35				errResp := strings.NewReader(xmlErrorResponse)
36				return GetErrorResponseComponents(errResp, ErrorResponseDeserializerOptions{
37					UseStatusCode:         false,
38					StatusCode:            0,
39					IsWrappedWithErrorTag: false,
40				})
41			},
42			expectedErrorCode:      "InvalidGreeting",
43			expectedErrorMessage:   "Hi",
44			expectedErrorRequestID: "foo-id",
45			expectedErrorHostID:    "bar-id",
46		},
47
48		"s3 no response body": {
49			getErr: func() (ErrorComponents, error) {
50				errResp := strings.NewReader("")
51				return GetErrorResponseComponents(errResp, ErrorResponseDeserializerOptions{
52					UseStatusCode: true,
53					StatusCode:    400,
54				})
55			},
56			expectedErrorCode:    "BadRequest",
57			expectedErrorMessage: "Bad Request",
58		},
59		"s3control no response body": {
60			getErr: func() (ErrorComponents, error) {
61				errResp := strings.NewReader("")
62				return GetErrorResponseComponents(errResp, ErrorResponseDeserializerOptions{
63					IsWrappedWithErrorTag: true,
64				})
65			},
66		},
67		"s3control standard response body": {
68			getErr: func() (ErrorComponents, error) {
69				errResp := strings.NewReader(wrappedXMLErrorResponse)
70				return GetErrorResponseComponents(errResp, ErrorResponseDeserializerOptions{
71					IsWrappedWithErrorTag: true,
72				})
73			},
74			expectedErrorCode:      "InvalidGreeting",
75			expectedErrorMessage:   "Hi",
76			expectedErrorRequestID: "foo-id",
77			expectedErrorHostID:    "bar-id",
78		},
79	}
80
81	for name, c := range cases {
82		t.Run(name, func(t *testing.T) {
83			ec, err := c.getErr()
84			if err != nil {
85				t.Fatalf("expected no error, got %v", err)
86			}
87
88			if e, a := c.expectedErrorCode, ec.Code; !strings.EqualFold(e, a) {
89				t.Fatalf("expected %v, got %v", e, a)
90			}
91			if e, a := c.expectedErrorMessage, ec.Message; !strings.EqualFold(e, a) {
92				t.Fatalf("expected %v, got %v", e, a)
93			}
94			if e, a := c.expectedErrorRequestID, ec.RequestID; !strings.EqualFold(e, a) {
95				t.Fatalf("expected %v, got %v", e, a)
96			}
97			if e, a := c.expectedErrorHostID, ec.HostID; !strings.EqualFold(e, a) {
98				t.Fatalf("expected %v, got %v", e, a)
99			}
100		})
101	}
102}
103