github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/appsec/penalty_box_conditions_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_ListPenaltyBoxConditions(t *testing.T) { 17 18 result := GetPenaltyBoxConditionsResponse{} 19 20 respData := compactJSON(loadFixtureBytes("testdata/TestPenaltyBoxConditions/PenaltyBoxConditions.json")) 21 err := json.Unmarshal([]byte(respData), &result) 22 require.NoError(t, err) 23 24 tests := map[string]struct { 25 params GetPenaltyBoxConditionsRequest 26 responseStatus int 27 responseBody string 28 expectedPath string 29 expectedResponse *GetPenaltyBoxConditionsResponse 30 withError func(*testing.T, error) 31 headers http.Header 32 }{ 33 "validation errors - PolicyID cannot be blank": { 34 params: GetPenaltyBoxConditionsRequest{ 35 ConfigID: 43253, 36 Version: 15, 37 }, 38 withError: func(t *testing.T, err error) { 39 assert.Equal(t, "struct validation: PolicyID: cannot be blank", err.Error()) 40 }, 41 }, 42 "validation errors - Version cannot be blank": { 43 params: GetPenaltyBoxConditionsRequest{ 44 ConfigID: 43253, 45 PolicyID: "AAAA_81230", 46 }, 47 withError: func(t *testing.T, err error) { 48 assert.Equal(t, "struct validation: Version: cannot be blank", err.Error()) 49 }, 50 }, 51 "validation errors - ConfigID cannot be blank": { 52 params: GetPenaltyBoxConditionsRequest{ 53 Version: 15, 54 PolicyID: "AAAA_81230", 55 }, 56 withError: func(t *testing.T, err error) { 57 assert.Equal(t, "struct validation: ConfigID: cannot be blank", err.Error()) 58 }, 59 }, 60 "200 OK": { 61 params: GetPenaltyBoxConditionsRequest{ 62 ConfigID: 43253, 63 Version: 15, 64 PolicyID: "AAAA_81230", 65 }, 66 headers: http.Header{ 67 "Content-Type": []string{"application/json"}, 68 }, 69 responseStatus: http.StatusOK, 70 responseBody: string(respData), 71 expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/AAAA_81230/penalty-box/conditions", 72 expectedResponse: &result, 73 }, 74 "500 internal server error": { 75 params: GetPenaltyBoxConditionsRequest{ 76 ConfigID: 43253, 77 Version: 15, 78 PolicyID: "AAAA_81230", 79 }, 80 responseStatus: http.StatusInternalServerError, 81 responseBody: ` 82 { 83 "type": "internal_error", 84 "title": "Internal Server Error", 85 "detail": "Error fetching PenaltyBoxConditions" 86 }`, 87 expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/AAAA_81230/penalty-box/conditions", 88 withError: func(t *testing.T, err error) { 89 want := &Error{ 90 Type: "internal_error", 91 Title: "Internal Server Error", 92 Detail: "Error fetching PenaltyBoxConditions", 93 StatusCode: http.StatusInternalServerError, 94 } 95 assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err) 96 }, 97 }, 98 } 99 100 for name, test := range tests { 101 t.Run(name, func(t *testing.T) { 102 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 103 assert.Equal(t, test.expectedPath, r.URL.String()) 104 assert.Equal(t, http.MethodGet, r.Method) 105 w.WriteHeader(test.responseStatus) 106 _, err := w.Write([]byte(test.responseBody)) 107 assert.NoError(t, err) 108 })) 109 client := mockAPIClient(t, mockServer) 110 result, err := client.GetPenaltyBoxConditions( 111 session.ContextWithOptions( 112 context.Background(), 113 session.WithContextHeaders(test.headers), 114 ), 115 test.params) 116 if test.withError != nil { 117 test.withError(t, err) 118 return 119 } 120 require.NoError(t, err) 121 assert.Equal(t, test.expectedResponse, result) 122 }) 123 } 124 } 125 126 func TestAppSec_UpdatePenaltyBoxConditions(t *testing.T) { 127 result := UpdatePenaltyBoxConditionsResponse{} 128 129 respData := compactJSON(loadFixtureBytes("testdata/TestPenaltyBoxConditions/PenaltyBoxConditions.json")) 130 err := json.Unmarshal([]byte(respData), &result) 131 require.NoError(t, err) 132 133 // eval Penalty Box conditions update test 134 reqData := PenaltyBoxConditionsPayload{} 135 err = json.Unmarshal(loadFixtureBytes("testdata/TestPenaltyBoxConditions/PenaltyBoxConditions.json"), &reqData) 136 require.NoError(t, err) 137 138 reqDataWithNoConditionOperator := PenaltyBoxConditionsPayload{ 139 ConditionOperator: "", 140 Conditions: &RuleConditions{}, 141 } 142 143 reqDataWithNoConditions := PenaltyBoxConditionsPayload{ 144 ConditionOperator: "AND", 145 Conditions: nil, 146 } 147 148 tests := map[string]struct { 149 params UpdatePenaltyBoxConditionsRequest 150 responseStatus int 151 responseBody string 152 expectedPath string 153 expectedResponse *UpdatePenaltyBoxConditionsResponse 154 withError func(*testing.T, error) 155 headers http.Header 156 }{ 157 "validation errors - PolicyID cannot be empty string": { 158 params: UpdatePenaltyBoxConditionsRequest{ 159 ConfigID: 43253, 160 Version: 15, 161 ConditionsPayload: reqData, 162 PolicyID: "", 163 }, 164 withError: func(t *testing.T, err error) { 165 assert.Equal(t, "struct validation: PolicyID: cannot be blank", err.Error()) 166 }, 167 headers: nil, 168 }, 169 "validation errors - PolicyID cannot be blank": { 170 params: UpdatePenaltyBoxConditionsRequest{ 171 ConfigID: 43253, 172 Version: 15, 173 ConditionsPayload: reqData, 174 }, 175 withError: func(t *testing.T, err error) { 176 assert.Equal(t, "struct validation: PolicyID: cannot be blank", err.Error()) 177 }, 178 }, 179 "validation errors - ConfigID cannot be blank": { 180 params: UpdatePenaltyBoxConditionsRequest{ 181 PolicyID: "AAAA_81230", 182 Version: 15, 183 ConditionsPayload: reqData, 184 }, 185 withError: func(t *testing.T, err error) { 186 assert.Equal(t, "struct validation: ConfigID: cannot be blank", err.Error()) 187 }, 188 }, 189 "validation errors - Version cannot be blank": { 190 params: UpdatePenaltyBoxConditionsRequest{ 191 ConfigID: 43253, 192 PolicyID: "AAAA_81230", 193 ConditionsPayload: reqData, 194 }, 195 withError: func(t *testing.T, err error) { 196 assert.Equal(t, "struct validation: Version: cannot be blank", err.Error()) 197 }, 198 }, 199 "validation errors - Request body payload cannot be blank": { 200 params: UpdatePenaltyBoxConditionsRequest{ 201 ConfigID: 43253, 202 PolicyID: "AAAA_81230", 203 Version: 15, 204 }, 205 responseStatus: http.StatusInternalServerError, 206 responseBody: ` 207 { 208 "type": "internal_error", 209 "title": "Internal Server Error", 210 "detail": "Error creating PenaltyBoxConditions" 211 }`, 212 expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/AAAA_81230/penalty-box/conditions", 213 withError: func(t *testing.T, err error) { 214 assert.Equal(t, "struct validation: ConditionOperator: cannot be blank\nConditions: is required", err.Error()) 215 216 }, 217 }, 218 "validation errors - ConditionOperator cannot be blank": { 219 params: UpdatePenaltyBoxConditionsRequest{ 220 ConfigID: 43253, 221 Version: 15, 222 PolicyID: "AAAA_81230", 223 ConditionsPayload: reqDataWithNoConditionOperator, 224 }, 225 withError: func(t *testing.T, err error) { 226 assert.Equal(t, "struct validation: ConditionOperator: cannot be blank", err.Error()) 227 }, 228 }, 229 "validation errors - Conditions cannot be blank": { 230 params: UpdatePenaltyBoxConditionsRequest{ 231 ConfigID: 43253, 232 Version: 15, 233 PolicyID: "AAAA_81230", 234 ConditionsPayload: reqDataWithNoConditions, 235 }, 236 withError: func(t *testing.T, err error) { 237 assert.Equal(t, "struct validation: Conditions: is required", err.Error()) 238 }, 239 }, 240 "200 Success": { 241 params: UpdatePenaltyBoxConditionsRequest{ 242 ConfigID: 43253, 243 Version: 15, 244 PolicyID: "AAAA_81230", 245 ConditionsPayload: reqData, 246 }, 247 headers: http.Header{ 248 "Content-Type": []string{"application/json;charset=UTF-8"}, 249 }, 250 responseStatus: http.StatusCreated, 251 responseBody: respData, 252 expectedResponse: &result, 253 expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/AAAA_81230/penalty-box/conditions", 254 }, 255 "500 internal server error": { 256 params: UpdatePenaltyBoxConditionsRequest{ 257 ConfigID: 43253, 258 Version: 15, 259 PolicyID: "AAAA_81230", 260 ConditionsPayload: reqData, 261 }, 262 responseStatus: http.StatusInternalServerError, 263 responseBody: ` 264 { 265 "type": "internal_error", 266 "title": "Internal Server Error", 267 "detail": "Error creating PenaltyBoxConditions" 268 }`, 269 expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/AAAA_81230/penalty-box/conditions", 270 withError: func(t *testing.T, err error) { 271 want := &Error{ 272 Type: "internal_error", 273 Title: "Internal Server Error", 274 Detail: "Error creating PenaltyBoxConditions", 275 StatusCode: http.StatusInternalServerError, 276 } 277 assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err) 278 }, 279 }, 280 } 281 282 for name, test := range tests { 283 t.Run(name, func(t *testing.T) { 284 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 285 assert.Equal(t, http.MethodPut, r.Method) 286 w.WriteHeader(test.responseStatus) 287 if len(test.responseBody) > 0 { 288 _, err := w.Write([]byte(test.responseBody)) 289 assert.NoError(t, err) 290 } 291 })) 292 client := mockAPIClient(t, mockServer) 293 result, err := client.UpdatePenaltyBoxConditions( 294 session.ContextWithOptions( 295 context.Background(), 296 session.WithContextHeaders(test.headers)), test.params) 297 if test.withError != nil { 298 test.withError(t, err) 299 return 300 } 301 require.NoError(t, err) 302 assert.Equal(t, test.expectedResponse, result) 303 }) 304 } 305 }