github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/appsec/reputation_profile_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_ListReputationProfile(t *testing.T) { 17 18 result := GetReputationProfilesResponse{} 19 20 respData := compactJSON(loadFixtureBytes("testdata/TestReputationProfile/ReputationProfile.json")) 21 err := json.Unmarshal([]byte(respData), &result) 22 require.NoError(t, err) 23 24 tests := map[string]struct { 25 params GetReputationProfilesRequest 26 responseStatus int 27 responseBody string 28 expectedPath string 29 expectedResponse *GetReputationProfilesResponse 30 withError error 31 headers http.Header 32 }{ 33 "200 OK": { 34 params: GetReputationProfilesRequest{ 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/reputation-profiles", 44 expectedResponse: &result, 45 }, 46 "500 internal server error": { 47 params: GetReputationProfilesRequest{ 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/reputation-profiles", 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.GetReputationProfiles( 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 ReputationProfile 97 func TestAppSec_GetReputationProfile(t *testing.T) { 98 99 result := GetReputationProfileResponse{} 100 101 respData := compactJSON(loadFixtureBytes("testdata/TestReputationProfile/ReputationProfile.json")) 102 err := json.Unmarshal([]byte(respData), &result) 103 require.NoError(t, err) 104 105 tests := map[string]struct { 106 params GetReputationProfileRequest 107 responseStatus int 108 responseBody string 109 expectedPath string 110 expectedResponse *GetReputationProfileResponse 111 withError error 112 }{ 113 "200 OK": { 114 params: GetReputationProfileRequest{ 115 ConfigID: 43253, 116 ConfigVersion: 15, 117 ReputationProfileId: 134644, 118 }, 119 responseStatus: http.StatusOK, 120 responseBody: respData, 121 expectedPath: "/appsec/v1/configs/43253/versions/15/reputation-profiles/134644", 122 expectedResponse: &result, 123 }, 124 "500 internal server error": { 125 params: GetReputationProfileRequest{ 126 ConfigID: 43253, 127 ConfigVersion: 15, 128 ReputationProfileId: 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/reputation-profiles/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.GetReputationProfile(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 ReputationProfile 169 func TestAppSec_CreateReputationProfile(t *testing.T) { 170 171 result := CreateReputationProfileResponse{} 172 173 respData := compactJSON(loadFixtureBytes("testdata/TestReputationProfile/ReputationProfile.json")) 174 err := json.Unmarshal([]byte(respData), &result) 175 require.NoError(t, err) 176 177 req := CreateReputationProfileRequest{} 178 179 reqData := compactJSON(loadFixtureBytes("testdata/TestReputationProfile/ReputationProfile.json")) 180 err = json.Unmarshal([]byte(reqData), &req) 181 require.NoError(t, err) 182 183 tests := map[string]struct { 184 params CreateReputationProfileRequest 185 prop *CreateReputationProfileRequest 186 responseStatus int 187 responseBody string 188 expectedPath string 189 expectedResponse *CreateReputationProfileResponse 190 withError error 191 headers http.Header 192 }{ 193 "201 Created": { 194 params: CreateReputationProfileRequest{ 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/reputation-profiles", 205 }, 206 "500 internal server error": { 207 params: CreateReputationProfileRequest{ 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/reputation-profiles", 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.CreateReputationProfile( 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 Update ReputationProfile 254 func TestAppSec_UpdateReputationProfile(t *testing.T) { 255 result := UpdateReputationProfileResponse{} 256 257 respData := compactJSON(loadFixtureBytes("testdata/TestReputationProfile/ReputationProfile.json")) 258 err := json.Unmarshal([]byte(respData), &result) 259 require.NoError(t, err) 260 261 req := UpdateReputationProfileRequest{} 262 263 reqData := compactJSON(loadFixtureBytes("testdata/TestReputationProfile/ReputationProfile.json")) 264 err = json.Unmarshal([]byte(reqData), &req) 265 require.NoError(t, err) 266 267 tests := map[string]struct { 268 params UpdateReputationProfileRequest 269 responseStatus int 270 responseBody string 271 expectedPath string 272 expectedResponse *UpdateReputationProfileResponse 273 withError error 274 headers http.Header 275 }{ 276 "200 Success": { 277 params: UpdateReputationProfileRequest{ 278 ConfigID: 43253, 279 ConfigVersion: 15, 280 ReputationProfileId: 134644, 281 }, 282 headers: http.Header{ 283 "Content-Type": []string{"application/json;charset=UTF-8"}, 284 }, 285 responseStatus: http.StatusCreated, 286 responseBody: respData, 287 expectedResponse: &result, 288 expectedPath: "/appsec/v1/configs/43253/versions/15/reputation-profiles/134644", 289 }, 290 "500 internal server error": { 291 params: UpdateReputationProfileRequest{ 292 ConfigID: 43253, 293 ConfigVersion: 15, 294 ReputationProfileId: 134644, 295 }, 296 responseStatus: http.StatusInternalServerError, 297 responseBody: ` 298 { 299 "type": "internal_error", 300 "title": "Internal Server Error", 301 "detail": "Error creating zone" 302 }`, 303 expectedPath: "/appsec/v1/configs/43253/versions/15/reputation-profiles/134644", 304 withError: &Error{ 305 Type: "internal_error", 306 Title: "Internal Server Error", 307 Detail: "Error creating zone", 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.MethodPut, 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.UpdateReputationProfile( 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 Remove ReputationProfile 339 func TestAppSec_RemoveReputationProfile(t *testing.T) { 340 341 result := RemoveReputationProfileResponse{} 342 343 respData := compactJSON(loadFixtureBytes("testdata/TestReputationProfile/ReputationProfileEmpty.json")) 344 err := json.Unmarshal([]byte(respData), &result) 345 require.NoError(t, err) 346 347 req := RemoveReputationProfileRequest{} 348 349 reqData := compactJSON(loadFixtureBytes("testdata/TestReputationProfile/ReputationProfileEmpty.json")) 350 err = json.Unmarshal([]byte(reqData), &req) 351 require.NoError(t, err) 352 353 tests := map[string]struct { 354 params RemoveReputationProfileRequest 355 responseStatus int 356 responseBody string 357 expectedPath string 358 expectedResponse *RemoveReputationProfileResponse 359 withError error 360 headers http.Header 361 }{ 362 "200 Success": { 363 params: RemoveReputationProfileRequest{ 364 ConfigID: 43253, 365 ConfigVersion: 15, 366 ReputationProfileId: 134644, 367 }, 368 headers: http.Header{ 369 "Content-Type": []string{"application/json;charset=UTF-8"}, 370 }, 371 responseStatus: http.StatusOK, 372 responseBody: respData, 373 expectedResponse: &result, 374 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies/134644", 375 }, 376 "500 internal server error": { 377 params: RemoveReputationProfileRequest{ 378 ConfigID: 43253, 379 ConfigVersion: 15, 380 ReputationProfileId: 134644, 381 }, 382 responseStatus: http.StatusInternalServerError, 383 responseBody: ` 384 { 385 "type": "internal_error", 386 "title": "Internal Server Error", 387 "detail": "Error deleting match target" 388 }`, 389 expectedPath: "/appsec/v1/configs/43253/versions/15/rate-policies/134644", 390 withError: &Error{ 391 Type: "internal_error", 392 Title: "Internal Server Error", 393 Detail: "Error deleting match target", 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.MethodDelete, r.Method) 403 w.WriteHeader(test.responseStatus) 404 if len(test.responseBody) > 0 { 405 _, err := w.Write([]byte(test.responseBody)) 406 assert.NoError(t, err) 407 } 408 })) 409 client := mockAPIClient(t, mockServer) 410 result, err := client.RemoveReputationProfile( 411 session.ContextWithOptions( 412 context.Background(), 413 session.WithContextHeaders(test.headers)), test.params) 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 }