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

     1  package gtm
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"encoding/gob"
     7  	"encoding/json"
     8  	"errors"
     9  	"net/http"
    10  	"net/http/httptest"
    11  	"testing"
    12  
    13  	"github.com/akamai/AkamaiOPEN-edgegrid-golang/v2/pkg/session"
    14  	"github.com/stretchr/testify/assert"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestGtm_NewDomain(t *testing.T) {
    19  	client := Client(session.Must(session.New()))
    20  
    21  	dom := client.NewDomain(context.Background(), "example.com", "primary")
    22  
    23  	assert.Equal(t, "example.com", dom.Name)
    24  	assert.Equal(t, "primary", dom.Type)
    25  }
    26  
    27  // Verify GetListDomains. Sould pass, e.g. no API errors and non nil list.
    28  func TestGtm_ListDomains(t *testing.T) {
    29  	var result DomainsList
    30  
    31  	respData, err := loadTestData("TestGtm_ListDomains.resp.json")
    32  	if err != nil {
    33  		t.Fatal(err)
    34  	}
    35  
    36  	if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil {
    37  		t.Fatal(err)
    38  	}
    39  
    40  	tests := map[string]struct {
    41  		responseStatus   int
    42  		responseBody     string
    43  		expectedPath     string
    44  		expectedResponse []*DomainItem
    45  		withError        error
    46  		headers          http.Header
    47  	}{
    48  		"200 OK": {
    49  			headers: http.Header{
    50  				"Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"},
    51  			},
    52  			responseStatus:   http.StatusOK,
    53  			responseBody:     string(respData),
    54  			expectedPath:     "/config-gtm/v1/domains",
    55  			expectedResponse: result.DomainItems,
    56  		},
    57  		"500 internal server error": {
    58  			headers:        http.Header{},
    59  			responseStatus: http.StatusInternalServerError,
    60  			responseBody: `
    61  {
    62      "type": "internal_error",
    63      "title": "Internal Server Error",
    64      "detail": "Error fetching domains",
    65      "status": 500
    66  }`,
    67  			expectedPath: "/config-gtm/v1/domains",
    68  			withError: &Error{
    69  				Type:       "internal_error",
    70  				Title:      "Internal Server Error",
    71  				Detail:     "Error fetching domains",
    72  				StatusCode: http.StatusInternalServerError,
    73  			},
    74  		},
    75  	}
    76  
    77  	for name, test := range tests {
    78  		t.Run(name, func(t *testing.T) {
    79  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    80  				assert.Equal(t, test.expectedPath, r.URL.String())
    81  				assert.Equal(t, http.MethodGet, r.Method)
    82  				w.WriteHeader(test.responseStatus)
    83  				_, err := w.Write([]byte(test.responseBody))
    84  				assert.NoError(t, err)
    85  			}))
    86  			client := mockAPIClient(t, mockServer)
    87  			result, err := client.ListDomains(
    88  				session.ContextWithOptions(
    89  					context.Background(),
    90  					session.WithContextHeaders(test.headers)))
    91  			if test.withError != nil {
    92  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
    93  				return
    94  			}
    95  			require.NoError(t, err)
    96  			assert.Equal(t, test.expectedResponse, result)
    97  		})
    98  	}
    99  }
   100  
   101  func TestGtm_NullFieldMap(t *testing.T) {
   102  	var result NullFieldMapStruct
   103  
   104  	gob.Register(map[string]NullPerObjectAttributeStruct{})
   105  
   106  	respData, err := loadTestData("TestGtm_NullFieldMap.resp.json")
   107  	if err != nil {
   108  		t.Fatal(err)
   109  	}
   110  
   111  	resultData, err := loadTestData("TestGtm_NullFieldMap.result.gob")
   112  	if err != nil {
   113  		t.Fatal(err)
   114  	}
   115  
   116  	if err := gob.NewDecoder(bytes.NewBuffer(resultData)).Decode(&result); err != nil {
   117  		t.Fatal(err)
   118  	}
   119  
   120  	tests := map[string]struct {
   121  		arg              *Domain
   122  		responseStatus   int
   123  		responseBody     []byte
   124  		expectedPath     string
   125  		expectedResponse *NullFieldMapStruct
   126  		withError        error
   127  	}{
   128  		"200 OK": {
   129  			arg: &Domain{
   130  				Name: "example.akadns.net",
   131  				Type: "primary",
   132  			},
   133  			responseStatus:   http.StatusOK,
   134  			responseBody:     respData,
   135  			expectedPath:     "/config-gtm/v1/domains/example.akadns.net",
   136  			expectedResponse: &result,
   137  		},
   138  		"500 internal server error": {
   139  			arg: &Domain{
   140  				Name: "example.akadns.net",
   141  				Type: "primary",
   142  			},
   143  			responseStatus: http.StatusInternalServerError,
   144  			responseBody: []byte(`
   145  {
   146      "type": "internal_error",
   147      "title": "Internal Server Error",
   148      "detail": "Error fetching null field map",
   149      "status": 500
   150  }`),
   151  			expectedPath: "/config-gtm/v1/domains/example.akadns.net",
   152  			withError: &Error{
   153  				Type:       "internal_error",
   154  				Title:      "Internal Server Error",
   155  				Detail:     "Error fetching null field map",
   156  				StatusCode: http.StatusInternalServerError,
   157  			},
   158  		},
   159  	}
   160  
   161  	for name, test := range tests {
   162  		t.Run(name, func(t *testing.T) {
   163  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   164  				assert.Equal(t, test.expectedPath, r.URL.String())
   165  				assert.Equal(t, http.MethodGet, r.Method)
   166  				w.WriteHeader(test.responseStatus)
   167  				_, err := w.Write(test.responseBody)
   168  				assert.NoError(t, err)
   169  			}))
   170  			client := mockAPIClient(t, mockServer)
   171  			result, err := client.NullFieldMap(context.Background(), test.arg)
   172  			if test.withError != nil {
   173  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   174  				return
   175  			}
   176  			require.NoError(t, err)
   177  			assert.Equal(t, test.expectedResponse, result)
   178  		})
   179  	}
   180  }
   181  
   182  // Test GetDomain
   183  // GetDomain(context.Context, string) (*Domain, error)
   184  func TestGtm_GetDomain(t *testing.T) {
   185  	var result Domain
   186  
   187  	respData, err := loadTestData("TestGtm_GetDomain.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  	tests := map[string]struct {
   197  		domain           string
   198  		responseStatus   int
   199  		responseBody     []byte
   200  		expectedPath     string
   201  		expectedResponse *Domain
   202  		withError        error
   203  	}{
   204  		"200 OK": {
   205  			domain:           "example.akadns.net",
   206  			responseStatus:   http.StatusOK,
   207  			responseBody:     respData,
   208  			expectedPath:     "/config-gtm/v1/domains/example.akadns.net",
   209  			expectedResponse: &result,
   210  		},
   211  		"500 internal server error": {
   212  			domain:         "example.akadns.net",
   213  			responseStatus: http.StatusInternalServerError,
   214  			responseBody: []byte(`
   215  {
   216      "type": "internal_error",
   217      "title": "Internal Server Error",
   218      "detail": "Error fetching domain"
   219  }`),
   220  			expectedPath: "/config-gtm/v1/domains/example.akadns.net",
   221  			withError: &Error{
   222  				Type:       "internal_error",
   223  				Title:      "Internal Server Error",
   224  				Detail:     "Error fetching domain",
   225  				StatusCode: http.StatusInternalServerError,
   226  			},
   227  		},
   228  	}
   229  
   230  	for name, test := range tests {
   231  		t.Run(name, func(t *testing.T) {
   232  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   233  				assert.Equal(t, test.expectedPath, r.URL.String())
   234  				assert.Equal(t, http.MethodGet, r.Method)
   235  				w.WriteHeader(test.responseStatus)
   236  				_, err := w.Write(test.responseBody)
   237  				assert.NoError(t, err)
   238  			}))
   239  			client := mockAPIClient(t, mockServer)
   240  			result, err := client.GetDomain(context.Background(), test.domain)
   241  			if test.withError != nil {
   242  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   243  				return
   244  			}
   245  			require.NoError(t, err)
   246  			assert.Equal(t, test.expectedResponse, result)
   247  		})
   248  	}
   249  }
   250  
   251  // Test Create domain.
   252  // CreateDomain(context.Context, *Domain, map[string]string) (*DomainResponse, error)
   253  func TestGtm_CreateDomain(t *testing.T) {
   254  	var result DomainResponse
   255  
   256  	respData, err := loadTestData("TestGtm_GetDomain.resp.json")
   257  	if err != nil {
   258  		t.Fatal(err)
   259  	}
   260  
   261  	if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil {
   262  		t.Fatal(err)
   263  	}
   264  
   265  	tests := map[string]struct {
   266  		domain           Domain
   267  		query            map[string]string
   268  		responseStatus   int
   269  		responseBody     []byte
   270  		expectedPath     string
   271  		expectedResponse *DomainResponse
   272  		withError        error
   273  		headers          http.Header
   274  	}{
   275  		"201 Created": {
   276  			domain: Domain{
   277  				Name: "gtmdomtest.akadns.net",
   278  				Type: "basic",
   279  			},
   280  			query: map[string]string{"contractId": "1-2ABCDE"},
   281  			headers: http.Header{
   282  				"Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"},
   283  			},
   284  			responseStatus:   http.StatusCreated,
   285  			responseBody:     respData,
   286  			expectedResponse: &result,
   287  			expectedPath:     "/config-gtm/v1/domains?contractId=1-2ABCDE",
   288  		},
   289  		"500 internal server error": {
   290  			domain: Domain{
   291  				Name: "gtmdomtest.akadns.net",
   292  				Type: "basic",
   293  			},
   294  			query:          map[string]string{"contractId": "1-2ABCDE"},
   295  			responseStatus: http.StatusInternalServerError,
   296  			responseBody: []byte(`
   297  {
   298      "type": "internal_error",
   299      "title": "Internal Server Error",
   300      "detail": "Error creating domain"
   301  }`),
   302  			expectedPath: "/config-gtm/v1/domains?contractId=1-2ABCDE",
   303  			withError: &Error{
   304  				Type:       "internal_error",
   305  				Title:      "Internal Server Error",
   306  				Detail:     "Error creating domain",
   307  				StatusCode: http.StatusInternalServerError,
   308  			},
   309  		},
   310  	}
   311  
   312  	for name, test := range tests {
   313  		t.Run(name, func(t *testing.T) {
   314  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   315  				assert.Equal(t, http.MethodPost, r.Method)
   316  				w.WriteHeader(test.responseStatus)
   317  				if len(test.responseBody) > 0 {
   318  					_, err := w.Write(test.responseBody)
   319  					assert.NoError(t, err)
   320  				}
   321  			}))
   322  			client := mockAPIClient(t, mockServer)
   323  			result, err := client.CreateDomain(
   324  				session.ContextWithOptions(
   325  					context.Background(),
   326  					session.WithContextHeaders(test.headers)), &test.domain, test.query)
   327  			if test.withError != nil {
   328  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   329  				return
   330  			}
   331  			require.NoError(t, err)
   332  			assert.Equal(t, test.expectedResponse, result)
   333  		})
   334  	}
   335  }
   336  
   337  // Test Update domain.
   338  // UpdateDomain(context.Context, *Domain, map[string]string) (*DomainResponse, error)
   339  func TestGtm_UpdateDomain(t *testing.T) {
   340  	var result DomainResponse
   341  
   342  	respData, err := loadTestData("TestGtm_UpdateDomain.resp.json")
   343  	if err != nil {
   344  		t.Fatal(err)
   345  	}
   346  
   347  	if err := json.NewDecoder(bytes.NewBuffer(respData)).Decode(&result); err != nil {
   348  		t.Fatal(err)
   349  	}
   350  
   351  	tests := map[string]struct {
   352  		domain           Domain
   353  		query            map[string]string
   354  		responseStatus   int
   355  		responseBody     []byte
   356  		expectedPath     string
   357  		expectedResponse *ResponseStatus
   358  		withError        error
   359  		headers          http.Header
   360  	}{
   361  		"200 Success": {
   362  			domain: Domain{
   363  				EndUserMappingEnabled: false,
   364  				Name:                  "gtmdomtest.akadns.net",
   365  				Type:                  "basic",
   366  			},
   367  			query: map[string]string{"contractId": "1-2ABCDE"},
   368  			headers: http.Header{
   369  				"Content-Type": []string{"application/vnd.config-gtm.v1.4+json;charset=UTF-8"},
   370  			},
   371  			responseStatus:   http.StatusCreated,
   372  			responseBody:     respData,
   373  			expectedResponse: result.Status,
   374  			expectedPath:     "/config-gtm/v1/domains?contractId=1-2ABCDE",
   375  		},
   376  		"500 internal server error": {
   377  			domain: Domain{
   378  				Name: "gtmdomtest.akadns.net",
   379  				Type: "basic",
   380  			},
   381  			query:          map[string]string{"contractId": "1-2ABCDE"},
   382  			responseStatus: http.StatusInternalServerError,
   383  			responseBody: []byte(`
   384  {
   385      "type": "internal_error",
   386      "title": "Internal Server Error",
   387      "detail": "Error creating zone"
   388  }`),
   389  			expectedPath: "/config-gtm/v1/domains?contractId=1-2ABCDE",
   390  			withError: &Error{
   391  				Type:       "internal_error",
   392  				Title:      "Internal Server Error",
   393  				Detail:     "Error creating zone",
   394  				StatusCode: http.StatusInternalServerError,
   395  			},
   396  		},
   397  	}
   398  
   399  	for name, test := range tests {
   400  		t.Run(name, func(t *testing.T) {
   401  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   402  				assert.Equal(t, http.MethodPut, r.Method)
   403  				w.WriteHeader(test.responseStatus)
   404  				if len(test.responseBody) > 0 {
   405  					_, err := w.Write(test.responseBody)
   406  					assert.NoError(t, err)
   407  				}
   408  			}))
   409  			client := mockAPIClient(t, mockServer)
   410  			result, err := client.UpdateDomain(
   411  				session.ContextWithOptions(
   412  					context.Background(),
   413  					session.WithContextHeaders(test.headers)), &test.domain, test.query)
   414  			if test.withError != nil {
   415  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   416  				return
   417  			}
   418  			require.NoError(t, err)
   419  			assert.Equal(t, test.expectedResponse, result)
   420  		})
   421  	}
   422  }
   423  
   424  /* Future. Presently no domain Delete endpoint.
   425  func TestGtm_DeleteDomain(t *testing.T) {
   426  
   427          defer gock.Off()
   428  
   429          mock := gock.New("https://akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net/config-gtm/v1/domains/"+gtmTestDomain)
   430          mock.
   431                  Delete("/config-gtm/v1/domains/"+gtmTestDomain).
   432                  HeaderPresent("Authorization").
   433                  Reply(200).
   434                  SetHeader("Content-Type", "application/vnd.config-gtm.v1.4+json;charset=UTF-8").
   435                  BodyString(`{
   436                          "resource" : null,
   437                          "status" : {
   438                                 "changeId": "40e36abd-bfb2-4635-9fca-62175cf17007",
   439                                 "links": [
   440                                       {
   441                                            "href": "https://akab-ymtebc45gco3ypzj-apz4yxpek55y7fyv.luna.akamaiapis.net/config-gtm/v1/domains/gtmdomtest.akadns.net/status/current",
   442                                            "rel": "self"
   443                                       }
   444                                 ],
   445                                 "message": "Change Pending",
   446                                 "passingValidation": true,
   447                                 "propagationStatus": "PENDING",
   448                                 "propagationStatusDate": "2019-04-25T14:54:00.000+00:00"
   449                            },
   450                  }`)
   451  
   452          Init(config)
   453  
   454          getDomain := instantiateDomain()
   455  
   456          _, err := getDomain.Delete()
   457          assert.NoError(t, err)
   458  
   459  }
   460  */