Skip to content

Commit 61e423f

Browse files
authored
TO client api tests for Regions automation (#5748)
* added test case for CacheGroup Pagination functionalites * added tests for region * formatted using go gmt * added tests for get regions by invalid id and name: * added tests for getregionbydivision * formatted test using go fmt: * fixed review comments * fixed segfault in region pagination function * updated the error message in sort functionality
1 parent f84ae27 commit 61e423f

File tree

3 files changed

+225
-12
lines changed

3 files changed

+225
-12
lines changed

traffic_ops/testing/api/v4/divisions_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ func SortTestDivisionDesc(t *testing.T) {
201201
}
202202
}
203203
} else {
204-
t.Errorf("No Response returned from GET Delivery Service using SortOrder")
204+
t.Errorf("No Response returned from GET Division using SortOrder")
205205
}
206206
}
207207

traffic_ops/testing/api/v4/regions_test.go

+210-9
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ package v4
1717

1818
import (
1919
"net/http"
20+
"net/url"
21+
"reflect"
2022
"sort"
2123
"strings"
2224
"testing"
@@ -36,15 +38,24 @@ func TestRegions(t *testing.T) {
3638
header.Set(rfc.IfModifiedSince, time)
3739
header.Set(rfc.IfUnmodifiedSince, time)
3840
SortTestRegions(t)
41+
SortTestRegionsDesc(t)
3942
UpdateTestRegions(t)
4043
UpdateTestRegionsWithHeaders(t, header)
4144
GetTestRegions(t)
4245
GetTestRegionsIMSAfterChange(t, header)
4346
DeleteTestRegionsByName(t)
47+
VerifyPaginationSupportRegion(t)
4448
header = make(map[string][]string)
4549
etag := rfc.ETag(currentTime)
4650
header.Set(rfc.IfMatch, etag)
4751
UpdateTestRegionsWithHeaders(t, header)
52+
DeleteTestRegionsByInvalidId(t)
53+
DeleteTestRegionsByInvalidName(t)
54+
GetTestRegionByInvalidId(t)
55+
GetTestRegionByInvalidName(t)
56+
GetTestRegionByDivision(t)
57+
GetTestRegionByInvalidDivision(t)
58+
CreateTestRegionsInvalidDivision(t)
4859
})
4960
}
5061

@@ -112,6 +123,15 @@ func GetTestRegionsIMSAfterChange(t *testing.T, header http.Header) {
112123
}
113124
}
114125

126+
func GetTestRegions(t *testing.T) {
127+
for _, region := range testData.Regions {
128+
resp, _, err := TOSession.GetRegionByName(region.Name, nil)
129+
if err != nil {
130+
t.Errorf("cannot GET Region by region: %v - %v", err, resp)
131+
}
132+
}
133+
}
134+
115135
func CreateTestRegions(t *testing.T) {
116136

117137
for _, region := range testData.Regions {
@@ -124,9 +144,8 @@ func CreateTestRegions(t *testing.T) {
124144
}
125145

126146
func SortTestRegions(t *testing.T) {
127-
var header http.Header
128147
var sortedList []string
129-
resp, _, err := TOSession.GetRegions(header)
148+
resp, _, err := TOSession.GetRegions(nil, nil)
130149
if err != nil {
131150
t.Fatalf("Expected no error, but got %v", err.Error())
132151
}
@@ -142,6 +161,38 @@ func SortTestRegions(t *testing.T) {
142161
}
143162
}
144163

164+
func SortTestRegionsDesc(t *testing.T) {
165+
166+
respAsc, _, err1 := TOSession.GetRegions(nil, nil)
167+
params := url.Values{}
168+
params.Set("sortOrder", "desc")
169+
respDesc, _, err2 := TOSession.GetRegions(params, nil)
170+
171+
if err1 != nil {
172+
t.Errorf("Expected no error, but got error in Regions Ascending %v", err1)
173+
}
174+
if err2 != nil {
175+
t.Errorf("Expected no error, but got error in Regions Descending %v", err2)
176+
}
177+
if len(respAsc) == len(respDesc) {
178+
if len(respAsc) > 0 && len(respDesc) > 0 {
179+
// reverse the descending-sorted response and compare it to the ascending-sorted one
180+
for start, end := 0, len(respDesc)-1; start < end; start, end = start+1, end-1 {
181+
respDesc[start], respDesc[end] = respDesc[end], respDesc[start]
182+
}
183+
if respDesc[0].Name != "" && respAsc[0].Name != "" {
184+
if !reflect.DeepEqual(respDesc[0].Name, respAsc[0].Name) {
185+
t.Errorf("Regions responses are not equal after reversal: Asc: %s - Desc: %s", respDesc[0].Name, respAsc[0].Name)
186+
}
187+
}
188+
} else {
189+
t.Errorf("No Response returned from GET Regions using SortOrder")
190+
}
191+
} else {
192+
t.Fatalf("Region response length are not equal Asc: %d Desc: %d", len(respAsc), len(respDesc))
193+
}
194+
}
195+
145196
func UpdateTestRegions(t *testing.T) {
146197

147198
firstRegion := testData.Regions[0]
@@ -175,15 +226,90 @@ func UpdateTestRegions(t *testing.T) {
175226
if err != nil {
176227
t.Errorf("cannot UPDATE Region by id: %v - %v", err, alert)
177228
}
178-
179229
}
180230

181-
func GetTestRegions(t *testing.T) {
182-
for _, region := range testData.Regions {
183-
resp, _, err := TOSession.GetRegionByName(region.Name, nil)
184-
if err != nil {
185-
t.Errorf("cannot GET Region by region: %v - %v", err, resp)
231+
func VerifyPaginationSupportRegion(t *testing.T) {
232+
233+
qparams := url.Values{}
234+
qparams.Set("orderby", "id")
235+
regions, _, err := TOSession.GetRegions(qparams, nil)
236+
if err != nil {
237+
t.Fatalf("cannot GET Regions: %v", err)
238+
}
239+
240+
if len(regions) > 0 {
241+
qparams = url.Values{}
242+
qparams.Set("orderby", "id")
243+
qparams.Set("limit", "1")
244+
regionsWithLimit, _, err := TOSession.GetRegions(qparams, nil)
245+
if err == nil {
246+
if !reflect.DeepEqual(regions[:1], regionsWithLimit) {
247+
t.Error("expected GET Regions with limit = 1 to return first result")
248+
}
249+
} else {
250+
t.Error("Error in getting regions by limit")
186251
}
252+
253+
if len(regions) > 1 {
254+
qparams = url.Values{}
255+
qparams.Set("orderby", "id")
256+
qparams.Set("limit", "1")
257+
qparams.Set("offset", "1")
258+
regionsWithOffset, _, err := TOSession.GetRegions(qparams, nil)
259+
if err == nil {
260+
if !reflect.DeepEqual(regions[1:2], regionsWithOffset) {
261+
t.Error("expected GET Regions with limit = 1, offset = 1 to return second result")
262+
}
263+
} else {
264+
t.Error("Error in getting regions by limit and offset")
265+
}
266+
267+
qparams = url.Values{}
268+
qparams.Set("orderby", "id")
269+
qparams.Set("limit", "1")
270+
qparams.Set("page", "2")
271+
regionsWithPage, _, err := TOSession.GetRegions(qparams, nil)
272+
if err == nil {
273+
if !reflect.DeepEqual(regions[1:2], regionsWithPage) {
274+
t.Error("expected GET Regions with limit = 1, page = 2 to return second result")
275+
}
276+
} else {
277+
t.Error("Error in getting regions by limit and page")
278+
}
279+
} else {
280+
t.Errorf("only one region found, so offset functionality can't test")
281+
}
282+
} else {
283+
t.Errorf("No region found to check pagination")
284+
}
285+
286+
qparams = url.Values{}
287+
qparams.Set("limit", "-2")
288+
_, _, err = TOSession.GetRegions(qparams, nil)
289+
if err == nil {
290+
t.Error("expected GET Regions to return an error when limit is not bigger than -1")
291+
} else if !strings.Contains(err.Error(), "must be bigger than -1") {
292+
t.Errorf("expected GET Regions to return an error for limit is not bigger than -1, actual error: " + err.Error())
293+
}
294+
295+
qparams = url.Values{}
296+
qparams.Set("limit", "1")
297+
qparams.Set("offset", "0")
298+
_, _, err = TOSession.GetRegions(qparams, nil)
299+
if err == nil {
300+
t.Error("expected GET Regions to return an error when offset is not a positive integer")
301+
} else if !strings.Contains(err.Error(), "must be a positive integer") {
302+
t.Errorf("expected GET Regions to return an error for offset is not a positive integer, actual error: " + err.Error())
303+
}
304+
305+
qparams = url.Values{}
306+
qparams.Set("limit", "1")
307+
qparams.Set("page", "0")
308+
_, _, err = TOSession.GetRegions(qparams, nil)
309+
if err == nil {
310+
t.Error("expected GET Regions to return an error when page is not a positive integer")
311+
} else if !strings.Contains(err.Error(), "must be a positive integer") {
312+
t.Errorf("expected GET Regions to return an error for page is not a positive integer, actual error: " + err.Error())
187313
}
188314
}
189315

@@ -214,7 +340,6 @@ func DeleteTestRegionsByName(t *testing.T) {
214340
t.Errorf("expected Region : %s to be deleted", region.Name)
215341
}
216342
}
217-
218343
CreateTestRegions(t)
219344
}
220345

@@ -243,3 +368,79 @@ func DeleteTestRegions(t *testing.T) {
243368
}
244369
}
245370
}
371+
372+
func DeleteTestRegionsByInvalidId(t *testing.T) {
373+
i := 10000
374+
delResp, _, err := TOSession.DeleteRegion(&i, nil)
375+
if err == nil {
376+
t.Errorf("cannot DELETE Regions by Invalid ID: %v - %v", err, delResp)
377+
}
378+
}
379+
380+
func DeleteTestRegionsByInvalidName(t *testing.T) {
381+
i := "invalid"
382+
delResp, _, err := TOSession.DeleteRegion(nil, &i)
383+
if err == nil {
384+
t.Errorf("cannot DELETE Regions by Invalid ID: %v - %v", err, delResp)
385+
}
386+
}
387+
388+
func GetTestRegionByInvalidId(t *testing.T) {
389+
regionResp, _, err := TOSession.GetRegionByID(10000, nil)
390+
if err != nil {
391+
t.Errorf("Error!! Getting Region by Invalid ID %v", err)
392+
}
393+
if len(regionResp) >= 1 {
394+
t.Errorf("Error!! Invalid ID shouldn't have any response %v Error %v", regionResp, err)
395+
}
396+
}
397+
398+
func GetTestRegionByInvalidName(t *testing.T) {
399+
regionResp, _, err := TOSession.GetRegionByName("abcd", nil)
400+
if err != nil {
401+
t.Errorf("Error!! Getting Region by Invalid Name %v", err)
402+
}
403+
if len(regionResp) >= 1 {
404+
t.Errorf("Error!! Invalid Name shouldn't have any response %v Error %v", regionResp, err)
405+
}
406+
}
407+
408+
func GetTestRegionByDivision(t *testing.T) {
409+
for _, region := range testData.Regions {
410+
411+
resp, _, err := TOSession.GetDivisionByName(region.DivisionName, nil)
412+
if err != nil {
413+
t.Errorf("cannot GET Division by name: %v - %v", region.DivisionName, err)
414+
}
415+
respDivision := resp[0]
416+
417+
_, reqInf, err := TOSession.GetRegionByDivision(respDivision.ID, nil)
418+
if err != nil {
419+
t.Fatalf("Expected no error, but got %v", err.Error())
420+
}
421+
if reqInf.StatusCode != http.StatusOK {
422+
t.Fatalf("Expected 200 status code, got %v", reqInf.StatusCode)
423+
}
424+
}
425+
}
426+
427+
func GetTestRegionByInvalidDivision(t *testing.T) {
428+
regionResp, _, err := TOSession.GetRegionByDivision(100000, nil)
429+
if err != nil {
430+
t.Errorf("Getting Region by Invalid Divisions %v", err)
431+
}
432+
if len(regionResp) >= 1 {
433+
t.Errorf("Invalid Division shouldn't have any response %v Error %v", regionResp, err)
434+
}
435+
}
436+
437+
func CreateTestRegionsInvalidDivision(t *testing.T) {
438+
439+
firstRegion := testData.Regions[0]
440+
firstRegion.Division = 100
441+
firstRegion.Name = "abcd"
442+
_, _, err := TOSession.CreateRegion(firstRegion)
443+
if err == nil {
444+
t.Errorf("Expected division not found Error %v", err)
445+
}
446+
}

traffic_ops/v4-client/region.go

+14-2
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,13 @@ func (to *Session) UpdateRegion(id int, region tc.Region, header http.Header) (t
5757
}
5858

5959
// GetRegions returns all Regions in Traffic Ops.
60-
func (to *Session) GetRegions(header http.Header) ([]tc.Region, toclientlib.ReqInf, error) {
60+
func (to *Session) GetRegions(params url.Values, header http.Header) ([]tc.Region, toclientlib.ReqInf, error) {
61+
uri := APIRegions
62+
if params != nil {
63+
uri += "?" + params.Encode()
64+
}
6165
var data tc.RegionsResponse
62-
reqInf, err := to.get(APIRegions, header, &data)
66+
reqInf, err := to.get(uri, header, &data)
6367
return data.Response, reqInf, err
6468
}
6569

@@ -79,6 +83,14 @@ func (to *Session) GetRegionByName(name string, header http.Header) ([]tc.Region
7983
return data.Response, reqInf, err
8084
}
8185

86+
// GetRegionByDivision retrieves the Region with the given Name.
87+
func (to *Session) GetRegionByDivision(id int, header http.Header) ([]tc.Region, toclientlib.ReqInf, error) {
88+
route := fmt.Sprintf("%s?division=%d", APIRegions, id)
89+
var data tc.RegionsResponse
90+
reqInf, err := to.get(route, header, &data)
91+
return data.Response, reqInf, err
92+
}
93+
8294
// DeleteRegion lets you DELETE a Region. Only 1 parameter is required, not both.
8395
func (to *Session) DeleteRegion(id *int, name *string) (tc.Alerts, toclientlib.ReqInf, error) {
8496
v := url.Values{}

0 commit comments

Comments
 (0)