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

     1  package edgeworkers
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"errors"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"strconv"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestGetEdgeWorkerVersion(t *testing.T) {
    17  	tests := map[string]struct {
    18  		params           GetEdgeWorkerVersionRequest
    19  		responseStatus   int
    20  		responseBody     string
    21  		expectedPath     string
    22  		expectedResponse *EdgeWorkerVersion
    23  		withError        error
    24  	}{
    25  		"200 OK - get EdgeWorkerVersion": {
    26  			params: GetEdgeWorkerVersionRequest{
    27  				EdgeWorkerID: 12345,
    28  				Version:      "1.2.3",
    29  			},
    30  			responseStatus: http.StatusOK,
    31  			responseBody: `
    32  {
    33      "edgeWorkerId": 12345,
    34  	"version": "1.2.3",
    35      "accountId": "B-123-WNKA6P",
    36  	"checksum": "868f28f16c26f46d418d83e24973520534d9ea4e4dbfd8a69ab00c1c37f28ca4",
    37  	"sequenceNumber": 3,
    38      "createdBy": "jbond",
    39      "createdTime": "2021-04-19T07:08:37Z"
    40  }
    41  `,
    42  			expectedPath: "/edgeworkers/v1/ids/12345/versions/1.2.3",
    43  			expectedResponse: &EdgeWorkerVersion{
    44  				EdgeWorkerID:   12345,
    45  				Version:        "1.2.3",
    46  				AccountID:      "B-123-WNKA6P",
    47  				Checksum:       "868f28f16c26f46d418d83e24973520534d9ea4e4dbfd8a69ab00c1c37f28ca4",
    48  				SequenceNumber: 3,
    49  				CreatedBy:      "jbond",
    50  				CreatedTime:    "2021-04-19T07:08:37Z",
    51  			},
    52  		},
    53  		"500 internal server error": {
    54  			params: GetEdgeWorkerVersionRequest{
    55  				EdgeWorkerID: 12345,
    56  				Version:      "1.2.3",
    57  			},
    58  			responseStatus: http.StatusInternalServerError,
    59  			responseBody: `
    60  {
    61    "type": "https://problems.luna-dev.akamaiapis.net/-/resource-impl/forward-origin-error",
    62    "title": "Server Error",
    63    "status": 500,
    64    "instance": "host_name/edgeworkers/v1/ids/12345/versions/1.2.3",
    65    "method": "GET",
    66    "serverIp": "10.0.0.1",
    67    "clientIp": "192.168.0.1",
    68    "requestId": "a73affa111",
    69    "requestTime": "2021-12-06T10:27:11Z"
    70  }`,
    71  			expectedPath: "/edgeworkers/v1/ids/12345/versions/1.2.3",
    72  			withError: &Error{
    73  				Type:        "https://problems.luna-dev.akamaiapis.net/-/resource-impl/forward-origin-error",
    74  				Title:       "Server Error",
    75  				Status:      500,
    76  				Instance:    "host_name/edgeworkers/v1/ids/12345/versions/1.2.3",
    77  				Method:      "GET",
    78  				ServerIP:    "10.0.0.1",
    79  				ClientIP:    "192.168.0.1",
    80  				RequestID:   "a73affa111",
    81  				RequestTime: "2021-12-06T10:27:11Z",
    82  			},
    83  		},
    84  		"missing EdgeWorkerID": {
    85  			params: GetEdgeWorkerVersionRequest{
    86  				Version: "1.2.3",
    87  			},
    88  			withError: ErrStructValidation,
    89  		},
    90  		"missing Version": {
    91  			params: GetEdgeWorkerVersionRequest{
    92  				EdgeWorkerID: 12345,
    93  			},
    94  			withError: ErrStructValidation,
    95  		},
    96  		"403 Forbidden - incorrect credentials": {
    97  			params: GetEdgeWorkerVersionRequest{
    98  				EdgeWorkerID: 12345,
    99  				Version:      "1.2.3",
   100  			},
   101  			responseStatus: http.StatusForbidden,
   102  			responseBody: `
   103  {
   104      "type": "https://problems.luna-dev.akamaiapis.net/-/pep-authz/deny",
   105      "title": "Forbidden",
   106      "status": 403,
   107      "detail": "The client does not have the grant needed for the request",
   108      "instance": "host_name/edgeworkers/v1/ids/12345/versions/1.2.3",
   109      "authzRealm": "scuomder224df6ct.dkekfr3qqg4dghpj",
   110      "method": "GET",
   111      "serverIp": "10.0.0.1",
   112      "clientIp": "192.168.0.1",
   113      "requestId": "a73affa111",
   114      "requestTime": "2021-12-06T12:45:09Z"
   115  }`,
   116  			expectedPath: "/edgeworkers/v1/ids/12345/versions/1.2.3",
   117  			withError: &Error{
   118  				Type:        "https://problems.luna-dev.akamaiapis.net/-/pep-authz/deny",
   119  				Title:       "Forbidden",
   120  				Status:      403,
   121  				Detail:      "The client does not have the grant needed for the request",
   122  				Instance:    "host_name/edgeworkers/v1/ids/12345/versions/1.2.3",
   123  				AuthzRealm:  "scuomder224df6ct.dkekfr3qqg4dghpj",
   124  				Method:      "GET",
   125  				ServerIP:    "10.0.0.1",
   126  				ClientIP:    "192.168.0.1",
   127  				RequestID:   "a73affa111",
   128  				RequestTime: "2021-12-06T12:45:09Z",
   129  			},
   130  		},
   131  		"404 Not Found - EdgeWorkerID doesn't exist": {
   132  			params: GetEdgeWorkerVersionRequest{
   133  				EdgeWorkerID: 12345,
   134  				Version:      "1.2.3",
   135  			},
   136  			responseStatus: http.StatusForbidden,
   137  			responseBody: `
   138  {
   139      "type": "/edgeworkers/error-types/edgeworkers-not-found",
   140      "title": "The given resource could not be found.",
   141      "detail": "Unable to find the requested version",
   142      "instance": "/edgeworkers/error-instances/86d1cc10-4baf-49e1-b81a-075b72a2f6a4",
   143      "status": 404,
   144      "errorCode": "EW2002"
   145  }`,
   146  			expectedPath: "/edgeworkers/v1/ids/12345/versions/1.2.3",
   147  			withError: &Error{
   148  				Type:      "/edgeworkers/error-types/edgeworkers-not-found",
   149  				Title:     "The given resource could not be found.",
   150  				Detail:    "Unable to find the requested version",
   151  				Status:    404,
   152  				Instance:  "/edgeworkers/error-instances/86d1cc10-4baf-49e1-b81a-075b72a2f6a4",
   153  				ErrorCode: "EW2002",
   154  			},
   155  		},
   156  	}
   157  
   158  	for name, test := range tests {
   159  		t.Run(name, func(t *testing.T) {
   160  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   161  				assert.Equal(t, test.expectedPath, r.URL.String())
   162  				assert.Equal(t, http.MethodGet, r.Method)
   163  				w.WriteHeader(test.responseStatus)
   164  				_, err := w.Write([]byte(test.responseBody))
   165  				assert.NoError(t, err)
   166  			}))
   167  			client := mockAPIClient(t, mockServer)
   168  			result, err := client.GetEdgeWorkerVersion(context.Background(), test.params)
   169  			if test.withError != nil {
   170  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   171  				return
   172  			}
   173  			require.NoError(t, err)
   174  			assert.Equal(t, test.expectedResponse, result)
   175  		})
   176  	}
   177  }
   178  
   179  func TestListEdgeWorkerVersions(t *testing.T) {
   180  	tests := map[string]struct {
   181  		params           ListEdgeWorkerVersionsRequest
   182  		responseStatus   int
   183  		responseBody     string
   184  		expectedPath     string
   185  		expectedResponse *ListEdgeWorkerVersionsResponse
   186  		withError        error
   187  	}{
   188  		"200 OK - list Edgeworker versions": {
   189  			params: ListEdgeWorkerVersionsRequest{
   190  				EdgeWorkerID: 88334,
   191  			},
   192  			responseStatus: http.StatusOK,
   193  			responseBody: `
   194  {
   195      "versions": [
   196          {
   197              "edgeWorkerId": 88334,
   198              "version": "1.23",
   199              "accountId": "B-3-WNKA6P",
   200              "checksum": "868f28f16c26f46d418d83e24973520534d9ea4e4dbfd8a69ab00c1c37f28ca4",
   201              "sequenceNumber": 3,
   202              "createdBy": "jsmith",
   203              "createdTime": "2021-12-20T08:28:37Z"
   204          },
   205          {
   206              "edgeWorkerId": 88334,
   207              "version": "1.24.5",
   208              "accountId": "B-3-WNKA6P",
   209              "checksum": "ad9c18a7f2ed5d7bbcd31c55b94a0a00ae1771c6a15fd9265aeae08f5ef41e1f",
   210              "sequenceNumber": 4,
   211              "createdBy": "jsmith",
   212              "createdTime": "2021-12-20T09:39:48Z"
   213          }
   214      ]
   215  }`,
   216  			expectedPath: "/edgeworkers/v1/ids/88334/versions",
   217  			expectedResponse: &ListEdgeWorkerVersionsResponse{[]EdgeWorkerVersion{
   218  				{
   219  					EdgeWorkerID:   88334,
   220  					Version:        "1.23",
   221  					AccountID:      "B-3-WNKA6P",
   222  					Checksum:       "868f28f16c26f46d418d83e24973520534d9ea4e4dbfd8a69ab00c1c37f28ca4",
   223  					SequenceNumber: 3,
   224  					CreatedBy:      "jsmith",
   225  					CreatedTime:    "2021-12-20T08:28:37Z",
   226  				},
   227  				{
   228  					EdgeWorkerID:   88334,
   229  					Version:        "1.24.5",
   230  					AccountID:      "B-3-WNKA6P",
   231  					Checksum:       "ad9c18a7f2ed5d7bbcd31c55b94a0a00ae1771c6a15fd9265aeae08f5ef41e1f",
   232  					SequenceNumber: 4,
   233  					CreatedBy:      "jsmith",
   234  					CreatedTime:    "2021-12-20T09:39:48Z",
   235  				},
   236  			}},
   237  		},
   238  		"200 OK - no Versions under EdgeworkerID": {
   239  			params: ListEdgeWorkerVersionsRequest{
   240  				EdgeWorkerID: 88334,
   241  			},
   242  			responseStatus: http.StatusOK,
   243  			responseBody: `
   244  {
   245     "versions": []
   246  }`,
   247  			expectedPath:     "/edgeworkers/v1/ids/88334/versions",
   248  			expectedResponse: &ListEdgeWorkerVersionsResponse{[]EdgeWorkerVersion{}},
   249  		},
   250  		"missing EdgeWorkerID": {
   251  			params:    ListEdgeWorkerVersionsRequest{},
   252  			withError: ErrStructValidation,
   253  		},
   254  		"500 internal server error": {
   255  			params: ListEdgeWorkerVersionsRequest{
   256  				EdgeWorkerID: 88334,
   257  			},
   258  			responseStatus: http.StatusInternalServerError,
   259  			responseBody: `
   260  {
   261   "type": "https://problems.luna-dev.akamaiapis.net/-/resource-impl/forward-origin-error",
   262   "title": "Server Error",
   263   "status": 500,
   264   "instance": "host_name/edgeworkers/v1/ids/88334/versions",
   265   "method": "GET",
   266   "serverIp": "10.0.0.1",
   267   "clientIp": "192.168.0.1",
   268   "requestId": "a73affa111",
   269   "requestTime": "2021-12-06T10:27:11Z"
   270  }`,
   271  			expectedPath: "/edgeworkers/v1/ids/88334/versions",
   272  			withError: &Error{
   273  				Type:        "https://problems.luna-dev.akamaiapis.net/-/resource-impl/forward-origin-error",
   274  				Title:       "Server Error",
   275  				Status:      500,
   276  				Instance:    "host_name/edgeworkers/v1/ids/88334/versions",
   277  				Method:      "GET",
   278  				ServerIP:    "10.0.0.1",
   279  				ClientIP:    "192.168.0.1",
   280  				RequestID:   "a73affa111",
   281  				RequestTime: "2021-12-06T10:27:11Z",
   282  			},
   283  		},
   284  		"403 Forbidden - incorrect credentials": {
   285  			params: ListEdgeWorkerVersionsRequest{
   286  				EdgeWorkerID: 88334,
   287  			},
   288  			responseStatus: http.StatusForbidden,
   289  			responseBody: `
   290  {
   291     "type": "https://problems.luna-dev.akamaiapis.net/-/pep-authz/deny",
   292     "title": "Forbidden",
   293     "status": 403,
   294     "detail": "The client does not have the grant needed for the request",
   295     "instance": "host_name/edgeworkers/v1/ids/88334/versions",
   296     "authzRealm": "scuomder224df6ct.dkekfr3qqg4dghpj",
   297     "method": "GET",
   298     "serverIp": "10.0.0.1",
   299     "clientIp": "192.168.0.1",
   300     "requestId": "a73affa111",
   301     "requestTime": "2021-12-13T12:01:17Z"
   302  }`,
   303  			expectedPath: "/edgeworkers/v1/ids/88334/versions",
   304  			withError: &Error{
   305  				Type:        "https://problems.luna-dev.akamaiapis.net/-/pep-authz/deny",
   306  				Title:       "Forbidden",
   307  				Status:      403,
   308  				Detail:      "The client does not have the grant needed for the request",
   309  				Instance:    "host_name/edgeworkers/v1/ids/88334/versions",
   310  				AuthzRealm:  "scuomder224df6ct.dkekfr3qqg4dghpj",
   311  				Method:      "GET",
   312  				ServerIP:    "10.0.0.1",
   313  				ClientIP:    "192.168.0.1",
   314  				RequestID:   "a73affa111",
   315  				RequestTime: "2021-12-13T12:01:17Z",
   316  			},
   317  		},
   318  	}
   319  	for name, test := range tests {
   320  		t.Run(name, func(t *testing.T) {
   321  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   322  				assert.Equal(t, test.expectedPath, r.URL.String())
   323  				assert.Equal(t, http.MethodGet, r.Method)
   324  				w.WriteHeader(test.responseStatus)
   325  				_, err := w.Write([]byte(test.responseBody))
   326  				assert.NoError(t, err)
   327  			}))
   328  			client := mockAPIClient(t, mockServer)
   329  			result, err := client.ListEdgeWorkerVersions(context.Background(), test.params)
   330  			if test.withError != nil {
   331  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   332  				return
   333  			}
   334  			require.NoError(t, err)
   335  			assert.Equal(t, test.expectedResponse, result)
   336  		})
   337  	}
   338  }
   339  
   340  func TestGetEdgeWorkerVersionContent(t *testing.T) {
   341  	tests := map[string]struct {
   342  		params         GetEdgeWorkerVersionContentRequest
   343  		responseStatus int
   344  		responseBody   string
   345  		expectedPath   string
   346  		withError      error
   347  	}{
   348  		"200 OK - get EdgeWorkerVersion": {
   349  			params: GetEdgeWorkerVersionContentRequest{
   350  				EdgeWorkerID: 88334,
   351  				Version:      "1.23",
   352  			},
   353  			responseStatus: http.StatusOK,
   354  			expectedPath:   "/edgeworkers/v1/ids/88334/versions/1.23/content",
   355  		},
   356  		"500 internal server error": {
   357  			params: GetEdgeWorkerVersionContentRequest{
   358  				EdgeWorkerID: 88334,
   359  				Version:      "1.23",
   360  			},
   361  			responseStatus: http.StatusInternalServerError,
   362  			responseBody: `
   363  {
   364    "type": "https://problems.luna-dev.akamaiapis.net/-/resource-impl/forward-origin-error",
   365    "title": "Server Error",
   366    "status": 500,
   367    "instance": "host_name/edgeworkers/v1/ids/88334/versions/1.23/content",
   368    "method": "GET",
   369    "serverIp": "10.0.0.1",
   370    "clientIp": "192.168.0.1",
   371    "requestId": "a73affa111",
   372    "requestTime": "2021-12-06T10:27:11Z"
   373  }`,
   374  			expectedPath: "/edgeworkers/v1/ids/88334/versions/1.23/content",
   375  			withError: &Error{
   376  				Type:        "https://problems.luna-dev.akamaiapis.net/-/resource-impl/forward-origin-error",
   377  				Title:       "Server Error",
   378  				Status:      500,
   379  				Instance:    "host_name/edgeworkers/v1/ids/88334/versions/1.23/content",
   380  				Method:      "GET",
   381  				ServerIP:    "10.0.0.1",
   382  				ClientIP:    "192.168.0.1",
   383  				RequestID:   "a73affa111",
   384  				RequestTime: "2021-12-06T10:27:11Z",
   385  			},
   386  		},
   387  		"missing EdgeWorkerID": {
   388  			params: GetEdgeWorkerVersionContentRequest{
   389  				Version: "1.23",
   390  			},
   391  			withError: ErrStructValidation,
   392  		},
   393  		"missing Version": {
   394  			params: GetEdgeWorkerVersionContentRequest{
   395  				EdgeWorkerID: 88334,
   396  			},
   397  			withError: ErrStructValidation,
   398  		},
   399  		"403 Forbidden - incorrect credentials": {
   400  			params: GetEdgeWorkerVersionContentRequest{
   401  				EdgeWorkerID: 88334,
   402  				Version:      "1.23",
   403  			},
   404  			responseStatus: http.StatusForbidden,
   405  			responseBody: `
   406  {
   407      "type": "https://problems.luna-dev.akamaiapis.net/-/pep-authz/deny",
   408      "title": "Forbidden",
   409      "status": 403,
   410      "detail": "The client does not have the grant needed for the request",
   411      "instance": "host_name/edgeworkers/v1/ids/88334/versions/1.23/content",
   412      "authzRealm": "scuomder224df6ct.dkekfr3qqg4dghpj",
   413      "method": "GET",
   414      "serverIp": "10.0.0.1",
   415      "clientIp": "192.168.0.1",
   416      "requestId": "a73affa111",
   417      "requestTime": "2021-12-06T12:45:09Z"
   418  }`,
   419  			expectedPath: "/edgeworkers/v1/ids/88334/versions/1.23/content",
   420  			withError: &Error{
   421  				Type:        "https://problems.luna-dev.akamaiapis.net/-/pep-authz/deny",
   422  				Title:       "Forbidden",
   423  				Status:      403,
   424  				Detail:      "The client does not have the grant needed for the request",
   425  				Instance:    "host_name/edgeworkers/v1/ids/88334/versions/1.23/content",
   426  				AuthzRealm:  "scuomder224df6ct.dkekfr3qqg4dghpj",
   427  				Method:      "GET",
   428  				ServerIP:    "10.0.0.1",
   429  				ClientIP:    "192.168.0.1",
   430  				RequestID:   "a73affa111",
   431  				RequestTime: "2021-12-06T12:45:09Z",
   432  			},
   433  		},
   434  		"404 Not Found": {
   435  			params: GetEdgeWorkerVersionContentRequest{
   436  				EdgeWorkerID: 88334,
   437  				Version:      "1.23",
   438  			},
   439  			expectedPath:   "/edgeworkers/v1/ids/88334/versions/1.23/content",
   440  			responseStatus: http.StatusNotFound,
   441  			responseBody: `
   442  {
   443      "type": "/edgeworkers/error-types/edgeworkers-not-found",
   444      "title": "The given resource could not be found.",
   445      "detail": "Unable to delete the version provided",
   446      "instance": "/edgeworkers/error-instances/514139f4-1608-4afc-88ac-67da91696af3",
   447      "status": 404,
   448      "errorCode": "EW2002"
   449  }`,
   450  			withError: &Error{
   451  				Type:      "/edgeworkers/error-types/edgeworkers-not-found",
   452  				Title:     "The given resource could not be found.",
   453  				Detail:    "Unable to delete the version provided",
   454  				Instance:  "/edgeworkers/error-instances/514139f4-1608-4afc-88ac-67da91696af3",
   455  				Status:    404,
   456  				ErrorCode: "EW2002",
   457  			},
   458  		},
   459  	}
   460  
   461  	for name, test := range tests {
   462  		t.Run(name, func(t *testing.T) {
   463  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   464  				assert.Equal(t, test.expectedPath, r.URL.String())
   465  				assert.Equal(t, http.MethodGet, r.Method)
   466  				w.WriteHeader(test.responseStatus)
   467  				_, err := w.Write([]byte(test.responseBody))
   468  				assert.NoError(t, err)
   469  			}))
   470  			client := mockAPIClient(t, mockServer)
   471  			_, err := client.GetEdgeWorkerVersionContent(context.Background(), test.params)
   472  			if test.withError != nil {
   473  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   474  				if test.responseStatus != 0 {
   475  					assert.Contains(t, err.Error(), strconv.FormatInt(int64(test.responseStatus), 10))
   476  				}
   477  
   478  				return
   479  			}
   480  			require.NoError(t, err)
   481  		})
   482  	}
   483  }
   484  
   485  func TestCreateEdgeWorkerVersion(t *testing.T) {
   486  	tests := map[string]struct {
   487  		params           CreateEdgeWorkerVersionRequest
   488  		responseStatus   int
   489  		responseBody     string
   490  		expectedPath     string
   491  		expectedResponse *EdgeWorkerVersion
   492  		withError        error
   493  	}{
   494  		"201 Created - create EdgeWorker Version": {
   495  			params: CreateEdgeWorkerVersionRequest{
   496  				EdgeWorkerID:  88334,
   497  				ContentBundle: Bundle{bytes.NewBuffer([]byte("testing create"))},
   498  			},
   499  			responseStatus: http.StatusCreated,
   500  			responseBody: `
   501  {
   502      "edgeWorkerId": 88334,
   503      "version": "1.23",
   504      "accountId": "B-3-WNKA6P",
   505      "checksum": "868f28f16c26f46d418d83e24973520534d9ea4e4dbfd8a69ab00c1c37f28ca4",
   506      "sequenceNumber": 24,
   507      "createdBy": "jsmith",
   508      "createdTime": "2021-12-21T12:57:54Z"
   509  }`,
   510  			expectedPath: "/edgeworkers/v1/ids/88334/versions",
   511  			expectedResponse: &EdgeWorkerVersion{
   512  				EdgeWorkerID:   88334,
   513  				Version:        "1.23",
   514  				AccountID:      "B-3-WNKA6P",
   515  				Checksum:       "868f28f16c26f46d418d83e24973520534d9ea4e4dbfd8a69ab00c1c37f28ca4",
   516  				SequenceNumber: 24,
   517  				CreatedBy:      "jsmith",
   518  				CreatedTime:    "2021-12-21T12:57:54Z",
   519  			},
   520  		},
   521  		"missing EdgeWorkerID": {
   522  			params: CreateEdgeWorkerVersionRequest{
   523  				ContentBundle: Bundle{bytes.NewBuffer([]byte("testing create"))},
   524  			},
   525  			withError: ErrStructValidation,
   526  		},
   527  		"missing ContentBundle": {
   528  			params: CreateEdgeWorkerVersionRequest{
   529  				EdgeWorkerID: 88334,
   530  			},
   531  			withError: ErrStructValidation,
   532  		},
   533  		"500 internal server error": {
   534  			params: CreateEdgeWorkerVersionRequest{
   535  				EdgeWorkerID:  88334,
   536  				ContentBundle: Bundle{bytes.NewBuffer([]byte("testing create"))},
   537  			},
   538  			responseStatus: http.StatusInternalServerError,
   539  			responseBody: `
   540  {
   541  "type": "https://problems.luna-dev.akamaiapis.net/-/resource-impl/forward-origin-error",
   542  "title": "Server Error",
   543  "status": 500,
   544  "instance": "host_name/edgeworkers/v1/ids/88334/versions",
   545  "method": "POST",
   546  "serverIp": "10.0.0.1",
   547  "clientIp": "192.168.0.1",
   548  "requestId": "a73affa111",
   549  "requestTime": "2021-12-13T13:32:37Z"
   550  }`,
   551  			expectedPath: "/edgeworkers/v1/ids/88334/versions",
   552  			withError: &Error{
   553  				Type:        "https://problems.luna-dev.akamaiapis.net/-/resource-impl/forward-origin-error",
   554  				Title:       "Server Error",
   555  				Status:      500,
   556  				Instance:    "host_name/edgeworkers/v1/ids/88334/versions",
   557  				Method:      "POST",
   558  				ServerIP:    "10.0.0.1",
   559  				ClientIP:    "192.168.0.1",
   560  				RequestID:   "a73affa111",
   561  				RequestTime: "2021-12-13T13:32:37Z",
   562  			},
   563  		},
   564  		"403 Forbidden - incorrect credentials": {
   565  			params: CreateEdgeWorkerVersionRequest{
   566  				EdgeWorkerID:  88334,
   567  				ContentBundle: Bundle{bytes.NewBuffer([]byte("testing create"))},
   568  			},
   569  			responseStatus: http.StatusForbidden,
   570  			responseBody: `
   571  {
   572    "type": "https://problems.luna-dev.akamaiapis.net/-/pep-authz/deny",
   573    "title": "Forbidden",
   574    "status": 403,
   575    "detail": "The client does not have the grant needed for the request",
   576    "instance": "host_name/edgeworkers/v1/ids/88334/versions",
   577    "authzRealm": "scuomder224df6ct.dkekfr3qqg4dghpj",
   578    "method": "POST",
   579    "serverIp": "10.0.0.1",
   580    "clientIp": "192.168.0.1",
   581    "requestId": "a73affa111",
   582    "requestTime": "2021-12-13T13:32:37Z"
   583  }`,
   584  			expectedPath: "/edgeworkers/v1/ids/88334/versions",
   585  			withError: &Error{
   586  				Type:        "https://problems.luna-dev.akamaiapis.net/-/pep-authz/deny",
   587  				Title:       "Forbidden",
   588  				Status:      403,
   589  				Detail:      "The client does not have the grant needed for the request",
   590  				Instance:    "host_name/edgeworkers/v1/ids/88334/versions",
   591  				AuthzRealm:  "scuomder224df6ct.dkekfr3qqg4dghpj",
   592  				Method:      "POST",
   593  				ServerIP:    "10.0.0.1",
   594  				ClientIP:    "192.168.0.1",
   595  				RequestID:   "a73affa111",
   596  				RequestTime: "2021-12-13T13:32:37Z",
   597  			},
   598  		},
   599  	}
   600  	for name, test := range tests {
   601  		t.Run(name, func(t *testing.T) {
   602  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   603  				assert.Equal(t, test.expectedPath, r.URL.String())
   604  				assert.Equal(t, http.MethodPost, r.Method)
   605  				w.WriteHeader(test.responseStatus)
   606  				_, err := w.Write([]byte(test.responseBody))
   607  				assert.NoError(t, err)
   608  			}))
   609  			client := mockAPIClient(t, mockServer)
   610  			result, err := client.CreateEdgeWorkerVersion(context.Background(), test.params)
   611  			if test.withError != nil {
   612  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   613  				return
   614  			}
   615  			require.NoError(t, err)
   616  			assert.Equal(t, test.expectedResponse, result)
   617  		})
   618  	}
   619  }
   620  
   621  func TestDeleteEdgeWorkerVersion(t *testing.T) {
   622  	tests := map[string]struct {
   623  		params         DeleteEdgeWorkerVersionRequest
   624  		withError      error
   625  		expectedPath   string
   626  		responseStatus int
   627  		responseBody   string
   628  	}{
   629  		"204 Deleted": {
   630  			params: DeleteEdgeWorkerVersionRequest{
   631  				EdgeWorkerID: 88334,
   632  				Version:      "1.23",
   633  			},
   634  			expectedPath:   "/edgeworkers/v1/ids/88334/versions/1.23",
   635  			responseStatus: http.StatusNoContent,
   636  		},
   637  		"missing EdgeWorkerID": {
   638  			params: DeleteEdgeWorkerVersionRequest{
   639  				Version: "1.23",
   640  			},
   641  			withError: ErrStructValidation,
   642  		},
   643  		"missing Version": {
   644  			params: DeleteEdgeWorkerVersionRequest{
   645  				EdgeWorkerID: 88334,
   646  			},
   647  			withError: ErrStructValidation,
   648  		},
   649  		"404 Not Found": {
   650  			params: DeleteEdgeWorkerVersionRequest{
   651  				EdgeWorkerID: 88334,
   652  				Version:      "1.23",
   653  			},
   654  			expectedPath:   "/edgeworkers/v1/ids/88334/versions/1.23",
   655  			responseStatus: http.StatusNotFound,
   656  			responseBody: `
   657  {
   658      "type": "/edgeworkers/error-types/edgeworkers-not-found",
   659      "title": "The given resource could not be found.",
   660      "detail": "Unable to delete the version provided",
   661      "instance": "/edgeworkers/error-instances/514139f4-1608-4afc-88ac-67da91696af3",
   662      "status": 404,
   663      "errorCode": "EW2002"
   664  }`,
   665  			withError: &Error{
   666  				Type:      "/edgeworkers/error-types/edgeworkers-not-found",
   667  				Title:     "The given resource could not be found.",
   668  				Detail:    "Unable to delete the version provided",
   669  				Instance:  "/edgeworkers/error-instances/514139f4-1608-4afc-88ac-67da91696af3",
   670  				Status:    404,
   671  				ErrorCode: "EW2002",
   672  			},
   673  		},
   674  		"500 internal server error": {
   675  			params: DeleteEdgeWorkerVersionRequest{
   676  				EdgeWorkerID: 88334,
   677  				Version:      "1.23",
   678  			},
   679  			expectedPath:   "/edgeworkers/v1/ids/88334/versions/1.23",
   680  			responseStatus: http.StatusInternalServerError,
   681  			responseBody: `
   682  {
   683   "type": "https://problems.luna-dev.akamaiapis.net/-/resource-impl/forward-origin-error",
   684   "title": "Server Error",
   685   "status": 500,
   686   "instance": "host_name/edgeworkers/v1/ids/88334/versions/1.23",
   687   "method": "DELETE",
   688   "serverIp": "10.0.0.1",
   689   "clientIp": "192.168.0.1",
   690   "requestId": "a73affa111",
   691   "requestTime": "2021-12-17T16:32:37Z"
   692  }`,
   693  			withError: &Error{
   694  				Type:        "https://problems.luna-dev.akamaiapis.net/-/resource-impl/forward-origin-error",
   695  				Title:       "Server Error",
   696  				Status:      500,
   697  				Instance:    "host_name/edgeworkers/v1/ids/88334/versions/1.23",
   698  				Method:      "DELETE",
   699  				ServerIP:    "10.0.0.1",
   700  				ClientIP:    "192.168.0.1",
   701  				RequestID:   "a73affa111",
   702  				RequestTime: "2021-12-17T16:32:37Z",
   703  			},
   704  		},
   705  	}
   706  	for name, test := range tests {
   707  		t.Run(name, func(t *testing.T) {
   708  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   709  				assert.Equal(t, test.expectedPath, r.URL.String())
   710  				assert.Equal(t, http.MethodDelete, r.Method)
   711  				w.WriteHeader(test.responseStatus)
   712  				_, err := w.Write([]byte(test.responseBody))
   713  				assert.NoError(t, err)
   714  			}))
   715  			client := mockAPIClient(t, mockServer)
   716  			err := client.DeleteEdgeWorkerVersion(context.Background(), test.params)
   717  			if test.withError != nil {
   718  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   719  				if test.responseStatus != 0 {
   720  					assert.Contains(t, err.Error(), strconv.FormatInt(int64(test.responseStatus), 10))
   721  				}
   722  
   723  				return
   724  			}
   725  			require.NoError(t, err)
   726  		})
   727  	}
   728  }