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