github.com/akamai/AkamaiOPEN-edgegrid-golang/v4@v4.1.0/pkg/gtm/datacenter_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/v4/pkg/session"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func TestGtm_NewDatacenterResponse(t *testing.T) {
    18  	client := Client(session.Must(session.New()))
    19  
    20  	dcr := client.NewDatacenterResponse(context.Background())
    21  
    22  	assert.NotNil(t, dcr)
    23  }
    24  
    25  func TestGtm_NewDatacenter(t *testing.T) {
    26  	client := Client(session.Must(session.New()))
    27  
    28  	dc := client.NewDatacenter(context.Background())
    29  
    30  	assert.NotNil(t, dc)
    31  }
    32  
    33  func TestGtm_ListDatacenters(t *testing.T) {
    34  	var result DatacenterList
    35  
    36  	respData, err := loadTestData("TestGtm_ListDatacenters.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  		domainName       string
    47  		responseStatus   int
    48  		responseBody     string
    49  		expectedPath     string
    50  		expectedResponse []*Datacenter
    51  		withError        error
    52  		headers          http.Header
    53  	}{
    54  		"200 OK": {
    55  			domainName: "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/datacenters",
    62  			expectedResponse: result.DatacenterItems,
    63  		},
    64  		"500 internal server error": {
    65  			domainName:     "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 datacenters"
    73  }`,
    74  			expectedPath: "/config-gtm/v1/domains/example.akadns.net/datacenters",
    75  			withError: &Error{
    76  				Type:       "internal_error",
    77  				Title:      "Internal Server Error",
    78  				Detail:     "Error fetching datacenters",
    79  				StatusCode: http.StatusInternalServerError,
    80  			},
    81  		},
    82  	}
    83  
    84  	for name, test := range tests {
    85  		t.Run(name, func(t *testing.T) {
    86  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    87  				assert.Equal(t, test.expectedPath, r.URL.String())
    88  				assert.Equal(t, http.MethodGet, r.Method)
    89  				w.WriteHeader(test.responseStatus)
    90  				_, err := w.Write([]byte(test.responseBody))
    91  				assert.NoError(t, err)
    92  			}))
    93  			client := mockAPIClient(t, mockServer)
    94  			result, err := client.ListDatacenters(
    95  				session.ContextWithOptions(
    96  					context.Background(),
    97  					session.WithContextHeaders(test.headers)), test.domainName)
    98  			if test.withError != nil {
    99  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   100  				return
   101  			}
   102  			require.NoError(t, err)
   103  			assert.Equal(t, test.expectedResponse, result)
   104  		})
   105  	}
   106  }
   107  
   108  func TestGtm_GetDatacenter(t *testing.T) {
   109  	var result Datacenter
   110  
   111  	respData, err := loadTestData("TestGtm_GetDatacenter.resp.json")
   112  	if err != nil {
   113  		t.Fatal(err)
   114  	}
   115  
   116  	if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil {
   117  		t.Fatal(err)
   118  	}
   119  
   120  	tests := map[string]struct {
   121  		id               int
   122  		domainName       string
   123  		responseStatus   int
   124  		responseBody     string
   125  		expectedPath     string
   126  		expectedResponse *Datacenter
   127  		withError        error
   128  		headers          http.Header
   129  	}{
   130  		"200 OK": {
   131  			id:         1,
   132  			domainName: "example.akadns.net",
   133  			headers: http.Header{
   134  				"Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"},
   135  			},
   136  			responseStatus:   http.StatusOK,
   137  			responseBody:     string(respData),
   138  			expectedPath:     "/config-gtm/v1/domains/example.akadns.net/datacenters/1",
   139  			expectedResponse: &result,
   140  		},
   141  		"500 internal server error": {
   142  			id:             1,
   143  			domainName:     "example.akadns.net",
   144  			headers:        http.Header{},
   145  			responseStatus: http.StatusInternalServerError,
   146  			responseBody: `
   147  {
   148      "type": "internal_error",
   149      "title": "Internal Server Error",
   150      "detail": "Error fetching datacenter"
   151  }`,
   152  			expectedPath: "/config-gtm/v1/domains/example.akadns.net/datacenters/1",
   153  			withError: &Error{
   154  				Type:       "internal_error",
   155  				Title:      "Internal Server Error",
   156  				Detail:     "Error fetching datacenter",
   157  				StatusCode: http.StatusInternalServerError,
   158  			},
   159  		},
   160  	}
   161  
   162  	for name, test := range tests {
   163  		t.Run(name, func(t *testing.T) {
   164  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   165  				assert.Equal(t, test.expectedPath, r.URL.String())
   166  				assert.Equal(t, http.MethodGet, r.Method)
   167  				w.WriteHeader(test.responseStatus)
   168  				_, err := w.Write([]byte(test.responseBody))
   169  				assert.NoError(t, err)
   170  			}))
   171  			client := mockAPIClient(t, mockServer)
   172  			result, err := client.GetDatacenter(
   173  				session.ContextWithOptions(
   174  					context.Background(),
   175  					session.WithContextHeaders(test.headers)), test.id, test.domainName)
   176  			if test.withError != nil {
   177  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   178  				return
   179  			}
   180  			require.NoError(t, err)
   181  			assert.Equal(t, test.expectedResponse, result)
   182  		})
   183  	}
   184  }
   185  
   186  func TestGtm_CreateDatacenter(t *testing.T) {
   187  	var result DatacenterResponse
   188  	var req Datacenter
   189  
   190  	respData, err := loadTestData("TestGtm_CreateDatacenter.resp.json")
   191  	if err != nil {
   192  		t.Fatal(err)
   193  	}
   194  
   195  	if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil {
   196  		t.Fatal(err)
   197  	}
   198  
   199  	reqData, err := loadTestData("TestGtm_CreateDatacenter.req.json")
   200  	if err != nil {
   201  		t.Fatal(err)
   202  	}
   203  
   204  	if err := json.NewDecoder(bytes.NewBuffer(reqData)).Decode(&req); err != nil {
   205  		t.Fatal(err)
   206  	}
   207  
   208  	tests := map[string]struct {
   209  		dc               *Datacenter
   210  		domainName       string
   211  		responseStatus   int
   212  		responseBody     string
   213  		expectedPath     string
   214  		expectedResponse *DatacenterResponse
   215  		withError        error
   216  		headers          http.Header
   217  	}{
   218  		"200 OK": {
   219  			dc:         &req,
   220  			domainName: "example.akadns.net",
   221  			headers: http.Header{
   222  				"Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"},
   223  			},
   224  			responseStatus:   http.StatusCreated,
   225  			responseBody:     string(respData),
   226  			expectedPath:     "/config-gtm/v1/domains/example.akadns.net/datacenters",
   227  			expectedResponse: &result,
   228  		},
   229  		"500 internal server error": {
   230  			dc:             &req,
   231  			domainName:     "example.akadns.net",
   232  			headers:        http.Header{},
   233  			responseStatus: http.StatusInternalServerError,
   234  			responseBody: `
   235  {
   236      "type": "internal_error",
   237      "title": "Internal Server Error",
   238      "detail": "Error creating dc"
   239  }`,
   240  			expectedPath: "/config-gtm/v1/domains/example.akadns.net/datacenters",
   241  			withError: &Error{
   242  				Type:       "internal_error",
   243  				Title:      "Internal Server Error",
   244  				Detail:     "Error creating dc",
   245  				StatusCode: http.StatusInternalServerError,
   246  			},
   247  		},
   248  	}
   249  
   250  	for name, test := range tests {
   251  		t.Run(name, func(t *testing.T) {
   252  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   253  				assert.Equal(t, test.expectedPath, r.URL.String())
   254  				assert.Equal(t, http.MethodPost, r.Method)
   255  				w.WriteHeader(test.responseStatus)
   256  				_, err := w.Write([]byte(test.responseBody))
   257  				assert.NoError(t, err)
   258  			}))
   259  			client := mockAPIClient(t, mockServer)
   260  			result, err := client.CreateDatacenter(
   261  				session.ContextWithOptions(
   262  					context.Background(),
   263  					session.WithContextHeaders(test.headers)), test.dc, test.domainName)
   264  			if test.withError != nil {
   265  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   266  				return
   267  			}
   268  			require.NoError(t, err)
   269  			assert.Equal(t, test.expectedResponse, result)
   270  		})
   271  	}
   272  }
   273  
   274  func TestGtm_CreateMapsDefaultDatacenter(t *testing.T) {
   275  	var result DatacenterResponse
   276  
   277  	respData, err := loadTestData("TestGtm_CreateMapsDefaultDatacenter.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  	tests := map[string]struct {
   287  		domainName       string
   288  		responseStatus   int
   289  		responseBody     string
   290  		expectedPath     string
   291  		expectedResponse *Datacenter
   292  		withError        error
   293  		headers          http.Header
   294  	}{
   295  		"200 OK": {
   296  			domainName: "example.akadns.net",
   297  			headers: http.Header{
   298  				"Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"},
   299  			},
   300  			responseStatus:   http.StatusCreated,
   301  			responseBody:     string(respData),
   302  			expectedPath:     "/config-gtm/v1/domains/example.akadns.net/datacenters/default-datacenter-for-maps",
   303  			expectedResponse: result.Resource,
   304  		},
   305  		"500 internal server error": {
   306  			domainName:     "example.akadns.net",
   307  			headers:        http.Header{},
   308  			responseStatus: http.StatusInternalServerError,
   309  			responseBody: `
   310  {
   311      "type": "internal_error",
   312      "title": "Internal Server Error",
   313      "detail": "Error creating dc"
   314  }`,
   315  			expectedPath: "/config-gtm/v1/domains/example.akadns.net/datacenters/default-datacenter-for-maps",
   316  			withError: &Error{
   317  				Type:       "internal_error",
   318  				Title:      "Internal Server Error",
   319  				Detail:     "Error creating dc",
   320  				StatusCode: http.StatusInternalServerError,
   321  			},
   322  		},
   323  	}
   324  
   325  	for name, test := range tests {
   326  		t.Run(name, func(t *testing.T) {
   327  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   328  				if r.Method == http.MethodGet {
   329  					w.WriteHeader(http.StatusNotFound)
   330  					_, err = w.Write([]byte(`
   331                                          {
   332                                              "type": "Datacenter",
   333                                              "title": "not found"
   334                                          }`))
   335  					require.NoError(t, err)
   336  					return
   337  				}
   338  				assert.Equal(t, test.expectedPath, r.URL.String())
   339  				assert.Equal(t, http.MethodPost, r.Method)
   340  				w.WriteHeader(test.responseStatus)
   341  				_, err := w.Write([]byte(test.responseBody))
   342  				assert.NoError(t, err)
   343  			}))
   344  			client := mockAPIClient(t, mockServer)
   345  			result, err := client.CreateMapsDefaultDatacenter(
   346  				session.ContextWithOptions(
   347  					context.Background(),
   348  					session.WithContextHeaders(test.headers)), test.domainName)
   349  			if test.withError != nil {
   350  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   351  				return
   352  			}
   353  			require.NoError(t, err)
   354  			assert.Equal(t, test.expectedResponse, result)
   355  		})
   356  	}
   357  }
   358  
   359  func TestGtm_CreateIPv4DefaultDatacenter(t *testing.T) {
   360  	var result DatacenterResponse
   361  
   362  	respData, err := loadTestData("TestGtm_CreateIPv4DefaultDatacenter.resp.json")
   363  	if err != nil {
   364  		t.Fatal(err)
   365  	}
   366  
   367  	if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil {
   368  		t.Fatal(err)
   369  	}
   370  
   371  	tests := map[string]struct {
   372  		domainName       string
   373  		responseStatus   int
   374  		responseBody     string
   375  		expectedPath     string
   376  		expectedResponse *Datacenter
   377  		withError        error
   378  		headers          http.Header
   379  	}{
   380  		"200 OK": {
   381  			domainName: "example.akadns.net",
   382  			headers: http.Header{
   383  				"Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"},
   384  			},
   385  			responseStatus:   http.StatusCreated,
   386  			responseBody:     string(respData),
   387  			expectedPath:     "/config-gtm/v1/domains/example.akadns.net/datacenters/datacenter-for-ip-version-selector-ipv4",
   388  			expectedResponse: result.Resource,
   389  		},
   390  		"500 internal server error": {
   391  			domainName:     "example.akadns.net",
   392  			headers:        http.Header{},
   393  			responseStatus: http.StatusInternalServerError,
   394  			responseBody: `
   395  {
   396      "type": "internal_error",
   397      "title": "Internal Server Error",
   398      "detail": "Error creating dc"
   399  }`,
   400  			expectedPath: "/config-gtm/v1/domains/example.akadns.net/datacenters/datacenter-for-ip-version-selector-ipv4",
   401  			withError: &Error{
   402  				Type:       "internal_error",
   403  				Title:      "Internal Server Error",
   404  				Detail:     "Error creating dc",
   405  				StatusCode: http.StatusInternalServerError,
   406  			},
   407  		},
   408  	}
   409  
   410  	for name, test := range tests {
   411  		t.Run(name, func(t *testing.T) {
   412  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   413  				if r.Method == http.MethodGet {
   414  					w.WriteHeader(http.StatusNotFound)
   415  					_, err = w.Write([]byte(`
   416                                          {
   417                                              "type": "Datacenter",
   418                                              "title": "not found"
   419                                          }`))
   420  					require.NoError(t, err)
   421  					return
   422  				}
   423  				assert.Equal(t, test.expectedPath, r.URL.String())
   424  				assert.Equal(t, http.MethodPost, r.Method)
   425  				w.WriteHeader(test.responseStatus)
   426  				_, err := w.Write([]byte(test.responseBody))
   427  				assert.NoError(t, err)
   428  			}))
   429  			client := mockAPIClient(t, mockServer)
   430  			result, err := client.CreateIPv4DefaultDatacenter(
   431  				session.ContextWithOptions(
   432  					context.Background(),
   433  					session.WithContextHeaders(test.headers)), test.domainName)
   434  			if test.withError != nil {
   435  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   436  				return
   437  			}
   438  			require.NoError(t, err)
   439  			assert.Equal(t, test.expectedResponse, result)
   440  		})
   441  	}
   442  }
   443  
   444  func TestGtm_CreateIPv6DefaultDatacenter(t *testing.T) {
   445  	var result DatacenterResponse
   446  
   447  	respData, err := loadTestData("TestGtm_CreateIPv6DefaultDatacenter.resp.json")
   448  	if err != nil {
   449  		t.Fatal(err)
   450  	}
   451  
   452  	if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil {
   453  		t.Fatal(err)
   454  	}
   455  
   456  	tests := map[string]struct {
   457  		domainName       string
   458  		responseStatus   int
   459  		responseBody     string
   460  		expectedPath     string
   461  		expectedResponse *Datacenter
   462  		withError        error
   463  		headers          http.Header
   464  	}{
   465  		"200 OK": {
   466  			domainName: "example.akadns.net",
   467  			headers: http.Header{
   468  				"Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"},
   469  			},
   470  			responseStatus:   http.StatusCreated,
   471  			responseBody:     string(respData),
   472  			expectedPath:     "/config-gtm/v1/domains/example.akadns.net/datacenters/datacenter-for-ip-version-selector-ipv6",
   473  			expectedResponse: result.Resource,
   474  		},
   475  		"500 internal server error": {
   476  			domainName:     "example.akadns.net",
   477  			headers:        http.Header{},
   478  			responseStatus: http.StatusInternalServerError,
   479  			responseBody: `
   480  {
   481      "type": "internal_error",
   482      "title": "Internal Server Error",
   483      "detail": "Error creating dc"
   484  }`,
   485  			expectedPath: "/config-gtm/v1/domains/example.akadns.net/datacenters/datacenter-for-ip-version-selector-ipv6",
   486  			withError: &Error{
   487  				Type:       "internal_error",
   488  				Title:      "Internal Server Error",
   489  				Detail:     "Error creating dc",
   490  				StatusCode: http.StatusInternalServerError,
   491  			},
   492  		},
   493  	}
   494  
   495  	for name, test := range tests {
   496  		t.Run(name, func(t *testing.T) {
   497  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   498  				if r.Method == http.MethodGet {
   499  					w.WriteHeader(http.StatusNotFound)
   500  					_, err = w.Write([]byte(`
   501                                          {
   502                                              "type": "Datacenter",
   503                                              "title": "not found"
   504                                          }`))
   505  					require.NoError(t, err)
   506  					return
   507  				}
   508  				assert.Equal(t, test.expectedPath, r.URL.String())
   509  				assert.Equal(t, http.MethodPost, r.Method)
   510  				w.WriteHeader(test.responseStatus)
   511  				_, err := w.Write([]byte(test.responseBody))
   512  				assert.NoError(t, err)
   513  			}))
   514  			client := mockAPIClient(t, mockServer)
   515  			result, err := client.CreateIPv6DefaultDatacenter(
   516  				session.ContextWithOptions(
   517  					context.Background(),
   518  					session.WithContextHeaders(test.headers)), test.domainName)
   519  			if test.withError != nil {
   520  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   521  				return
   522  			}
   523  			require.NoError(t, err)
   524  			assert.Equal(t, test.expectedResponse, result)
   525  		})
   526  	}
   527  }
   528  
   529  func TestGtm_UpdateDatacenter(t *testing.T) {
   530  	var result DatacenterResponse
   531  	var req Datacenter
   532  
   533  	respData, err := loadTestData("TestGtm_CreateDatacenter.resp.json")
   534  	if err != nil {
   535  		t.Fatal(err)
   536  	}
   537  
   538  	if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil {
   539  		t.Fatal(err)
   540  	}
   541  
   542  	reqData, err := loadTestData("TestGtm_CreateDatacenter.req.json")
   543  	if err != nil {
   544  		t.Fatal(err)
   545  	}
   546  
   547  	if err := json.NewDecoder(bytes.NewBuffer(reqData)).Decode(&req); err != nil {
   548  		t.Fatal(err)
   549  	}
   550  
   551  	tests := map[string]struct {
   552  		dc               *Datacenter
   553  		domainName       string
   554  		responseStatus   int
   555  		responseBody     string
   556  		expectedPath     string
   557  		expectedResponse *ResponseStatus
   558  		withError        error
   559  		headers          http.Header
   560  	}{
   561  		"200 OK": {
   562  			dc:         &req,
   563  			domainName: "example.akadns.net",
   564  			headers: http.Header{
   565  				"Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"},
   566  			},
   567  			responseStatus:   http.StatusOK,
   568  			responseBody:     string(respData),
   569  			expectedPath:     "/config-gtm/v1/domains/example.akadns.net/datacenters/0",
   570  			expectedResponse: result.Status,
   571  		},
   572  		"500 internal server error": {
   573  			dc:             &req,
   574  			domainName:     "example.akadns.net",
   575  			headers:        http.Header{},
   576  			responseStatus: http.StatusInternalServerError,
   577  			responseBody: `
   578  {
   579      "type": "internal_error",
   580      "title": "Internal Server Error",
   581      "detail": "Error updating dc"
   582  }`,
   583  			expectedPath: "/config-gtm/v1/domains/example.akadns.net/datacenters/0",
   584  			withError: &Error{
   585  				Type:       "internal_error",
   586  				Title:      "Internal Server Error",
   587  				Detail:     "Error updating dc",
   588  				StatusCode: http.StatusInternalServerError,
   589  			},
   590  		},
   591  	}
   592  
   593  	for name, test := range tests {
   594  		t.Run(name, func(t *testing.T) {
   595  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   596  				assert.Equal(t, test.expectedPath, r.URL.String())
   597  				assert.Equal(t, http.MethodPut, r.Method)
   598  				w.WriteHeader(test.responseStatus)
   599  				_, err := w.Write([]byte(test.responseBody))
   600  				assert.NoError(t, err)
   601  			}))
   602  			client := mockAPIClient(t, mockServer)
   603  			result, err := client.UpdateDatacenter(
   604  				session.ContextWithOptions(
   605  					context.Background(),
   606  					session.WithContextHeaders(test.headers)), test.dc, test.domainName)
   607  			if test.withError != nil {
   608  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   609  				return
   610  			}
   611  			require.NoError(t, err)
   612  			assert.Equal(t, test.expectedResponse, result)
   613  		})
   614  	}
   615  }
   616  
   617  func TestGtm_DeleteDatacenter(t *testing.T) {
   618  	var result DatacenterResponse
   619  	var req Datacenter
   620  
   621  	respData, err := loadTestData("TestGtm_CreateDatacenter.resp.json")
   622  	if err != nil {
   623  		t.Fatal(err)
   624  	}
   625  
   626  	if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil {
   627  		t.Fatal(err)
   628  	}
   629  
   630  	reqData, err := loadTestData("TestGtm_CreateDatacenter.req.json")
   631  	if err != nil {
   632  		t.Fatal(err)
   633  	}
   634  
   635  	if err := json.NewDecoder(bytes.NewBuffer(reqData)).Decode(&req); err != nil {
   636  		t.Fatal(err)
   637  	}
   638  
   639  	tests := map[string]struct {
   640  		dc               *Datacenter
   641  		domainName       string
   642  		responseStatus   int
   643  		responseBody     string
   644  		expectedPath     string
   645  		expectedResponse *ResponseStatus
   646  		withError        error
   647  		headers          http.Header
   648  	}{
   649  		"200 OK": {
   650  			dc:         &req,
   651  			domainName: "example.akadns.net",
   652  			headers: http.Header{
   653  				"Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"},
   654  			},
   655  			responseStatus:   http.StatusOK,
   656  			responseBody:     string(respData),
   657  			expectedPath:     "/config-gtm/v1/domains/example.akadns.net/datacenters/0",
   658  			expectedResponse: result.Status,
   659  		},
   660  		"500 internal server error": {
   661  			dc:             &req,
   662  			domainName:     "example.akadns.net",
   663  			headers:        http.Header{},
   664  			responseStatus: http.StatusInternalServerError,
   665  			responseBody: `
   666  {
   667      "type": "internal_error",
   668      "title": "Internal Server Error",
   669      "detail": "Error updating dc"
   670  }`,
   671  			expectedPath: "/config-gtm/v1/domains/example.akadns.net/datacenters/0",
   672  			withError: &Error{
   673  				Type:       "internal_error",
   674  				Title:      "Internal Server Error",
   675  				Detail:     "Error updating dc",
   676  				StatusCode: http.StatusInternalServerError,
   677  			},
   678  		},
   679  	}
   680  
   681  	for name, test := range tests {
   682  		t.Run(name, func(t *testing.T) {
   683  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   684  				assert.Equal(t, test.expectedPath, r.URL.String())
   685  				assert.Equal(t, http.MethodDelete, r.Method)
   686  				w.WriteHeader(test.responseStatus)
   687  				_, err := w.Write([]byte(test.responseBody))
   688  				assert.NoError(t, err)
   689  			}))
   690  			client := mockAPIClient(t, mockServer)
   691  			result, err := client.DeleteDatacenter(
   692  				session.ContextWithOptions(
   693  					context.Background(),
   694  					session.WithContextHeaders(test.headers)), test.dc, test.domainName)
   695  			if test.withError != nil {
   696  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   697  				return
   698  			}
   699  			require.NoError(t, err)
   700  			assert.Equal(t, test.expectedResponse, result)
   701  		})
   702  	}
   703  }