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