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