github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/appsec/tuning_recommendations_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/v2/pkg/session"
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestAppSec_GetTuningRecommendations(t *testing.T) {
    17  
    18  	result := GetTuningRecommendationsResponse{}
    19  
    20  	respData := compactJSON(loadFixtureBytes("testdata/TestTuningRecommendations/Recommendations.json"))
    21  	json.Unmarshal([]byte(respData), &result)
    22  
    23  	tests := map[string]struct {
    24  		params           GetTuningRecommendationsRequest
    25  		responseStatus   int
    26  		responseBody     string
    27  		expectedPath     string
    28  		expectedResponse *GetTuningRecommendationsResponse
    29  		withError        error
    30  		headers          http.Header
    31  	}{
    32  		"200 OK": {
    33  			params: GetTuningRecommendationsRequest{
    34  				ConfigID:    43253,
    35  				Version:     15,
    36  				PolicyID:    "AAAA_81230",
    37  				RulesetType: RulesetTypeActive,
    38  			},
    39  			headers: http.Header{
    40  				"Content-Type": []string{"application/json"},
    41  			},
    42  			responseStatus:   http.StatusOK,
    43  			responseBody:     string(respData),
    44  			expectedPath:     "/appsec/v1/configs/43253/versions/15/security-policies/AAAA_81230/recommendations?standardException=true&type=active",
    45  			expectedResponse: &result,
    46  		},
    47  		"500 internal server error": {
    48  			params: GetTuningRecommendationsRequest{
    49  				ConfigID:    43253,
    50  				Version:     15,
    51  				PolicyID:    "AAAA_81230",
    52  				RulesetType: RulesetTypeEvaluation,
    53  			},
    54  			headers:        http.Header{},
    55  			responseStatus: http.StatusInternalServerError,
    56  			responseBody: `
    57  {
    58      "type": "internal_error",
    59      "title": "Internal Server Error",
    60      "detail": "Error fetching propertys",
    61      "status": 500
    62  }`,
    63  			expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/AAAA_81230/recommendations?standardException=true&type=evaluation",
    64  			withError: &Error{
    65  				Type:       "internal_error",
    66  				Title:      "Internal Server Error",
    67  				Detail:     "Error fetching propertys",
    68  				StatusCode: http.StatusInternalServerError,
    69  			},
    70  		},
    71  	}
    72  
    73  	for name, test := range tests {
    74  		t.Run(name, func(t *testing.T) {
    75  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    76  				assert.Equal(t, test.expectedPath, r.URL.String())
    77  				assert.Equal(t, http.MethodGet, r.Method)
    78  				w.WriteHeader(test.responseStatus)
    79  				_, err := w.Write([]byte(test.responseBody))
    80  				assert.NoError(t, err)
    81  			}))
    82  			client := mockAPIClient(t, mockServer)
    83  			result, err := client.GetTuningRecommendations(
    84  				session.ContextWithOptions(
    85  					context.Background(),
    86  					session.WithContextHeaders(test.headers),
    87  				),
    88  				test.params)
    89  			if test.withError != nil {
    90  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
    91  				return
    92  			}
    93  			require.NoError(t, err)
    94  			assert.Equal(t, test.expectedResponse, result)
    95  		})
    96  	}
    97  }
    98  
    99  func TestAppSec_GetRuleRecommendations(t *testing.T) {
   100  
   101  	result := GetRuleRecommendationsResponse{}
   102  
   103  	respData := compactJSON(loadFixtureBytes("testdata/TestTuningRecommendations/RuleRecommendations.json"))
   104  	json.Unmarshal([]byte(respData), &result)
   105  
   106  	tests := map[string]struct {
   107  		params           GetRuleRecommendationsRequest
   108  		responseStatus   int
   109  		responseBody     string
   110  		expectedPath     string
   111  		expectedResponse *GetRuleRecommendationsResponse
   112  		withError        error
   113  		headers          http.Header
   114  	}{
   115  		"200 OK": {
   116  			params: GetRuleRecommendationsRequest{
   117  				ConfigID:    43253,
   118  				Version:     15,
   119  				PolicyID:    "AAAA_81230",
   120  				RuleID:      958008,
   121  				RulesetType: RulesetTypeEvaluation,
   122  			},
   123  			headers: http.Header{
   124  				"Content-Type": []string{"application/json"},
   125  			},
   126  			responseStatus:   http.StatusOK,
   127  			responseBody:     string(respData),
   128  			expectedPath:     "/appsec/v1/configs/43253/versions/15/security-policies/AAAA_81230/recommendations/rules/958008?standardException=true&type=evaluation",
   129  			expectedResponse: &result,
   130  		},
   131  		"500 internal server error": {
   132  			params: GetRuleRecommendationsRequest{
   133  				ConfigID:    43253,
   134  				Version:     15,
   135  				PolicyID:    "AAAA_81230",
   136  				RuleID:      958008,
   137  				RulesetType: RulesetTypeActive,
   138  			},
   139  			headers:        http.Header{},
   140  			responseStatus: http.StatusInternalServerError,
   141  			responseBody: `
   142  {
   143      "type": "internal_error",
   144      "title": "Internal Server Error",
   145      "detail": "Error fetching propertys",
   146      "status": 500
   147  }`,
   148  			expectedPath: "/appsec/v1/configs/43253/versions/15/security-policies/AAAA_81230/recommendations/rules/958008?standardException=true&type=active",
   149  			withError: &Error{
   150  				Type:       "internal_error",
   151  				Title:      "Internal Server Error",
   152  				Detail:     "Error fetching propertys",
   153  				StatusCode: http.StatusInternalServerError,
   154  			},
   155  		},
   156  	}
   157  
   158  	for name, test := range tests {
   159  		t.Run(name, func(t *testing.T) {
   160  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   161  				assert.Equal(t, test.expectedPath, r.URL.String())
   162  				assert.Equal(t, http.MethodGet, r.Method)
   163  				w.WriteHeader(test.responseStatus)
   164  				_, err := w.Write([]byte(test.responseBody))
   165  				assert.NoError(t, err)
   166  			}))
   167  			client := mockAPIClient(t, mockServer)
   168  			result, err := client.GetRuleRecommendations(
   169  				session.ContextWithOptions(
   170  					context.Background(),
   171  					session.WithContextHeaders(test.headers),
   172  				),
   173  				test.params)
   174  			if test.withError != nil {
   175  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   176  				return
   177  			}
   178  			require.NoError(t, err)
   179  			assert.Equal(t, test.expectedResponse, result)
   180  		})
   181  	}
   182  }