This is an automated email from the ASF dual-hosted git repository.

rawlin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new 3d8d459b69 Refactor divisions test (#6863)
3d8d459b69 is described below

commit 3d8d459b69a08797c9fe0d9345c9f9878ed186e8
Author: Eric Holguin <[email protected]>
AuthorDate: Wed Jun 29 16:38:08 2022 -0600

    Refactor divisions test (#6863)
    
    * Refactor divisions test
    
    * fix typo in comment
---
 traffic_ops/testing/api/v3/divisions_test.go | 354 +++++++--------
 traffic_ops/testing/api/v4/divisions_test.go | 636 +++++++++++----------------
 2 files changed, 420 insertions(+), 570 deletions(-)

diff --git a/traffic_ops/testing/api/v3/divisions_test.go 
b/traffic_ops/testing/api/v3/divisions_test.go
index 0d098a901e..78827f00fa 100644
--- a/traffic_ops/testing/api/v3/divisions_test.go
+++ b/traffic_ops/testing/api/v3/divisions_test.go
@@ -16,226 +16,208 @@ package v3
 */
 
 import (
+       "encoding/json"
        "net/http"
+       "net/url"
        "sort"
-       "strings"
        "testing"
        "time"
 
        "github.com/apache/trafficcontrol/lib/go-rfc"
        "github.com/apache/trafficcontrol/lib/go-tc"
+       "github.com/apache/trafficcontrol/traffic_ops/testing/api/assert"
+       "github.com/apache/trafficcontrol/traffic_ops/testing/api/utils"
+       "github.com/apache/trafficcontrol/traffic_ops/toclientlib"
 )
 
 func TestDivisions(t *testing.T) {
        WithObjs(t, []TCObj{Parameters, Divisions, Regions}, func() {
-               GetTestDivisionsIMS(t)
-               TryToDeleteDivision(t)
-               currentTime := time.Now().UTC().Add(-5 * time.Second)
-               time := currentTime.Format(time.RFC1123)
-               var header http.Header
-               header = make(map[string][]string)
-               header.Set(rfc.IfModifiedSince, time)
-               header.Set(rfc.IfUnmodifiedSince, time)
-               SortTestDivisions(t)
-               UpdateTestDivisions(t)
-               UpdateTestDivisionsWithHeaders(t, header)
-               GetTestDivisionsIMSAfterChange(t, header)
-               GetTestDivisions(t)
-               header = make(map[string][]string)
-               etag := rfc.ETag(currentTime)
-               header.Set(rfc.IfMatch, etag)
-               UpdateTestDivisionsWithHeaders(t, header)
-       })
-}
-
-func UpdateTestDivisionsWithHeaders(t *testing.T, header http.Header) {
-       firstDivision := testData.Divisions[0]
-       // Retrieve the Division by division so we can get the id for the Update
-       resp, _, err := TOSession.GetDivisionByNameWithHdr(firstDivision.Name, 
header)
-       if err != nil {
-               t.Errorf("cannot GET Division by division: %v - %v", 
firstDivision.Name, err)
-       }
-       if len(resp) > 0 {
-               remoteDivision := resp[0]
-               expectedDivision := "division-test"
-               remoteDivision.Name = expectedDivision
-
-               _, reqInf, err := 
TOSession.UpdateDivisionByIDWithHdr(remoteDivision.ID, remoteDivision, header)
-               if err == nil {
-                       t.Errorf("Expected error about precondition failed, but 
got none")
-               }
-               if reqInf.StatusCode != http.StatusPreconditionFailed {
-                       t.Errorf("Expected status code 412, got %v", 
reqInf.StatusCode)
-               }
-       }
-}
 
-func GetTestDivisionsIMSAfterChange(t *testing.T, header http.Header) {
-       for _, division := range testData.Divisions {
-               _, reqInf, err := 
TOSession.GetDivisionByNameWithHdr(division.Name, header)
-               if err != nil {
-                       t.Fatalf("could not GET divisions: %v", err)
-               }
-               if reqInf.StatusCode != http.StatusOK {
-                       t.Fatalf("Expected 200 status code, got %v", 
reqInf.StatusCode)
-               }
-       }
-       header = make(map[string][]string)
-       futureTime := time.Now().AddDate(0, 0, 1)
-       time := futureTime.Format(time.RFC1123)
-       header.Set(rfc.IfModifiedSince, time)
-       for _, division := range testData.Divisions {
-               _, reqInf, err := 
TOSession.GetDivisionByNameWithHdr(division.Name, header)
-               if err != nil {
-                       t.Fatalf("could not GET divisions: %v", err)
-               }
-               if reqInf.StatusCode != http.StatusNotModified {
-                       t.Fatalf("Expected 304 status code, got %v", 
reqInf.StatusCode)
+               currentTime := time.Now().UTC().Add(-15 * time.Second)
+               currentTimeRFC := currentTime.Format(time.RFC1123)
+               tomorrow := currentTime.AddDate(0, 0, 1).Format(time.RFC1123)
+
+               methodTests := utils.V3TestCase{
+                       "GET": {
+                               "NOT MODIFIED when NO CHANGES made": {
+                                       ClientSession:  TOSession,
+                                       RequestHeaders: 
http.Header{rfc.IfModifiedSince: {tomorrow}},
+                                       Expectations:   
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusNotModified)),
+                               },
+                               "OK when VALID request": {
+                                       ClientSession: TOSession,
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
validateDivisionSort()),
+                               },
+                               "OK when VALID NAME parameter": {
+                                       ClientSession: TOSession,
+                                       RequestParams: url.Values{"name": 
{"division1"}},
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
utils.ResponseHasLength(1),
+                                               
validateDivisionFields(map[string]interface{}{"Name": "division1"})),
+                               },
+                       },
+                       "PUT": {
+                               "OK when VALID request": {
+                                       EndpointId:    GetDivisionID(t, 
"cdn-div2"),
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "name": "testdivision",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK),
+                                               
validateDivisionUpdateCreateFields("testdivision", 
map[string]interface{}{"Name": "testdivision"})),
+                               },
+                               "PRECONDITION FAILED when updating with IMS & 
IUS Headers": {
+                                       EndpointId:     GetDivisionID(t, 
"division1"),
+                                       ClientSession:  TOSession,
+                                       RequestHeaders: 
http.Header{rfc.IfUnmodifiedSince: {currentTimeRFC}},
+                                       RequestBody: map[string]interface{}{
+                                               "name": "division1",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), 
utils.HasStatus(http.StatusPreconditionFailed)),
+                               },
+                               "PRECONDITION FAILED when updating with IFMATCH 
ETAG Header": {
+                                       EndpointId:    GetDivisionID(t, 
"division1"),
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "name": "division1",
+                                       },
+                                       RequestHeaders: 
http.Header{rfc.IfMatch: {rfc.ETag(currentTime)}},
+                                       Expectations:   
utils.CkRequest(utils.HasError(), 
utils.HasStatus(http.StatusPreconditionFailed)),
+                               },
+                       },
+                       "DELETE": {
+                               "BAD REQUEST when DIVISION in use by REGION": {
+                                       EndpointId:    GetDivisionID(t, 
"division1"),
+                                       ClientSession: TOSession,
+                                       Expectations:  
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                       },
+                       "GET AFTER CHANGES": {
+                               "OK when CHANGES made": {
+                                       ClientSession:  TOSession,
+                                       RequestHeaders: 
http.Header{rfc.IfModifiedSince: {currentTimeRFC}},
+                                       Expectations:   
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                       },
+               }
+
+               for method, testCases := range methodTests {
+                       t.Run(method, func(t *testing.T) {
+                               for name, testCase := range testCases {
+                                       division := tc.Division{}
+
+                                       if testCase.RequestBody != nil {
+                                               dat, err := 
json.Marshal(testCase.RequestBody)
+                                               assert.NoError(t, err, "Error 
occurred when marshalling request body: %v", err)
+                                               err = json.Unmarshal(dat, 
&division)
+                                               assert.NoError(t, err, "Error 
occurred when unmarshalling request body: %v", err)
+                                       }
+
+                                       switch method {
+                                       case "GET", "GET AFTER CHANGES":
+                                               t.Run(name, func(t *testing.T) {
+                                                       if name == "OK when 
VALID NAME parameter" {
+                                                               resp, reqInf, 
err := 
testCase.ClientSession.GetDivisionByNameWithHdr(testCase.RequestParams["name"][0],
 testCase.RequestHeaders)
+                                                               for _, check := 
range testCase.Expectations {
+                                                                       
check(t, reqInf, resp, tc.Alerts{}, err)
+                                                               }
+                                                       } else {
+                                                               resp, reqInf, 
err := testCase.ClientSession.GetDivisionsWithHdr(testCase.RequestHeaders)
+                                                               for _, check := 
range testCase.Expectations {
+                                                                       
check(t, reqInf, resp, tc.Alerts{}, err)
+                                                               }
+                                                       }
+                                               })
+                                       case "POST":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.CreateDivision(division)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       case "PUT":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.UpdateDivisionByIDWithHdr(testCase.EndpointId(), 
division, testCase.RequestHeaders)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       case "DELETE":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.DeleteDivisionByID(testCase.EndpointId())
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       }
+                               }
+                       })
                }
-       }
+       })
 }
 
-func GetTestDivisionsIMS(t *testing.T) {
-       var header http.Header
-       header = make(map[string][]string)
-       futureTime := time.Now().AddDate(0, 0, 1)
-       time := futureTime.Format(time.RFC1123)
-       header.Set(rfc.IfModifiedSince, time)
-       for _, division := range testData.Divisions {
-               _, reqInf, err := 
TOSession.GetDivisionByNameWithHdr(division.Name, header)
-               if err != nil {
-                       t.Fatalf("could not GET divisions: %v", err)
-               }
-               if reqInf.StatusCode != http.StatusNotModified {
-                       t.Fatalf("Expected 304 status code, got %v", 
reqInf.StatusCode)
+func validateDivisionFields(expectedResp map[string]interface{}) 
utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               assert.RequireNotNil(t, resp, "Expected Division response to 
not be nil.")
+               divisionResp := resp.([]tc.Division)
+               for field, expected := range expectedResp {
+                       for _, division := range divisionResp {
+                               switch field {
+                               case "Name":
+                                       assert.Equal(t, expected, 
division.Name, "Expected Name to be %v, but got %s", expected, division.Name)
+                               default:
+                                       t.Errorf("Expected field: %v, does not 
exist in response", field)
+                               }
+                       }
                }
        }
 }
 
-func TryToDeleteDivision(t *testing.T) {
-       division := testData.Divisions[0]
-
-       resp, _, err := TOSession.GetDivisionByName(division.Name)
-       if err != nil {
-               t.Errorf("cannot GET Division by name: %v - %v", division.Name, 
err)
-       }
-       division = resp[0]
-       _, _, err = TOSession.DeleteDivisionByID(division.ID)
-
-       if err == nil {
-               t.Error("should not be able to delete a division prematurely")
-               return
+func validateDivisionUpdateCreateFields(name string, expectedResp 
map[string]interface{}) utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               divisions, _, err := TOSession.GetDivisionByNameWithHdr(name, 
nil)
+               assert.RequireNoError(t, err, "Error getting Division: %v - 
alerts: %+v", err, divisions)
+               assert.RequireEqual(t, 1, len(divisions), "Expected one 
Division returned Got: %d", len(divisions))
+               validateDivisionFields(expectedResp)(t, toclientlib.ReqInf{}, 
divisions, tc.Alerts{}, nil)
        }
-
-       if strings.Contains(err.Error(), "Resource not found.") {
-               t.Errorf("division with name %v does not exist", division.Name)
-               return
-       }
-
-       if strings.Contains(err.Error(), "cannot delete division because it is 
being used by a region") {
-               return
-       }
-
-       t.Errorf("unexpected error occured: %v", err)
 }
 
-func CreateTestDivisions(t *testing.T) {
-       for _, division := range testData.Divisions {
-               resp, _, err := TOSession.CreateDivision(division)
-               t.Log("Response: ", resp)
-               if err != nil {
-                       t.Errorf("could not CREATE division: %v", err)
+func validateDivisionSort() utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, 
alerts tc.Alerts, _ error) {
+               assert.RequireNotNil(t, resp, "Expected Division response to 
not be nil.")
+               var divisionNames []string
+               divisionResp := resp.([]tc.Division)
+               for _, division := range divisionResp {
+                       divisionNames = append(divisionNames, division.Name)
                }
+               assert.Equal(t, true, sort.StringsAreSorted(divisionNames), 
"List is not sorted by their names: %v", divisionNames)
        }
 }
 
-func SortTestDivisions(t *testing.T) {
-       var header http.Header
-       var sortedList []string
-       resp, _, err := TOSession.GetDivisionsWithHdr(header)
-       if err != nil {
-               t.Fatalf("Expected no error, but got %v", err.Error())
-       }
-       for i, _ := range resp {
-               sortedList = append(sortedList, resp[i].Name)
-       }
-
-       res := sort.SliceIsSorted(sortedList, func(p, q int) bool {
-               return sortedList[p] < sortedList[q]
-       })
-       if res != true {
-               t.Errorf("list is not sorted by their names: %v", sortedList)
-       }
-}
-
-func UpdateTestDivisions(t *testing.T) {
-
-       firstDivision := testData.Divisions[0]
-       // Retrieve the Division by division so we can get the id for the Update
-       resp, _, err := TOSession.GetDivisionByName(firstDivision.Name)
-       if err != nil {
-               t.Errorf("cannot GET Division by division: %v - %v", 
firstDivision.Name, err)
-       }
-       remoteDivision := resp[0]
-       expectedDivision := "division-test"
-       remoteDivision.Name = expectedDivision
-       var alert tc.Alerts
-       alert, _, err = TOSession.UpdateDivisionByID(remoteDivision.ID, 
remoteDivision)
-       if err != nil {
-               t.Errorf("cannot UPDATE Division by id: %v - %v", err, alert)
-       }
-
-       // Retrieve the Division to check division got updated
-       resp, _, err = TOSession.GetDivisionByID(remoteDivision.ID)
-       if err != nil {
-               t.Errorf("cannot GET Division by division: %v - %v", 
firstDivision.Name, err)
-       }
-       if len(resp) > 0 {
-               respDivision := resp[0]
-               if respDivision.Name != expectedDivision {
-                       t.Errorf("results do not match actual: %s, expected: 
%s", respDivision.Name, expectedDivision)
-               }
-
-               // Set the name back to the fixture value so we can delete it 
after
-               remoteDivision.Name = firstDivision.Name
-               alert, _, err = TOSession.UpdateDivisionByID(remoteDivision.ID, 
remoteDivision)
-               if err != nil {
-                       t.Errorf("cannot UPDATE Division by id: %v - %v", err, 
alert)
-               }
+func GetDivisionID(t *testing.T, divisionName string) func() int {
+       return func() int {
+               divisionsResp, _, err := 
TOSession.GetDivisionByNameWithHdr(divisionName, nil)
+               assert.RequireNoError(t, err, "Get Divisions Request failed 
with error:", err)
+               assert.RequireEqual(t, 1, len(divisionsResp), "Expected 
response object length 1, but got %d", len(divisionsResp))
+               return divisionsResp[0].ID
        }
 }
 
-func GetTestDivisions(t *testing.T) {
+func CreateTestDivisions(t *testing.T) {
        for _, division := range testData.Divisions {
-               resp, _, err := TOSession.GetDivisionByName(division.Name)
-               if err != nil {
-                       t.Errorf("cannot GET Division by division: %v - %v", 
err, resp)
-               }
+               alerts, _, err := TOSession.CreateDivision(division)
+               assert.RequireNoError(t, err, "Could not create Division '%s': 
%v - alerts: %+v", division.Name, err, alerts)
        }
 }
 
 func DeleteTestDivisions(t *testing.T) {
-
-       for _, division := range testData.Divisions {
-               // Retrieve the Division by name so we can get the id
-               resp, _, err := TOSession.GetDivisionByName(division.Name)
-               if err != nil {
-                       t.Errorf("cannot GET Division by name: %v - %v", 
division.Name, err)
-               }
-               respDivision := resp[0]
-
-               delResp, _, err := TOSession.DeleteDivisionByID(respDivision.ID)
-               if err != nil {
-                       t.Errorf("cannot DELETE Division by division: %v - %v", 
err, delResp)
-               }
-
+       divisions, _, err := TOSession.GetDivisionsWithHdr(nil)
+       assert.NoError(t, err, "Cannot get Divisions: %v", err)
+       for _, division := range divisions {
+               alerts, _, err := TOSession.DeleteDivisionByID(division.ID)
+               assert.NoError(t, err, "Unexpected error deleting Division '%s' 
(#%d): %v - alerts: %+v", division.Name, division.ID, err, alerts.Alerts)
                // Retrieve the Division to see if it got deleted
-               divisionResp, _, err := 
TOSession.GetDivisionByName(division.Name)
-               if err != nil {
-                       t.Errorf("error deleting Division division: %s", 
err.Error())
-               }
-               if len(divisionResp) > 0 {
-                       t.Errorf("expected Division : %s to be deleted", 
division.Name)
-               }
+               getDivision, _, err := 
TOSession.GetDivisionByIDWithHdr(division.ID, nil)
+               assert.NoError(t, err, "Error getting Division '%s' after 
deletion: %v", division.Name, err)
+               assert.Equal(t, 0, len(getDivision), "Expected Division '%s' to 
be deleted, but it was found in Traffic Ops", division.Name)
        }
 }
diff --git a/traffic_ops/testing/api/v4/divisions_test.go 
b/traffic_ops/testing/api/v4/divisions_test.go
index fe1b11baf0..23a3c62ca2 100644
--- a/traffic_ops/testing/api/v4/divisions_test.go
+++ b/traffic_ops/testing/api/v4/divisions_test.go
@@ -16,436 +16,304 @@ package v4
 */
 
 import (
+       "encoding/json"
        "net/http"
        "net/url"
-       "reflect"
        "sort"
        "strconv"
-       "strings"
        "testing"
        "time"
 
        "github.com/apache/trafficcontrol/lib/go-rfc"
        "github.com/apache/trafficcontrol/lib/go-tc"
+       "github.com/apache/trafficcontrol/traffic_ops/testing/api/assert"
+       "github.com/apache/trafficcontrol/traffic_ops/testing/api/utils"
+       "github.com/apache/trafficcontrol/traffic_ops/toclientlib"
        client "github.com/apache/trafficcontrol/traffic_ops/v4-client"
 )
 
 func TestDivisions(t *testing.T) {
        WithObjs(t, []TCObj{Parameters, Divisions, Regions}, func() {
-               GetTestDivisionsIMS(t)
-               TryToDeleteDivision(t)
-               currentTime := time.Now().UTC().Add(-5 * time.Second)
-               time := currentTime.Format(time.RFC1123)
-               var header http.Header
-               header = make(map[string][]string)
-               header.Set(rfc.IfModifiedSince, time)
-               header.Set(rfc.IfUnmodifiedSince, time)
-               SortTestDivisions(t)
-               SortTestDivisionDesc(t)
-               UpdateTestDivisions(t)
-               UpdateTestDivisionsWithHeaders(t, header)
-               GetTestDivisionsIMSAfterChange(t, header)
-               GetTestDivisions(t)
-               header = make(map[string][]string)
-               etag := rfc.ETag(currentTime)
-               header.Set(rfc.IfMatch, etag)
-               UpdateTestDivisionsWithHeaders(t, header)
-               GetTestPaginationSupportDivision(t)
-               GetDivisionByInvalidId(t)
-               GetDivisionByInvalidName(t)
-               DeleteTestDivisionsByInvalidId(t)
-       })
-}
-
-func UpdateTestDivisionsWithHeaders(t *testing.T, header http.Header) {
-       if len(testData.Divisions) < 1 {
-               t.Error("Need at least one Division to test updating a Division 
with HTTP headers")
-               return
-       }
-       firstDivision := testData.Divisions[0]
 
-       // Retrieve the Division by division so we can get the id for the Update
-       opts := client.NewRequestOptions()
-       opts.Header = header
-       opts.QueryParameters.Set("name", firstDivision.Name)
-       resp, _, err := TOSession.GetDivisions(opts)
-       if err != nil {
-               t.Errorf("cannot get Division '%s': %v - alerts: %+v", 
firstDivision.Name, err, resp.Alerts)
-       }
-       if len(resp.Response) > 0 {
-               remoteDivision := resp.Response[0]
-               expectedDivision := "division-test"
-               remoteDivision.Name = expectedDivision
-
-               opts.QueryParameters.Del("name")
-               _, reqInf, err := TOSession.UpdateDivision(remoteDivision.ID, 
remoteDivision, opts)
-               if err == nil {
-                       t.Errorf("Expected error about precondition failed, but 
got none")
-               }
-               if reqInf.StatusCode != http.StatusPreconditionFailed {
-                       t.Errorf("Expected status code 412, got %v", 
reqInf.StatusCode)
+               currentTime := time.Now().UTC().Add(-15 * time.Second)
+               currentTimeRFC := currentTime.Format(time.RFC1123)
+               tomorrow := currentTime.AddDate(0, 0, 1).Format(time.RFC1123)
+
+               methodTests := utils.V4TestCase{
+                       "GET": {
+                               "NOT MODIFIED when NO CHANGES made": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{Header: http.Header{rfc.IfModifiedSince: {tomorrow}}},
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusNotModified)),
+                               },
+                               "OK when VALID request": {
+                                       ClientSession: TOSession,
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
validateDivisionSort()),
+                               },
+                               "OK when VALID NAME parameter": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{QueryParameters: url.Values{"name": {"division1"}}},
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
utils.ResponseHasLength(1),
+                                               
validateDivisionFields(map[string]interface{}{"Name": "division1"})),
+                               },
+                               "EMPTY RESPONSE when INVALID ID parameter": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{QueryParameters: url.Values{"id": {"10000"}}},
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
utils.ResponseHasLength(0)),
+                               },
+                               "EMPTY RESPONSE when INVALID NAME parameter": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{QueryParameters: url.Values{"name": {"abcd"}}},
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
utils.ResponseHasLength(0)),
+                               },
+                               "VALID when SORTORDER param is DESC": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{QueryParameters: url.Values{"sortOrder": {"desc"}}},
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
validateDivisionDescSort()),
+                               },
+                               "FIRST RESULT when LIMIT=1": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{QueryParameters: url.Values{"orderby": {"id"}, "limit": 
{"1"}}},
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
validateDivisionPagination("limit")),
+                               },
+                               "SECOND RESULT when LIMIT=1 OFFSET=1": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{QueryParameters: url.Values{"orderby": {"id"}, "limit": 
{"1"}, "offset": {"1"}}},
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
validateDivisionPagination("offset")),
+                               },
+                               "SECOND RESULT when LIMIT=1 PAGE=2": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{QueryParameters: url.Values{"orderby": {"id"}, "limit": 
{"1"}, "page": {"2"}}},
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
validateDivisionPagination("page")),
+                               },
+                               "BAD REQUEST when INVALID LIMIT parameter": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{QueryParameters: url.Values{"limit": {"-2"}}},
+                                       Expectations:  
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "BAD REQUEST when INVALID OFFSET parameter": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{QueryParameters: url.Values{"limit": {"1"}, "offset": 
{"0"}}},
+                                       Expectations:  
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "BAD REQUEST when INVALID PAGE parameter": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{QueryParameters: url.Values{"limit": {"1"}, "page": 
{"0"}}},
+                                       Expectations:  
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                       },
+                       "PUT": {
+                               "OK when VALID request": {
+                                       EndpointId:    GetDivisionID(t, 
"cdn-div2"),
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "name": "testdivision",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK),
+                                               
validateDivisionUpdateCreateFields("testdivision", 
map[string]interface{}{"Name": "testdivision"})),
+                               },
+                               "PRECONDITION FAILED when updating with IMS & 
IUS Headers": {
+                                       EndpointId:    GetDivisionID(t, 
"division1"),
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{Header: http.Header{rfc.IfUnmodifiedSince: 
{currentTimeRFC}}},
+                                       RequestBody: map[string]interface{}{
+                                               "name": "division1",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), 
utils.HasStatus(http.StatusPreconditionFailed)),
+                               },
+                               "PRECONDITION FAILED when updating with IFMATCH 
ETAG Header": {
+                                       EndpointId:    GetDivisionID(t, 
"division1"),
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "name": "division1",
+                                       },
+                                       RequestOpts:  
client.RequestOptions{Header: http.Header{rfc.IfMatch: 
{rfc.ETag(currentTime)}}},
+                                       Expectations: 
utils.CkRequest(utils.HasError(), 
utils.HasStatus(http.StatusPreconditionFailed)),
+                               },
+                       },
+                       "DELETE": {
+                               "BAD REQUEST when DIVISION in use by REGION": {
+                                       EndpointId:    GetDivisionID(t, 
"division1"),
+                                       ClientSession: TOSession,
+                                       Expectations:  
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "NOT FOUND when INVALID ID parameter": {
+                                       EndpointId:    func() int { return 
111111 },
+                                       ClientSession: TOSession,
+                                       Expectations:  
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusNotFound)),
+                               },
+                       },
+                       "GET AFTER CHANGES": {
+                               "OK when CHANGES made": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{Header: http.Header{rfc.IfModifiedSince: 
{currentTimeRFC}}},
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                       },
                }
-       }
-}
 
-func GetTestDivisionsIMSAfterChange(t *testing.T, header http.Header) {
-       opts := client.NewRequestOptions()
-       opts.Header = header
-       for _, division := range testData.Divisions {
-               opts.QueryParameters.Set("name", division.Name)
-               resp, reqInf, err := TOSession.GetDivisions(opts)
-               if err != nil {
-                       t.Errorf("could not get Divisions: %v - alerts: %+v", 
err, resp.Alerts)
-               }
-               if reqInf.StatusCode != http.StatusOK {
-                       t.Errorf("Expected 200 status code, got %v", 
reqInf.StatusCode)
+               for method, testCases := range methodTests {
+                       t.Run(method, func(t *testing.T) {
+                               for name, testCase := range testCases {
+                                       division := tc.Division{}
+
+                                       if testCase.RequestBody != nil {
+                                               dat, err := 
json.Marshal(testCase.RequestBody)
+                                               assert.NoError(t, err, "Error 
occurred when marshalling request body: %v", err)
+                                               err = json.Unmarshal(dat, 
&division)
+                                               assert.NoError(t, err, "Error 
occurred when unmarshalling request body: %v", err)
+                                       }
+
+                                       switch method {
+                                       case "GET", "GET AFTER CHANGES":
+                                               t.Run(name, func(t *testing.T) {
+                                                       resp, reqInf, err := 
testCase.ClientSession.GetDivisions(testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, resp.Response, resp.Alerts, err)
+                                                       }
+                                               })
+                                       case "POST":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.CreateDivision(division, testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       case "PUT":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.UpdateDivision(testCase.EndpointId(), division, 
testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       case "DELETE":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.DeleteDivision(testCase.EndpointId(), 
testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       }
+                               }
+                       })
                }
-       }
-
-       futureTime := time.Now().AddDate(0, 0, 1)
-       time := futureTime.Format(time.RFC1123)
-
-       opts.Header = make(map[string][]string)
-       opts.Header.Set(rfc.IfModifiedSince, time)
-       for _, division := range testData.Divisions {
-               opts.QueryParameters.Set("name", division.Name)
-               resp, reqInf, err := TOSession.GetDivisions(opts)
-               if err != nil {
-                       t.Errorf("could not get Divisions: %v - alerts: %+v", 
err, resp.Alerts)
-               }
-               if reqInf.StatusCode != http.StatusNotModified {
-                       t.Errorf("Expected 304 status code, got %v", 
reqInf.StatusCode)
-               }
-       }
-}
-
-func GetTestDivisionsIMS(t *testing.T) {
-       futureTime := time.Now().AddDate(0, 0, 1)
-       time := futureTime.Format(time.RFC1123)
-
-       opts := client.NewRequestOptions()
-       opts.Header.Set(rfc.IfModifiedSince, time)
-       for _, division := range testData.Divisions {
-               opts.QueryParameters.Set("name", division.Name)
-               resp, reqInf, err := TOSession.GetDivisions(opts)
-               if err != nil {
-                       t.Errorf("could not get Divisions: %v - alerts: %+v", 
err, resp.Alerts)
-               }
-               if reqInf.StatusCode != http.StatusNotModified {
-                       t.Fatalf("Expected 304 status code, got %v", 
reqInf.StatusCode)
-               }
-       }
-}
-
-func TryToDeleteDivision(t *testing.T) {
-       if len(testData.Divisions) < 1 {
-               t.Fatal("Need at least one Division to attempt to delete 
Divisions")
-       }
-       division := testData.Divisions[0]
-
-       opts := client.NewRequestOptions()
-       opts.QueryParameters.Set("name", division.Name)
-
-       resp, _, err := TOSession.GetDivisions(opts)
-       if err != nil {
-               t.Errorf("cannot get Division '%s': %v - alerts %+v", 
division.Name, err, resp.Alerts)
-       }
-       if len(resp.Response) != 1 {
-               t.Fatalf("Expected exactly one Division to exist with name 
'%s', found: %d", division.Name, len(resp.Response))
-       }
-       division = resp.Response[0]
-
-       alerts, _, err := TOSession.DeleteDivision(division.ID, 
client.RequestOptions{})
-       if err == nil {
-               t.Fatal("should not be able to delete a Division prematurely")
-       }
-
-       found := false
-       for _, alert := range alerts.Alerts {
-               if strings.Contains(alert.Text, "Resource not found.") {
-                       t.Errorf("Division with name '%s' does not exist", 
division.Name)
-               }
-               if alert.Level == tc.ErrorLevel.String() && 
strings.Contains(alert.Text, "cannot delete division because it is being used 
by a region") {
-                       found = true
-               }
-       }
-       if !found {
-               t.Errorf("unexpected error occured: %v - alerts: %+v", err, 
alerts)
-       }
-
-}
-
-func CreateTestDivisions(t *testing.T) {
-       for _, division := range testData.Divisions {
-               resp, _, err := TOSession.CreateDivision(division, 
client.RequestOptions{})
-               if err != nil {
-                       t.Errorf("could not create Division '%s': %v - alerts: 
%+v", division.Name, err, resp.Alerts)
-               }
-       }
-}
-
-func SortTestDivisions(t *testing.T) {
-       resp, _, err := TOSession.GetDivisions(client.RequestOptions{})
-       if err != nil {
-               t.Fatalf("Expected no error, but got: %v - alerts: %+v", err, 
resp.Alerts)
-       }
-
-       sortedList := make([]string, 0, len(resp.Response))
-       for _, division := range resp.Response {
-               sortedList = append(sortedList, division.Name)
-       }
-
-       res := sort.SliceIsSorted(sortedList, func(p, q int) bool {
-               return sortedList[p] < sortedList[q]
        })
-       if res != true {
-               t.Errorf("list is not sorted by their names: %v", sortedList)
-       }
 }
 
-func SortTestDivisionDesc(t *testing.T) {
-       respAsc, _, err := TOSession.GetDivisions(client.RequestOptions{})
-       if err != nil {
-               t.Errorf("Expected no error, but got error in Division 
Ascending: %v - alerts: %+v", err, respAsc.Alerts)
-       }
-       if len(respAsc.Response) < 1 {
-               t.Fatal("Need at least one Division in Traffic Ops to test 
default vs explicit sort order")
-       }
-
-       opts := client.NewRequestOptions()
-       opts.QueryParameters.Set("sortOrder", "desc")
-       respDesc, _, err := TOSession.GetDivisions(opts)
-       if err != nil {
-               t.Errorf("Expected no error, but got error in Division 
Descending: %v - alerts: %+v", err, respDesc.Alerts)
-       }
-       if len(respDesc.Response) < 1 {
-               t.Fatal("Traffic Ops returned at least one Division using 
default sort order, but zero Divisions using explicit 'desc' sort order")
-       }
-
-       if len(respAsc.Response) != len(respDesc.Response) {
-               t.Fatalf("Ascending sort response lists %d Divisions, 
descending lists %d; these should/must be the same", len(respAsc.Response), 
len(respDesc.Response))
-       }
-
-       // TODO: check that the whole thing is sorted, not just the first/last 
elements?
-       // TODO: verify more than one in each response - list of length one is 
trivially sorted both ascending and descending
-
-       // reverse the descending-sorted response and compare it to the 
ascending-sorted one
-       for start, end := 0, len(respDesc.Response)-1; start < end; start, end 
= start+1, end-1 {
-               respDesc.Response[start], respDesc.Response[end] = 
respDesc.Response[end], respDesc.Response[start]
-       }
-       if len(respDesc.Response[0].Name) > 0 && len(respAsc.Response[0].Name) 
> 0 {
-               if respDesc.Response[0].Name != respAsc.Response[0].Name {
-                       t.Errorf("Division responses are not equal after 
reversal: %s - %s", respDesc.Response[0].Name, respAsc.Response[0].Name)
+func validateDivisionFields(expectedResp map[string]interface{}) 
utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               assert.RequireNotNil(t, resp, "Expected Division response to 
not be nil.")
+               divisionResp := resp.([]tc.Division)
+               for field, expected := range expectedResp {
+                       for _, division := range divisionResp {
+                               switch field {
+                               case "Name":
+                                       assert.Equal(t, expected, 
division.Name, "Expected Name to be %v, but got %s", expected, division.Name)
+                               default:
+                                       t.Errorf("Expected field: %v, does not 
exist in response", field)
+                               }
+                       }
                }
-       } else {
-               t.Errorf("Division name shouldn't be empty while sorting the 
response")
        }
 }
 
-func UpdateTestDivisions(t *testing.T) {
-       if len(testData.Divisions) < 1 {
-               t.Fatal("Need at least one Division to test updating Divisions")
-       }
-       firstDivision := testData.Divisions[0]
-
-       // Retrieve the Division by division so we can get the id for the Update
-       opts := client.NewRequestOptions()
-       opts.QueryParameters.Set("name", firstDivision.Name)
-       resp, _, err := TOSession.GetDivisions(opts)
-       if err != nil {
-               t.Errorf("cannot get Division '%s': %v - alerts: %+v", 
firstDivision.Name, err, resp.Alerts)
-       }
-       if len(resp.Response) != 1 {
-               t.Fatalf("Expected exactly one Division to exist with name 
'%s', found: %d", firstDivision.Name, len(resp.Response))
-       }
-       remoteDivision := resp.Response[0]
-       expectedDivision := "division-test"
-       remoteDivision.Name = expectedDivision
-
-       alert, _, err := TOSession.UpdateDivision(remoteDivision.ID, 
remoteDivision, client.RequestOptions{})
-       if err != nil {
-               t.Errorf("cannot update Division '%s' (#%d): %v - alerts: %+v", 
firstDivision.Name, remoteDivision.ID, err, alert.Alerts)
-       }
-
-       // Retrieve the Division to check division got updated
-       opts.QueryParameters.Del("name")
-       opts.QueryParameters.Set("id", strconv.Itoa(remoteDivision.ID))
-       resp, _, err = TOSession.GetDivisions(opts)
-       if err != nil {
-               t.Errorf("cannot get Division #%d: %v - alerts: %+v", 
remoteDivision.ID, err, resp.Alerts)
-       }
-       if len(resp.Response) > 0 {
-               respDivision := resp.Response[0]
-               if respDivision.Name != expectedDivision {
-                       t.Errorf("results do not match actual: %s, expected: 
%s", respDivision.Name, expectedDivision)
-               }
-
-               // Set the name back to the fixture value so we can delete it 
after
-               remoteDivision.Name = firstDivision.Name
-               alert, _, err = TOSession.UpdateDivision(remoteDivision.ID, 
remoteDivision, client.RequestOptions{})
-               if err != nil {
-                       t.Errorf("cannot update Division #%d: %v - alerts: 
%+v", remoteDivision.ID, err, alert.Alerts)
-               }
+func validateDivisionUpdateCreateFields(name string, expectedResp 
map[string]interface{}) utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               opts := client.NewRequestOptions()
+               opts.QueryParameters.Set("name", name)
+               divisions, _, err := TOSession.GetDivisions(opts)
+               assert.RequireNoError(t, err, "Error getting Division: %v - 
alerts: %+v", err, divisions.Alerts)
+               assert.RequireEqual(t, 1, len(divisions.Response), "Expected 
one Division returned Got: %d", len(divisions.Response))
+               validateDivisionFields(expectedResp)(t, toclientlib.ReqInf{}, 
divisions.Response, tc.Alerts{}, nil)
        }
 }
 
-func GetTestDivisions(t *testing.T) {
-       opts := client.NewRequestOptions()
-       for _, division := range testData.Divisions {
-               opts.QueryParameters.Set("name", division.Name)
-               resp, _, err := TOSession.GetDivisions(opts)
-               if err != nil {
-                       t.Errorf("cannot get Division '%s': %v - alerts: %+v", 
division.Name, err, resp)
+func validateDivisionPagination(paginationParam string) utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               paginationResp := resp.([]tc.Division)
+               opts := client.NewRequestOptions()
+               opts.QueryParameters.Set("orderby", "id")
+               respBase, _, err := TOSession.GetDivisions(opts)
+               assert.RequireNoError(t, err, "Cannot get Divisions: %v - 
alerts: %+v", err, respBase.Alerts)
+
+               division := respBase.Response
+               assert.RequireGreaterOrEqual(t, len(division), 2, "Need at 
least 2 Divisions in Traffic Ops to test pagination support, found: %d", 
len(division))
+               switch paginationParam {
+               case "limit:":
+                       assert.Exactly(t, division[:1], paginationResp, 
"expected GET Divisions with limit = 1 to return first result")
+               case "offset":
+                       assert.Exactly(t, division[1:2], paginationResp, 
"expected GET Divisions with limit = 1, offset = 1 to return second result")
+               case "page":
+                       assert.Exactly(t, division[1:2], paginationResp, 
"expected GET Divisions with limit = 1, page = 2 to return second result")
                }
        }
 }
 
-func DeleteTestDivisions(t *testing.T) {
-       opts := client.NewRequestOptions()
-       for _, division := range testData.Divisions {
-               // Retrieve the Division by name so we can get the id
-               opts.QueryParameters.Set("name", division.Name)
-               resp, _, err := TOSession.GetDivisions(opts)
-               if err != nil {
-                       t.Errorf("cannot get Division '%s': %v - alerts: %+v", 
division.Name, err, resp.Alerts)
-               }
-               if len(resp.Response) != 1 {
-                       t.Errorf("Expected exactly one Division to exist with 
the name '%s', found: %d", division.Name, len(resp.Response))
-                       continue
-               }
-               respDivision := resp.Response[0]
-
-               delResp, _, err := TOSession.DeleteDivision(respDivision.ID, 
client.RequestOptions{})
-               if err != nil {
-                       t.Errorf("cannot DELETE Division '%s' (#%d): %v - 
alerts: %+v", division.Name, respDivision.ID, err, delResp.Alerts)
-               }
-
-               // Retrieve the Division to see if it got deleted
-               resp, _, err = TOSession.GetDivisions(opts)
-               if err != nil {
-                       t.Errorf("error fetching Division '%s' after deletion: 
%v - alerts: %+v", division.Name, err, resp.Alerts)
-               }
-               if len(resp.Response) > 0 {
-                       t.Errorf("expected Division : %s to be deleted, but it 
was returned by Traffic Ops", division.Name)
+func validateDivisionSort() utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, 
alerts tc.Alerts, _ error) {
+               assert.RequireNotNil(t, resp, "Expected Division response to 
not be nil.")
+               var divisionNames []string
+               divisionResp := resp.([]tc.Division)
+               for _, division := range divisionResp {
+                       divisionNames = append(divisionNames, division.Name)
                }
+               assert.Equal(t, true, sort.StringsAreSorted(divisionNames), 
"List is not sorted by their names: %v", divisionNames)
        }
 }
 
-func GetTestPaginationSupportDivision(t *testing.T) {
-       opts := client.NewRequestOptions()
-       opts.QueryParameters.Set("orderby", "id")
-       resp, _, err := TOSession.GetDivisions(opts)
-       if err != nil {
-               t.Fatalf("cannot get Divisions: %v - alerts: %+v", err, 
resp.Alerts)
-       }
-       if len(resp.Response) < 2 {
-               t.Fatalf("Need at least 2 Divisions to test Division 
pagination, only found: %d", len(resp.Response))
-       }
-       divisions := resp.Response
-       opts.QueryParameters = url.Values{}
-       opts.QueryParameters.Set("orderby", "id")
-       opts.QueryParameters.Set("limit", "1")
-       divisionsWithLimit, _, err := TOSession.GetDivisions(opts)
-       if err == nil {
-               if !reflect.DeepEqual(divisions[:1], 
divisionsWithLimit.Response) {
-                       t.Error("expected GET Divisions with limit = 1 to 
return first result")
+func validateDivisionDescSort() utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, 
alerts tc.Alerts, _ error) {
+               assert.RequireNotNil(t, resp, "Expected Division response to 
not be nil.")
+               divisionDescResp := resp.([]tc.Division)
+               var descSortedList []string
+               var ascSortedList []string
+               assert.RequireGreaterOrEqual(t, len(divisionDescResp), 2, "Need 
at least 2 Divisions in Traffic Ops to test desc sort, found: %d", 
len(divisionDescResp))
+               // Get Divisions in the default ascending order for comparison.
+               divisionAscResp, _, err := 
TOSession.GetDivisions(client.RequestOptions{})
+               assert.RequireNoError(t, err, "Unexpected error getting 
Divisions with default sort order: %v - alerts: %+v", err, 
divisionAscResp.Alerts)
+               // Verify the response match in length, i.e. equal amount of 
Divisions.
+               assert.RequireEqual(t, len(divisionAscResp.Response), 
len(divisionDescResp), "Expected descending order response length: %v, to match 
ascending order response length %v", len(divisionAscResp.Response), 
len(divisionDescResp))
+               // Insert Division names to the front of a new list, so they 
are now reversed to be in ascending order.
+               for _, division := range divisionDescResp {
+                       descSortedList = append([]string{division.Name}, 
descSortedList...)
                }
-       } else {
-               t.Errorf("Unexpected error getting Divisions with a limit: %v - 
alerts: %+v", err, divisionsWithLimit.Alerts)
-       }
-       opts.QueryParameters = url.Values{}
-       opts.QueryParameters.Set("orderby", "id")
-       opts.QueryParameters.Set("limit", "1")
-       opts.QueryParameters.Set("offset", "1")
-       divisionsWithOffset, _, err := TOSession.GetDivisions(opts)
-       if err == nil {
-               if !reflect.DeepEqual(divisions[1:2], 
divisionsWithOffset.Response) {
-                       t.Error("expected GET Divisions with limit = 1, offset 
= 1 to return second result")
-               }
-       } else {
-               t.Errorf("Unexpected error getting Divisions with a limit and 
an offset: %v - alerts: %+v", err, divisionsWithOffset.Alerts)
-       }
-
-       opts.QueryParameters = url.Values{}
-       opts.QueryParameters.Set("orderby", "id")
-       opts.QueryParameters.Set("limit", "1")
-       opts.QueryParameters.Set("page", "2")
-       divisionsWithPage, _, err := TOSession.GetDivisions(opts)
-       if err == nil {
-               if !reflect.DeepEqual(divisions[1:2], 
divisionsWithPage.Response) {
-                       t.Error("expected GET Divisions with limit = 1, page = 
2 to return second result")
+               // Insert Division names by appending to a new list, so they 
stay in ascending order.
+               for _, division := range divisionAscResp.Response {
+                       ascSortedList = append(ascSortedList, division.Name)
                }
-       } else {
-               t.Errorf("Unexpected error getting Divisions with a limit and a 
page: %v - alerts: %+v", err, divisionsWithPage.Alerts)
-       }
-
-       opts.QueryParameters = url.Values{}
-       opts.QueryParameters.Set("limit", "-2")
-       resp, _, err = TOSession.GetDivisions(opts)
-       if err == nil {
-               t.Error("expected GET Divisions to return an error when limit 
is not bigger than -1")
-       } else if !alertsHaveError(resp.Alerts.Alerts, "must be bigger than 
-1") {
-               t.Errorf("expected GET Divisions to return an error for limit 
is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
-       }
-
-       opts.QueryParameters = url.Values{}
-       opts.QueryParameters.Set("limit", "1")
-       opts.QueryParameters.Set("offset", "0")
-       resp, _, err = TOSession.GetDivisions(opts)
-       if err == nil {
-               t.Error("expected GET Divisions to return an error when offset 
is not a positive integer")
-       } else if !strings.Contains(err.Error(), "must be a positive integer") {
-               t.Errorf("expected GET Divisions to return an error for offset 
is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
-       }
-
-       opts.QueryParameters = url.Values{}
-       opts.QueryParameters.Set("limit", "1")
-       opts.QueryParameters.Set("offset", "0")
-       resp, _, err = TOSession.GetDivisions(opts)
-       if err == nil {
-               t.Error("expected GET Divisions to return an error when offset 
is not a positive integer")
-       } else if !alertsHaveError(resp.Alerts.Alerts, "must be a positive 
integer") {
-               t.Errorf("expected GET Divisions to return an error for offset 
is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
-       }
-
-       opts.QueryParameters = url.Values{}
-       opts.QueryParameters.Set("limit", "1")
-       opts.QueryParameters.Set("page", "0")
-       resp, _, err = TOSession.GetDivisions(opts)
-       if err == nil {
-               t.Error("expected GET Divisions to return an error when page is 
not a positive integer")
-       } else if !alertsHaveError(resp.Alerts.Alerts, "must be a positive 
integer") {
-               t.Errorf("expected GET Divisions to return an error for page is 
not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+               assert.Exactly(t, ascSortedList, descSortedList, "Division 
responses are not equal after reversal: %v - %v", ascSortedList, descSortedList)
        }
 }
 
-func GetDivisionByInvalidId(t *testing.T) {
-       opts := client.NewRequestOptions()
-       opts.QueryParameters.Set("id", "10000")
-       resp, _, err := TOSession.GetDivisions(opts)
-       if err != nil {
-               t.Errorf("Unexpected error getting Division by presumably 
invalid ID (10000): %v - alerts: %+v", err, resp.Alerts)
-       }
-       if len(resp.Response) >= 1 {
-               t.Errorf("Expected to find exactly zero Divisions with 
presumably invalid ID (10000), found: %d", len(resp.Response))
+func GetDivisionID(t *testing.T, divisionName string) func() int {
+       return func() int {
+               opts := client.NewRequestOptions()
+               opts.QueryParameters.Set("name", divisionName)
+               divisionsResp, _, err := TOSession.GetDivisions(opts)
+               assert.RequireNoError(t, err, "Get Divisions Request failed 
with error:", err)
+               assert.RequireEqual(t, 1, len(divisionsResp.Response), 
"Expected response object length 1, but got %d", len(divisionsResp.Response))
+               return divisionsResp.Response[0].ID
        }
 }
 
-func GetDivisionByInvalidName(t *testing.T) {
-       opts := client.NewRequestOptions()
-       opts.QueryParameters.Set("name", "abcd")
-       resp, _, err := TOSession.GetDivisions(opts)
-       if err != nil {
-               t.Errorf("Unexpected error getting Division by presumably 
invalid name ('abcd'): %v - alerts: %+v", err, resp.Alerts)
-       }
-       if len(resp.Response) >= 1 {
-               t.Errorf("Expected to find exactly zero Divisions with 
presumably invalid name ('abcd'), found: %d", len(resp.Response))
+func CreateTestDivisions(t *testing.T) {
+       for _, division := range testData.Divisions {
+               resp, _, err := TOSession.CreateDivision(division, 
client.RequestOptions{})
+               assert.RequireNoError(t, err, "Could not create Division '%s': 
%v - alerts: %+v", division.Name, err, resp.Alerts)
        }
 }
 
-func DeleteTestDivisionsByInvalidId(t *testing.T) {
-       delResp, _, err := TOSession.DeleteDivision(10000, 
client.RequestOptions{})
-       if err == nil {
-               t.Errorf("Expected an error deleting Division with presumably 
invalid ID (10000), didn't get one - alerts: %+v", delResp.Alerts)
+func DeleteTestDivisions(t *testing.T) {
+       divisions, _, err := TOSession.GetDivisions(client.RequestOptions{})
+       assert.NoError(t, err, "Cannot get Divisions: %v - alerts: %+v", err, 
divisions.Alerts)
+       for _, division := range divisions.Response {
+               alerts, _, err := TOSession.DeleteDivision(division.ID, 
client.RequestOptions{})
+               assert.NoError(t, err, "Unexpected error deleting Division '%s' 
(#%d): %v - alerts: %+v", division.Name, division.ID, err, alerts.Alerts)
+               // Retrieve the Division to see if it got deleted
+               opts := client.NewRequestOptions()
+               opts.QueryParameters.Set("id", strconv.Itoa(division.ID))
+               getDivision, _, err := TOSession.GetDivisions(opts)
+               assert.NoError(t, err, "Error getting Division '%s' after 
deletion: %v - alerts: %+v", division.Name, err, getDivision.Alerts)
+               assert.Equal(t, 0, len(getDivision.Response), "Expected 
Division '%s' to be deleted, but it was found in Traffic Ops", division.Name)
        }
 }

Reply via email to