1// +build go1.8
2
3package route53
4
5import (
6	"io/ioutil"
7	"net/http"
8	"strings"
9	"testing"
10
11	"github.com/aws/aws-sdk-go/aws/awserr"
12	"github.com/aws/aws-sdk-go/aws/request"
13)
14
15func TestUnmarshalInvalidChangeBatch(t *testing.T) {
16	const errorMessage = `
17Tried to create resource record set duplicate.example.com. type A,
18but it already exists
19`
20
21	type batchError struct {
22		Code, Message string
23	}
24
25	cases := map[string]struct {
26		Request                  *request.Request
27		Code, Message, RequestID string
28		StatusCode               int
29		BatchErrors              []batchError
30	}{
31		"standard error": {
32			Request: &request.Request{
33				HTTPResponse: &http.Response{
34					StatusCode: 400,
35					Header:     http.Header{},
36					Body: ioutil.NopCloser(strings.NewReader(
37						`<?xml version="1.0" encoding="UTF-8"?>
38<ErrorResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
39  <Error>
40	<Code>InvalidDomainName</Code>
41	<Message>The domain name is invalid</Message>
42  </Error>
43  <RequestId>12345</RequestId>
44</ErrorResponse>`)),
45				},
46			},
47			Code: "InvalidDomainName", Message: "The domain name is invalid",
48			StatusCode: 400, RequestID: "12345",
49		},
50		"batched error": {
51			Request: &request.Request{
52				HTTPResponse: &http.Response{
53					StatusCode: 400,
54					Header:     http.Header{},
55					Body: ioutil.NopCloser(strings.NewReader(
56						`<?xml version="1.0" encoding="UTF-8"?>
57<InvalidChangeBatch xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
58  <Messages>
59	<Message>` + errorMessage + `</Message>
60  </Messages>
61  <RequestId>12345</RequestId>
62</InvalidChangeBatch>`)),
63				},
64			},
65			Code: "InvalidChangeBatch", Message: "ChangeBatch errors occurred",
66			StatusCode: 400, RequestID: "12345",
67			BatchErrors: []batchError{
68				{Code: "InvalidChangeBatch", Message: errorMessage},
69			},
70		},
71	}
72
73	for name, c := range cases {
74		t.Run(name, func(t *testing.T) {
75			unmarshalChangeResourceRecordSetsError(c.Request)
76			err := c.Request.Error
77			if err == nil {
78				t.Error("expected error, but received none")
79			}
80
81			reqErr := err.(awserr.RequestFailure)
82			if e, a := c.StatusCode, reqErr.StatusCode(); e != a {
83				t.Errorf("expected %d status, got %d", e, a)
84			}
85			if e, a := c.Code, reqErr.Code(); e != a {
86				t.Errorf("expected %v code, got %v", e, a)
87			}
88			if e, a := c.Message, reqErr.Message(); e != a {
89				t.Errorf("expected %q message, got %q", e, a)
90			}
91			if e, a := c.RequestID, reqErr.RequestID(); e != a {
92				t.Errorf("expected %v request ID, got %v", e, a)
93			}
94
95			batchErr := err.(awserr.BatchedErrors)
96			batchedErrs := batchErr.OrigErrs()
97
98			if e, a := len(c.BatchErrors), len(batchedErrs); e != a {
99				t.Fatalf("expect %v batch errors, got %v", e, a)
100			}
101
102			for i, ee := range c.BatchErrors {
103				bErr := batchedErrs[i].(awserr.Error)
104				if e, a := ee.Code, bErr.Code(); e != a {
105					t.Errorf("expect %v code, got %v", e, a)
106				}
107				if e, a := ee.Message, bErr.Message(); e != a {
108					t.Errorf("expect %v message, got %v", e, a)
109				}
110			}
111		})
112	}
113}
114