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

     1  package networklists
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"errors"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"testing"
    10  
    11  	"github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/session"
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestNetworkList_ListNetworkList(t *testing.T) {
    17  
    18  	result := GetNetworkListsResponse{}
    19  
    20  	respData := compactJSON(loadFixtureBytes("testdata/TestNetworkList/NetworkLists.json"))
    21  	err := json.Unmarshal([]byte(respData), &result)
    22  	require.NoError(t, err)
    23  
    24  	tests := map[string]struct {
    25  		params           GetNetworkListsRequest
    26  		responseStatus   int
    27  		responseBody     string
    28  		expectedPath     string
    29  		expectedResponse *GetNetworkListsResponse
    30  		withError        error
    31  		headers          http.Header
    32  	}{
    33  		"200 OK": {
    34  			params: GetNetworkListsRequest{},
    35  			headers: http.Header{
    36  				"Content-Type": []string{"application/json"},
    37  			},
    38  			responseStatus:   http.StatusOK,
    39  			responseBody:     respData,
    40  			expectedPath:     "/network-list/v2/network-lists",
    41  			expectedResponse: &result,
    42  		},
    43  		"500 internal server error": {
    44  			params:         GetNetworkListsRequest{},
    45  			headers:        http.Header{},
    46  			responseStatus: http.StatusInternalServerError,
    47  			responseBody: `
    48  {
    49      "type": "internal_error",
    50      "title": "Internal Server Error",
    51      "detail": "Error fetching networklist",
    52      "status": 500
    53  }`,
    54  			expectedPath: "/network-list/v2/network-lists",
    55  			withError: &Error{
    56  				Type:       "internal_error",
    57  				Title:      "Internal Server Error",
    58  				Detail:     "Error fetching networklist",
    59  				StatusCode: http.StatusInternalServerError,
    60  			},
    61  		},
    62  	}
    63  
    64  	for name, test := range tests {
    65  		t.Run(name, func(t *testing.T) {
    66  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    67  				assert.Equal(t, test.expectedPath, r.URL.String())
    68  				assert.Equal(t, http.MethodGet, r.Method)
    69  				w.WriteHeader(test.responseStatus)
    70  				_, err := w.Write([]byte(test.responseBody))
    71  				assert.NoError(t, err)
    72  			}))
    73  			client := mockAPIClient(t, mockServer)
    74  			result, err := client.GetNetworkLists(
    75  				session.ContextWithOptions(
    76  					context.Background(),
    77  					session.WithContextHeaders(test.headers),
    78  				),
    79  				test.params)
    80  			if test.withError != nil {
    81  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
    82  				return
    83  			}
    84  			require.NoError(t, err)
    85  			assert.Equal(t, test.expectedResponse, result)
    86  		})
    87  	}
    88  }
    89  
    90  func TestNetworkList_FilterNetworkLists(t *testing.T) {
    91  
    92  	result := GetNetworkListsResponse{}
    93  
    94  	respData := compactJSON(loadFixtureBytes("testdata/TestNetworkList/NetworkLists.json"))
    95  	err := json.Unmarshal([]byte(respData), &result)
    96  	require.NoError(t, err)
    97  
    98  	expectedResult := GetNetworkListsResponse{}
    99  	expectedResponseData := compactJSON(loadFixtureBytes("testdata/TestNetworkList/NetworkLists_GEO.json"))
   100  	err = json.Unmarshal([]byte(expectedResponseData), &expectedResult)
   101  	require.NoError(t, err)
   102  
   103  	tests := map[string]struct {
   104  		params           GetNetworkListsRequest
   105  		responseStatus   int
   106  		responseBody     string
   107  		expectedPath     string
   108  		expectedResponse *GetNetworkListsResponse
   109  		withError        error
   110  		headers          http.Header
   111  	}{
   112  		"200 OK": {
   113  			params: GetNetworkListsRequest{Type: "GEO"},
   114  			headers: http.Header{
   115  				"Content-Type": []string{"application/json"},
   116  			},
   117  			responseStatus:   http.StatusOK,
   118  			responseBody:     respData,
   119  			expectedPath:     "/network-list/v2/network-lists",
   120  			expectedResponse: &expectedResult,
   121  		},
   122  		"500 internal server error": {
   123  			params:         GetNetworkListsRequest{},
   124  			headers:        http.Header{},
   125  			responseStatus: http.StatusInternalServerError,
   126  			responseBody: `
   127  {
   128      "type": "internal_error",
   129      "title": "Internal Server Error",
   130      "detail": "Error fetching networklist",
   131      "status": 500
   132  }`,
   133  			expectedPath: "/network-list/v2/network-lists",
   134  			withError: &Error{
   135  				Type:       "internal_error",
   136  				Title:      "Internal Server Error",
   137  				Detail:     "Error fetching networklist",
   138  				StatusCode: http.StatusInternalServerError,
   139  			},
   140  		},
   141  	}
   142  
   143  	for name, test := range tests {
   144  		t.Run(name, func(t *testing.T) {
   145  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   146  				assert.Equal(t, test.expectedPath, r.URL.String())
   147  				assert.Equal(t, http.MethodGet, r.Method)
   148  				w.WriteHeader(test.responseStatus)
   149  				_, err := w.Write([]byte(test.responseBody))
   150  				assert.NoError(t, err)
   151  			}))
   152  			client := mockAPIClient(t, mockServer)
   153  			result, err := client.GetNetworkLists(
   154  				session.ContextWithOptions(
   155  					context.Background(),
   156  					session.WithContextHeaders(test.headers),
   157  				),
   158  				test.params)
   159  			if test.withError != nil {
   160  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   161  				return
   162  			}
   163  			require.NoError(t, err)
   164  			assert.Equal(t, test.expectedResponse, result)
   165  		})
   166  	}
   167  }
   168  
   169  // Test NetworkList
   170  func TestNetworkList_GetNetworkList(t *testing.T) {
   171  
   172  	result := GetNetworkListResponse{}
   173  
   174  	respData := compactJSON(loadFixtureBytes("testdata/TestNetworkList/NetworkList.json"))
   175  	err := json.Unmarshal([]byte(respData), &result)
   176  	require.NoError(t, err)
   177  
   178  	tests := map[string]struct {
   179  		params           GetNetworkListRequest
   180  		responseStatus   int
   181  		responseBody     string
   182  		expectedPath     string
   183  		expectedResponse *GetNetworkListResponse
   184  		withError        error
   185  	}{
   186  		"200 OK": {
   187  			params:           GetNetworkListRequest{UniqueID: "Test"},
   188  			responseStatus:   http.StatusOK,
   189  			responseBody:     respData,
   190  			expectedPath:     "/network-list/v2/network-lists/Test",
   191  			expectedResponse: &result,
   192  		},
   193  		"500 internal server error": {
   194  			params:         GetNetworkListRequest{UniqueID: "Test"},
   195  			responseStatus: http.StatusInternalServerError,
   196  			responseBody: `
   197  {
   198      "type": "internal_error",
   199      "title": "Internal Server Error",
   200      "detail": "Error fetching networklist"
   201  }`,
   202  			expectedPath: "/network-list/v2/network-lists/Test",
   203  			withError: &Error{
   204  				Type:       "internal_error",
   205  				Title:      "Internal Server Error",
   206  				Detail:     "Error fetching networklist",
   207  				StatusCode: http.StatusInternalServerError,
   208  			},
   209  		},
   210  	}
   211  
   212  	for name, test := range tests {
   213  		t.Run(name, func(t *testing.T) {
   214  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   215  				assert.Equal(t, test.expectedPath, r.URL.String())
   216  				assert.Equal(t, http.MethodGet, r.Method)
   217  				w.WriteHeader(test.responseStatus)
   218  				_, err := w.Write([]byte(test.responseBody))
   219  				assert.NoError(t, err)
   220  			}))
   221  			client := mockAPIClient(t, mockServer)
   222  			result, err := client.GetNetworkList(context.Background(), test.params)
   223  			if test.withError != nil {
   224  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   225  				return
   226  			}
   227  			require.NoError(t, err)
   228  			assert.Equal(t, test.expectedResponse, result)
   229  		})
   230  	}
   231  }
   232  
   233  // Test Create NetworkList
   234  func TestNetworkList_CreateNetworkList(t *testing.T) {
   235  
   236  	result := CreateNetworkListResponse{}
   237  
   238  	respData := compactJSON(loadFixtureBytes("testdata/TestNetworkList/NetworkList.json"))
   239  	err := json.Unmarshal([]byte(respData), &result)
   240  	require.NoError(t, err)
   241  
   242  	req := CreateNetworkListRequest{}
   243  
   244  	reqData := compactJSON(loadFixtureBytes("testdata/TestNetworkList/NetworkList.json"))
   245  	err = json.Unmarshal([]byte(reqData), &req)
   246  	require.NoError(t, err)
   247  
   248  	tests := map[string]struct {
   249  		params           CreateNetworkListRequest
   250  		prop             *CreateNetworkListRequest
   251  		responseStatus   int
   252  		responseBody     string
   253  		expectedPath     string
   254  		expectedResponse *CreateNetworkListResponse
   255  		withError        error
   256  		headers          http.Header
   257  	}{
   258  		"201 Created": {
   259  			params: CreateNetworkListRequest{Name: "Test"},
   260  			headers: http.Header{
   261  				"Content-Type": []string{"application/json;charset=UTF-8"},
   262  			},
   263  			responseStatus:   http.StatusCreated,
   264  			responseBody:     respData,
   265  			expectedResponse: &result,
   266  			expectedPath:     "/network-list/v2/network-lists",
   267  		},
   268  		"500 internal server error": {
   269  			params:         CreateNetworkListRequest{Name: "Test"},
   270  			responseStatus: http.StatusInternalServerError,
   271  			responseBody: `
   272  {
   273      "type": "internal_error",
   274      "title": "Internal Server Error",
   275      "detail": "Error creating networklist"
   276  }`,
   277  			expectedPath: "/network-list/v2/network-lists",
   278  			withError: &Error{
   279  				Type:       "internal_error",
   280  				Title:      "Internal Server Error",
   281  				Detail:     "Error creating networklist",
   282  				StatusCode: http.StatusInternalServerError,
   283  			},
   284  		},
   285  	}
   286  
   287  	for name, test := range tests {
   288  		t.Run(name, func(t *testing.T) {
   289  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   290  				assert.Equal(t, http.MethodPost, r.Method)
   291  				assert.Equal(t, test.expectedPath, r.URL.String())
   292  				w.WriteHeader(test.responseStatus)
   293  				if len(test.responseBody) > 0 {
   294  					_, err := w.Write([]byte(test.responseBody))
   295  					assert.NoError(t, err)
   296  				}
   297  			}))
   298  			client := mockAPIClient(t, mockServer)
   299  			result, err := client.CreateNetworkList(
   300  				session.ContextWithOptions(
   301  					context.Background(),
   302  					session.WithContextHeaders(test.headers)), test.params)
   303  			if test.withError != nil {
   304  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   305  				return
   306  			}
   307  			require.NoError(t, err)
   308  			assert.Equal(t, test.expectedResponse, result)
   309  		})
   310  	}
   311  }
   312  
   313  // Test Update NetworkList
   314  func TestNetworkList_UpdateNetworkList(t *testing.T) {
   315  	result := UpdateNetworkListResponse{}
   316  
   317  	respData := compactJSON(loadFixtureBytes("testdata/TestNetworkList/NetworkList.json"))
   318  	err := json.Unmarshal([]byte(respData), &result)
   319  	require.NoError(t, err)
   320  
   321  	req := UpdateNetworkListRequest{}
   322  
   323  	reqData := compactJSON(loadFixtureBytes("testdata/TestNetworkList/NetworkList.json"))
   324  	err = json.Unmarshal([]byte(reqData), &req)
   325  	require.NoError(t, err)
   326  
   327  	tests := map[string]struct {
   328  		params           UpdateNetworkListRequest
   329  		responseStatus   int
   330  		responseBody     string
   331  		expectedPath     string
   332  		expectedResponse *UpdateNetworkListResponse
   333  		withError        error
   334  		headers          http.Header
   335  	}{
   336  		"200 Success": {
   337  			params: UpdateNetworkListRequest{Name: "TEST", UniqueID: "Test"},
   338  			headers: http.Header{
   339  				"Content-Type": []string{"application/json;charset=UTF-8"},
   340  			},
   341  			responseStatus:   http.StatusCreated,
   342  			responseBody:     respData,
   343  			expectedResponse: &result,
   344  			expectedPath:     "/network-list/v2/network-lists/Test",
   345  		},
   346  		"500 internal server error": {
   347  			params:         UpdateNetworkListRequest{Name: "TEST", UniqueID: "Test"},
   348  			responseStatus: http.StatusInternalServerError,
   349  			responseBody: `
   350  {
   351      "type": "internal_error",
   352      "title": "Internal Server Error",
   353      "detail": "Error updating networklist"
   354  }`,
   355  			expectedPath: "/network-list/v2/network-lists/Test",
   356  			withError: &Error{
   357  				Type:       "internal_error",
   358  				Title:      "Internal Server Error",
   359  				Detail:     "Error updating networklist",
   360  				StatusCode: http.StatusInternalServerError,
   361  			},
   362  		},
   363  	}
   364  
   365  	for name, test := range tests {
   366  		t.Run(name, func(t *testing.T) {
   367  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   368  				assert.Equal(t, http.MethodPut, r.Method)
   369  				assert.Equal(t, test.expectedPath, r.URL.String())
   370  				w.WriteHeader(test.responseStatus)
   371  				if len(test.responseBody) > 0 {
   372  					_, err := w.Write([]byte(test.responseBody))
   373  					assert.NoError(t, err)
   374  				}
   375  			}))
   376  			client := mockAPIClient(t, mockServer)
   377  			result, err := client.UpdateNetworkList(
   378  				session.ContextWithOptions(
   379  					context.Background(),
   380  					session.WithContextHeaders(test.headers)), test.params)
   381  			if test.withError != nil {
   382  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   383  				return
   384  			}
   385  			require.NoError(t, err)
   386  			assert.Equal(t, test.expectedResponse, result)
   387  		})
   388  	}
   389  }
   390  
   391  func TestNetworkList_DeleteNetworkList(t *testing.T) {
   392  
   393  	result := RemoveNetworkListResponse{}
   394  
   395  	respData := compactJSON(loadFixtureBytes("testdata/TestNetworkList/NetworkListEmpty.json"))
   396  	err := json.Unmarshal([]byte(respData), &result)
   397  	require.NoError(t, err)
   398  
   399  	req := RemoveNetworkListRequest{}
   400  
   401  	reqData := compactJSON(loadFixtureBytes("testdata/TestNetworkList/NetworkListEmpty.json"))
   402  	err = json.Unmarshal([]byte(reqData), &req)
   403  	require.NoError(t, err)
   404  
   405  	tests := map[string]struct {
   406  		params           RemoveNetworkListRequest
   407  		responseStatus   int
   408  		responseBody     string
   409  		expectedPath     string
   410  		expectedResponse *RemoveNetworkListResponse
   411  		withError        error
   412  		headers          http.Header
   413  	}{
   414  		"200 Success": {
   415  			params: RemoveNetworkListRequest{UniqueID: "Test"},
   416  			headers: http.Header{
   417  				"Content-Type": []string{"application/json;charset=UTF-8"},
   418  			},
   419  			responseStatus:   http.StatusOK,
   420  			responseBody:     respData,
   421  			expectedResponse: &result,
   422  			expectedPath:     "/network-list/v2/network-lists/Test",
   423  		},
   424  		"500 internal server error": {
   425  			params:         RemoveNetworkListRequest{UniqueID: "Test"},
   426  			responseStatus: http.StatusInternalServerError,
   427  			responseBody: `
   428          {
   429           "type": "internal_error",
   430           "title": "Internal Server Error",
   431           "detail": "Error deleting networklist"
   432           }`,
   433  			expectedPath: "/network-list/v2/network-lists/Test",
   434  			withError: &Error{
   435  				Type:       "internal_error",
   436  				Title:      "Internal Server Error",
   437  				Detail:     "Error deleting networklist",
   438  				StatusCode: http.StatusInternalServerError,
   439  			},
   440  		},
   441  	}
   442  
   443  	for name, test := range tests {
   444  		t.Run(name, func(t *testing.T) {
   445  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   446  				assert.Equal(t, http.MethodDelete, r.Method)
   447  				assert.Equal(t, test.expectedPath, r.URL.String())
   448  				w.WriteHeader(test.responseStatus)
   449  				if len(test.responseBody) > 0 {
   450  					_, err := w.Write([]byte(test.responseBody))
   451  					assert.NoError(t, err)
   452  				}
   453  			}))
   454  			client := mockAPIClient(t, mockServer)
   455  			result, err := client.RemoveNetworkList(
   456  				session.ContextWithOptions(
   457  					context.Background(),
   458  					session.WithContextHeaders(test.headers)), test.params)
   459  			if test.withError != nil {
   460  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   461  				return
   462  			}
   463  			require.NoError(t, err)
   464  			assert.Equal(t, test.expectedResponse, result)
   465  		})
   466  	}
   467  }