github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/appsec/rate_policy_test.go (about) 1 package appsec 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 TestAppSec_ListRatePolicies(t *testing.T) { 17 18 result := GetRatePoliciesResponse{} 19 20 respData := compactJSON(loadFixtureBytes("testdata/TestRatePolicies/RatePolicies.json")) 21 err := json.Unmarshal([]byte(respData), &result) 22 require.NoError(t, err) 23 24 tests := map[string]struct { 25 params GetRatePoliciesRequest 26 responseStatus int 27 responseBody string 28 expectedPath string 29 expectedResponse *GetRatePoliciesResponse 30 withError error 31 headers http.Header 32 }{ 33 "200 OK": { 34 params: GetRatePoliciesRequest{ 35 ConfigID: 43253, 36 ConfigVersion: 15, 37 }, 38 headers: http.Header{ 39 "Content-Type": []string{"application/json"}, 40 }, 41 responseStatus: http.StatusOK, 42 responseBody: string(respData), 43 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies", 44 expectedResponse: &result, 45 }, 46 "500 internal server error": { 47 params: GetRatePoliciesRequest{ 48 ConfigID: 43253, 49 ConfigVersion: 15, 50 }, 51 headers: http.Header{}, 52 responseStatus: http.StatusInternalServerError, 53 responseBody: ` 54 { 55 "type": "internal_error", 56 "title": "Internal Server Error", 57 "detail": "Error fetching propertys", 58 "status": 500 59 }`, 60 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies", 61 withError: &Error{ 62 Type: "internal_error", 63 Title: "Internal Server Error", 64 Detail: "Error fetching propertys", 65 StatusCode: http.StatusInternalServerError, 66 }, 67 }, 68 } 69 70 for name, test := range tests { 71 t.Run(name, func(t *testing.T) { 72 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 73 assert.Equal(t, test.expectedPath, r.URL.String()) 74 assert.Equal(t, http.MethodGet, r.Method) 75 w.WriteHeader(test.responseStatus) 76 _, err := w.Write([]byte(test.responseBody)) 77 assert.NoError(t, err) 78 })) 79 client := mockAPIClient(t, mockServer) 80 result, err := client.GetRatePolicies( 81 session.ContextWithOptions( 82 context.Background(), 83 session.WithContextHeaders(test.headers), 84 ), 85 test.params) 86 if test.withError != nil { 87 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 88 return 89 } 90 require.NoError(t, err) 91 assert.Equal(t, test.expectedResponse, result) 92 }) 93 } 94 } 95 96 // Test RatePolicy 97 func TestAppSec_GetRatePolicy(t *testing.T) { 98 99 result := GetRatePolicyResponse{} 100 101 respData := compactJSON(loadFixtureBytes("testdata/TestRatePolicies/RatePolicy.json")) 102 err := json.Unmarshal([]byte(respData), &result) 103 require.NoError(t, err) 104 105 tests := map[string]struct { 106 params GetRatePolicyRequest 107 responseStatus int 108 responseBody string 109 expectedPath string 110 expectedResponse *GetRatePolicyResponse 111 withError error 112 }{ 113 "200 OK": { 114 params: GetRatePolicyRequest{ 115 ConfigID: 43253, 116 ConfigVersion: 15, 117 RatePolicyID: 134644, 118 }, 119 responseStatus: http.StatusOK, 120 responseBody: respData, 121 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies/134644", 122 expectedResponse: &result, 123 }, 124 "500 internal server error": { 125 params: GetRatePolicyRequest{ 126 ConfigID: 43253, 127 ConfigVersion: 15, 128 RatePolicyID: 134644, 129 }, 130 responseStatus: http.StatusInternalServerError, 131 responseBody: ` 132 { 133 "type": "internal_error", 134 "title": "Internal Server Error", 135 "detail": "Error fetching match target" 136 }`, 137 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies/134644", 138 withError: &Error{ 139 Type: "internal_error", 140 Title: "Internal Server Error", 141 Detail: "Error fetching match target", 142 StatusCode: http.StatusInternalServerError, 143 }, 144 }, 145 } 146 147 for name, test := range tests { 148 t.Run(name, func(t *testing.T) { 149 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 150 assert.Equal(t, test.expectedPath, r.URL.String()) 151 assert.Equal(t, http.MethodGet, r.Method) 152 w.WriteHeader(test.responseStatus) 153 _, err := w.Write([]byte(test.responseBody)) 154 assert.NoError(t, err) 155 })) 156 client := mockAPIClient(t, mockServer) 157 result, err := client.GetRatePolicy(context.Background(), test.params) 158 if test.withError != nil { 159 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 160 return 161 } 162 require.NoError(t, err) 163 assert.Equal(t, test.expectedResponse, result) 164 }) 165 } 166 } 167 168 // Test Create RatePolicy 169 func TestAppSec_CreateRatePolicy(t *testing.T) { 170 171 result := CreateRatePolicyResponse{} 172 173 respData := compactJSON(loadFixtureBytes("testdata/TestRatePolicies/RatePolicy.json")) 174 err := json.Unmarshal([]byte(respData), &result) 175 require.NoError(t, err) 176 177 req := CreateRatePolicyRequest{} 178 179 reqData := compactJSON(loadFixtureBytes("testdata/TestRatePolicies/RatePolicy.json")) 180 err = json.Unmarshal([]byte(reqData), &req) 181 require.NoError(t, err) 182 183 tests := map[string]struct { 184 params CreateRatePolicyRequest 185 prop *CreateRatePolicyRequest 186 responseStatus int 187 responseBody string 188 expectedPath string 189 expectedResponse *CreateRatePolicyResponse 190 withError error 191 headers http.Header 192 }{ 193 "201 Created": { 194 params: CreateRatePolicyRequest{ 195 ConfigID: 43253, 196 ConfigVersion: 15, 197 }, 198 headers: http.Header{ 199 "Content-Type": []string{"application/json;charset=UTF-8"}, 200 }, 201 responseStatus: http.StatusCreated, 202 responseBody: respData, 203 expectedResponse: &result, 204 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies", 205 }, 206 "500 internal server error": { 207 params: CreateRatePolicyRequest{ 208 ConfigID: 43253, 209 ConfigVersion: 15, 210 }, 211 responseStatus: http.StatusInternalServerError, 212 responseBody: ` 213 { 214 "type": "internal_error", 215 "title": "Internal Server Error", 216 "detail": "Error creating domain" 217 }`, 218 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies", 219 withError: &Error{ 220 Type: "internal_error", 221 Title: "Internal Server Error", 222 Detail: "Error creating domain", 223 StatusCode: http.StatusInternalServerError, 224 }, 225 }, 226 } 227 228 for name, test := range tests { 229 t.Run(name, func(t *testing.T) { 230 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 231 assert.Equal(t, http.MethodPost, r.Method) 232 w.WriteHeader(test.responseStatus) 233 if len(test.responseBody) > 0 { 234 _, err := w.Write([]byte(test.responseBody)) 235 assert.NoError(t, err) 236 } 237 })) 238 client := mockAPIClient(t, mockServer) 239 result, err := client.CreateRatePolicy( 240 session.ContextWithOptions( 241 context.Background(), 242 session.WithContextHeaders(test.headers)), test.params) 243 if test.withError != nil { 244 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 245 return 246 } 247 require.NoError(t, err) 248 assert.Equal(t, test.expectedResponse, result) 249 }) 250 } 251 } 252 253 // Test Create RatePolicy with negative hostnames match (using RatePoliciesHosts field) 254 func TestAppSec_CreateRatePolicy_NegativeMatch(t *testing.T) { 255 256 result := CreateRatePolicyResponse{} 257 258 respData := compactJSON(loadFixtureBytes("testdata/TestRatePolicies/RatePoliciesHosts.json")) 259 err := json.Unmarshal([]byte(respData), &result) 260 require.NoError(t, err) 261 262 req := CreateRatePolicyRequest{} 263 264 reqData := compactJSON(loadFixtureBytes("testdata/TestRatePolicies/RatePoliciesHosts.json")) 265 err = json.Unmarshal([]byte(reqData), &req) 266 require.NoError(t, err) 267 268 tests := map[string]struct { 269 params CreateRatePolicyRequest 270 prop *CreateRatePolicyRequest 271 responseStatus int 272 responseBody string 273 expectedPath string 274 expectedResponse *CreateRatePolicyResponse 275 withError error 276 headers http.Header 277 }{ 278 "201 Created": { 279 params: CreateRatePolicyRequest{ 280 ConfigID: 43253, 281 ConfigVersion: 15, 282 }, 283 headers: http.Header{ 284 "Content-Type": []string{"application/json;charset=UTF-8"}, 285 }, 286 responseStatus: http.StatusCreated, 287 responseBody: respData, 288 expectedResponse: &result, 289 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies", 290 }, 291 "500 internal server error": { 292 params: CreateRatePolicyRequest{ 293 ConfigID: 43253, 294 ConfigVersion: 15, 295 }, 296 responseStatus: http.StatusInternalServerError, 297 responseBody: ` 298 { 299 "type": "internal_error", 300 "title": "Internal Server Error", 301 "detail": "Error creating domain" 302 }`, 303 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies", 304 withError: &Error{ 305 Type: "internal_error", 306 Title: "Internal Server Error", 307 Detail: "Error creating domain", 308 StatusCode: http.StatusInternalServerError, 309 }, 310 }, 311 } 312 313 for name, test := range tests { 314 t.Run(name, func(t *testing.T) { 315 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 316 assert.Equal(t, http.MethodPost, r.Method) 317 w.WriteHeader(test.responseStatus) 318 if len(test.responseBody) > 0 { 319 _, err := w.Write([]byte(test.responseBody)) 320 assert.NoError(t, err) 321 } 322 })) 323 client := mockAPIClient(t, mockServer) 324 result, err := client.CreateRatePolicy( 325 session.ContextWithOptions( 326 context.Background(), 327 session.WithContextHeaders(test.headers)), test.params) 328 if test.withError != nil { 329 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 330 return 331 } 332 require.NoError(t, err) 333 assert.Equal(t, test.expectedResponse, result) 334 }) 335 } 336 } 337 338 // Test Update RatePolicy 339 func TestAppSec_UpdateRatePolicy(t *testing.T) { 340 result := UpdateRatePolicyResponse{} 341 342 respData := compactJSON(loadFixtureBytes("testdata/TestRatePolicies/RatePolicy.json")) 343 err := json.Unmarshal([]byte(respData), &result) 344 require.NoError(t, err) 345 346 req := UpdateRatePolicyRequest{} 347 348 reqData := compactJSON(loadFixtureBytes("testdata/TestRatePolicies/RatePolicy.json")) 349 err = json.Unmarshal([]byte(reqData), &req) 350 require.NoError(t, err) 351 352 tests := map[string]struct { 353 params UpdateRatePolicyRequest 354 responseStatus int 355 responseBody string 356 expectedPath string 357 expectedResponse *UpdateRatePolicyResponse 358 withError error 359 headers http.Header 360 }{ 361 "200 Success": { 362 params: UpdateRatePolicyRequest{ 363 ConfigID: 43253, 364 ConfigVersion: 15, 365 RatePolicyID: 134644, 366 }, 367 headers: http.Header{ 368 "Content-Type": []string{"application/json;charset=UTF-8"}, 369 }, 370 responseStatus: http.StatusCreated, 371 responseBody: respData, 372 expectedResponse: &result, 373 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies/134644", 374 }, 375 "500 internal server error": { 376 params: UpdateRatePolicyRequest{ 377 ConfigID: 43253, 378 ConfigVersion: 15, 379 RatePolicyID: 134644, 380 }, 381 responseStatus: http.StatusInternalServerError, 382 responseBody: ` 383 { 384 "type": "internal_error", 385 "title": "Internal Server Error", 386 "detail": "Error creating zone" 387 }`, 388 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies/134644", 389 withError: &Error{ 390 Type: "internal_error", 391 Title: "Internal Server Error", 392 Detail: "Error creating zone", 393 StatusCode: http.StatusInternalServerError, 394 }, 395 }, 396 } 397 398 for name, test := range tests { 399 t.Run(name, func(t *testing.T) { 400 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 401 assert.Equal(t, http.MethodPut, r.Method) 402 w.WriteHeader(test.responseStatus) 403 if len(test.responseBody) > 0 { 404 _, err := w.Write([]byte(test.responseBody)) 405 assert.NoError(t, err) 406 } 407 })) 408 client := mockAPIClient(t, mockServer) 409 result, err := client.UpdateRatePolicy( 410 session.ContextWithOptions( 411 context.Background(), 412 session.WithContextHeaders(test.headers)), test.params) 413 if test.withError != nil { 414 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 415 return 416 } 417 require.NoError(t, err) 418 assert.Equal(t, test.expectedResponse, result) 419 }) 420 } 421 } 422 423 // Test Remove RatePolicy 424 func TestAppSec_RemoveRatePolicy(t *testing.T) { 425 426 result := RemoveRatePolicyResponse{} 427 428 respData := compactJSON(loadFixtureBytes("testdata/TestRatePolicies/RatePoliciesEmpty.json")) 429 err := json.Unmarshal([]byte(respData), &result) 430 require.NoError(t, err) 431 432 req := RemoveRatePolicyRequest{} 433 434 reqData := compactJSON(loadFixtureBytes("testdata/TestRatePolicies/RatePoliciesEmpty.json")) 435 err = json.Unmarshal([]byte(reqData), &req) 436 require.NoError(t, err) 437 438 tests := map[string]struct { 439 params RemoveRatePolicyRequest 440 responseStatus int 441 responseBody string 442 expectedPath string 443 expectedResponse *RemoveRatePolicyResponse 444 withError error 445 headers http.Header 446 }{ 447 "200 Success": { 448 params: RemoveRatePolicyRequest{ 449 ConfigID: 43253, 450 ConfigVersion: 15, 451 RatePolicyID: 134644, 452 }, 453 headers: http.Header{ 454 "Content-Type": []string{"application/json;charset=UTF-8"}, 455 }, 456 responseStatus: http.StatusOK, 457 responseBody: respData, 458 expectedResponse: &result, 459 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies/134644", 460 }, 461 "500 internal server error": { 462 params: RemoveRatePolicyRequest{ 463 ConfigID: 43253, 464 ConfigVersion: 15, 465 RatePolicyID: 134644, 466 }, 467 responseStatus: http.StatusInternalServerError, 468 responseBody: ` 469 { 470 "type": "internal_error", 471 "title": "Internal Server Error", 472 "detail": "Error deleting match target" 473 }`, 474 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies/134644", 475 withError: &Error{ 476 Type: "internal_error", 477 Title: "Internal Server Error", 478 Detail: "Error deleting match target", 479 StatusCode: http.StatusInternalServerError, 480 }, 481 }, 482 } 483 484 for name, test := range tests { 485 t.Run(name, func(t *testing.T) { 486 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 487 assert.Equal(t, http.MethodDelete, r.Method) 488 w.WriteHeader(test.responseStatus) 489 if len(test.responseBody) > 0 { 490 _, err := w.Write([]byte(test.responseBody)) 491 assert.NoError(t, err) 492 } 493 })) 494 client := mockAPIClient(t, mockServer) 495 result, err := client.RemoveRatePolicy( 496 session.ContextWithOptions( 497 context.Background(), 498 session.WithContextHeaders(test.headers)), test.params) 499 if test.withError != nil { 500 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 501 return 502 } 503 require.NoError(t, err) 504 assert.Equal(t, test.expectedResponse, result) 505 }) 506 } 507 }