github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/appsec/advanced_settings_request_body_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 TestAppsecGetAdvancedSettingsRequestBody(t *testing.T) { 17 18 result := GetAdvancedSettingsRequestBodyResponse{} 19 20 respData := compactJSON(loadFixtureBytes("testdata/TestAdvancedSettingsRequestBody/AdvancedSettingsRequestBody.json")) 21 err := json.Unmarshal([]byte(respData), &result) 22 require.NoError(t, err) 23 24 tests := map[string]struct { 25 params GetAdvancedSettingsRequestBodyRequest 26 responseStatus int 27 responseBody string 28 expectedPath string 29 expectedResponse *GetAdvancedSettingsRequestBodyResponse 30 withError error 31 headers http.Header 32 }{ 33 "200 OK": { 34 params: GetAdvancedSettingsRequestBodyRequest{ 35 ConfigID: 43253, 36 Version: 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/advanced-settings/request-body", 44 expectedResponse: &result, 45 }, 46 "500 internal server error": { 47 params: GetAdvancedSettingsRequestBodyRequest{ 48 ConfigID: 43253, 49 Version: 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 AdvancedSettingsRequestBody", 58 "status": 500 59 }`, 60 expectedPath: "/appsec/v1/configs/43253/versions/15/advanced-settings/request-body", 61 withError: &Error{ 62 Type: "internal_error", 63 Title: "Internal Server Error", 64 Detail: "Error fetching AdvancedSettingsRequestBody", 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.GetAdvancedSettingsRequestBody( 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 func TestAppsecGetAdvancedSettingsRequestBodyValidation(t *testing.T) { 97 98 result := GetAdvancedSettingsRequestBodyResponse{} 99 100 respData := compactJSON(loadFixtureBytes("testdata/TestAdvancedSettingsRequestBody/AdvancedSettingsRequestBody.json")) 101 err := json.Unmarshal([]byte(respData), &result) 102 require.NoError(t, err) 103 104 tests := map[string]struct { 105 params GetAdvancedSettingsRequestBodyRequest 106 responseStatus int 107 responseBody string 108 expectedPath string 109 expectedResponse *GetAdvancedSettingsRequestBodyResponse 110 withError func(*testing.T, error) 111 headers http.Header 112 }{ 113 "validation error configID missing": { 114 params: GetAdvancedSettingsRequestBodyRequest{ 115 Version: 15, 116 }, 117 headers: http.Header{}, 118 expectedPath: "/appsec/v1/configs/43253/versions/15/advanced-settings/request-body", 119 withError: func(t *testing.T, err error) { 120 assert.Containsf(t, err.Error(), "ConfigID: cannot be blank", "want: %s; got: %s", ErrStructValidation, err) 121 assert.True(t, errors.Is(err, ErrStructValidation), "want: %s; got: %s", ErrStructValidation, err) 122 }, 123 }, 124 "validation error version missing": { 125 params: GetAdvancedSettingsRequestBodyRequest{ 126 ConfigID: 43253, 127 }, 128 headers: http.Header{}, 129 expectedPath: "/appsec/v1/configs/43253/versions/15/advanced-settings/request-body", 130 withError: func(t *testing.T, err error) { 131 assert.Containsf(t, err.Error(), "Version: cannot be blank", "want: %s; got: %s", ErrStructValidation, err) 132 assert.True(t, errors.Is(err, ErrStructValidation), "want: %s; got: %s", ErrStructValidation, err) 133 }, 134 }, 135 } 136 137 for name, test := range tests { 138 t.Run(name, func(t *testing.T) { 139 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 140 assert.Equal(t, test.expectedPath, r.URL.String()) 141 assert.Equal(t, http.MethodGet, r.Method) 142 w.WriteHeader(test.responseStatus) 143 _, err := w.Write([]byte(test.responseBody)) 144 assert.NoError(t, err) 145 })) 146 client := mockAPIClient(t, mockServer) 147 result, err := client.GetAdvancedSettingsRequestBody( 148 session.ContextWithOptions( 149 context.Background(), 150 session.WithContextHeaders(test.headers), 151 ), 152 test.params) 153 if test.withError != nil { 154 test.withError(t, err) 155 return 156 } 157 require.NoError(t, err) 158 assert.Equal(t, test.expectedResponse, result) 159 }) 160 } 161 } 162 163 func TestAppsecGetAdvancedSettingsRequestBodyPolicy(t *testing.T) { 164 165 result := GetAdvancedSettingsRequestBodyResponse{} 166 167 respData := compactJSON(loadFixtureBytes("testdata/TestAdvancedSettingsRequestBody/AdvancedSettingsRequestBody.json")) 168 err := json.Unmarshal([]byte(respData), &result) 169 require.NoError(t, err) 170 171 tests := map[string]struct { 172 params GetAdvancedSettingsRequestBodyRequest 173 responseStatus int 174 responseBody string 175 expectedPath string 176 expectedResponse *GetAdvancedSettingsRequestBodyResponse 177 withError error 178 }{ 179 "200 OK": { 180 params: GetAdvancedSettingsRequestBodyRequest{ 181 ConfigID: 43253, 182 Version: 15, 183 PolicyID: "test_policy", 184 }, 185 responseStatus: http.StatusOK, 186 responseBody: respData, 187 expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/test_policy/advanced-settings/request-body", 188 expectedResponse: &result, 189 }, 190 "500 internal server error": { 191 params: GetAdvancedSettingsRequestBodyRequest{ 192 ConfigID: 43253, 193 Version: 15, 194 PolicyID: "test_policy", 195 }, 196 responseStatus: http.StatusInternalServerError, 197 responseBody: ` 198 { 199 "type": "internal_error", 200 "title": "Internal Server Error", 201 "detail": "Error fetching AdvancedSettingsRequestBody" 202 }`, 203 expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/test_policy/advanced-settings/request-body", 204 withError: &Error{ 205 Type: "internal_error", 206 Title: "Internal Server Error", 207 Detail: "Error fetching AdvancedSettingsRequestBody", 208 StatusCode: http.StatusInternalServerError, 209 }, 210 }, 211 } 212 213 for name, test := range tests { 214 t.Run(name, func(t *testing.T) { 215 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 216 assert.Equal(t, test.expectedPath, r.URL.String()) 217 assert.Equal(t, http.MethodGet, r.Method) 218 w.WriteHeader(test.responseStatus) 219 _, err := w.Write([]byte(test.responseBody)) 220 assert.NoError(t, err) 221 })) 222 client := mockAPIClient(t, mockServer) 223 result, err := client.GetAdvancedSettingsRequestBody(context.Background(), test.params) 224 if test.withError != nil { 225 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 226 return 227 } 228 require.NoError(t, err) 229 assert.Equal(t, test.expectedResponse, result) 230 }) 231 } 232 } 233 234 // Test Update AdvancedSettingsRequestBody config level. 235 func TestAppsecUpdateAdvancedSettingsRequestBody(t *testing.T) { 236 result := UpdateAdvancedSettingsRequestBodyResponse{} 237 238 respData := compactJSON(loadFixtureBytes("testdata/TestAdvancedSettingsRequestBody/AdvancedSettingsRequestBody.json")) 239 err := json.Unmarshal([]byte(respData), &result) 240 require.NoError(t, err) 241 242 req := UpdateAdvancedSettingsRequestBodyRequest{} 243 244 reqData := compactJSON(loadFixtureBytes("testdata/TestAdvancedSettingsRequestBody/AdvancedSettingsRequestBody.json")) 245 err = json.Unmarshal([]byte(reqData), &req) 246 require.NoError(t, err) 247 248 tests := map[string]struct { 249 params UpdateAdvancedSettingsRequestBodyRequest 250 responseStatus int 251 responseBody string 252 expectedPath string 253 expectedResponse *UpdateAdvancedSettingsRequestBodyResponse 254 withError error 255 headers http.Header 256 }{ 257 "200 Success": { 258 params: UpdateAdvancedSettingsRequestBodyRequest{ 259 ConfigID: 43253, 260 Version: 15, 261 }, 262 headers: http.Header{ 263 "Content-Type": []string{"application/json;charset=UTF-8"}, 264 }, 265 responseStatus: http.StatusCreated, 266 responseBody: respData, 267 expectedResponse: &result, 268 expectedPath: "/appsec/v1/configs/43253/versions/15/advanced-settings/request-body", 269 }, 270 "500 internal server error": { 271 params: UpdateAdvancedSettingsRequestBodyRequest{ 272 ConfigID: 43253, 273 Version: 15, 274 }, 275 responseStatus: http.StatusInternalServerError, 276 responseBody: ` 277 { 278 "type": "internal_error", 279 "title": "Internal Server Error", 280 "detail": "Error creating AdvancedSettingsRequestBody" 281 }`, 282 expectedPath: "/appsec/v1/configs/43253/versions/15/advanced-settings/request-body", 283 withError: &Error{ 284 Type: "internal_error", 285 Title: "Internal Server Error", 286 Detail: "Error creating AdvancedSettingsRequestBody", 287 StatusCode: http.StatusInternalServerError, 288 }, 289 }, 290 } 291 292 for name, test := range tests { 293 t.Run(name, func(t *testing.T) { 294 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 295 assert.Equal(t, http.MethodPut, r.Method) 296 w.WriteHeader(test.responseStatus) 297 if len(test.responseBody) > 0 { 298 _, err := w.Write([]byte(test.responseBody)) 299 assert.NoError(t, err) 300 } 301 })) 302 client := mockAPIClient(t, mockServer) 303 result, err := client.UpdateAdvancedSettingsRequestBody( 304 session.ContextWithOptions( 305 context.Background(), 306 session.WithContextHeaders(test.headers)), test.params) 307 if test.withError != nil { 308 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 309 return 310 } 311 require.NoError(t, err) 312 assert.Equal(t, test.expectedResponse, result) 313 }) 314 } 315 } 316 317 // Test Update UpdateAdvancedSettingsRequestBody policy level. 318 func TestAppsecUpdateAdvancedSettingsRequestBodyPolicy(t *testing.T) { 319 result := UpdateAdvancedSettingsRequestBodyResponse{} 320 321 respData := compactJSON(loadFixtureBytes("testdata/TestAdvancedSettingsRequestBody/AdvancedSettingsRequestBody.json")) 322 err := json.Unmarshal([]byte(respData), &result) 323 require.NoError(t, err) 324 325 req := UpdateAdvancedSettingsRequestBodyRequest{} 326 327 reqData := compactJSON(loadFixtureBytes("testdata/TestAdvancedSettingsRequestBody/AdvancedSettingsRequestBody.json")) 328 err = json.Unmarshal([]byte(reqData), &req) 329 require.NoError(t, err) 330 331 tests := map[string]struct { 332 params UpdateAdvancedSettingsRequestBodyRequest 333 responseStatus int 334 responseBody string 335 expectedPath string 336 expectedResponse *UpdateAdvancedSettingsRequestBodyResponse 337 withError error 338 headers http.Header 339 }{ 340 "200 Success": { 341 params: UpdateAdvancedSettingsRequestBodyRequest{ 342 ConfigID: 43253, 343 Version: 15, 344 PolicyID: "test_policy", 345 }, 346 headers: http.Header{ 347 "Content-Type": []string{"application/json;charset=UTF-8"}, 348 }, 349 responseStatus: http.StatusCreated, 350 responseBody: respData, 351 expectedResponse: &result, 352 expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/test_policy/advanced-settings/request-body", 353 }, 354 "500 internal server error": { 355 params: UpdateAdvancedSettingsRequestBodyRequest{ 356 ConfigID: 43253, 357 Version: 15, 358 PolicyID: "test_policy", 359 }, 360 responseStatus: http.StatusInternalServerError, 361 responseBody: ` 362 { 363 "type": "internal_error", 364 "title": "Internal Server Error", 365 "detail": "Error creating AdvancedSettingsRequestBody" 366 }`, 367 expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/test_policy/advanced-settings/request-body", 368 withError: &Error{ 369 Type: "internal_error", 370 Title: "Internal Server Error", 371 Detail: "Error creating AdvancedSettingsRequestBody", 372 StatusCode: http.StatusInternalServerError, 373 }, 374 }, 375 } 376 377 for name, test := range tests { 378 t.Run(name, func(t *testing.T) { 379 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 380 assert.Equal(t, http.MethodPut, r.Method) 381 w.WriteHeader(test.responseStatus) 382 if len(test.responseBody) > 0 { 383 _, err := w.Write([]byte(test.responseBody)) 384 assert.NoError(t, err) 385 } 386 })) 387 client := mockAPIClient(t, mockServer) 388 result, err := client.UpdateAdvancedSettingsRequestBody( 389 session.ContextWithOptions( 390 context.Background(), 391 session.WithContextHeaders(test.headers)), test.params) 392 if test.withError != nil { 393 assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err) 394 return 395 } 396 require.NoError(t, err) 397 assert.Equal(t, test.expectedResponse, result) 398 }) 399 } 400 }