github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/configgtm/domain_test.go (about) 1 package gtm 2 3 import ( 4 "bytes" 5 "context" 6 "encoding/gob" 7 "encoding/json" 8 "errors" 9 "net/http" 10 "net/http/httptest" 11 "testing" 12 13 "github.com/akamai/AkamaiOPEN-edgegrid-golang/v2/pkg/session" 14 "github.com/stretchr/testify/assert" 15 "github.com/stretchr/testify/require" 16 ) 17 18 func TestGtm_NewDomain(t *testing.T) { 19 client := Client(session.Must(session.New())) 20 21 dom := client.NewDomain(context.Background(), "example.com", "primary") 22 23 assert.Equal(t, "example.com", dom.Name) 24 assert.Equal(t, "primary", dom.Type) 25 } 26 27 // Verify GetListDomains. Sould pass, e.g. no API errors and non nil list. 28 func TestGtm_ListDomains(t *testing.T) { 29 var result DomainsList 30 31 respData, err := loadTestData("TestGtm_ListDomains.resp.json") 32 if err != nil { 33 t.Fatal(err) 34 } 35 36 if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil { 37 t.Fatal(err) 38 } 39 40 tests := map[string]struct { 41 responseStatus int 42 responseBody string 43 expectedPath string 44 expectedResponse []*DomainItem 45 withError error 46 headers http.Header 47 }{ 48 "200 OK": { 49 headers: http.Header{ 50 "Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"}, 51 }, 52 responseStatus: http.StatusOK, 53 responseBody: string(respData), 54 expectedPath: "/config-gtm/v1/domains", 55 expectedResponse: result.DomainItems, 56 }, 57 "500 internal server error": { 58 headers: http.Header{}, 59 responseStatus: http.StatusInternalServerError, 60 responseBody: ` 61 { 62 "type": "internal_error", 63 "title": "Internal Server Error", 64 "detail": "Error fetching domains", 65 "status": 500 66 }`, 67 expectedPath: "/config-gtm/v1/domains", 68 withError: &Error{ 69 Type: "internal_error", 70 Title: "Internal Server Error", 71 Detail: "Error fetching domains", 72 StatusCode: http.StatusInternalServerError, 73 }, 74 }, 75 } 76 77 for name, test := range tests { 78 t.Run(name, func(t *testing.T) { 79 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 80 assert.Equal(t, test.expectedPath, r.URL.String()) 81 assert.Equal(t, http.MethodGet, r.Method) 82 w.WriteHeader(test.responseStatus) 83 _, err := w.Write([]byte(test.responseBody)) 84 assert.NoError(t, err) 85 })) 86 client := mockAPIClient(t, mockServer) 87 result, err := client.ListDomains( 88 session.ContextWithOptions( 89 context.Background(), 90 session.WithContextHeaders(test.headers))) 91 if test.withError != nil { 92 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 93 return 94 } 95 require.NoError(t, err) 96 assert.Equal(t, test.expectedResponse, result) 97 }) 98 } 99 } 100 101 func TestGtm_NullFieldMap(t *testing.T) { 102 var result NullFieldMapStruct 103 104 gob.Register(map[string]NullPerObjectAttributeStruct{}) 105 106 respData, err := loadTestData("TestGtm_NullFieldMap.resp.json") 107 if err != nil { 108 t.Fatal(err) 109 } 110 111 resultData, err := loadTestData("TestGtm_NullFieldMap.result.gob") 112 if err != nil { 113 t.Fatal(err) 114 } 115 116 if err := gob.NewDecoder(bytes.NewBuffer(resultData)).Decode(&result); err != nil { 117 t.Fatal(err) 118 } 119 120 tests := map[string]struct { 121 arg *Domain 122 responseStatus int 123 responseBody []byte 124 expectedPath string 125 expectedResponse *NullFieldMapStruct 126 withError error 127 }{ 128 "200 OK": { 129 arg: &Domain{ 130 Name: "example.akadns.net", 131 Type: "primary", 132 }, 133 responseStatus: http.StatusOK, 134 responseBody: respData, 135 expectedPath: "/config-gtm/v1/domains/example.akadns.net", 136 expectedResponse: &result, 137 }, 138 "500 internal server error": { 139 arg: &Domain{ 140 Name: "example.akadns.net", 141 Type: "primary", 142 }, 143 responseStatus: http.StatusInternalServerError, 144 responseBody: []byte(` 145 { 146 "type": "internal_error", 147 "title": "Internal Server Error", 148 "detail": "Error fetching null field map", 149 "status": 500 150 }`), 151 expectedPath: "/config-gtm/v1/domains/example.akadns.net", 152 withError: &Error{ 153 Type: "internal_error", 154 Title: "Internal Server Error", 155 Detail: "Error fetching null field map", 156 StatusCode: http.StatusInternalServerError, 157 }, 158 }, 159 } 160 161 for name, test := range tests { 162 t.Run(name, func(t *testing.T) { 163 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 164 assert.Equal(t, test.expectedPath, r.URL.String()) 165 assert.Equal(t, http.MethodGet, r.Method) 166 w.WriteHeader(test.responseStatus) 167 _, err := w.Write(test.responseBody) 168 assert.NoError(t, err) 169 })) 170 client := mockAPIClient(t, mockServer) 171 result, err := client.NullFieldMap(context.Background(), test.arg) 172 if test.withError != nil { 173 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 174 return 175 } 176 require.NoError(t, err) 177 assert.Equal(t, test.expectedResponse, result) 178 }) 179 } 180 } 181 182 // Test GetDomain 183 // GetDomain(context.Context, string) (*Domain, error) 184 func TestGtm_GetDomain(t *testing.T) { 185 var result Domain 186 187 respData, err := loadTestData("TestGtm_GetDomain.resp.json") 188 if err != nil { 189 t.Fatal(err) 190 } 191 192 if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil { 193 t.Fatal(err) 194 } 195 196 tests := map[string]struct { 197 domain string 198 responseStatus int 199 responseBody []byte 200 expectedPath string 201 expectedResponse *Domain 202 withError error 203 }{ 204 "200 OK": { 205 domain: "example.akadns.net", 206 responseStatus: http.StatusOK, 207 responseBody: respData, 208 expectedPath: "/config-gtm/v1/domains/example.akadns.net", 209 expectedResponse: &result, 210 }, 211 "500 internal server error": { 212 domain: "example.akadns.net", 213 responseStatus: http.StatusInternalServerError, 214 responseBody: []byte(` 215 { 216 "type": "internal_error", 217 "title": "Internal Server Error", 218 "detail": "Error fetching domain" 219 }`), 220 expectedPath: "/config-gtm/v1/domains/example.akadns.net", 221 withError: &Error{ 222 Type: "internal_error", 223 Title: "Internal Server Error", 224 Detail: "Error fetching domain", 225 StatusCode: http.StatusInternalServerError, 226 }, 227 }, 228 } 229 230 for name, test := range tests { 231 t.Run(name, func(t *testing.T) { 232 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 233 assert.Equal(t, test.expectedPath, r.URL.String()) 234 assert.Equal(t, http.MethodGet, r.Method) 235 w.WriteHeader(test.responseStatus) 236 _, err := w.Write(test.responseBody) 237 assert.NoError(t, err) 238 })) 239 client := mockAPIClient(t, mockServer) 240 result, err := client.GetDomain(context.Background(), test.domain) 241 if test.withError != nil { 242 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 243 return 244 } 245 require.NoError(t, err) 246 assert.Equal(t, test.expectedResponse, result) 247 }) 248 } 249 } 250 251 // Test Create domain. 252 // CreateDomain(context.Context, *Domain, map[string]string) (*DomainResponse, error) 253 func TestGtm_CreateDomain(t *testing.T) { 254 var result DomainResponse 255 256 respData, err := loadTestData("TestGtm_GetDomain.resp.json") 257 if err != nil { 258 t.Fatal(err) 259 } 260 261 if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil { 262 t.Fatal(err) 263 } 264 265 tests := map[string]struct { 266 domain Domain 267 query map[string]string 268 responseStatus int 269 responseBody []byte 270 expectedPath string 271 expectedResponse *DomainResponse 272 withError error 273 headers http.Header 274 }{ 275 "201 Created": { 276 domain: Domain{ 277 Name: "gtmdomtest.akadns.net", 278 Type: "basic", 279 }, 280 query: map[string]string{"contractId": "1-2ABCDE"}, 281 headers: http.Header{ 282 "Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"}, 283 }, 284 responseStatus: http.StatusCreated, 285 responseBody: respData, 286 expectedResponse: &result, 287 expectedPath: "/config-gtm/v1/domains?contractId=1-2ABCDE", 288 }, 289 "500 internal server error": { 290 domain: Domain{ 291 Name: "gtmdomtest.akadns.net", 292 Type: "basic", 293 }, 294 query: map[string]string{"contractId": "1-2ABCDE"}, 295 responseStatus: http.StatusInternalServerError, 296 responseBody: []byte(` 297 { 298 "type": "internal_error", 299 "title": "Internal Server Error", 300 "detail": "Error creating domain" 301 }`), 302 expectedPath: "/config-gtm/v1/domains?contractId=1-2ABCDE", 303 withError: &Error{ 304 Type: "internal_error", 305 Title: "Internal Server Error", 306 Detail: "Error creating domain", 307 StatusCode: http.StatusInternalServerError, 308 }, 309 }, 310 } 311 312 for name, test := range tests { 313 t.Run(name, func(t *testing.T) { 314 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 315 assert.Equal(t, http.MethodPost, r.Method) 316 w.WriteHeader(test.responseStatus) 317 if len(test.responseBody) > 0 { 318 _, err := w.Write(test.responseBody) 319 assert.NoError(t, err) 320 } 321 })) 322 client := mockAPIClient(t, mockServer) 323 result, err := client.CreateDomain( 324 session.ContextWithOptions( 325 context.Background(), 326 session.WithContextHeaders(test.headers)), &test.domain, test.query) 327 if test.withError != nil { 328 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 329 return 330 } 331 require.NoError(t, err) 332 assert.Equal(t, test.expectedResponse, result) 333 }) 334 } 335 } 336 337 // Test Update domain. 338 // UpdateDomain(context.Context, *Domain, map[string]string) (*DomainResponse, error) 339 func TestGtm_UpdateDomain(t *testing.T) { 340 var result DomainResponse 341 342 respData, err := loadTestData("TestGtm_UpdateDomain.resp.json") 343 if err != nil { 344 t.Fatal(err) 345 } 346 347 if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil { 348 t.Fatal(err) 349 } 350 351 tests := map[string]struct { 352 domain Domain 353 query map[string]string 354 responseStatus int 355 responseBody []byte 356 expectedPath string 357 expectedResponse *ResponseStatus 358 withError error 359 headers http.Header 360 }{ 361 "200 Success": { 362 domain: Domain{ 363 EndUserMappingEnabled: false, 364 Name: "gtmdomtest.akadns.net", 365 Type: "basic", 366 }, 367 query: map[string]string{"contractId": "1-2ABCDE"}, 368 headers: http.Header{ 369 "Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"}, 370 }, 371 responseStatus: http.StatusCreated, 372 responseBody: respData, 373 expectedResponse: result.Status, 374 expectedPath: "/config-gtm/v1/domains?contractId=1-2ABCDE", 375 }, 376 "500 internal server error": { 377 domain: Domain{ 378 Name: "gtmdomtest.akadns.net", 379 Type: "basic", 380 }, 381 query: map[string]string{"contractId": "1-2ABCDE"}, 382 responseStatus: http.StatusInternalServerError, 383 responseBody: []byte(` 384 { 385 "type": "internal_error", 386 "title": "Internal Server Error", 387 "detail": "Error creating zone" 388 }`), 389 expectedPath: "/config-gtm/v1/domains?contractId=1-2ABCDE", 390 withError: &Error{ 391 Type: "internal_error", 392 Title: "Internal Server Error", 393 Detail: "Error creating zone", 394 StatusCode: http.StatusInternalServerError, 395 }, 396 }, 397 } 398 399 for name, test := range tests { 400 t.Run(name, func(t *testing.T) { 401 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 402 assert.Equal(t, http.MethodPut, r.Method) 403 w.WriteHeader(test.responseStatus) 404 if len(test.responseBody) > 0 { 405 _, err := w.Write(test.responseBody) 406 assert.NoError(t, err) 407 } 408 })) 409 client := mockAPIClient(t, mockServer) 410 result, err := client.UpdateDomain( 411 session.ContextWithOptions( 412 context.Background(), 413 session.WithContextHeaders(test.headers)), &test.domain, test.query) 414 if test.withError != nil { 415 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 416 return 417 } 418 require.NoError(t, err) 419 assert.Equal(t, test.expectedResponse, result) 420 }) 421 } 422 } 423 424 /* Future. Presently no domain Delete endpoint. 425 func TestGtm_DeleteDomain(t *testing.T) { 426 427 defer gock.Off() 428 429 mock := gock.New("https://akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net/config-gtm/v1/domains/"+gtmTestDomain) 430 mock. 431 Delete("/config-gtm/v1/domains/"+gtmTestDomain). 432 HeaderPresent("Authorization"). 433 Reply(200). 434 SetHeader("Content-Type", "application/vnd.config-gtm.v1.4+json;charset=UTF-8"). 435 BodyString(`{ 436 "resource" : null, 437 "status" : { 438 "changeId": "40e36abd-bfb2-4635-9fca-62175cf17007", 439 "links": [ 440 { 441 "href": "https://akab-ymtebc45gco3ypzj-apz4yxpek55y7fyv.luna.akamaiapis.net/config-gtm/v1/domains/gtmdomtest.akadns.net/status/current", 442 "rel": "self" 443 } 444 ], 445 "message": "Change Pending", 446 "passingValidation": true, 447 "propagationStatus": "PENDING", 448 "propagationStatusDate": "2019-04-25T14:54:00.000+00:00" 449 }, 450 }`) 451 452 Init(config) 453 454 getDomain := instantiateDomain() 455 456 _, err := getDomain.Delete() 457 assert.NoError(t, err) 458 459 } 460 */