github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/cps/deployment_schedules_test.go (about) 1 package cps 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/tools" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func TestGetDeploymentSchedule(t *testing.T) { 17 tests := map[string]struct { 18 params GetDeploymentScheduleRequest 19 expectedPath string 20 expectedHeaders map[string]string 21 expectedResponse *DeploymentSchedule 22 responseStatus int 23 responseBody string 24 withError func(*testing.T, error) 25 }{ 26 "200 OK": { 27 params: GetDeploymentScheduleRequest{ 28 ChangeID: 1, 29 EnrollmentID: 10, 30 }, 31 responseStatus: http.StatusOK, 32 responseBody: `{ 33 "notAfter": "2021-11-03T08:02:46.655484Z", 34 "notBefore": "2021-10-03T08:02:46.655484Z" 35 }`, 36 expectedPath: "/cps/v2/enrollments/10/changes/1/deployment-schedule", 37 expectedHeaders: map[string]string{ 38 "Accept": "application/vnd.akamai.cps.deployment-schedule.v1+json", 39 }, 40 expectedResponse: &DeploymentSchedule{ 41 NotAfter: tools.StringPtr("2021-11-03T08:02:46.655484Z"), 42 NotBefore: tools.StringPtr("2021-10-03T08:02:46.655484Z"), 43 }, 44 }, 45 "500 internal server error": { 46 params: GetDeploymentScheduleRequest{ 47 ChangeID: 1, 48 EnrollmentID: 10, 49 }, 50 responseStatus: http.StatusInternalServerError, 51 responseBody: ` 52 { 53 "type": "internal_error", 54 "title": "Internal Server Error", 55 "detail": "Error making request", 56 "status": 500 57 }`, 58 expectedPath: "/cps/v2/enrollments/10/changes/1/deployment-schedule", 59 withError: func(t *testing.T, err error) { 60 want := &Error{ 61 Type: "internal_error", 62 Title: "Internal Server Error", 63 Detail: "Error making request", 64 StatusCode: http.StatusInternalServerError, 65 } 66 assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err) 67 }, 68 }, 69 "validation error missing change_id": { 70 params: GetDeploymentScheduleRequest{ 71 EnrollmentID: 10, 72 }, 73 expectedPath: "/cps/v2/enrollments/10/changes/1/deployment-schedule", 74 withError: func(t *testing.T, err error) { 75 assert.Containsf(t, err.Error(), "ChangeID: cannot be blank.", "want: %s; got: %s", ErrStructValidation, err) 76 assert.True(t, errors.Is(err, ErrStructValidation), "want: %s; got: %s", ErrStructValidation, err) 77 }, 78 }, 79 "validation error missing enorollment_id": { 80 params: GetDeploymentScheduleRequest{ 81 ChangeID: 1, 82 }, 83 expectedPath: "/cps/v2/enrollments/10/changes/1/deployment-schedule", 84 withError: func(t *testing.T, err error) { 85 assert.Containsf(t, err.Error(), "EnrollmentID: cannot be blank.", "want: %s; got: %s", ErrStructValidation, err) 86 assert.True(t, errors.Is(err, ErrStructValidation), "want: %s; got: %s", ErrStructValidation, err) 87 }, 88 }, 89 } 90 91 for name, test := range tests { 92 t.Run(name, func(t *testing.T) { 93 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 94 assert.Equal(t, test.expectedPath, r.URL.String()) 95 assert.Equal(t, http.MethodGet, r.Method) 96 for k, v := range test.expectedHeaders { 97 assert.Equal(t, v, r.Header.Get(k)) 98 } 99 w.WriteHeader(test.responseStatus) 100 _, err := w.Write([]byte(test.responseBody)) 101 assert.NoError(t, err) 102 })) 103 client := mockAPIClient(t, mockServer) 104 result, err := client.GetDeploymentSchedule(context.Background(), test.params) 105 if test.withError != nil { 106 test.withError(t, err) 107 return 108 } 109 require.NoError(t, err) 110 assert.Equal(t, test.expectedResponse, result) 111 }) 112 } 113 } 114 115 func TestUpdateDeploymentSchedule(t *testing.T) { 116 tests := map[string]struct { 117 params UpdateDeploymentScheduleRequest 118 expectedPath string 119 expectedHeaders map[string]string 120 expectedRequestBody string 121 expectedResponse *UpdateDeploymentScheduleResponse 122 responseStatus int 123 responseBody string 124 withError func(*testing.T, error) 125 }{ 126 "200 OK - update deployment schedule": { 127 params: UpdateDeploymentScheduleRequest{ 128 ChangeID: 1, 129 EnrollmentID: 10, 130 DeploymentSchedule: DeploymentSchedule{ 131 NotAfter: tools.StringPtr("2021-11-03T08:02:46.655484Z"), 132 NotBefore: tools.StringPtr("2021-10-03T08:02:46.655484Z"), 133 }, 134 }, 135 responseStatus: http.StatusOK, 136 responseBody: `{ 137 "change": "test_change" 138 }`, 139 expectedRequestBody: `{"notAfter":"2021-11-03T08:02:46.655484Z","notBefore":"2021-10-03T08:02:46.655484Z"}`, 140 expectedPath: "/cps/v2/enrollments/10/changes/1/deployment-schedule", 141 expectedHeaders: map[string]string{ 142 "Accept": "application/vnd.akamai.cps.change-id.v1+json", 143 "Content-type": "application/vnd.akamai.cps.deployment-schedule.v1+json; charset=utf-8", 144 }, 145 expectedResponse: &UpdateDeploymentScheduleResponse{ 146 Change: "test_change", 147 }, 148 }, 149 "500 internal server error": { 150 params: UpdateDeploymentScheduleRequest{ 151 ChangeID: 1, 152 EnrollmentID: 10, 153 DeploymentSchedule: DeploymentSchedule{ 154 NotAfter: tools.StringPtr("2021-11-03T08:02:46.655484Z"), 155 NotBefore: tools.StringPtr("2021-10-03T08:02:46.655484Z"), 156 }, 157 }, 158 responseStatus: http.StatusInternalServerError, 159 responseBody: ` 160 { 161 "type": "internal_error", 162 "title": "Internal Server Error", 163 "detail": "Error making request", 164 "status": 500 165 }`, 166 expectedPath: "/cps/v2/enrollments/10/changes/1/deployment-schedule", 167 withError: func(t *testing.T, err error) { 168 want := &Error{ 169 Type: "internal_error", 170 Title: "Internal Server Error", 171 Detail: "Error making request", 172 StatusCode: http.StatusInternalServerError, 173 } 174 assert.True(t, errors.Is(err, want), "want: %s; got: %s", want, err) 175 }, 176 }, 177 "validation error missing change_id": { 178 params: UpdateDeploymentScheduleRequest{ 179 EnrollmentID: 10, 180 DeploymentSchedule: DeploymentSchedule{ 181 NotAfter: tools.StringPtr("2021-11-03T08:02:46.655484Z"), 182 NotBefore: tools.StringPtr("2021-10-03T08:02:46.655484Z"), 183 }, 184 }, 185 expectedPath: "/cps/v2/enrollments/10/changes/1/deployment-schedule", 186 withError: func(t *testing.T, err error) { 187 assert.Containsf(t, err.Error(), "ChangeID: cannot be blank.", "want: %s; got: %s", ErrStructValidation, err) 188 assert.True(t, errors.Is(err, ErrStructValidation), "want: %s; got: %s", ErrStructValidation, err) 189 }, 190 }, 191 "validation error missing enorollment_id": { 192 params: UpdateDeploymentScheduleRequest{ 193 ChangeID: 1, 194 DeploymentSchedule: DeploymentSchedule{ 195 NotAfter: tools.StringPtr("2021-11-03T08:02:46.655484Z"), 196 NotBefore: tools.StringPtr("2021-10-03T08:02:46.655484Z"), 197 }, 198 }, 199 expectedPath: "/cps/v2/enrollments/10/changes/1/deployment-schedule", 200 withError: func(t *testing.T, err error) { 201 assert.Containsf(t, err.Error(), "EnrollmentID: cannot be blank.", "want: %s; got: %s", ErrStructValidation, err) 202 assert.True(t, errors.Is(err, ErrStructValidation), "want: %s; got: %s", ErrStructValidation, err) 203 }, 204 }, 205 } 206 207 for name, test := range tests { 208 t.Run(name, func(t *testing.T) { 209 mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 210 assert.Equal(t, test.expectedPath, r.URL.String()) 211 assert.Equal(t, http.MethodPut, r.Method) 212 for k, v := range test.expectedHeaders { 213 assert.Equal(t, v, r.Header.Get(k)) 214 } 215 w.WriteHeader(test.responseStatus) 216 _, err := w.Write([]byte(test.responseBody)) 217 assert.NoError(t, err) 218 219 if len(test.expectedRequestBody) > 0 { 220 body, err := ioutil.ReadAll(r.Body) 221 require.NoError(t, err) 222 assert.Equal(t, test.expectedRequestBody, string(body)) 223 } 224 })) 225 client := mockAPIClient(t, mockServer) 226 result, err := client.UpdateDeploymentSchedule(context.Background(), test.params) 227 if test.withError != nil { 228 test.withError(t, err) 229 return 230 } 231 require.NoError(t, err) 232 assert.Equal(t, test.expectedResponse, result) 233 }) 234 } 235 }