github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/cps/dv_challenges_test.go (about) 1 package cps 2 3 import ( 4 "context" 5 "errors" 6 "net/http" 7 "net/http/httptest" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestGetChangeLetsEncryptChallenges(t *testing.T) { 15 tests := map[string]struct { 16 params GetChangeRequest 17 responseStatus int 18 responseBody string 19 expectedPath string 20 expectedResponse *DVArray 21 withError func(*testing.T, error) 22 }{ 23 "200 OK": { 24 params: GetChangeRequest{ 25 EnrollmentID: 1, 26 ChangeID: 2, 27 }, 28 responseStatus: http.StatusOK, 29 responseBody: ` 30 { 31 "dv": [ 32 { 33 "status": "Awaiting user", 34 "error": "The domain is not ready for validation.", 35 "validationStatus": "RESPONSE_ERROR", 36 "requestTimestamp": "2018-09-05T15:55:49Z", 37 "validatedTimestamp": "2018-09-05T17:53:22Z", 38 "expires": "2018-09-06T17:55:17Z", 39 "challenges": [ 40 { 41 "type": "dns-01", 42 "status": "pending", 43 "error": null, 44 "token": "cGBnw-3YO7rUhq61EuuHqcGrYkaQWALAgi8szTqRoHA", 45 "responseBody": "0yVISDJjpXR7BXzR5QgfA51tt-I6aKremGnPwK_lvH4", 46 "fullPath": "_acme-challenge.www.cps-example-dv.com.", 47 "redirectFullPath": "", 48 "validationRecords": [] 49 } 50 ], 51 "domain": "www.cps-example-dv.com" 52 } 53 ] 54 }`, 55 expectedPath: "/cps/v2/enrollments/1/changes/2/input/info/lets-encrypt-challenges", 56 expectedResponse: &DVArray{DV: []DV{ 57 { 58 Challenges: []Challenge{ 59 { 60 FullPath: "_acme-challenge.www.cps-example-dv.com.", 61 ResponseBody: "0yVISDJjpXR7BXzR5QgfA51tt-I6aKremGnPwK_lvH4", 62 Status: "pending", 63 Token: "cGBnw-3YO7rUhq61EuuHqcGrYkaQWALAgi8szTqRoHA", 64 Type: "dns-01", 65 ValidationRecords: []ValidationRecord{}, 66 }, 67 }, 68 Domain: "www.cps-example-dv.com", 69 Error: "The domain is not ready for validation.", 70 Expires: "2018-09-06T17:55:17Z", 71 RequestTimestamp: "2018-09-05T15:55:49Z", 72 Status: "Awaiting user", 73 ValidatedTimestamp: "2018-09-05T17:53:22Z", 74 ValidationStatus: "RESPONSE_ERROR", 75 }, 76 }}, 77 }, 78 "500 internal server error": { 79 params: GetChangeRequest{ 80 EnrollmentID: 1, 81 ChangeID: 2, 82 }, 83 responseStatus: http.StatusInternalServerError, 84 responseBody: ` 85 { 86 "type": "internal_error", 87 "title": "Internal Server Error", 88 "detail": "Error making request", 89 "status": 500 90 }`, 91 expectedPath: "/cps/v2/enrollments/1/changes/2/input/info/lets-encrypt-challenges", 92 withError: func(t *testing.T, err error) { 93 want := &Error{ 94 Type: "internal_error", 95 Title: "Internal Server Error", 96 Detail: "Error making request", 97 StatusCode: http.StatusInternalServerError, 98 } 99 assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err) 100 }, 101 }, 102 "validation error": { 103 params: GetChangeRequest{}, 104 withError: func(t *testing.T, err error) { 105 assert.True(t, errors.Is(err, ErrStructValidation), "want: %s; got: %s", ErrStructValidation, err) 106 }, 107 }, 108 } 109 for name, test := range tests { 110 t.Run(name, func(t *testing.T) { 111 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 112 assert.Equal(t, test.expectedPath, r.URL.String()) 113 assert.Equal(t, http.MethodGet, r.Method) 114 assert.Equal(t, "application/vnd.akamai.cps.dv-challenges.v2+json", r.Header.Get("Accept")) 115 w.WriteHeader(test.responseStatus) 116 _, err := w.Write([]byte(test.responseBody)) 117 assert.NoError(t, err) 118 })) 119 client := mockAPIClient(t, mockServer) 120 result, err := client.GetChangeLetsEncryptChallenges(context.Background(), test.params) 121 if test.withError != nil { 122 test.withError(t, err) 123 return 124 } 125 require.NoError(t, err) 126 assert.Equal(t, test.expectedResponse, result) 127 }) 128 } 129 } 130 131 func TestAcknowledgeDVChallenges(t *testing.T) { 132 tests := map[string]struct { 133 params AcknowledgementRequest 134 responseStatus int 135 responseBody string 136 expectedPath string 137 expectedResponse *DVArray 138 withError func(*testing.T, error) 139 }{ 140 "204 no content": { 141 params: AcknowledgementRequest{ 142 EnrollmentID: 1, 143 ChangeID: 2, 144 Acknowledgement: Acknowledgement{"acknowledge"}, 145 }, 146 responseStatus: http.StatusNoContent, 147 expectedPath: "/cps/v2/enrollments/1/changes/2/input/update/lets-encrypt-challenges-completed", 148 }, 149 "500 internal server error": { 150 params: AcknowledgementRequest{ 151 EnrollmentID: 1, 152 ChangeID: 2, 153 Acknowledgement: Acknowledgement{"acknowledge"}, 154 }, 155 responseStatus: http.StatusInternalServerError, 156 expectedPath: "/cps/v2/enrollments/1/changes/2/input/update/lets-encrypt-challenges-completed", 157 responseBody: ` 158 { 159 "type": "internal_error", 160 "title": "Internal Server Error", 161 "detail": "Error making request", 162 "status": 500 163 }`, 164 withError: func(t *testing.T, err error) { 165 want := &Error{ 166 Type: "internal_error", 167 Title: "Internal Server Error", 168 Detail: "Error making request", 169 StatusCode: http.StatusInternalServerError, 170 } 171 assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err) 172 }, 173 }, 174 "validation error": { 175 params: AcknowledgementRequest{}, 176 withError: func(t *testing.T, err error) { 177 assert.True(t, errors.Is(err, ErrStructValidation), "want: %s; got: %s", ErrStructValidation, err) 178 }, 179 }, 180 } 181 for name, test := range tests { 182 t.Run(name, func(t *testing.T) { 183 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 184 assert.Equal(t, test.expectedPath, r.URL.String()) 185 assert.Equal(t, http.MethodPost, r.Method) 186 assert.Equal(t, "application/vnd.akamai.cps.change-id.v1+json", r.Header.Get("Accept")) 187 assert.Equal(t, "application/vnd.akamai.cps.acknowledgement.v1+json; charset=utf-8", r.Header.Get("Content-Type")) 188 w.WriteHeader(test.responseStatus) 189 _, err := w.Write([]byte(test.responseBody)) 190 require.NoError(t, err) 191 })) 192 client := mockAPIClient(t, mockServer) 193 err := client.AcknowledgeDVChallenges(context.Background(), test.params) 194 if test.withError != nil { 195 test.withError(t, err) 196 return 197 } 198 require.NoError(t, err) 199 }) 200 } 201 }