github.com/akamai/AkamaiOPEN-edgegrid-golang/v5@v5.0.0/pkg/dns/zonebulk_test.go (about)

     1  package dns
     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 TestDns_GetBulkZoneCreateStatus(t *testing.T) {
    15  	tests := map[string]struct {
    16  		requestid        string
    17  		responseStatus   int
    18  		responseBody     string
    19  		expectedPath     string
    20  		expectedResponse *BulkStatusResponse
    21  		withError        error
    22  	}{
    23  		"200 OK": {
    24  			requestid:      "15bc138f-8d82-451b-80b7-a56b88ffc474",
    25  			responseStatus: http.StatusOK,
    26  			responseBody: `
    27    {
    28      "requestId": "15bc138f-8d82-451b-80b7-a56b88ffc474",
    29      "zonesSubmitted": 2,
    30      "successCount": 0,
    31      "failureCount": 2,
    32      "isComplete": true,
    33      "expirationDate": "2020-10-28T17:10:04.515792Z"
    34    }`,
    35  			expectedPath: "/config-dns/v2/zones/create-requests/15bc138f-8d82-451b-80b7-a56b88ffc474",
    36  			expectedResponse: &BulkStatusResponse{
    37  				RequestId:      "15bc138f-8d82-451b-80b7-a56b88ffc474",
    38  				ZonesSubmitted: 2,
    39  				SuccessCount:   0,
    40  				FailureCount:   2,
    41  				IsComplete:     true,
    42  				ExpirationDate: "2020-10-28T17:10:04.515792Z",
    43  			},
    44  		},
    45  		"500 internal server error": {
    46  			requestid:      "15bc138f-8d82-451b-80b7-a56b88ffc474",
    47  			responseStatus: http.StatusInternalServerError,
    48  			responseBody: `
    49  {
    50  	"type": "internal_error",
    51      "title": "Internal Server Error",
    52      "detail": "Error fetching authorities",
    53      "status": 500
    54  }`,
    55  			expectedPath: "/config-dns/v2/zones/create-requests/15bc138f-8d82-451b-80b7-a56b88ffc474",
    56  			withError: &Error{
    57  				Type:       "internal_error",
    58  				Title:      "Internal Server Error",
    59  				Detail:     "Error fetching authorities",
    60  				StatusCode: http.StatusInternalServerError,
    61  			},
    62  		},
    63  	}
    64  
    65  	for name, test := range tests {
    66  		t.Run(name, func(t *testing.T) {
    67  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    68  				//assert.Equal(t, test.expectedPath, r.URL.String())
    69  				assert.Equal(t, http.MethodGet, r.Method)
    70  				w.WriteHeader(test.responseStatus)
    71  				_, err := w.Write([]byte(test.responseBody))
    72  				assert.NoError(t, err)
    73  			}))
    74  			client := mockAPIClient(t, mockServer)
    75  			result, err := client.GetBulkZoneCreateStatus(context.Background(), test.requestid)
    76  			if test.withError != nil {
    77  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
    78  				return
    79  			}
    80  			require.NoError(t, err)
    81  			assert.Equal(t, test.expectedResponse, result)
    82  		})
    83  	}
    84  }
    85  
    86  func TestDns_GetBulkZoneCreateResult(t *testing.T) {
    87  	tests := map[string]struct {
    88  		requestid        string
    89  		responseStatus   int
    90  		responseBody     string
    91  		expectedPath     string
    92  		expectedResponse *BulkCreateResultResponse
    93  		withError        error
    94  	}{
    95  		"200 OK": {
    96  			requestid:      "15bc138f-8d82-451b-80b7-a56b88ffc474",
    97  			responseStatus: http.StatusOK,
    98  			responseBody: `
    99    {
   100      "requestId": "15bc138f-8d82-451b-80b7-a56b88ffc474",
   101      "successfullyCreatedZones": [],
   102      "failedZones": [
   103        {
   104          "zone": "one.testbulk.net",
   105          "failureReason": "ZONE_ALREADY_EXISTS"
   106        }
   107      ]
   108    }`,
   109  			expectedPath: "/config-dns/v2/zones/create-requests/15bc138f-8d82-451b-80b7-a56b88ffc474/result",
   110  			expectedResponse: &BulkCreateResultResponse{
   111  				RequestId:                "15bc138f-8d82-451b-80b7-a56b88ffc474",
   112  				SuccessfullyCreatedZones: make([]string, 0),
   113  				FailedZones: []*BulkFailedZone{
   114  					{
   115  						Zone:          "one.testbulk.net",
   116  						FailureReason: "ZONE_ALREADY_EXISTS",
   117  					},
   118  				},
   119  			},
   120  		},
   121  		"500 internal server error": {
   122  			requestid:      "15bc138f-8d82-451b-80b7-a56b88ffc474",
   123  			responseStatus: http.StatusInternalServerError,
   124  			responseBody: `
   125  {
   126          "type": "internal_error",
   127      "title": "Internal Server Error",
   128      "detail": "Error fetching authorities",
   129      "status": 500
   130  }`,
   131  			expectedPath: "/config-dns/v2/zones/create-requests/15bc138f-8d82-451b-80b7-a56b88ffc474/result",
   132  			withError: &Error{
   133  				Type:       "internal_error",
   134  				Title:      "Internal Server Error",
   135  				Detail:     "Error fetching authorities",
   136  				StatusCode: http.StatusInternalServerError,
   137  			},
   138  		},
   139  	}
   140  
   141  	for name, test := range tests {
   142  		t.Run(name, func(t *testing.T) {
   143  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   144  				//assert.Equal(t, test.expectedPath, r.URL.String())
   145  				assert.Equal(t, http.MethodGet, r.Method)
   146  				w.WriteHeader(test.responseStatus)
   147  				_, err := w.Write([]byte(test.responseBody))
   148  				assert.NoError(t, err)
   149  			}))
   150  			client := mockAPIClient(t, mockServer)
   151  			result, err := client.GetBulkZoneCreateResult(context.Background(), test.requestid)
   152  			if test.withError != nil {
   153  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   154  				return
   155  			}
   156  			require.NoError(t, err)
   157  			assert.Equal(t, test.expectedResponse, result)
   158  		})
   159  	}
   160  }
   161  
   162  func TestDns_CreateBulkZones(t *testing.T) {
   163  	tests := map[string]struct {
   164  		zones            BulkZonesCreate
   165  		query            ZoneQueryString
   166  		responseStatus   int
   167  		responseBody     string
   168  		expectedResponse *BulkZonesResponse
   169  		expectedPath     string
   170  		withError        error
   171  	}{
   172  		"200 Created": {
   173  			zones: BulkZonesCreate{
   174  				Zones: []*ZoneCreate{
   175  					{
   176  						Zone:    "one.testbulk.net",
   177  						Type:    "secondary",
   178  						Comment: "testing bulk operations",
   179  						Masters: []string{"1.2.3.4", "1.2.3.10"},
   180  					},
   181  					{
   182  						Zone:    "two.testbulk.net",
   183  						Type:    "secondary",
   184  						Comment: "testing bulk operations",
   185  						Masters: []string{"1.2.3.6", "1.2.3.70"},
   186  					},
   187  				},
   188  			},
   189  			query:          ZoneQueryString{Contract: "1-2ABCDE", Group: "testgroup"},
   190  			responseStatus: http.StatusCreated,
   191  			responseBody: `
   192  {
   193      "requestId": "93e97a28-4e05-45f4-8b9a-cebd71155949",
   194      "expirationDate": "2020-10-28T19:50:36.272668Z"
   195  }`,
   196  			expectedResponse: &BulkZonesResponse{
   197  				RequestId:      "93e97a28-4e05-45f4-8b9a-cebd71155949",
   198  				ExpirationDate: "2020-10-28T19:50:36.272668Z",
   199  			},
   200  			expectedPath: "/config-dns/v2/zones/create-requests?contractId=1-2ABCDE&gid=testgroup",
   201  		},
   202  		"500 internal server error": {
   203  			zones: BulkZonesCreate{
   204  				Zones: []*ZoneCreate{
   205  					{
   206  						Zone:    "one.testbulk.net",
   207  						Type:    "secondary",
   208  						Comment: "testing bulk operations",
   209  						Masters: []string{"1.2.3.4", "1.2.3.10"},
   210  					},
   211  					{
   212  						Zone:    "two.testbulk.net",
   213  						Type:    "secondary",
   214  						Comment: "testing bulk operations",
   215  						Masters: []string{"1.2.3.6", "1.2.3.70"},
   216  					},
   217  				},
   218  			},
   219  			query:          ZoneQueryString{Contract: "1-2ABCDE", Group: "testgroup"},
   220  			responseStatus: http.StatusInternalServerError,
   221  			responseBody: `
   222  {
   223  	"type": "internal_error",
   224      "title": "Internal Server Error",
   225      "detail": "Error creating zone",
   226      "status": 500
   227  }`,
   228  			expectedPath: "/config-dns/v2/zones/create-requests?contractId=1-2ABCDE&gid=testgroup",
   229  			withError: &Error{
   230  				Type:       "internal_error",
   231  				Title:      "Internal Server Error",
   232  				Detail:     "Error creating zone",
   233  				StatusCode: http.StatusInternalServerError,
   234  			},
   235  		},
   236  	}
   237  
   238  	for name, test := range tests {
   239  		t.Run(name, func(t *testing.T) {
   240  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   241  				assert.Equal(t, http.MethodPost, r.Method)
   242  				w.WriteHeader(test.responseStatus)
   243  				if len(test.responseBody) > 0 {
   244  					_, err := w.Write([]byte(test.responseBody))
   245  					assert.NoError(t, err)
   246  				}
   247  			}))
   248  			client := mockAPIClient(t, mockServer)
   249  			result, err := client.CreateBulkZones(context.Background(), &test.zones, test.query)
   250  			if test.withError != nil {
   251  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   252  				return
   253  			}
   254  			require.NoError(t, err)
   255  			assert.Equal(t, test.expectedResponse, result)
   256  		})
   257  	}
   258  }
   259  
   260  // Bulk Delete tests
   261  func TestDns_GetBulkZoneDeleteStatus(t *testing.T) {
   262  	tests := map[string]struct {
   263  		requestid        string
   264  		responseStatus   int
   265  		responseBody     string
   266  		expectedPath     string
   267  		expectedResponse *BulkStatusResponse
   268  		withError        error
   269  	}{
   270  		"200 OK": {
   271  			requestid:      "15bc138f-8d82-451b-80b7-a56b88ffc474",
   272  			responseStatus: http.StatusOK,
   273  			responseBody: `
   274    {
   275      "requestId": "15bc138f-8d82-451b-80b7-a56b88ffc474",
   276      "zonesSubmitted": 2,
   277      "successCount": 0,
   278      "failureCount": 2,
   279      "isComplete": true,
   280      "expirationDate": "2020-10-28T17:10:04.515792Z"
   281    }`,
   282  			expectedPath: "/config-dns/v2/zones/delete-requests/15bc138f-8d82-451b-80b7-a56b88ffc474",
   283  			expectedResponse: &BulkStatusResponse{
   284  				RequestId:      "15bc138f-8d82-451b-80b7-a56b88ffc474",
   285  				ZonesSubmitted: 2,
   286  				SuccessCount:   0,
   287  				FailureCount:   2,
   288  				IsComplete:     true,
   289  				ExpirationDate: "2020-10-28T17:10:04.515792Z",
   290  			},
   291  		},
   292  		"500 internal server error": {
   293  			requestid:      "15bc138f-8d82-451b-80b7-a56b88ffc474",
   294  			responseStatus: http.StatusInternalServerError,
   295  			responseBody: `
   296  {
   297          "type": "internal_error",
   298      "title": "Internal Server Error",
   299      "detail": "Error fetching authorities",
   300      "status": 500
   301  }`,
   302  			expectedPath: "/config-dns/v2/zones/delete-requests/15bc138f-8d82-451b-80b7-a56b88ffc474",
   303  			withError: &Error{
   304  				Type:       "internal_error",
   305  				Title:      "Internal Server Error",
   306  				Detail:     "Error fetching authorities",
   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, test.expectedPath, r.URL.String())
   316  				assert.Equal(t, http.MethodGet, r.Method)
   317  				w.WriteHeader(test.responseStatus)
   318  				_, err := w.Write([]byte(test.responseBody))
   319  				assert.NoError(t, err)
   320  			}))
   321  			client := mockAPIClient(t, mockServer)
   322  			result, err := client.GetBulkZoneDeleteStatus(context.Background(), test.requestid)
   323  			if test.withError != nil {
   324  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   325  				return
   326  			}
   327  			require.NoError(t, err)
   328  			assert.Equal(t, test.expectedResponse, result)
   329  		})
   330  	}
   331  }
   332  
   333  func TestDns_GetBulkZoneDeleteResult(t *testing.T) {
   334  	tests := map[string]struct {
   335  		requestid        string
   336  		responseStatus   int
   337  		responseBody     string
   338  		expectedPath     string
   339  		expectedResponse *BulkDeleteResultResponse
   340  		withError        error
   341  	}{
   342  		"200 OK": {
   343  			requestid:      "15bc138f-8d82-451b-80b7-a56b88ffc474",
   344  			responseStatus: http.StatusOK,
   345  			responseBody: `
   346    {
   347      "requestId": "15bc138f-8d82-451b-80b7-a56b88ffc474",
   348      "successfullyDeletedZones": [],
   349      "failedZones": [
   350        {
   351          "zone": "one.testbulk.net",
   352          "failureReason": "ZONE_ALREADY_EXISTS"
   353        }
   354      ]
   355    }`,
   356  			expectedPath: "/config-dns/v2/zones/delete-requests/15bc138f-8d82-451b-80b7-a56b88ffc474/result",
   357  			expectedResponse: &BulkDeleteResultResponse{
   358  				RequestId:                "15bc138f-8d82-451b-80b7-a56b88ffc474",
   359  				SuccessfullyDeletedZones: make([]string, 0),
   360  				FailedZones: []*BulkFailedZone{
   361  					{
   362  						Zone:          "one.testbulk.net",
   363  						FailureReason: "ZONE_ALREADY_EXISTS",
   364  					},
   365  				},
   366  			},
   367  		},
   368  		"500 internal server error": {
   369  			requestid:      "15bc138f-8d82-451b-80b7-a56b88ffc474",
   370  			responseStatus: http.StatusInternalServerError,
   371  			responseBody: `
   372  {
   373          "type": "internal_error",
   374      "title": "Internal Server Error",
   375      "detail": "Error fetching authorities",
   376      "status": 500
   377  }`,
   378  			expectedPath: "/config-dns/v2/zones/create-requests/15bc138f-8d82-451b-80b7-a56b88ffc474/result",
   379  			withError: &Error{
   380  				Type:       "internal_error",
   381  				Title:      "Internal Server Error",
   382  				Detail:     "Error fetching authorities",
   383  				StatusCode: http.StatusInternalServerError,
   384  			},
   385  		},
   386  	}
   387  
   388  	for name, test := range tests {
   389  		t.Run(name, func(t *testing.T) {
   390  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   391  				//assert.Equal(t, test.expectedPath, r.URL.String())
   392  				assert.Equal(t, http.MethodGet, r.Method)
   393  				w.WriteHeader(test.responseStatus)
   394  				_, err := w.Write([]byte(test.responseBody))
   395  				assert.NoError(t, err)
   396  			}))
   397  			client := mockAPIClient(t, mockServer)
   398  			result, err := client.GetBulkZoneDeleteResult(context.Background(), test.requestid)
   399  			if test.withError != nil {
   400  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   401  				return
   402  			}
   403  			require.NoError(t, err)
   404  			assert.Equal(t, test.expectedResponse, result)
   405  		})
   406  	}
   407  }
   408  
   409  func TestDns_DeleteBulkZones(t *testing.T) {
   410  	tests := map[string]struct {
   411  		zoneslist        ZoneNameListResponse
   412  		bypassSafety     bool
   413  		responseStatus   int
   414  		responseBody     string
   415  		expectedResponse *BulkZonesResponse
   416  		expectedPath     string
   417  		withError        error
   418  	}{
   419  		"200 Created": {
   420  			zoneslist: ZoneNameListResponse{
   421  				Zones: []string{"one.testbulk.net", "two.testbulk.net"},
   422  			},
   423  			bypassSafety:   true,
   424  			responseStatus: http.StatusCreated,
   425  			responseBody: `
   426  {
   427      "requestId": "93e97a28-4e05-45f4-8b9a-cebd71155949",
   428      "expirationDate": "2020-10-28T19:50:36.272668Z"
   429  }`,
   430  			expectedResponse: &BulkZonesResponse{
   431  				RequestId:      "93e97a28-4e05-45f4-8b9a-cebd71155949",
   432  				ExpirationDate: "2020-10-28T19:50:36.272668Z",
   433  			},
   434  			expectedPath: "/config-dns/v2/zones/delete-requests?bypassSafetyChecks=true",
   435  		},
   436  		"500 internal server error": {
   437  			zoneslist: ZoneNameListResponse{
   438  				Zones: []string{"one.testbulk.net", "two.testbulk.net"},
   439  			},
   440  			bypassSafety:   true,
   441  			responseStatus: http.StatusInternalServerError,
   442  			responseBody: `
   443  {
   444          "type": "internal_error",
   445      "title": "Internal Server Error",
   446      "detail": "Error creating zone",
   447      "status": 500
   448  }`,
   449  			expectedPath: "/config-dns/v2/zones/delete-requests?bypassSafetyChecks=true",
   450  			withError: &Error{
   451  				Type:       "internal_error",
   452  				Title:      "Internal Server Error",
   453  				Detail:     "Error creating zone",
   454  				StatusCode: http.StatusInternalServerError,
   455  			},
   456  		},
   457  	}
   458  
   459  	for name, test := range tests {
   460  		t.Run(name, func(t *testing.T) {
   461  			mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   462  				assert.Equal(t, http.MethodPost, r.Method)
   463  				w.WriteHeader(test.responseStatus)
   464  				if len(test.responseBody) > 0 {
   465  					_, err := w.Write([]byte(test.responseBody))
   466  					assert.NoError(t, err)
   467  				}
   468  			}))
   469  			client := mockAPIClient(t, mockServer)
   470  			result, err := client.DeleteBulkZones(context.Background(), &test.zoneslist, test.bypassSafety)
   471  			if test.withError != nil {
   472  				assert.True(t, errors.Is(err, test.withError), "want: %s; got: %s", test.withError, err)
   473  				return
   474  			}
   475  			require.NoError(t, err)
   476  			assert.Equal(t, test.expectedResponse, result)
   477  		})
   478  	}
   479  }