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 }