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  }