github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/gtm/asmap_test.go (about) 1 package gtm 2 3 import ( 4 "bytes" 5 "context" 6 "encoding/json" 7 "errors" 8 "net/http" 9 "net/http/httptest" 10 "testing" 11 12 "github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/session" 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestGTM_ListASMap(t *testing.T) { 18 var result ASMapList 19 20 respData, err := loadTestData("TestGTM_ListASMap.resp.json") 21 if err != nil { 22 t.Fatal(err) 23 } 24 25 if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil { 26 t.Fatal(err) 27 } 28 29 tests := map[string]struct { 30 domainName string 31 responseStatus int 32 responseBody string 33 expectedPath string 34 expectedResponse []*ASMap 35 withError error 36 headers http.Header 37 }{ 38 "200 OK": { 39 domainName: "example.akadns.net", 40 headers: http.Header{ 41 "Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"}, 42 }, 43 responseStatus: http.StatusOK, 44 responseBody: string(respData), 45 expectedPath: "/config-gtm/v1/domains/example.akadns.net/as-maps", 46 expectedResponse: result.ASMapItems, 47 }, 48 "500 internal server error": { 49 domainName: "example.akadns.net", 50 headers: http.Header{}, 51 responseStatus: http.StatusInternalServerError, 52 responseBody: ` 53 { 54 "type": "internal_error", 55 "title": "Internal Server Error", 56 "detail": "Error fetching asmap", 57 "status": 500 58 }`, 59 expectedPath: "/config-gtm/v1/domains/example.akadns.net/as-maps", 60 withError: &Error{ 61 Type: "internal_error", 62 Title: "Internal Server Error", 63 Detail: "Error fetching asmap", 64 StatusCode: http.StatusInternalServerError, 65 }, 66 }, 67 } 68 69 for name, test := range tests { 70 t.Run(name, func(t *testing.T) { 71 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 72 assert.Equal(t, test.expectedPath, r.URL.String()) 73 assert.Equal(t, http.MethodGet, r.Method) 74 w.WriteHeader(test.responseStatus) 75 _, err := w.Write([]byte(test.responseBody)) 76 assert.NoError(t, err) 77 })) 78 client := mockAPIClient(t, mockServer) 79 result, err := client.ListASMaps( 80 session.ContextWithOptions( 81 context.Background(), 82 session.WithContextHeaders(test.headers)), test.domainName) 83 if test.withError != nil { 84 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 85 return 86 } 87 require.NoError(t, err) 88 assert.Equal(t, test.expectedResponse, result) 89 }) 90 } 91 } 92 93 func TestGTM_GetASMap(t *testing.T) { 94 var result ASMap 95 96 respData, err := loadTestData("TestGTM_GetASMap.resp.json") 97 if err != nil { 98 t.Fatal(err) 99 } 100 101 if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil { 102 t.Fatal(err) 103 } 104 105 tests := map[string]struct { 106 name string 107 domainName string 108 responseStatus int 109 responseBody string 110 expectedPath string 111 expectedResponse *ASMap 112 withError error 113 headers http.Header 114 }{ 115 "200 OK": { 116 name: "Software-rollout", 117 domainName: "example.akadns.net", 118 headers: http.Header{ 119 "Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"}, 120 }, 121 responseStatus: http.StatusOK, 122 responseBody: string(respData), 123 expectedPath: "/config-gtm/v1/domains/example.akadns.net/as-maps/Software-rollout", 124 expectedResponse: &result, 125 }, 126 "500 internal server error": { 127 name: "Software-rollout", 128 domainName: "example.akadns.net", 129 headers: http.Header{}, 130 responseStatus: http.StatusInternalServerError, 131 responseBody: ` 132 { 133 "type": "internal_error", 134 "title": "Internal Server Error", 135 "detail": "Error fetching asmap", 136 "status": 500 137 }`, 138 expectedPath: "/config-gtm/v1/domains/example.akadns.net/as-maps/Software-rollout", 139 withError: &Error{ 140 Type: "internal_error", 141 Title: "Internal Server Error", 142 Detail: "Error fetching asmap", 143 StatusCode: http.StatusInternalServerError, 144 }, 145 }, 146 } 147 148 for name, test := range tests { 149 t.Run(name, func(t *testing.T) { 150 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 151 assert.Equal(t, test.expectedPath, r.URL.String()) 152 assert.Equal(t, http.MethodGet, r.Method) 153 w.WriteHeader(test.responseStatus) 154 _, err := w.Write([]byte(test.responseBody)) 155 assert.NoError(t, err) 156 })) 157 client := mockAPIClient(t, mockServer) 158 result, err := client.GetASMap( 159 session.ContextWithOptions( 160 context.Background(), 161 session.WithContextHeaders(test.headers)), test.name, test.domainName) 162 if test.withError != nil { 163 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 164 return 165 } 166 require.NoError(t, err) 167 assert.Equal(t, test.expectedResponse, result) 168 }) 169 } 170 } 171 172 func TestGTM_CreateASMap(t *testing.T) { 173 var result ASMapResponse 174 var req ASMap 175 176 respData, err := loadTestData("TestGTM_CreateASMap.resp.json") 177 if err != nil { 178 t.Fatal(err) 179 } 180 181 if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil { 182 t.Fatal(err) 183 } 184 185 reqData, err := loadTestData("TestGTM_CreateASMap.req.json") 186 if err != nil { 187 t.Fatal(err) 188 } 189 190 if err := json.NewDecoder(bytes.NewBuffer(reqData)).Decode(&req); err != nil { 191 t.Fatal(err) 192 } 193 194 tests := map[string]struct { 195 asMap *ASMap 196 domainName string 197 responseStatus int 198 responseBody string 199 expectedPath string 200 expectedResponse *ASMapResponse 201 withError error 202 headers http.Header 203 }{ 204 "200 OK": { 205 asMap: &req, 206 domainName: "example.akadns.net", 207 headers: http.Header{ 208 "Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"}, 209 }, 210 responseStatus: http.StatusOK, 211 responseBody: string(respData), 212 expectedPath: "/config-gtm/v1/domains/example.akadns.net/as-maps/The%20North", 213 expectedResponse: &result, 214 }, 215 "500 internal server error": { 216 asMap: &req, 217 domainName: "example.akadns.net", 218 headers: http.Header{}, 219 responseStatus: http.StatusInternalServerError, 220 responseBody: ` 221 { 222 "type": "internal_error", 223 "title": "Internal Server Error", 224 "detail": "Error creating asmap" 225 }`, 226 expectedPath: "/config-gtm/v1/domains/example.akadns.net/as-maps/The%20North", 227 withError: &Error{ 228 Type: "internal_error", 229 Title: "Internal Server Error", 230 Detail: "Error creating asmap", 231 StatusCode: http.StatusInternalServerError, 232 }, 233 }, 234 } 235 236 for name, test := range tests { 237 t.Run(name, func(t *testing.T) { 238 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 239 assert.Equal(t, test.expectedPath, r.URL.String()) 240 assert.Equal(t, http.MethodPut, r.Method) 241 w.WriteHeader(test.responseStatus) 242 _, err := w.Write([]byte(test.responseBody)) 243 assert.NoError(t, err) 244 })) 245 client := mockAPIClient(t, mockServer) 246 result, err := client.CreateASMap( 247 session.ContextWithOptions( 248 context.Background(), 249 session.WithContextHeaders(test.headers)), test.asMap, test.domainName) 250 if test.withError != nil { 251 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 252 return 253 } 254 require.NoError(t, err) 255 assert.Equal(t, test.expectedResponse, result) 256 }) 257 } 258 } 259 260 func TestGTM_UpdateASMap(t *testing.T) { 261 var result ASMapResponse 262 var req ASMap 263 264 respData, err := loadTestData("TestGTM_CreateASMap.resp.json") 265 if err != nil { 266 t.Fatal(err) 267 } 268 269 if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil { 270 t.Fatal(err) 271 } 272 273 reqData, err := loadTestData("TestGTM_CreateASMap.req.json") 274 if err != nil { 275 t.Fatal(err) 276 } 277 278 if err := json.NewDecoder(bytes.NewBuffer(reqData)).Decode(&req); err != nil { 279 t.Fatal(err) 280 } 281 282 tests := map[string]struct { 283 asMap *ASMap 284 domainName string 285 responseStatus int 286 responseBody string 287 expectedPath string 288 expectedResponse *ResponseStatus 289 withError error 290 headers http.Header 291 }{ 292 "200 OK": { 293 asMap: &req, 294 domainName: "example.akadns.net", 295 headers: http.Header{ 296 "Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"}, 297 }, 298 responseStatus: http.StatusOK, 299 responseBody: string(respData), 300 expectedPath: "/config-gtm/v1/domains/example.akadns.net/as-maps/The%20North", 301 expectedResponse: result.Status, 302 }, 303 "500 internal server error": { 304 asMap: &req, 305 domainName: "example.akadns.net", 306 headers: http.Header{}, 307 responseStatus: http.StatusInternalServerError, 308 responseBody: ` 309 { 310 "type": "internal_error", 311 "title": "Internal Server Error", 312 "detail": "Error updating asmap" 313 }`, 314 expectedPath: "/config-gtm/v1/domains/example.akadns.net/as-maps/The%20North", 315 withError: &Error{ 316 Type: "internal_error", 317 Title: "Internal Server Error", 318 Detail: "Error updating asmap", 319 StatusCode: http.StatusInternalServerError, 320 }, 321 }, 322 } 323 324 for name, test := range tests { 325 t.Run(name, func(t *testing.T) { 326 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 327 assert.Equal(t, test.expectedPath, r.URL.String()) 328 assert.Equal(t, http.MethodPut, r.Method) 329 w.WriteHeader(test.responseStatus) 330 _, err := w.Write([]byte(test.responseBody)) 331 assert.NoError(t, err) 332 })) 333 client := mockAPIClient(t, mockServer) 334 result, err := client.UpdateASMap( 335 session.ContextWithOptions( 336 context.Background(), 337 session.WithContextHeaders(test.headers)), test.asMap, test.domainName) 338 if test.withError != nil { 339 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 340 return 341 } 342 require.NoError(t, err) 343 assert.Equal(t, test.expectedResponse, result) 344 }) 345 } 346 } 347 348 func TestGTM_DeleteASMap(t *testing.T) { 349 var result ASMapResponse 350 var req ASMap 351 352 respData, err := loadTestData("TestGTM_CreateASMap.resp.json") 353 if err != nil { 354 t.Fatal(err) 355 } 356 357 if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil { 358 t.Fatal(err) 359 } 360 361 reqData, err := loadTestData("TestGTM_CreateASMap.req.json") 362 if err != nil { 363 t.Fatal(err) 364 } 365 366 if err := json.NewDecoder(bytes.NewBuffer(reqData)).Decode(&req); err != nil { 367 t.Fatal(err) 368 } 369 370 tests := map[string]struct { 371 asMap *ASMap 372 domainName string 373 responseStatus int 374 responseBody string 375 expectedPath string 376 expectedResponse *ResponseStatus 377 withError error 378 headers http.Header 379 }{ 380 "200 OK": { 381 asMap: &req, 382 domainName: "example.akadns.net", 383 headers: http.Header{ 384 "Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"}, 385 }, 386 responseStatus: http.StatusOK, 387 responseBody: string(respData), 388 expectedPath: "/config-gtm/v1/domains/example.akadns.net/as-maps/The%20North", 389 expectedResponse: result.Status, 390 }, 391 "500 internal server error": { 392 asMap: &req, 393 domainName: "example.akadns.net", 394 headers: http.Header{}, 395 responseStatus: http.StatusInternalServerError, 396 responseBody: ` 397 { 398 "type": "internal_error", 399 "title": "Internal Server Error", 400 "detail": "Error updating asmap" 401 }`, 402 expectedPath: "/config-gtm/v1/domains/example.akadns.net/as-maps/The%20North", 403 withError: &Error{ 404 Type: "internal_error", 405 Title: "Internal Server Error", 406 Detail: "Error updating asmap", 407 StatusCode: http.StatusInternalServerError, 408 }, 409 }, 410 } 411 412 for name, test := range tests { 413 t.Run(name, func(t *testing.T) { 414 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 415 assert.Equal(t, test.expectedPath, r.URL.String()) 416 assert.Equal(t, http.MethodDelete, r.Method) 417 w.WriteHeader(test.responseStatus) 418 _, err := w.Write([]byte(test.responseBody)) 419 assert.NoError(t, err) 420 })) 421 client := mockAPIClient(t, mockServer) 422 result, err := client.DeleteASMap( 423 session.ContextWithOptions( 424 context.Background(), 425 session.WithContextHeaders(test.headers)), test.asMap, test.domainName) 426 if test.withError != nil { 427 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 428 return 429 } 430 require.NoError(t, err) 431 assert.Equal(t, test.expectedResponse, result) 432 }) 433 } 434 }