github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/cloudlets/policy_version_activation_test.go (about)

     1  package cloudlets
     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 TestListPolicyActivations(t *testing.T) {
    15  	tests := map[string]struct {
    16  		parameters       ListPolicyActivationsRequest
    17  		uri              string
    18  		responseStatus   int
    19  		responseBody     string
    20  		expectedResponse []PolicyActivation
    21  		withError        error
    22  	}{
    23  		"200 staging ok": {
    24  			parameters: ListPolicyActivationsRequest{
    25  				PropertyName: "www.rc-cloudlet.com",
    26  				Network:      "staging",
    27  				PolicyID:     1234,
    28  			},
    29  			uri:            "/cloudlets/api/v2/policies/1234/activations?network=staging&propertyName=www.rc-cloudlet.com",
    30  			responseStatus: http.StatusOK,
    31  			responseBody: `[
    32  				{
    33  					"serviceVersion": null,
    34  					"apiVersion": "2.0",
    35  					"network": "staging",
    36  					"policyInfo": {
    37  						"policyId": 2962,
    38  						"name": "RequestControlPolicy",
    39  						"version": 1,
    40  						"status": "active",
    41  						"statusDetail": "File successfully deployed to Akamai's network",
    42  						"activationDate": 1427428800000,
    43  						"activatedBy": "jsmith"
    44  					},
    45  					"propertyInfo": {
    46  						"name": "www.rc-cloudlet.com",
    47  						"version": 0,
    48  						"groupId": 40498,
    49  						"status": "inactive",
    50  						"activatedBy": null,
    51  						"activationDate": 0
    52  					}
    53  				}
    54  			]`,
    55  			expectedResponse: []PolicyActivation{{
    56  				APIVersion: "2.0",
    57  				Network:    PolicyActivationNetworkStaging,
    58  				PropertyInfo: PropertyInfo{
    59  					Name:           "www.rc-cloudlet.com",
    60  					Version:        0,
    61  					GroupID:        40498,
    62  					Status:         PolicyActivationStatusInactive,
    63  					ActivatedBy:    "",
    64  					ActivationDate: 0,
    65  				},
    66  				PolicyInfo: PolicyInfo{
    67  					PolicyID:       2962,
    68  					Name:           "RequestControlPolicy",
    69  					Version:        1,
    70  					Status:         PolicyActivationStatusActive,
    71  					StatusDetail:   "File successfully deployed to Akamai's network",
    72  					ActivatedBy:    "jsmith",
    73  					ActivationDate: 1427428800000,
    74  				},
    75  			}},
    76  		},
    77  		"empty Network should not appear in uri query": {
    78  			parameters: ListPolicyActivationsRequest{
    79  				PropertyName: "www.rc-cloudlet.com",
    80  				Network:      "",
    81  				PolicyID:     1234,
    82  			},
    83  			responseBody:     `[]`,
    84  			expectedResponse: []PolicyActivation{},
    85  			responseStatus:   http.StatusOK,
    86  			uri:              "/cloudlets/api/v2/policies/1234/activations?propertyName=www.rc-cloudlet.com",
    87  		},
    88  		"empty PropertyName should not appear in uri query": {
    89  			parameters: ListPolicyActivationsRequest{
    90  				PropertyName: "",
    91  				Network:      "staging",
    92  				PolicyID:     1234,
    93  			},
    94  			responseBody:     `[]`,
    95  			expectedResponse: []PolicyActivation{},
    96  			responseStatus:   http.StatusOK,
    97  			uri:              "/cloudlets/api/v2/policies/1234/activations?network=staging",
    98  		},
    99  		"not valid network": {
   100  			parameters: ListPolicyActivationsRequest{
   101  				PropertyName: "www.rc-cloudlet.com",
   102  				Network:      "not valid",
   103  				PolicyID:     1234,
   104  			},
   105  			withError: ErrStructValidation,
   106  		},
   107  		"404 not found": {
   108  			parameters: ListPolicyActivationsRequest{
   109  				PropertyName: "www.rc-cloudlet.com",
   110  				Network:      "staging",
   111  				PolicyID:     1234,
   112  			},
   113  			responseStatus: http.StatusNotFound,
   114  			uri:            "/cloudlets/api/v2/policies/1234/activations?network=staging&propertyName=www.rc-cloudlet.com",
   115  			withError:      &Error{StatusCode: 404},
   116  		},
   117  		"500 server error": {
   118  			parameters: ListPolicyActivationsRequest{
   119  				PropertyName: "www.rc-cloudlet.com",
   120  				Network:      "staging",
   121  				PolicyID:     1234,
   122  			},
   123  			responseStatus: http.StatusInternalServerError,
   124  			uri:            "/cloudlets/api/v2/policies/1234/activations?network=staging&propertyName=www.rc-cloudlet.com",
   125  			withError:      &Error{StatusCode: 500},
   126  		},
   127  	}
   128  	for name, test := range tests {
   129  		t.Run(name, func(t *testing.T) {
   130  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   131  				assert.Equal(t, test.uri, r.URL.String())
   132  				assert.Equal(t, http.MethodGet, r.Method)
   133  				w.WriteHeader(test.responseStatus)
   134  				_, err := w.Write([]byte(test.responseBody))
   135  				assert.NoError(t, err)
   136  			}))
   137  			client := mockAPIClient(t, mockServer)
   138  			result, err := client.ListPolicyActivations(context.Background(), test.parameters)
   139  			if test.withError != nil {
   140  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   141  				return
   142  			}
   143  			require.NoError(t, err)
   144  			assert.Equal(t, test.expectedResponse, result)
   145  		})
   146  	}
   147  }
   148  
   149  func TestActivatePolicyVersion(t *testing.T) {
   150  	tests := map[string]struct {
   151  		parameters         ActivatePolicyVersionRequest
   152  		responseStatus     int
   153  		uri                string
   154  		responseBody       string
   155  		expectedActivation PolicyVersionActivation
   156  		withError          func(*testing.T, error)
   157  	}{
   158  		"200 Policy version activation": {
   159  			responseStatus: http.StatusOK,
   160  			parameters: ActivatePolicyVersionRequest{
   161  				PolicyID: 1234,
   162  				Version:  1,
   163  				PolicyVersionActivation: PolicyVersionActivation{
   164  					Network:                 PolicyActivationNetworkStaging,
   165  					AdditionalPropertyNames: []string{"www.rc-cloudlet.com"},
   166  				},
   167  			},
   168  			responseBody: `{
   169      "revisionId": 11870,
   170      "policyId": 1001,
   171      "version": 2,
   172      "description": "v2",
   173      "createdBy": "jsmith",
   174      "createDate": 1427133784903,
   175      "lastModifiedBy": "sjones",
   176      "lastModifiedDate": 1427133805767,
   177      "activations": [],
   178      "matchRules": [],
   179      "rulesLocked": false
   180  }`,
   181  		},
   182  		"any request validation error": {
   183  			parameters: ActivatePolicyVersionRequest{},
   184  			withError: func(t *testing.T, err error) {
   185  				assert.True(t, errors.Is(err, ErrStructValidation), "want: %s; got: %s", ErrStructValidation, err)
   186  			},
   187  		},
   188  		"any kind of server error": {
   189  			responseStatus: http.StatusInternalServerError,
   190  			parameters: ActivatePolicyVersionRequest{
   191  				PolicyID: 1234,
   192  				Version:  1,
   193  				PolicyVersionActivation: PolicyVersionActivation{
   194  					Network:                 PolicyActivationNetworkStaging,
   195  					AdditionalPropertyNames: []string{"www.rc-cloudlet.com"},
   196  				},
   197  			},
   198  			withError: func(t *testing.T, err error) {
   199  				assert.True(t, errors.Is(err, ErrActivatePolicyVersion), "want: %s; got: %s", ErrActivatePolicyVersion, err)
   200  			},
   201  		},
   202  		"property name not existing": {
   203  			responseStatus: http.StatusBadRequest,
   204  			parameters: ActivatePolicyVersionRequest{
   205  				PolicyID: 1234,
   206  				Version:  1,
   207  				PolicyVersionActivation: PolicyVersionActivation{
   208  					Network:                 PolicyActivationNetworkStaging,
   209  					AdditionalPropertyNames: []string{"www.rc-cloudlet.com"},
   210  				},
   211  			},
   212  			withError: func(t *testing.T, err error) {
   213  				assert.Containsf(t, err.Error(), "Requested propertyName \\\"XYZ\\\" does not exist", "want: %s; got: %s", ErrActivatePolicyVersion, err)
   214  				assert.True(t, errors.Is(err, ErrActivatePolicyVersion), "want: %s; got: %s", ErrActivatePolicyVersion, err)
   215  			},
   216  			responseBody: `
   217  				{
   218  					"detail": "Requested propertyName \"XYZ\" does not exist",
   219  					"errorCode": -1,
   220  					"errorMessage": "Requested property Name \"XYZ\" does not exist",
   221  					"instance": "s8dsf8sf8df8",
   222  					"stackTrace": "java.lang.IllegalArgumentException: Requested property Name \"XYZ\" does not exist\n\tat com.akamai..."
   223  				}
   224  			`,
   225  		},
   226  		"validation errors": {
   227  			responseStatus: http.StatusBadRequest,
   228  			parameters: ActivatePolicyVersionRequest{
   229  				PolicyID: 1234,
   230  				Version:  1,
   231  				PolicyVersionActivation: PolicyVersionActivation{
   232  					Network:                 "",
   233  					AdditionalPropertyNames: []string{},
   234  				},
   235  			},
   236  			withError: func(t *testing.T, err error) {
   237  				assert.Containsf(t, err.Error(), "RequestBody.Network: cannot be blank", "want: %s; got: %s", ErrStructValidation, err)
   238  				assert.Containsf(t, err.Error(), "RequestBody.AdditionalPropertyNames: cannot be blank", "want: %s; got: %s", ErrStructValidation, err)
   239  				assert.True(t, errors.Is(err, ErrStructValidation), "want: %s; got: %s", ErrStructValidation, err)
   240  			},
   241  		},
   242  	}
   243  
   244  	for name, test := range tests {
   245  		t.Run(name, func(t *testing.T) {
   246  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   247  				assert.Equal(t, http.MethodPost, r.Method)
   248  				w.WriteHeader(test.responseStatus)
   249  				_, err := w.Write([]byte(test.responseBody))
   250  				assert.NoError(t, err)
   251  			}))
   252  			client := mockAPIClient(t, mockServer)
   253  			err := client.ActivatePolicyVersion(context.Background(), test.parameters)
   254  			if test.withError != nil {
   255  				test.withError(t, err)
   256  				return
   257  			}
   258  			require.NoError(t, err)
   259  		})
   260  	}
   261  }