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

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