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  }