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

     1  package botman
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"io/ioutil"
     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  // Test Get CustomClientSequence
    17  func TestBotman_GetCustomClientSequence(t *testing.T) {
    18  	tests := map[string]struct {
    19  		params           GetCustomClientSequenceRequest
    20  		responseStatus   int
    21  		responseBody     string
    22  		expectedPath     string
    23  		expectedResponse *CustomClientSequenceResponse
    24  		withError        func(*testing.T, error)
    25  	}{
    26  		"200 OK": {
    27  			params: GetCustomClientSequenceRequest{
    28  				ConfigID: 43253,
    29  				Version:  15,
    30  			},
    31  			responseStatus: http.StatusOK,
    32  			responseBody:   `{"sequence":["cc9c3f89-e179-4892-89cf-d5e623ba9dc7","d79285df-e399-43e8-bb0f-c0d980a88e4f","afa309b8-4fd5-430e-a061-1c61df1d2ac2"]}`,
    33  			expectedPath:   "/appsec/v1/configs/43253/versions/15/custom-client-sequence",
    34  			expectedResponse: &CustomClientSequenceResponse{
    35  				Sequence: []string{"cc9c3f89-e179-4892-89cf-d5e623ba9dc7", "d79285df-e399-43e8-bb0f-c0d980a88e4f", "afa309b8-4fd5-430e-a061-1c61df1d2ac2"},
    36  			},
    37  		},
    38  		"500 internal server error": {
    39  			params: GetCustomClientSequenceRequest{
    40  				ConfigID: 43253,
    41  				Version:  15,
    42  			},
    43  			responseStatus: http.StatusInternalServerError,
    44  			responseBody: `
    45  			{
    46  				"type": "internal_error",
    47  				"title": "Internal Server Error",
    48  				"detail": "Error fetching data"
    49  			}`,
    50  			expectedPath: "/appsec/v1/configs/43253/versions/15/custom-client-sequence",
    51  			withError: func(t *testing.T, err error) {
    52  				want := &Error{
    53  					Type:       "internal_error",
    54  					Title:      "Internal Server Error",
    55  					Detail:     "Error fetching data",
    56  					StatusCode: http.StatusInternalServerError,
    57  				}
    58  				assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err)
    59  			},
    60  		},
    61  		"Missing ConfigID": {
    62  			params: GetCustomClientSequenceRequest{
    63  				Version: 15,
    64  			},
    65  			withError: func(t *testing.T, err error) {
    66  				want := ErrStructValidation
    67  				assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err)
    68  				assert.Contains(t, err.Error(), "ConfigID")
    69  			},
    70  		},
    71  		"Missing Version": {
    72  			params: GetCustomClientSequenceRequest{
    73  				ConfigID: 43253,
    74  			},
    75  			withError: func(t *testing.T, err error) {
    76  				want := ErrStructValidation
    77  				assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err)
    78  				assert.Contains(t, err.Error(), "Version")
    79  			},
    80  		},
    81  	}
    82  
    83  	for name, test := range tests {
    84  		t.Run(name, func(t *testing.T) {
    85  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    86  				assert.Equal(t, test.expectedPath, r.URL.String())
    87  				assert.Equal(t, http.MethodGet, r.Method)
    88  				w.WriteHeader(test.responseStatus)
    89  				_, err := w.Write([]byte(test.responseBody))
    90  				assert.NoError(t, err)
    91  			}))
    92  			client := mockAPIClient(t, mockServer)
    93  			result, err := client.GetCustomClientSequence(context.Background(), test.params)
    94  			if test.withError != nil {
    95  				test.withError(t, err)
    96  				return
    97  			}
    98  			require.NoError(t, err)
    99  			assert.Equal(t, test.expectedResponse, result)
   100  		})
   101  	}
   102  }
   103  
   104  // Test Update CustomClientSequence.
   105  func TestBotman_UpdateCustomClientSequence(t *testing.T) {
   106  	tests := map[string]struct {
   107  		params              UpdateCustomClientSequenceRequest
   108  		expectedRequestBody string
   109  		responseStatus      int
   110  		responseBody        string
   111  		expectedPath        string
   112  		expectedResponse    *CustomClientSequenceResponse
   113  		withError           func(*testing.T, error)
   114  	}{
   115  		"200 Success": {
   116  			params: UpdateCustomClientSequenceRequest{
   117  				ConfigID: 43253,
   118  				Version:  15,
   119  				Sequence: []string{"cc9c3f89-e179-4892-89cf-d5e623ba9dc7", "d79285df-e399-43e8-bb0f-c0d980a88e4f", "afa309b8-4fd5-430e-a061-1c61df1d2ac2"},
   120  			},
   121  			expectedRequestBody: `{"sequence":["cc9c3f89-e179-4892-89cf-d5e623ba9dc7","d79285df-e399-43e8-bb0f-c0d980a88e4f","afa309b8-4fd5-430e-a061-1c61df1d2ac2"]}`,
   122  			responseStatus:      http.StatusOK,
   123  			responseBody:        `{"sequence":["cc9c3f89-e179-4892-89cf-d5e623ba9dc7", "d79285df-e399-43e8-bb0f-c0d980a88e4f", "afa309b8-4fd5-430e-a061-1c61df1d2ac2"]}`,
   124  			expectedResponse: &CustomClientSequenceResponse{
   125  				Sequence: []string{"cc9c3f89-e179-4892-89cf-d5e623ba9dc7", "d79285df-e399-43e8-bb0f-c0d980a88e4f", "afa309b8-4fd5-430e-a061-1c61df1d2ac2"},
   126  			},
   127  			expectedPath: "/appsec/v1/configs/43253/versions/15/custom-client-sequence",
   128  		},
   129  		"500 internal server error": {
   130  			params: UpdateCustomClientSequenceRequest{
   131  				ConfigID: 43253,
   132  				Version:  15,
   133  				Sequence: []string{"cc9c3f89-e179-4892-89cf-d5e623ba9dc7", "d79285df-e399-43e8-bb0f-c0d980a88e4f", "afa309b8-4fd5-430e-a061-1c61df1d2ac2"},
   134  			},
   135  			responseStatus: http.StatusInternalServerError,
   136  			responseBody: `
   137  			{
   138  				"type": "internal_error",
   139  				"title": "Internal Server Error",
   140  				"detail": "Error updating data"
   141  			}`,
   142  			expectedPath: "/appsec/v1/configs/43253/versions/15/custom-client-sequence",
   143  			withError: func(t *testing.T, err error) {
   144  				want := &Error{
   145  					Type:       "internal_error",
   146  					Title:      "Internal Server Error",
   147  					Detail:     "Error updating data",
   148  					StatusCode: http.StatusInternalServerError,
   149  				}
   150  				assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err)
   151  			},
   152  		},
   153  		"Missing ConfigID": {
   154  			params: UpdateCustomClientSequenceRequest{
   155  				Version:  15,
   156  				Sequence: []string{"cc9c3f89-e179-4892-89cf-d5e623ba9dc7", "d79285df-e399-43e8-bb0f-c0d980a88e4f", "afa309b8-4fd5-430e-a061-1c61df1d2ac2"},
   157  			},
   158  			withError: func(t *testing.T, err error) {
   159  				want := ErrStructValidation
   160  				assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err)
   161  				assert.Contains(t, err.Error(), "ConfigID")
   162  			},
   163  		},
   164  		"Missing Version": {
   165  			params: UpdateCustomClientSequenceRequest{
   166  				ConfigID: 43253,
   167  				Sequence: []string{"cc9c3f89-e179-4892-89cf-d5e623ba9dc7", "d79285df-e399-43e8-bb0f-c0d980a88e4f", "afa309b8-4fd5-430e-a061-1c61df1d2ac2"},
   168  			},
   169  			withError: func(t *testing.T, err error) {
   170  				want := ErrStructValidation
   171  				assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err)
   172  				assert.Contains(t, err.Error(), "Version")
   173  			},
   174  		},
   175  		"Missing Sequence": {
   176  			params: UpdateCustomClientSequenceRequest{
   177  				ConfigID: 43253,
   178  				Version:  15,
   179  			},
   180  			withError: func(t *testing.T, err error) {
   181  				want := ErrStructValidation
   182  				assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err)
   183  				assert.Contains(t, err.Error(), "Sequence")
   184  			},
   185  		},
   186  	}
   187  
   188  	for name, test := range tests {
   189  		t.Run(name, func(t *testing.T) {
   190  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   191  				assert.Equal(t, test.expectedPath, r.URL.String())
   192  				assert.Equal(t, http.MethodPut, r.Method)
   193  				w.WriteHeader(test.responseStatus)
   194  				if len(test.responseBody) > 0 {
   195  					_, err := w.Write([]byte(test.responseBody))
   196  					assert.NoError(t, err)
   197  				}
   198  
   199  				if len(test.expectedRequestBody) > 0 {
   200  					body, err := ioutil.ReadAll(r.Body)
   201  					require.NoError(t, err)
   202  					assert.Equal(t, test.expectedRequestBody, string(body))
   203  				}
   204  			}))
   205  			client := mockAPIClient(t, mockServer)
   206  			result, err := client.UpdateCustomClientSequence(
   207  				session.ContextWithOptions(
   208  					context.Background()), test.params)
   209  			if test.withError != nil {
   210  				test.withError(t, err)
   211  				return
   212  			}
   213  			require.NoError(t, err)
   214  			assert.Equal(t, test.expectedResponse, result)
   215  		})
   216  	}
   217  }