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

     1  package edgeworkers
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestListResourceTiers(t *testing.T) {
    15  	tests := map[string]struct {
    16  		params           ListResourceTiersRequest
    17  		responseStatus   int
    18  		responseBody     string
    19  		expectedPath     string
    20  		expectedResponse *ListResourceTiersResponse
    21  		withError        error
    22  	}{
    23  		"200 OK": {
    24  			params:         ListResourceTiersRequest{ContractID: "123"},
    25  			responseStatus: http.StatusOK,
    26  			responseBody: `
    27  {
    28      "resourceTiers": [
    29          {
    30              "resourceTierId": 100,
    31              "resourceTierName": "Basic Compute",
    32              "edgeWorkerLimits": [
    33                  {
    34                      "limitName": "Maximum CPU time during initialization",
    35                      "limitValue": 30,
    36                      "limitUnit": "MILLISECOND"
    37                  },
    38                  {
    39                      "limitName": "Maximum response size for HTTP sub-requests during the responseProvider event handler",
    40                      "limitValue": 1048576,
    41                      "limitUnit": "BYTE"
    42                  }
    43              ]
    44          },
    45          {
    46              "resourceTierId": 200,
    47              "resourceTierName": "Dynamic Compute",
    48              "edgeWorkerLimits": [
    49                  {
    50                      "limitName": "Maximum number of HTTP sub-requests allowed in parallel for responseProvider",
    51                      "limitValue": 5,
    52                      "limitUnit": "COUNT"
    53                  },
    54                  {
    55                      "limitName": "Maximum wall time for HTTP sub-requests during the execution of the responseProvider event handler",
    56                      "limitValue": 1000,
    57                      "limitUnit": "MILLISECOND"
    58                  }
    59              ]
    60          }
    61      ]
    62  }`,
    63  			expectedPath: "/edgeworkers/v1/resource-tiers?contractId=123",
    64  			expectedResponse: &ListResourceTiersResponse{[]ResourceTier{
    65  				{
    66  					ID:   100,
    67  					Name: "Basic Compute",
    68  					EdgeWorkerLimits: []EdgeWorkerLimit{
    69  						{
    70  							LimitName:  "Maximum CPU time during initialization",
    71  							LimitValue: 30,
    72  							LimitUnit:  "MILLISECOND",
    73  						},
    74  						{
    75  							LimitName:  "Maximum response size for HTTP sub-requests during the responseProvider event handler",
    76  							LimitValue: 1048576,
    77  							LimitUnit:  "BYTE",
    78  						},
    79  					},
    80  				},
    81  				{
    82  					ID:   200,
    83  					Name: "Dynamic Compute",
    84  					EdgeWorkerLimits: []EdgeWorkerLimit{
    85  						{
    86  							LimitName:  "Maximum number of HTTP sub-requests allowed in parallel for responseProvider",
    87  							LimitValue: 5,
    88  							LimitUnit:  "COUNT",
    89  						},
    90  						{
    91  							LimitName:  "Maximum wall time for HTTP sub-requests during the execution of the responseProvider event handler",
    92  							LimitValue: 1000,
    93  							LimitUnit:  "MILLISECOND",
    94  						},
    95  					},
    96  				},
    97  			}},
    98  		},
    99  		"500 internal server error": {
   100  			params:         ListResourceTiersRequest{ContractID: "123"},
   101  			responseStatus: http.StatusInternalServerError,
   102  			responseBody: `
   103  {
   104      "type": "/edgeworkers/error-types/edgeworkers-server-error",
   105      "title": "An unexpected error has occurred.",
   106      "detail": "Error processing request",
   107      "instance": "/edgeworkers/error-instances/abc",
   108      "status": 500,
   109      "errorCode": "EW4303"
   110  }`,
   111  			expectedPath: "/edgeworkers/v1/resource-tiers?contractId=123",
   112  			withError: &Error{
   113  				Type:      "/edgeworkers/error-types/edgeworkers-server-error",
   114  				Title:     "An unexpected error has occurred.",
   115  				Detail:    "Error processing request",
   116  				Instance:  "/edgeworkers/error-instances/abc",
   117  				Status:    500,
   118  				ErrorCode: "EW4303",
   119  			},
   120  		},
   121  		"missing contract ID": {
   122  			params:    ListResourceTiersRequest{},
   123  			withError: ErrStructValidation,
   124  		},
   125  	}
   126  
   127  	for name, test := range tests {
   128  		t.Run(name, func(t *testing.T) {
   129  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   130  				assert.Equal(t, test.expectedPath, r.URL.String())
   131  				assert.Equal(t, http.MethodGet, r.Method)
   132  				w.WriteHeader(test.responseStatus)
   133  				_, err := w.Write([]byte(test.responseBody))
   134  				assert.NoError(t, err)
   135  			}))
   136  			client := mockAPIClient(t, mockServer)
   137  			result, err := client.ListResourceTiers(context.Background(), test.params)
   138  			if test.withError != nil {
   139  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   140  				return
   141  			}
   142  			require.NoError(t, err)
   143  			assert.Equal(t, test.expectedResponse, result)
   144  		})
   145  	}
   146  }
   147  
   148  func TestGetResourceTier(t *testing.T) {
   149  	tests := map[string]struct {
   150  		params           GetResourceTierRequest
   151  		responseStatus   int
   152  		responseBody     string
   153  		expectedPath     string
   154  		expectedResponse *ResourceTier
   155  		withError        error
   156  	}{
   157  		"200 OK": {
   158  			params:         GetResourceTierRequest{EdgeWorkerID: 123},
   159  			responseStatus: http.StatusOK,
   160  			responseBody: `
   161  {
   162          
   163  	"resourceTierId": 100,
   164  	"resourceTierName": "Basic Compute",
   165  	"edgeWorkerLimits": [
   166  		{
   167  			"limitName": "Maximum CPU time during initialization",
   168  			"limitValue": 30,
   169  			"limitUnit": "MILLISECOND"
   170  		},
   171  		{
   172  			"limitName": "Maximum response size for HTTP sub-requests during the responseProvider event handler",
   173  			"limitValue": 1048576,
   174  			"limitUnit": "BYTE"
   175  		}
   176  	]
   177  }
   178  `,
   179  			expectedPath: "/edgeworkers/v1/ids/123/resource-tier",
   180  			expectedResponse: &ResourceTier{
   181  				ID:   100,
   182  				Name: "Basic Compute",
   183  				EdgeWorkerLimits: []EdgeWorkerLimit{
   184  					{
   185  						LimitName:  "Maximum CPU time during initialization",
   186  						LimitValue: 30,
   187  						LimitUnit:  "MILLISECOND",
   188  					},
   189  					{
   190  						LimitName:  "Maximum response size for HTTP sub-requests during the responseProvider event handler",
   191  						LimitValue: 1048576,
   192  						LimitUnit:  "BYTE",
   193  					},
   194  				},
   195  			},
   196  		},
   197  		"500 internal server error": {
   198  			params:         GetResourceTierRequest{EdgeWorkerID: 123},
   199  			responseStatus: http.StatusInternalServerError,
   200  			responseBody: `
   201  {
   202      "type": "/edgeworkers/error-types/edgeworkers-server-error",
   203      "title": "An unexpected error has occurred.",
   204      "detail": "Error processing request",
   205      "instance": "/edgeworkers/error-instances/abc",
   206      "status": 500,
   207      "errorCode": "EW4303"
   208  }`,
   209  			expectedPath: "/edgeworkers/v1/ids/123/resource-tier",
   210  			withError: &Error{
   211  				Type:      "/edgeworkers/error-types/edgeworkers-server-error",
   212  				Title:     "An unexpected error has occurred.",
   213  				Detail:    "Error processing request",
   214  				Instance:  "/edgeworkers/error-instances/abc",
   215  				Status:    500,
   216  				ErrorCode: "EW4303",
   217  			},
   218  		},
   219  		"missing edgeworker ID": {
   220  			params:    GetResourceTierRequest{},
   221  			withError: ErrStructValidation,
   222  		},
   223  	}
   224  
   225  	for name, test := range tests {
   226  		t.Run(name, func(t *testing.T) {
   227  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   228  				assert.Equal(t, test.expectedPath, r.URL.String())
   229  				assert.Equal(t, http.MethodGet, r.Method)
   230  				w.WriteHeader(test.responseStatus)
   231  				_, err := w.Write([]byte(test.responseBody))
   232  				assert.NoError(t, err)
   233  			}))
   234  			client := mockAPIClient(t, mockServer)
   235  			result, err := client.GetResourceTier(context.Background(), test.params)
   236  			if test.withError != nil {
   237  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   238  				return
   239  			}
   240  			require.NoError(t, err)
   241  			assert.Equal(t, test.expectedResponse, result)
   242  		})
   243  	}
   244  }