github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/appsec/advanced_settings_pii_learning_test.go (about)

     1  package appsec
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"errors"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/session"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func TestAppsec_GetAdvancedSettingsPIILearning(t *testing.T) {
    18  
    19  	result := AdvancedSettingsPIILearningResponse{}
    20  
    21  	respData := compactJSON(loadFixtureBytes("testdata/TestAdvancedSettingsPIILearning/AdvancedSettingsPIILearning.json"))
    22  	err := json.Unmarshal([]byte(respData), &result)
    23  	require.NoError(t, err)
    24  
    25  	tests := map[string]struct {
    26  		params           GetAdvancedSettingsPIILearningRequest
    27  		responseStatus   int
    28  		responseBody     string
    29  		expectedPath     string
    30  		expectedResponse *AdvancedSettingsPIILearningResponse
    31  		withError        error
    32  	}{
    33  		"200 OK": {
    34  			params: GetAdvancedSettingsPIILearningRequest{
    35  				ConfigVersion: ConfigVersion{
    36  					ConfigID: 43253,
    37  					Version:  15,
    38  				},
    39  			},
    40  			responseStatus:   http.StatusOK,
    41  			responseBody:     string(respData),
    42  			expectedPath:     "/appsec/v1/configs/43253/versions/15/advanced-settings/pii-learning",
    43  			expectedResponse: &result,
    44  		},
    45  		"500 internal server error": {
    46  			params: GetAdvancedSettingsPIILearningRequest{
    47  				ConfigVersion: ConfigVersion{
    48  					ConfigID: 43253,
    49  					Version:  15,
    50  				},
    51  			},
    52  			responseStatus: http.StatusInternalServerError,
    53  			responseBody: `
    54  {
    55      "type": "internal_error",
    56      "title": "Internal Server Error",
    57      "detail": "Error fetching AdvancedSettingsPIILearning",
    58      "status": 500
    59  }`,
    60  			expectedPath: "/appsec/v1/configs/43253/versions/15/advanced-settings/pii-learning",
    61  			withError: &Error{
    62  				Type:       "internal_error",
    63  				Title:      "Internal Server Error",
    64  				Detail:     "Error fetching AdvancedSettingsPIILearning",
    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.GetAdvancedSettingsPIILearning(
    81  				session.ContextWithOptions(context.Background()),
    82  				test.params)
    83  			if test.withError != nil {
    84  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
    85  				return
    86  			}
    87  			require.NoError(t, err)
    88  			assert.Equal(t, test.expectedResponse, result)
    89  		})
    90  	}
    91  }
    92  
    93  func TestAppSec_UpdateAdvancedSettingsPIILearning(t *testing.T) {
    94  	result := AdvancedSettingsPIILearningResponse{}
    95  
    96  	respData := compactJSON(loadFixtureBytes("testdata/TestAdvancedSettingsPIILearning/AdvancedSettingsPIILearning.json"))
    97  	err := json.Unmarshal([]byte(respData), &result)
    98  	require.NoError(t, err)
    99  
   100  	req := UpdateAdvancedSettingsPIILearningRequest{}
   101  
   102  	reqData := compactJSON(loadFixtureBytes("testdata/TestAdvancedSettingsPIILearning/AdvancedSettingsPIILearning.json"))
   103  	err = json.Unmarshal([]byte(reqData), &req)
   104  	require.NoError(t, err)
   105  
   106  	tests := map[string]struct {
   107  		params                UpdateAdvancedSettingsPIILearningRequest
   108  		responseStatus        int
   109  		responseBody          string
   110  		expectedPath          string
   111  		expectedResponse      *AdvancedSettingsPIILearningResponse
   112  		withError             error
   113  		expectedBody          string
   114  		expectValidationError bool
   115  	}{
   116  		"validation error": {
   117  			params: UpdateAdvancedSettingsPIILearningRequest{
   118  				ConfigVersion: ConfigVersion{
   119  					ConfigID: 43253,
   120  				},
   121  				EnablePIILearning: false,
   122  			},
   123  			expectValidationError: true,
   124  		},
   125  		"200 Success": {
   126  			params: UpdateAdvancedSettingsPIILearningRequest{
   127  				ConfigVersion: ConfigVersion{
   128  					ConfigID: 43253,
   129  					Version:  15,
   130  				},
   131  				EnablePIILearning: true,
   132  			},
   133  			expectedBody: `
   134  		{
   135  			"enablePiiLearning": true
   136  		}`,
   137  			responseStatus:   http.StatusCreated,
   138  			responseBody:     respData,
   139  			expectedResponse: &result,
   140  			expectedPath:     "/appsec/v1/configs/43253/versions/15/advanced-settings/pii-learning",
   141  		},
   142  		"500 internal server error": {
   143  			params: UpdateAdvancedSettingsPIILearningRequest{
   144  				ConfigVersion: ConfigVersion{
   145  					ConfigID: 43253,
   146  					Version:  15,
   147  				},
   148  				EnablePIILearning: true,
   149  			},
   150  			responseStatus: http.StatusInternalServerError,
   151  			responseBody: `
   152  					{
   153  						"type": "internal_error",
   154  						"title": "Internal Server Error",
   155  						"detail": "Error creating AdvancedSettingsPIILearning"
   156  					}`,
   157  			expectedPath: "/appsec/v1/configs/43253/versions/15/advanced-settings/pii-learning",
   158  			withError: &Error{
   159  				Type:       "internal_error",
   160  				Title:      "Internal Server Error",
   161  				Detail:     "Error creating AdvancedSettingsPIILearning",
   162  				StatusCode: http.StatusInternalServerError,
   163  			},
   164  		},
   165  	}
   166  
   167  	for name, test := range tests {
   168  		t.Run(name, func(t *testing.T) {
   169  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   170  				assert.Equal(t, http.MethodPut, r.Method)
   171  				w.WriteHeader(test.responseStatus)
   172  				if len(test.responseBody) > 0 {
   173  					_, err := w.Write([]byte(test.responseBody))
   174  					assert.NoError(t, err)
   175  				}
   176  				if test.withError == nil {
   177  					var reqBody interface{}
   178  					err = json.NewDecoder(r.Body).Decode(&reqBody)
   179  					require.NoError(t, err, "Error while decoding request body")
   180  
   181  					var expectedBody interface{}
   182  					err = json.Unmarshal([]byte(test.expectedBody), &expectedBody)
   183  					require.NoError(t, err, "Error while parsing expected body to JSON")
   184  
   185  					assert.Equal(t, expectedBody, reqBody)
   186  				}
   187  			}))
   188  			client := mockAPIClient(t, mockServer)
   189  			result, err := client.UpdateAdvancedSettingsPIILearning(
   190  				session.ContextWithOptions(context.Background()),
   191  				test.params)
   192  			if test.expectValidationError {
   193  				assert.True(t, strings.Contains(err.Error(), "struct validation"))
   194  				return
   195  			}
   196  			if test.withError != nil {
   197  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   198  				return
   199  			}
   200  			require.NoError(t, err)
   201  			assert.Equal(t, test.expectedResponse, result)
   202  		})
   203  	}
   204  }