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

zrhoffman 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 498dad6c98 Refactor Delivery Service Requests (#6758)
498dad6c98 is described below

commit 498dad6c983accbb085ff5f76551d4567097b826
Author: Eric Holguin <[email protected]>
AuthorDate: Fri Apr 29 10:16:28 2022 -0600

    Refactor Delivery Service Requests (#6758)
    
    * Updated prereqs for ds requests tests
    
    * Refactor tests
    
    * all fields start on newline
    
    * Added assert
    
    * Readd resetDS functionality
---
 .../api/v3/deliveryservice_requests_test.go        | 625 +++++++-------
 traffic_ops/testing/api/v3/tc-fixtures.json        |  49 +-
 .../api/v4/deliveryservice_requests_test.go        | 925 +++++++--------------
 traffic_ops/testing/api/v4/tc-fixtures.json        |  64 +-
 4 files changed, 615 insertions(+), 1048 deletions(-)

diff --git a/traffic_ops/testing/api/v3/deliveryservice_requests_test.go 
b/traffic_ops/testing/api/v3/deliveryservice_requests_test.go
index 11cc733ee4..df323a44a4 100644
--- a/traffic_ops/testing/api/v3/deliveryservice_requests_test.go
+++ b/traffic_ops/testing/api/v3/deliveryservice_requests_test.go
@@ -16,366 +16,327 @@ package v3
 */
 
 import (
+       "encoding/json"
        "net/http"
+       "net/url"
        "strings"
        "testing"
        "time"
 
        "github.com/apache/trafficcontrol/lib/go-rfc"
-       tc "github.com/apache/trafficcontrol/lib/go-tc"
-)
-
-const (
-       dsrGood      = 0
-       dsrBadTenant = 1
-       dsrRequired  = 2
-       dsrDraft     = 3
+       "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 TestDeliveryServiceRequests(t *testing.T) {
        WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants, 
DeliveryServiceRequests}, func() {
-               GetTestDeliveryServiceRequestsIMS(t)
-               GetTestDeliveryServiceRequests(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)
-               UpdateTestDeliveryServiceRequests(t)
-               UpdateTestDeliveryServiceRequestsWithHeaders(t, header)
-               GetTestDeliveryServiceRequestsIMSAfterChange(t, header)
-               header = make(map[string][]string)
-               etag := rfc.ETag(currentTime)
-               header.Set(rfc.IfMatch, etag)
-               UpdateTestDeliveryServiceRequestsWithHeaders(t, header)
-       })
-}
-
-func UpdateTestDeliveryServiceRequestsWithHeaders(t *testing.T, header 
http.Header) {
-       // Retrieve the DeliveryServiceRequest by name so we can get the id for 
the Update
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       resp, _, err := 
TOSession.GetDeliveryServiceRequestByXMLIDWithHdr(dsr.DeliveryService.XMLID, 
header)
-       if err != nil {
-               t.Errorf("cannot GET DeliveryServiceRequest by name: %v - %v", 
dsr.DeliveryService.XMLID, err)
-       }
-       if len(resp) == 0 {
-               t.Fatal("Length of GET DeliveryServiceRequest is 0")
-       }
-       respDSR := resp[0]
-       respDSR.DeliveryService.DisplayName = "new display name"
-
-       _, reqInf, err := 
TOSession.UpdateDeliveryServiceRequestByIDWithHdr(respDSR.ID, respDSR, 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 GetTestDeliveryServiceRequestsIMSAfterChange(t *testing.T, header 
http.Header) {
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       _, reqInf, err := 
TOSession.GetDeliveryServiceRequestByXMLIDWithHdr(dsr.DeliveryService.XMLID, 
header)
-       if err != nil {
-               t.Fatalf("Expected no error, but got %v", err.Error())
-       }
-       if reqInf.StatusCode != http.StatusOK {
-               t.Fatalf("Expected 200 status code, got %v", reqInf.StatusCode)
-       }
-       currentTime := time.Now().UTC()
-       currentTime = currentTime.Add(1 * time.Second)
-       timeStr := currentTime.Format(time.RFC1123)
-       header.Set(rfc.IfModifiedSince, timeStr)
-       _, reqInf, err = 
TOSession.GetDeliveryServiceRequestByXMLIDWithHdr(dsr.DeliveryService.XMLID, 
header)
-       if err != nil {
-               t.Fatalf("Expected no error, but got %v", err.Error())
-       }
-       if reqInf.StatusCode != http.StatusNotModified {
-               t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
-       }
-}
-
-func CreateTestDeliveryServiceRequests(t *testing.T) {
-       t.Log("CreateTestDeliveryServiceRequests")
-
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       respDSR, _, err := TOSession.CreateDeliveryServiceRequest(dsr)
-       t.Log("Response: ", respDSR)
-       if err != nil {
-               t.Errorf("could not CREATE DeliveryServiceRequests: %v", err)
-       }
-
-}
 
-func TestDeliveryServiceRequestRequired(t *testing.T) {
-       WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants}, func() {
-               dsr := testData.DeliveryServiceRequests[dsrRequired]
-               _, _, err := TOSession.CreateDeliveryServiceRequest(dsr)
-               if err == nil {
-                       t.Error("expected: validation error, actual: nil")
+               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 XMLID parameter": {
+                                       ClientSession: TOSession,
+                                       RequestParams: url.Values{"xmlId": 
{"test-ds1"}},
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
utils.ResponseLengthGreaterOrEqual(1),
+                                               
validateGetDSRequestFields(map[string]interface{}{"XMLID": "test-ds1"})),
+                               },
+                       },
+                       "PUT": {
+                               "OK when VALID request": {
+                                       EndpointId:    
GetDeliveryServiceRequestId(t, "test-ds1"),
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "deliveryService": 
generateDeliveryService(t, map[string]interface{}{
+                                                       "displayName": "NEW 
DISPLAY NAME",
+                                                       "tenantId":    
GetTenantId(t, "tenant1"),
+                                                       "xmlId":       
"test-ds1",
+                                               }),
+                                               "status": "draft",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                               "OK when UPDATING STATUS FROM DRAFT TO 
SUBMITTED": {
+                                       EndpointId:    
GetDeliveryServiceRequestId(t, "test-ds1"),
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "deliveryService": 
generateDeliveryService(t, map[string]interface{}{
+                                                       "tenantId": 
GetTenantId(t, "tenant1"),
+                                                       "xmlId":    "test-ds1",
+                                               }),
+                                               "status": "submitted",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                               "PRECONDITION FAILED when updating with 
IF-UNMODIFIED-SINCE Header": {
+                                       EndpointId:     
GetDeliveryServiceRequestId(t, "test-ds1"),
+                                       ClientSession:  TOSession,
+                                       RequestHeaders: 
http.Header{rfc.IfUnmodifiedSince: {currentTimeRFC}},
+                                       RequestBody:    
map[string]interface{}{},
+                                       Expectations:   
utils.CkRequest(utils.HasError(), 
utils.HasStatus(http.StatusPreconditionFailed)),
+                               },
+                               "PRECONDITION FAILED when updating with IFMATCH 
ETAG Header": {
+                                       EndpointId:     
GetDeliveryServiceRequestId(t, "test-ds1"),
+                                       ClientSession:  TOSession,
+                                       RequestBody:    
map[string]interface{}{},
+                                       RequestHeaders: 
http.Header{rfc.IfMatch: {rfc.ETag(currentTime)}},
+                                       Expectations:   
utils.CkRequest(utils.HasError(), 
utils.HasStatus(http.StatusPreconditionFailed)),
+                               },
+                       },
+                       "POST": {
+                               "OK when VALID request": {
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "deliveryService": 
generateDeliveryService(t, map[string]interface{}{
+                                                       "ccrDnsTtl":          
30,
+                                                       "deepCachingType":    
"NEVER",
+                                                       "initialDispersion":  3,
+                                                       "ipv6RoutingEnabled": 
true,
+                                                       "longDesc":           
"long desc",
+                                                       "orgServerFqdn":      
"http://example.test";,
+                                                       "profileName":        
nil,
+                                                       "tenant":             
"root",
+                                                       "xmlId":              
"test-ds2",
+                                               }),
+                                               "status": "draft",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                               "BAD REQUEST when MISSING REQUIRED FIELDS": {
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "deliveryService": 
map[string]interface{}{
+                                                       "type":  "HTTP",
+                                                       "xmlId": 
"test-ds-fields",
+                                               },
+                                               "status": "draft",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "BAD REQUEST when VALIDATION RULES ARE NOT 
FOLLOWED": {
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "deliveryService": 
map[string]interface{}{
+                                                       "ccrDnsTtl":            
30,
+                                                       "deepCachingType":      
"NEVER",
+                                                       "displayName":          
strings.Repeat("X", 49),
+                                                       "dscp":                 
0,
+                                                       "geoLimit":             
0,
+                                                       "geoProvider":          
1,
+                                                       "infoUrl":              
"xxx",
+                                                       "initialDispersion":    
1,
+                                                       "ipv6RoutingEnabled":   
true,
+                                                       "logsEnabled":          
true,
+                                                       "longDesc":             
"long desc",
+                                                       "missLat":              
0.0,
+                                                       "missLong":             
0.0,
+                                                       "multiSiteOrigin":      
false,
+                                                       "orgServerFqdn":        
"http://example.test";,
+                                                       "protocol":             
0,
+                                                       "qstringIgnore":        
0,
+                                                       "rangeRequestHandling": 
0,
+                                                       "regionalGeoBlocking":  
true,
+                                                       "routingName":          
strings.Repeat("X", 1) + "." + strings.Repeat("X", 48),
+                                                       "tenant":               
"tenant1",
+                                                       "type":                 
"HTTP",
+                                                       "xmlId":                
"X " + strings.Repeat("X", 46),
+                                               },
+                                               "status": "draft",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "BAD REQUEST when NON-DRAFT": {
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "deliveryService": 
map[string]interface{}{
+                                                       "active":               
false,
+                                                       "cdnName":              
"cdn1",
+                                                       "displayName":          
"Testing transitions",
+                                                       "dscp":                 
3,
+                                                       "geoLimit":             
1,
+                                                       "geoProvider":          
1,
+                                                       "initialDispersion":    
1,
+                                                       "ipv6RoutingEnabled":   
true,
+                                                       "logsEnabled":          
true,
+                                                       "missLat":              
0.0,
+                                                       "missLong":             
0.0,
+                                                       "multiSiteOrigin":      
false,
+                                                       "orgServerFqdn":        
"http://example.test";,
+                                                       "protocol":             
0,
+                                                       "qstringIgnore":        
0,
+                                                       "rangeRequestHandling": 
0,
+                                                       "regionalGeoBlocking":  
true,
+                                                       "routingName":          
"goodroute",
+                                                       "tenant":               
"tenant1",
+                                                       "type":                 
"HTTP",
+                                                       "xmlId":                
"test-transitions",
+                                               },
+                                               "status": "pending",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "BAD REQUEST when ALREADY EXISTS": {
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "deliveryService": 
map[string]interface{}{
+                                                       "active":               
true,
+                                                       "cdnName":              
"cdn1",
+                                                       "displayName":          
"Good Kabletown CDN",
+                                                       "dscp":                 
1,
+                                                       "geoLimit":             
1,
+                                                       "geoProvider":          
1,
+                                                       "initialDispersion":    
1,
+                                                       "ipv6RoutingEnabled":   
true,
+                                                       "logsEnabled":          
true,
+                                                       "missLat":              
0.0,
+                                                       "missLong":             
0.0,
+                                                       "multiSiteOrigin":      
false,
+                                                       "orgServerFqdn":        
"http://example.test";,
+                                                       "protocol":             
0,
+                                                       "qstringIgnore":        
0,
+                                                       "rangeRequestHandling": 
0,
+                                                       "regionalGeoBlocking":  
true,
+                                                       "routingName":          
"goodroute",
+                                                       "tenant":               
"tenant1",
+                                                       "type":                 
"HTTP",
+                                                       "xmlId":                
"test-ds1",
+                                               },
+                                               "status": "draft",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                       },
+                       "DELETE": {
+                               "OK when VALID request": {
+                                       EndpointId:    
GetDeliveryServiceRequestId(t, "test-deletion"),
+                                       ClientSession: TOSession,
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                       },
+                       "GET AFTER CHANGES": {
+                               "OK when CHANGES made": {
+                                       ClientSession:  TOSession,
+                                       RequestHeaders: 
http.Header{rfc.IfModifiedSince: {currentTimeRFC}},
+                                       Expectations:   
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                       },
                }
-       })
-}
-
-func TestDeliveryServiceRequestRules(t *testing.T) {
-       WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants}, func() {
-               routingName := strings.Repeat("X", 1) + "." + 
strings.Repeat("X", 48)
-               // Test the xmlId length and form
-               XMLID := "X " + strings.Repeat("X", 46)
-               displayName := strings.Repeat("X", 49)
-
-               dsr := testData.DeliveryServiceRequests[dsrGood]
-               dsr.DeliveryService.DisplayName = displayName
-               dsr.DeliveryService.RoutingName = routingName
-               dsr.DeliveryService.XMLID = XMLID
-
-               _, _, err := TOSession.CreateDeliveryServiceRequest(dsr)
-               if err == nil {
-                       t.Error("expected: validation error, actual: nil")
-               }
-       })
-}
-
-func TestDeliveryServiceRequestTypeFields(t *testing.T) {
-       WithObjs(t, []TCObj{CDNs, Types, Tenants, Parameters}, func() {
-               dsr := testData.DeliveryServiceRequests[dsrBadTenant]
 
-               alerts, _, err := TOSession.CreateDeliveryServiceRequest(dsr)
-               if err != nil {
-                       t.Errorf("Error occurred %v", err)
+               for method, testCases := range methodTests {
+                       t.Run(method, func(t *testing.T) {
+                               for name, testCase := range testCases {
+                                       dsReq := tc.DeliveryServiceRequest{}
+
+                                       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, 
&dsReq)
+                                               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 XMLID parameter" {
+                                                               resp, reqInf, 
err := 
testCase.ClientSession.GetDeliveryServiceRequestByXMLIDWithHdr(testCase.RequestParams["xmlId"][0],
 testCase.RequestHeaders)
+                                                               for _, check := 
range testCase.Expectations {
+                                                                       
check(t, reqInf, resp, tc.Alerts{}, err)
+                                                               }
+                                                       } else {
+                                                               resp, reqInf, 
err := 
testCase.ClientSession.GetDeliveryServiceRequestsWithHdr(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.CreateDeliveryServiceRequest(dsReq)
+                                                       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.UpdateDeliveryServiceRequestByIDWithHdr(testCase.EndpointId(),
 dsReq, 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.DeleteDeliveryServiceRequestByID(testCase.EndpointId())
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       }
+                               }
+                       })
                }
 
-               found := false
-               for _, alert := range alerts.Alerts {
-                       if alert.Level == tc.ErrorLevel.String() {
-                               t.Errorf("Expected only succuss-level alerts 
creating a DSR, got error-level alert: %s", alert.Text)
-                       } else if alert.Level == tc.SuccessLevel.String() {
-                               t.Logf("Got expected alert creating a DSR: %s", 
alert.Text)
-                               found = true
-                       }
-               }
-               if !found {
-                       t.Errorf("Expected a success-level alert creating a 
DSR, got none")
-               }
-
-               dsrs, _, err := 
TOSession.GetDeliveryServiceRequestByXMLID(dsr.DeliveryService.XMLID)
-               if len(dsrs) != 1 {
-                       t.Errorf("expected 1 deliveryservice_request with XMLID 
%s;  got %d", dsr.DeliveryService.XMLID, len(dsrs))
-               }
-               alert, _, err := 
TOSession.DeleteDeliveryServiceRequestByID(dsrs[0].ID)
-               if err != nil {
-                       t.Errorf("cannot DELETE DeliveryServiceRequest by id: 
%d - %v - %v", dsrs[0].ID, err, alert)
-               }
        })
 }
 
-func TestDeliveryServiceRequestBad(t *testing.T) {
-       WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants}, func() {
-               // try to create non-draft/submitted
-               src := testData.DeliveryServiceRequests[dsrDraft]
-               s, err := tc.RequestStatusFromString("pending")
-               if err != nil {
-                       t.Errorf(`unable to create Status from string 
"pending"`)
-               }
-               src.Status = s
-
-               _, _, err = TOSession.CreateDeliveryServiceRequest(src)
-               if err == nil {
-                       t.Fatal("expected: validation error, actual: nil")
-               }
-       })
+func GetDeliveryServiceRequestId(t *testing.T, xmlId string) func() int {
+       return func() int {
+               resp, _, err := 
TOSession.GetDeliveryServiceRequestByXMLIDWithHdr(xmlId, http.Header{})
+               assert.RequireNoError(t, err, "Get Delivery Service Requests 
failed with error: %v", err)
+               assert.RequireGreaterOrEqual(t, len(resp), 1, "Expected 
delivery service requests response object length of atleast 1, but got %d", 
len(resp))
+               assert.RequireNotNil(t, resp[0].ID, "Expected id to not be nil")
+               return resp[0].ID
+       }
 }
 
-// TestDeliveryServiceRequestWorkflow tests that transitions of Status are
-func TestDeliveryServiceRequestWorkflow(t *testing.T) {
-       WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants}, func() {
-               // test empty request table
-               dsrs, _, err := TOSession.GetDeliveryServiceRequests()
-               if err != nil {
-                       t.Errorf("Error getting empty list of 
DeliveryServiceRequests %v++", err)
-               }
-               if dsrs == nil {
-                       t.Error("Expected empty DeliveryServiceRequest slice -- 
got nil")
-               }
-               if len(dsrs) != 0 {
-                       t.Errorf("Expected no entries in DeliveryServiceRequest 
slice -- got %d", len(dsrs))
-               }
-
-               // Create a draft request
-               src := testData.DeliveryServiceRequests[dsrDraft]
-
-               alerts, _, err := TOSession.CreateDeliveryServiceRequest(src)
-               if err != nil {
-                       t.Errorf("Error creating DeliveryServiceRequest %v", 
err)
-               }
-
-               found := false
-               for _, alert := range alerts.Alerts {
-                       if alert.Level == tc.ErrorLevel.String() {
-                               t.Errorf("Expected only succuss-level alerts 
creating a DSR, got error-level alert: %s", alert.Text)
-                       } else if alert.Level == tc.SuccessLevel.String() {
-                               t.Logf("Got expected alert creating a DSR: %s", 
alert.Text)
-                               found = true
-                       }
-               }
-               if !found {
-                       t.Errorf("Expected a success-level alert creating a 
DSR, got none")
-               }
-
-               // Create a duplicate request -- should fail because xmlId is 
the same
-               alerts, _, err = TOSession.CreateDeliveryServiceRequest(src)
-               if err == nil {
-                       t.Fatal("expected: validation error, actual: nil")
-               }
-
-               // TODO: the client needs to be fixed to return alerts on 
error. But
-               // that's gotten harder to do "semantically" now that most of 
the logic
-               // is shared between all API versions.
-               // found = false
-               // for _, alert := range alerts.Alerts {
-               //      if alert.Level == tc.SuccessLevel.String() {
-               //              t.Errorf("Expected only error-level alerts 
creating a duplicate DSR, got success-level alert: %s", alert.Text)
-               //      } else if alert.Level == tc.ErrorLevel.String() {
-               //              t.Logf("Got expected alert creating a duplicate 
DSR: %s", alert.Text)
-               //              found = true
-               //      }
-               // }
-               // if !found {
-               //      t.Errorf("Expected an error-level alert creating a 
duplicate DSR, got none")
-               // }
-
-               dsrs, _, err = 
TOSession.GetDeliveryServiceRequestByXMLID(`test-transitions`)
-               if len(dsrs) != 1 {
-                       t.Errorf("Expected 1 deliveryServiceRequest -- got %d", 
len(dsrs))
-                       if len(dsrs) == 0 {
-                               t.Fatal("Cannot proceed")
+func validateGetDSRequestFields(expectedResp map[string]interface{}) 
utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               dsReqResp := resp.([]tc.DeliveryServiceRequest)
+               for field, expected := range expectedResp {
+                       for _, ds := range dsReqResp {
+                               switch field {
+                               case "XMLID":
+                                       assert.Equal(t, expected, 
ds.DeliveryService.XMLID, "Expected XMLID to be %v, but got %v", expected, 
ds.DeliveryService.XMLID)
+                               default:
+                                       t.Errorf("Expected field: %v, does not 
exist in response", field)
+                               }
                        }
                }
-
-               alerts, dsr := updateDeliveryServiceRequestStatus(t, dsrs[0], 
"submitted", nil)
-
-               found = false
-               for _, alert := range alerts.Alerts {
-                       if alert.Level == tc.ErrorLevel.String() {
-                               t.Errorf("Expected only succuss-level alerts 
updating a DSR, got error-level alert: %s", alert.Text)
-                       } else if alert.Level == tc.SuccessLevel.String() {
-                               t.Logf("Got expected alert updating a DSR: %s", 
alert.Text)
-                               found = true
-                       }
-               }
-               if !found {
-                       t.Errorf("Expected a success-level alert updating a 
DSR, got none")
-               }
-
-               if dsr.Status != tc.RequestStatus("submitted") {
-                       t.Errorf("expected status=submitted,  got %s", 
string(dsr.Status))
-               }
-       })
-}
-
-func updateDeliveryServiceRequestStatus(t *testing.T, dsr 
tc.DeliveryServiceRequest, newstate string, header http.Header) (tc.Alerts, 
tc.DeliveryServiceRequest) {
-       ID := dsr.ID
-       dsr.Status = tc.RequestStatus("submitted")
-
-       alerts, _, err := TOSession.UpdateDeliveryServiceRequestByIDWithHdr(ID, 
dsr, header)
-       if err != nil {
-               t.Errorf("Error updating deliveryservice_request: %v", err)
-               return alerts, dsr
-       }
-
-       d, _, err := TOSession.GetDeliveryServiceRequestByID(ID)
-       if err != nil {
-               t.Errorf("Error updating deliveryservice_request %d: %v", ID, 
err)
-               return alerts, dsr
-       }
-
-       if len(d) != 1 {
-               t.Errorf("Expected 1 deliveryservice_request, got %d", len(d))
-       }
-       return alerts, d[0]
-}
-
-func GetTestDeliveryServiceRequestsIMS(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)
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       _, reqInf, err := 
TOSession.GetDeliveryServiceRequestByXMLIDWithHdr(dsr.DeliveryService.XMLID, 
header)
-       if err != nil {
-               t.Fatalf("Expected no error, but got %v", err.Error())
-       }
-       if reqInf.StatusCode != http.StatusNotModified {
-               t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
-       }
-}
-
-func GetTestDeliveryServiceRequests(t *testing.T) {
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       resp, _, err := 
TOSession.GetDeliveryServiceRequestByXMLID(dsr.DeliveryService.XMLID)
-       if err != nil {
-               t.Errorf("cannot GET DeliveryServiceRequest by XMLID: %v - %v", 
err, resp)
        }
 }
 
-func UpdateTestDeliveryServiceRequests(t *testing.T) {
-
-       // Retrieve the DeliveryServiceRequest by name so we can get the id for 
the Update
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       resp, _, err := 
TOSession.GetDeliveryServiceRequestByXMLID(dsr.DeliveryService.XMLID)
-       if err != nil {
-               t.Errorf("cannot GET DeliveryServiceRequest by name: %v - %v", 
dsr.DeliveryService.XMLID, err)
-       }
-       if len(resp) == 0 {
-               t.Fatal("Length of GET DeliveryServiceRequest is 0")
-       }
-       respDSR := resp[0]
-       expDisplayName := "new display name"
-       respDSR.DeliveryService.DisplayName = expDisplayName
-       var alert tc.Alerts
-       alert, _, err = TOSession.UpdateDeliveryServiceRequestByID(respDSR.ID, 
respDSR)
-       t.Log("Response: ", alert)
-       if err != nil {
-               t.Errorf("cannot UPDATE DeliveryServiceRequest by id: %v - %v", 
err, alert)
-               return
-       }
-
-       // Retrieve the DeliveryServiceRequest to check DeliveryServiceRequest 
name got updated
-       resp, _, err = TOSession.GetDeliveryServiceRequestByID(respDSR.ID)
-       if err != nil {
-               t.Errorf("cannot GET DeliveryServiceRequest by name: %v - %v", 
respDSR.ID, err)
-       } else {
-               respDSR = resp[0]
-               if respDSR.DeliveryService.DisplayName != expDisplayName {
-                       t.Errorf("results do not match actual: %s, expected: 
%s", respDSR.DeliveryService.DisplayName, expDisplayName)
-               }
+func CreateTestDeliveryServiceRequests(t *testing.T) {
+       for _, dsr := range testData.DeliveryServiceRequests {
+               respDSR, _, err := TOSession.CreateDeliveryServiceRequest(dsr)
+               assert.NoError(t, err, "Could not create Delivery Service 
Requests: %v - alerts: %+v", err, respDSR.Alerts)
        }
-
 }
 
 func DeleteTestDeliveryServiceRequests(t *testing.T) {
-
-       // Retrieve the DeliveryServiceRequest by name so we can get the id for 
the Update
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       resp, _, err := 
TOSession.GetDeliveryServiceRequestByXMLID(dsr.DeliveryService.XMLID)
-       if err != nil {
-               t.Errorf("cannot GET DeliveryServiceRequest by id: %v - %v", 
dsr.DeliveryService.XMLID, err)
-       }
-       respDSR := resp[0]
-       alert, _, err := TOSession.DeleteDeliveryServiceRequestByID(respDSR.ID)
-       t.Log("Response: ", alert)
-       if err != nil {
-               t.Errorf("cannot DELETE DeliveryServiceRequest by id: %d - %v - 
%v", respDSR.ID, err, alert)
-       }
-
-       // Retrieve the DeliveryServiceRequest to see if it got deleted
-       dsrs, _, err := 
TOSession.GetDeliveryServiceRequestByXMLID(dsr.DeliveryService.XMLID)
-       if err != nil {
-               t.Errorf("error deleting DeliveryServiceRequest name: %s", 
err.Error())
-       }
-       if len(dsrs) > 0 {
-               t.Errorf("expected DeliveryServiceRequest XMLID: %s to be 
deleted", dsr.DeliveryService.XMLID)
+       resp, _, err := 
TOSession.GetDeliveryServiceRequestsWithHdr(http.Header{})
+       assert.NoError(t, err, "Cannot get Delivery Service Requests: %v", err)
+       for _, request := range resp {
+               alert, _, err := 
TOSession.DeleteDeliveryServiceRequestByID(request.ID)
+               assert.NoError(t, err, "Cannot delete Delivery Service Request 
#%d: %v - alerts: %+v", request.ID, err, alert.Alerts)
+
+               // Retrieve the DeliveryServiceRequest to see if it got deleted
+               dsr, _, err := 
TOSession.GetDeliveryServiceRequestByIDWithHdr(request.ID, http.Header{})
+               assert.NoError(t, err, "Unexpected error fetching Delivery 
Service Request #%d after deletion: %v", request.ID, err)
+               assert.Equal(t, len(dsr), 0, "Expected Delivery Service Request 
#%d to be deleted, but it was found in Traffic Ops", request.ID)
        }
 }
diff --git a/traffic_ops/testing/api/v3/tc-fixtures.json 
b/traffic_ops/testing/api/v3/tc-fixtures.json
index 7c2f2994ff..d9b962a512 100644
--- a/traffic_ops/testing/api/v3/tc-fixtures.json
+++ b/traffic_ops/testing/api/v3/tc-fixtures.json
@@ -327,51 +327,8 @@
                 "cdnName": "cdn1",
                 "ccrDnsTtl": 30,
                 "deepCachingType": "NEVER",
-                "displayName": "Bad Tenant",
-                "dscp": 0,
-                "geoLimit": 0,
-                "geoProvider": 0,
-                "initialDispersion": 3,
-                "logsEnabled": false,
-                "longDesc": "long desc",
-                "regionalGeoBlocking": false,
-                "tenant": "root",
-                "type": "HTTP",
-                "xmlId": "test-ds2"
-            },
-            "status": "draft"
-        },
-        {
-            "changeType": "create",
-            "deliveryService": {
-                "ccrDnsTtl": 30,
-                "deepCachingType": "NEVER",
-                "displayName": "Bad Test Case CDN",
-                "dscp": 0,
-                "geoLimit": 0,
-                "geoProvider": 1,
-                "infoUrl": "xxx",
-                "initialDispersion": 1,
-                "logsEnabled": true,
-                "longDesc": "long desc",
-                "orgServerFqdn": "xxx",
-                "regionalGeoBlocking": true,
-                "routingName": "x routing",
-                "tenant": "tenant1",
-                "type": "HTTP",
-                "xmlId": "test-ds3"
-            },
-            "status": "draft"
-        },
-        {
-            "changeType": "create",
-            "deliveryService": {
-                "active": false,
-                "cdnName": "cdn1",
-                "ccrDnsTtl": 30,
-                "deepCachingType": "NEVER",
-                "displayName": "Testing transitions",
-                "dscp": 3,
+                "displayName": "Good Kabletown CDN",
+                "dscp": 1,
                 "geoLimit": 1,
                 "geoProvider": 1,
                 "initialDispersion": 1,
@@ -381,7 +338,7 @@
                 "routingName": "goodroute",
                 "tenant": "tenant1",
                 "type": "HTTP",
-                "xmlId": "test-transitions"
+                "xmlId": "test-deletion"
             },
             "status": "draft"
         }
diff --git a/traffic_ops/testing/api/v4/deliveryservice_requests_test.go 
b/traffic_ops/testing/api/v4/deliveryservice_requests_test.go
index d0ccf8c735..6890c33148 100644
--- a/traffic_ops/testing/api/v4/deliveryservice_requests_test.go
+++ b/traffic_ops/testing/api/v4/deliveryservice_requests_test.go
@@ -16,25 +16,22 @@ package v4
 */
 
 import (
+       "encoding/json"
        "net/http"
+       "net/url"
        "strconv"
        "strings"
        "testing"
        "time"
 
        "github.com/apache/trafficcontrol/lib/go-rfc"
-       tc "github.com/apache/trafficcontrol/lib/go-tc"
-       "github.com/apache/trafficcontrol/lib/go-util"
+       "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"
 )
 
-const (
-       dsrGood      = 0
-       dsrBadTenant = 1
-       dsrRequired  = 2
-       dsrDraft     = 3
-)
-
 // this resets the IDs of things attached to a DS, which needs to be done
 // because the WithObjs flow destroys and recreates those object IDs
 // non-deterministically with each test - BUT, the client method permanently
@@ -58,630 +55,340 @@ func resetDS(ds *tc.DeliveryServiceV4) {
 
 func TestDeliveryServiceRequests(t *testing.T) {
        WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants, 
DeliveryServiceRequests}, func() {
-               GetTestDeliveryServiceRequestsIMS(t)
-               GetTestDeliveryServiceRequests(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)
-               UpdateTestDeliveryServiceRequestsWithLongDescFields(t)
-               UpdateTestDeliveryServiceRequests(t)
-               UpdateTestDeliveryServiceRequestsWithHeaders(t, header)
-               GetTestDeliveryServiceRequestsIMSAfterChange(t, header)
-               header = make(map[string][]string)
-               etag := rfc.ETag(currentTime)
-               header.Set(rfc.IfMatch, etag)
-               UpdateTestDeliveryServiceRequestsWithHeaders(t, header)
-       })
-}
-
-func UpdateTestDeliveryServiceRequestsWithLongDescFields(t *testing.T) {
-       if len(testData.DeliveryServiceRequests) < dsrGood+1 {
-               t.Fatalf("Need at least %d Delivery Service Requests to test 
updating them", dsrGood+1)
-       }
-
-       // Retrieve the DeliveryServiceRequest by name so we can get the id for 
the Update
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       var ds *tc.DeliveryServiceV4
-       if dsr.ChangeType == tc.DSRChangeTypeDelete {
-               dsr.Original.LongDesc1 = util.StrPtr("long desc 1")
-               dsr.Original.LongDesc2 = util.StrPtr("long desc 2")
-               ds = dsr.Original
-       } else {
-               dsr.Requested.LongDesc1 = util.StrPtr("long desc 1")
-               dsr.Requested.LongDesc2 = util.StrPtr("long desc 2")
-               ds = dsr.Requested
-       }
-
-       if ds == nil || ds.XMLID == nil {
-               t.Fatalf("the %dth DSR in the test data had no DeliveryService 
- or that DeliveryService had no XMLID", dsrGood)
-       }
-
-       opts := client.NewRequestOptions()
-       opts.QueryParameters.Set("xmlId", *ds.XMLID)
-       resp, _, err := TOSession.GetDeliveryServiceRequests(opts)
-       if err != nil {
-               t.Errorf("cannot get Delivery Service Request with XMLID '%s': 
%v - alerts: %+v", *ds.XMLID, err, resp.Alerts)
-       }
-       if len(resp.Response) == 0 {
-               t.Fatalf("Expected at least one Deliver Service Request to 
exist with XMLID '%s', but none were found in Traffic Ops", *ds.XMLID)
-       }
-       respDSR := resp.Response[0]
-       if respDSR.ID == nil {
-               t.Fatalf("got a DSR by XMLID '%s' with a null or undefined ID", 
*ds.XMLID)
-       }
-       var respDS *tc.DeliveryServiceV4
-       if dsr.ChangeType == tc.DSRChangeTypeDelete {
-               respDS = dsr.Original
-               respDSR.Original = respDS
-       } else {
-               respDS = dsr.Requested
-               respDSR.Requested = respDS
-       }
-       expDisplayName := "new display name"
-       respDS.DisplayName = &expDisplayName
-       id := *respDSR.ID
-       _, reqInf, err := TOSession.UpdateDeliveryServiceRequest(id, respDSR, 
client.RequestOptions{})
-       if err == nil {
-               t.Errorf("expected an error stating that Long Desc 1 and Long 
Desc 2 fields are not supported in api version 4.0 onwards, but got nothing")
-       }
-       if reqInf.StatusCode != http.StatusBadRequest {
-               t.Errorf("expected a 400 status code, but got %d", 
reqInf.StatusCode)
-       }
-}
 
-// Note that this test is susceptible to breaking if the structure of the test
-// data's DSRs is altered at all.
-func UpdateTestDeliveryServiceRequestsWithHeaders(t *testing.T, header 
http.Header) {
-       if len(testData.DeliveryServiceRequests) < dsrGood+1 {
-               t.Fatalf("Need at least %d Delivery Service Requests to test 
updating them using headers", dsrGood+1)
-       }
-       // Retrieve the DeliveryServiceRequest by name so we can get the id for 
the Update
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       var ds *tc.DeliveryServiceV4
-       if dsr.ChangeType == tc.DSRChangeTypeDelete {
-               ds = dsr.Original
-       } else {
-               ds = dsr.Requested
-       }
-       resetDS(ds)
-       if ds == nil || ds.XMLID == nil {
-               t.Fatalf("the %dth DSR in the test data had no Delivery 
Service, or that Delivery Service had a null or undefined XMLID", dsrGood)
-       }
-       opts := client.NewRequestOptions()
-       opts.Header = header
-       opts.QueryParameters.Set("xmlId", *ds.XMLID)
-       resp, _, err := TOSession.GetDeliveryServiceRequests(opts)
-       if err != nil {
-               t.Errorf("cannot get Delivery Service Request by XMLID '%s': %v 
- alerts: %+v", *ds.XMLID, err, resp.Alerts)
-       }
-       if len(resp.Response) == 0 {
-               t.Fatal("Length of GET DeliveryServiceRequest is 0")
-       }
-       respDSR := resp.Response[0]
-       if respDSR.ID == nil {
-               t.Fatalf("Got a DSR for XML ID '%s' that had a nil ID", 
*ds.XMLID)
-       }
-       if respDSR.ChangeType != dsr.ChangeType {
-               t.Fatalf("remote representation of DSR with XMLID '%s' differed 
from stored data", *ds.XMLID)
-       }
-       var respDS *tc.DeliveryServiceV4
-       if respDSR.ChangeType == tc.DSRChangeTypeDelete {
-               respDS = respDSR.Original
-       } else {
-               respDS = respDSR.Requested
-       }
-
-       respDS.DisplayName = new(string)
-       *respDS.DisplayName = "new display name"
-       opts.QueryParameters.Del("xmlId")
-       _, reqInf, err := TOSession.UpdateDeliveryServiceRequest(*respDSR.ID, 
respDSR, 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)
-       }
-}
-
-// Note that this test is susceptible to breaking if the structure of the test
-// data's DSRs is altered at all.
-func GetTestDeliveryServiceRequestsIMSAfterChange(t *testing.T, header 
http.Header) {
-       if len(testData.DeliveryServiceRequests) < dsrGood+1 {
-               t.Fatalf("Need at least %d Delivery Service Requests to test 
updating them with IMS", dsrGood+1)
-       }
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       var ds *tc.DeliveryServiceV4
-       if dsr.ChangeType == tc.DSRChangeTypeDelete {
-               ds = dsr.Original
-       } else {
-               ds = dsr.Requested
-       }
-
-       resetDS(ds)
-       if ds == nil || ds.XMLID == nil {
-               t.Fatalf("the %dth DSR in the test data had no Delivery 
Service, or that Delivery Service had a null or undefined XMLID", dsrGood)
-       }
-
-       opts := client.NewRequestOptions()
-       opts.Header = header
-       opts.QueryParameters.Set("xmlId", *ds.XMLID)
-       resp, reqInf, err := TOSession.GetDeliveryServiceRequests(opts)
-       if err != nil {
-               t.Fatalf("Expected no error, but got: %v - alerts: %+v", err, 
resp.Alerts)
-       }
-       if reqInf.StatusCode != http.StatusOK {
-               t.Fatalf("Expected 200 status code, got %v", reqInf.StatusCode)
-       }
-       currentTime := time.Now().UTC()
-       currentTime = currentTime.Add(1 * time.Second)
-       timeStr := currentTime.Format(time.RFC1123)
-       opts.Header.Set(rfc.IfModifiedSince, timeStr)
-       resp, reqInf, err = TOSession.GetDeliveryServiceRequests(opts)
-       if err != nil {
-               t.Fatalf("Expected no error, but got: %v - alerts: %+v", err, 
resp.Alerts)
-       }
-       if reqInf.StatusCode != http.StatusNotModified {
-               t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
-       }
-}
-
-// Note that this test is susceptible to breaking if the structure of the test
-// data's DSRs is altered at all.
-func CreateTestDeliveryServiceRequests(t *testing.T) {
-       if len(testData.DeliveryServiceRequests) < dsrGood+1 {
-               t.Fatalf("Need at least %d Delivery Service Requests to test 
creating Delivery Service Requests", dsrGood+1)
-       }
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       resetDS(dsr.Original)
-       resetDS(dsr.Requested)
-       respDSR, _, err := TOSession.CreateDeliveryServiceRequest(dsr, 
client.RequestOptions{})
-       if err != nil {
-               t.Errorf("could not create Delivery Service Requests: %v - 
alerts: %+v", err, respDSR.Alerts)
-       }
-
-}
-
-// Note that this test is susceptible to breaking if the structure of the test
-// data's DSRs is altered at all.
-func TestDeliveryServiceRequestRequired(t *testing.T) {
-       WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants}, func() {
-               if len(testData.DeliveryServiceRequests) < dsrRequired+1 {
-                       t.Fatalf("Need at least %d Delivery Service Requests to 
test creating a Delivery Service Request missing required fields", 
dsrRequired+1)
+               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 XMLID parameter": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{QueryParameters: url.Values{"xmlId": {"test-ds1"}}},
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
utils.ResponseLengthGreaterOrEqual(1),
+                                               
validateGetDSRequestFields(map[string]interface{}{"XMLID": "test-ds1"})),
+                               },
+                       },
+                       "PUT": {
+                               "OK when VALID request": {
+                                       EndpointId:    
GetDeliveryServiceRequestId(t, "test-ds1"),
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "requested": 
generateDeliveryService(t, map[string]interface{}{
+                                                       "displayName": "NEW 
DISPLAY NAME",
+                                                       "tenantId":    
GetTenantId(t, "tenant1"),
+                                                       "xmlId":       
"test-ds1",
+                                               }),
+                                               "status": "draft",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                               "OK when UPDATING STATUS FROM DRAFT TO 
SUBMITTED": {
+                                       EndpointId:    
GetDeliveryServiceRequestId(t, "test-ds1"),
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "requested": 
generateDeliveryService(t, map[string]interface{}{
+                                                       "tenantId": 
GetTenantId(t, "tenant1"),
+                                                       "xmlId":    "test-ds1",
+                                               }),
+                                               "status": "submitted",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK),
+                                               
validatePutDSRequestFields(map[string]interface{}{"STATUS": 
tc.RequestStatusSubmitted})),
+                               },
+                               "BAD REQUEST when using LONG DESCRIPTION 2 and 
3 fields": {
+                                       EndpointId:    
GetDeliveryServiceRequestId(t, "test-ds1"),
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "requested": 
generateDeliveryService(t, map[string]interface{}{
+                                                       "longDesc1": "long desc 
1",
+                                                       "longDesc2": "long desc 
2",
+                                                       "tenantId":  
GetTenantId(t, "tenant1"),
+                                                       "xmlId":     "test-ds1",
+                                               }),
+                                               "status": "draft",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "PRECONDITION FAILED when updating with 
IF-UNMODIFIED-SINCE Header": {
+                                       EndpointId:    
GetDeliveryServiceRequestId(t, "test-ds1"),
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{Header: http.Header{rfc.IfUnmodifiedSince: 
{currentTimeRFC}}},
+                                       RequestBody:   map[string]interface{}{},
+                                       Expectations:  
utils.CkRequest(utils.HasError(), 
utils.HasStatus(http.StatusPreconditionFailed)),
+                               },
+                               "PRECONDITION FAILED when updating with IFMATCH 
ETAG Header": {
+                                       EndpointId:    
GetDeliveryServiceRequestId(t, "test-ds1"),
+                                       ClientSession: TOSession,
+                                       RequestBody:   map[string]interface{}{},
+                                       RequestOpts:   
client.RequestOptions{Header: http.Header{rfc.IfMatch: 
{rfc.ETag(currentTime)}}},
+                                       Expectations:  
utils.CkRequest(utils.HasError(), 
utils.HasStatus(http.StatusPreconditionFailed)),
+                               },
+                       },
+                       "POST": {
+                               "CREATED when VALID request": {
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "requested": 
generateDeliveryService(t, map[string]interface{}{
+                                                       "ccrDnsTtl":          
30,
+                                                       "deepCachingType":    
"NEVER",
+                                                       "initialDispersion":  3,
+                                                       "ipv6RoutingEnabled": 
true,
+                                                       "longDesc":           
"long desc",
+                                                       "orgServerFqdn":      
"http://example.test";,
+                                                       "profileName":        
nil,
+                                                       "tenant":             
"root",
+                                                       "xmlId":              
"test-ds2",
+                                               }),
+                                               "status": "draft",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusCreated)),
+                               },
+                               "BAD REQUEST when MISSING REQUIRED FIELDS": {
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "requested": 
map[string]interface{}{
+                                                       "type":  "HTTP",
+                                                       "xmlId": 
"test-ds-fields",
+                                               },
+                                               "status": "draft",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "BAD REQUEST when VALIDATION RULES ARE NOT 
FOLLOWED": {
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "requested": 
map[string]interface{}{
+                                                       "ccrDnsTtl":            
30,
+                                                       "deepCachingType":      
"NEVER",
+                                                       "displayName":          
strings.Repeat("X", 49),
+                                                       "dscp":                 
0,
+                                                       "geoLimit":             
0,
+                                                       "geoProvider":          
1,
+                                                       "infoUrl":              
"xxx",
+                                                       "initialDispersion":    
1,
+                                                       "ipv6RoutingEnabled":   
true,
+                                                       "logsEnabled":          
true,
+                                                       "longDesc":             
"long desc",
+                                                       "missLat":              
0.0,
+                                                       "missLong":             
0.0,
+                                                       "multiSiteOrigin":      
false,
+                                                       "orgServerFqdn":        
"http://example.test";,
+                                                       "protocol":             
0,
+                                                       "qstringIgnore":        
0,
+                                                       "rangeRequestHandling": 
0,
+                                                       "regionalGeoBlocking":  
true,
+                                                       "routingName":          
strings.Repeat("X", 1) + "." + strings.Repeat("X", 48),
+                                                       "tenant":               
"tenant1",
+                                                       "type":                 
"HTTP",
+                                                       "xmlId":                
"X " + strings.Repeat("X", 46),
+                                               },
+                                               "status": "draft",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "BAD REQUEST when NON-DRAFT": {
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "requested": 
map[string]interface{}{
+                                                       "active":               
false,
+                                                       "cdnName":              
"cdn1",
+                                                       "displayName":          
"Testing transitions",
+                                                       "dscp":                 
3,
+                                                       "geoLimit":             
1,
+                                                       "geoProvider":          
1,
+                                                       "initialDispersion":    
1,
+                                                       "ipv6RoutingEnabled":   
true,
+                                                       "logsEnabled":          
true,
+                                                       "missLat":              
0.0,
+                                                       "missLong":             
0.0,
+                                                       "multiSiteOrigin":      
false,
+                                                       "orgServerFqdn":        
"http://example.test";,
+                                                       "protocol":             
0,
+                                                       "qstringIgnore":        
0,
+                                                       "rangeRequestHandling": 
0,
+                                                       "regionalGeoBlocking":  
true,
+                                                       "routingName":          
"goodroute",
+                                                       "tenant":               
"tenant1",
+                                                       "type":                 
"HTTP",
+                                                       "xmlId":                
"test-transitions",
+                                               },
+                                               "status": "pending",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "BAD REQUEST when ALREADY EXISTS": {
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "changeType": "create",
+                                               "requested": 
map[string]interface{}{
+                                                       "active":               
true,
+                                                       "cdnName":              
"cdn1",
+                                                       "displayName":          
"Good Kabletown CDN",
+                                                       "dscp":                 
1,
+                                                       "geoLimit":             
1,
+                                                       "geoProvider":          
1,
+                                                       "initialDispersion":    
1,
+                                                       "ipv6RoutingEnabled":   
true,
+                                                       "logsEnabled":          
true,
+                                                       "missLat":              
0.0,
+                                                       "missLong":             
0.0,
+                                                       "multiSiteOrigin":      
false,
+                                                       "orgServerFqdn":        
"http://example.test";,
+                                                       "protocol":             
0,
+                                                       "qstringIgnore":        
0,
+                                                       "rangeRequestHandling": 
0,
+                                                       "regionalGeoBlocking":  
true,
+                                                       "routingName":          
"goodroute",
+                                                       "tenant":               
"tenant1",
+                                                       "type":                 
"HTTP",
+                                                       "xmlId":                
"test-ds1",
+                                               },
+                                               "status": "draft",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                       },
+                       "DELETE": {
+                               "OK when VALID request": {
+                                       EndpointId:    
GetDeliveryServiceRequestId(t, "test-deletion"),
+                                       ClientSession: TOSession,
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                       },
+                       "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)),
+                               },
+                       },
                }
-               dsr := testData.DeliveryServiceRequests[dsrRequired]
-               resetDS(dsr.Original)
-               resetDS(dsr.Requested)
-               _, _, err := TOSession.CreateDeliveryServiceRequest(dsr, 
client.RequestOptions{})
-               if err == nil {
-                       t.Error("expected: validation error, actual: nil")
-               }
-       })
-}
 
-// Note that this test is susceptible to breaking if the structure of the test
-// data's DSRs is altered at all.
-func TestDeliveryServiceRequestRules(t *testing.T) {
-       if len(testData.DeliveryServiceRequests) < dsrGood+1 {
-               t.Fatalf("Need at least %d Delivery Service Requests to test 
creating Delivery Service Request rules", dsrGood+1)
-       }
-       WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants}, func() {
-               routingName := strings.Repeat("X", 1) + "." + 
strings.Repeat("X", 48)
-               // Test the xmlId length and form
-               XMLID := "X " + strings.Repeat("X", 46)
-               displayName := strings.Repeat("X", 49)
-
-               dsr := testData.DeliveryServiceRequests[dsrGood]
-               var ds *tc.DeliveryServiceV4
-               if dsr.ChangeType == tc.DSRChangeTypeDelete {
-                       ds = dsr.Original
-               } else {
-                       ds = dsr.Requested
-               }
-               resetDS(ds)
-               if ds == nil {
-                       t.Fatalf("the %dth DSR in the test data had no 
DeliveryService", dsrGood)
+               for method, testCases := range methodTests {
+                       t.Run(method, func(t *testing.T) {
+                               for name, testCase := range testCases {
+                                       dsReq := tc.DeliveryServiceRequestV4{}
+
+                                       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, 
&dsReq)
+                                               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.GetDeliveryServiceRequests(testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, resp.Response, resp.Alerts, err)
+                                                       }
+                                               })
+                                       case "POST":
+                                               t.Run(name, func(t *testing.T) {
+                                                       resp, reqInf, err := 
testCase.ClientSession.CreateDeliveryServiceRequest(dsReq, testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, resp.Response, resp.Alerts, err)
+                                                       }
+                                               })
+                                       case "PUT":
+                                               t.Run(name, func(t *testing.T) {
+                                                       resp, reqInf, err := 
testCase.ClientSession.UpdateDeliveryServiceRequest(testCase.EndpointId(), 
dsReq, testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, resp.Response, resp.Alerts, err)
+                                                       }
+                                               })
+                                       case "DELETE":
+                                               t.Run(name, func(t *testing.T) {
+                                                       resp, reqInf, err := 
testCase.ClientSession.DeleteDeliveryServiceRequest(testCase.EndpointId(), 
testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, resp.Response, resp.Alerts, err)
+                                                       }
+                                               })
+                                       }
+                               }
+                       })
                }
-               ds.DisplayName = &displayName
-               ds.RoutingName = &routingName
-               ds.XMLID = &XMLID
 
-               _, _, err := TOSession.CreateDeliveryServiceRequest(dsr, 
client.RequestOptions{})
-               if err == nil {
-                       t.Error("expected: validation error, actual: nil")
-               }
        })
 }
 
-// Note that this test is susceptible to breaking if the structure of the test
-// data's DSRs is altered at all.
-func TestDeliveryServiceRequestTypeFields(t *testing.T) {
-       if len(testData.DeliveryServiceRequests) < dsrBadTenant+1 {
-               t.Fatalf("Need at least %d Delivery Service Requests to test 
creating a Delivery Service Request with missing fields for its Type", 
dsrBadTenant+1)
-       }
-
-       WithObjs(t, []TCObj{CDNs, Types, Tenants, Parameters}, func() {
-               dsr := testData.DeliveryServiceRequests[dsrBadTenant]
-               var ds *tc.DeliveryServiceV4
-               if dsr.ChangeType == tc.DSRChangeTypeDelete {
-                       ds = dsr.Original
-               } else {
-                       ds = dsr.Requested
-               }
-               resetDS(ds)
-               if ds == nil || ds.XMLID == nil {
-                       t.Fatalf("the %dth DSR in the test data had no Delivery 
Service, or that Delivery Service had a null or undefined XMLID", dsrBadTenant)
-               }
-
-               resp, _, err := TOSession.CreateDeliveryServiceRequest(dsr, 
client.RequestOptions{})
-               if err != nil {
-                       t.Errorf("Unexpected error creating a Delivery Service 
Request: %v - alerts: %+v", err, resp.Alerts)
-               }
-
-               found := false
-               for _, alert := range resp.Alerts.Alerts {
-                       if alert.Level == tc.ErrorLevel.String() {
-                               t.Errorf("Expected only succuss-level alerts 
creating a DSR, got error-level alert: %s", alert.Text)
-                       } else if alert.Level == tc.SuccessLevel.String() {
-                               t.Logf("Got expected alert creating a DSR: %s", 
alert.Text)
-                               found = true
-                       }
-               }
-
-               if !found {
-                       t.Errorf("Expected a success-level alert creating a 
DSR, got none")
-               }
-
+func GetDeliveryServiceRequestId(t *testing.T, xmlId string) func() int {
+       return func() int {
                opts := client.NewRequestOptions()
-               opts.QueryParameters.Set("xmlId", *ds.XMLID)
-               dsrs, _, err := TOSession.GetDeliveryServiceRequests(opts)
-               if err != nil {
-                       t.Errorf("Unexpected error retriving Delivery Service 
Requests with XMLID '%s': %v - alerts: %+v", *ds.XMLID, err, dsrs.Alerts)
-               }
-               if len(dsrs.Response) != 1 {
-                       t.Fatalf("expected exactly one Deliveryservice Request 
with XMLID '%s'; got %d", *ds.XMLID, len(dsrs.Response))
-               }
-               if dsrs.Response[0].ID == nil {
-                       t.Fatalf("got a DSR with a null ID by XMLID '%s'", 
*ds.XMLID)
-               }
-
-               alert, _, err := 
TOSession.DeleteDeliveryServiceRequest(*dsrs.Response[0].ID, 
client.RequestOptions{})
-               if err != nil {
-                       t.Errorf("cannot delete Delivery Service Request #%d: 
%v - alerts: %+v", dsrs.Response[0].ID, err, alert.Alerts)
-               }
-       })
-}
-
-// Note that this test is susceptible to breaking if the structure of the test
-// data's DSRs is altered at all.
-func TestDeliveryServiceRequestBad(t *testing.T) {
-       if len(testData.DeliveryServiceRequests) < dsrDraft+1 {
-               t.Fatalf("Need at least %d Delivery Service Requests to test 
creating a non-draft Delivery Service Request", dsrDraft+1)
+               opts.QueryParameters.Set("xmlId", xmlId)
+               resp, _, err := TOSession.GetDeliveryServiceRequests(opts)
+               assert.RequireNoError(t, err, "Get Delivery Service Requests 
failed with error: %v", err)
+               assert.RequireGreaterOrEqual(t, len(resp.Response), 1, 
"Expected delivery service requests response object length of atleast 1, but 
got %d", len(resp.Response))
+               assert.RequireNotNil(t, resp.Response[0].ID, "Expected id to 
not be nil")
+               return *resp.Response[0].ID
        }
-       WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants}, func() {
-               // try to create non-draft/submitted
-               src := testData.DeliveryServiceRequests[dsrDraft]
-               resetDS(src.Original)
-               resetDS(src.Requested)
-               src.Status = tc.RequestStatusPending
-
-               if _, _, err := TOSession.CreateDeliveryServiceRequest(src, 
client.RequestOptions{}); err == nil {
-                       t.Fatal("expected: validation error, actual: nil")
-               }
-       })
 }
 
-// Note that this test is susceptible to breaking if the structure of the test
-// data's DSRs is altered at all.
-func TestDeliveryServiceRequestWorkflow(t *testing.T) {
-       if len(testData.DeliveryServiceRequests) < dsrDraft+1 {
-               t.Fatalf("Need at least %d Delivery Service Requests to test 
Delivery Service Request workflow", dsrDraft+1)
-       }
-
-       WithObjs(t, []TCObj{CDNs, Types, Parameters, Tenants}, func() {
-               // test empty request table
-               dsrs, _, err := 
TOSession.GetDeliveryServiceRequests(client.RequestOptions{})
-               if err != nil {
-                       t.Errorf("Error getting empty list of Delivery Service 
Requests: %v - alerts: %+v", err, dsrs.Alerts)
-               }
-               if dsrs.Response == nil {
-                       t.Error("Expected empty Delivery Service Request slice 
-- got nil")
-               }
-               if len(dsrs.Response) != 0 {
-                       t.Errorf("Expected no entries in Delivery Service 
Request slice, got %d", len(dsrs.Response))
-               }
-
-               // Create a draft request
-               src := testData.DeliveryServiceRequests[dsrDraft]
-               resetDS(src.Original)
-               resetDS(src.Requested)
-
-               alerts, _, err := TOSession.CreateDeliveryServiceRequest(src, 
client.RequestOptions{})
-               if err != nil {
-                       t.Errorf("Error creating Delivery Service Request: %v - 
alerts: %+v", err, alerts.Alerts)
-               }
-
-               found := false
-               for _, alert := range alerts.Alerts.Alerts {
-                       if alert.Level == tc.ErrorLevel.String() {
-                               t.Errorf("Expected only succuss-level alerts 
creating a DSR, got error-level alert: %s", alert.Text)
-                       } else if alert.Level == tc.SuccessLevel.String() {
-                               t.Logf("Got expected alert creating a DSR: %s", 
alert.Text)
-                               found = true
-                       }
-               }
-
-               if !found {
-                       t.Errorf("Expected a success-level alert creating a 
DSR, got none")
-               }
-
-               // Create a duplicate request -- should fail because xmlId is 
the same
-               alerts, _, err = TOSession.CreateDeliveryServiceRequest(src, 
client.RequestOptions{})
-               if err == nil {
-                       t.Fatal("expected: validation error, actual: nil")
-               }
-
-               found = false
-               for _, alert := range alerts.Alerts.Alerts {
-                       if alert.Level == tc.SuccessLevel.String() {
-                               t.Errorf("Expected only error-level alerts 
creating a duplicate DSR, got success-level alert: %s", alert.Text)
-                       } else if alert.Level == tc.ErrorLevel.String() {
-                               t.Logf("Got expected alert creating a duplicate 
DSR: %s", alert.Text)
-                               found = true
+func validateGetDSRequestFields(expectedResp map[string]interface{}) 
utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               dsReqResp := resp.([]tc.DeliveryServiceRequestV40)
+               for field, expected := range expectedResp {
+                       for _, ds := range dsReqResp {
+                               switch field {
+                               case "XMLID":
+                                       assert.Equal(t, expected, 
*ds.Requested.XMLID, "Expected XMLID to be %v, but got %v", expected, 
*ds.Requested.XMLID)
+                               default:
+                                       t.Errorf("Expected field: %v, does not 
exist in response", field)
+                               }
                        }
                }
-               if !found {
-                       t.Errorf("Expected an error-level alert creating a 
duplicate DSR, got none")
-               }
-
-               opts := client.NewRequestOptions()
-               opts.QueryParameters.Set("xmlId", "test-transitions")
-               dsrs, _, err = TOSession.GetDeliveryServiceRequests(opts)
-               if err != nil {
-                       t.Errorf("Unexpected error getting Delivery Service 
Requests with XMLID 'test-transitions': %v - alerts: %+v", err, dsrs.Alerts)
-               }
-               if len(dsrs.Response) != 1 {
-                       t.Errorf("Expected exactly one Delivery Service Request 
with XMLID 'test-transitions', got: %d", len(dsrs.Response))
-                       if len(dsrs.Response) == 0 {
-                               t.Fatal("Cannot proceed")
-                       }
-               }
-
-               alerts = updateDeliveryServiceRequestStatus(t, 
dsrs.Response[0], "submitted", nil)
-
-               found = false
-               for _, alert := range alerts.Alerts.Alerts {
-                       if alert.Level == tc.ErrorLevel.String() {
-                               t.Errorf("Expected only succuss-level alerts 
updating a DSR, got error-level alert: %s", alert.Text)
-                       } else if alert.Level == tc.SuccessLevel.String() {
-                               t.Logf("Got expected alert updating a DSR: %s", 
alert.Text)
-                               found = true
-                       }
-               }
-               if !found {
-                       t.Errorf("Expected a success-level alert updating a 
DSR, got none: %v", alerts.Alerts)
-               }
-
-               if alerts.Response.Status != tc.RequestStatus("submitted") {
-                       t.Errorf("expected status=submitted, got %s", 
alerts.Response.Status)
-               }
-       })
-}
-
-func updateDeliveryServiceRequestStatus(t *testing.T, dsr 
tc.DeliveryServiceRequestV4, newstate string, header http.Header) 
tc.DeliveryServiceRequestResponseV4 {
-       var resp tc.DeliveryServiceRequestResponseV4
-       ID := dsr.ID
-       if ID == nil {
-               t.Error("updateDeliveryServiceRequestStatus called with a DSR 
that has a nil ID")
-               return resp
-       }
-       dsr.Status = tc.RequestStatus("submitted")
-       resp, _, err := TOSession.UpdateDeliveryServiceRequest(*ID, dsr, 
client.RequestOptions{Header: header})
-       if err != nil {
-               t.Errorf("Unexpected error updating Delivery Service Request: 
%v - alerts: %+v", err, resp.Alerts)
-               return resp
        }
-
-       opts := client.NewRequestOptions()
-       opts.QueryParameters.Set("id", strconv.Itoa(*ID))
-       d, _, err := TOSession.GetDeliveryServiceRequests(opts)
-       if err != nil {
-               t.Errorf("Error fetching Delivery Service Request #%d after 
status update: %v - alerts: %+v", ID, err, d.Alerts)
-               return resp
-       }
-       if len(d.Response) != 1 {
-               t.Errorf("Expected exactly one Delivery Service Request to 
exist with ID %d, found: %d", *ID, len(d.Response))
-       }
-
-       resp.Response = d.Response[0]
-
-       return resp
 }
 
-// Note that this test is susceptible to breaking if the structure of the test
-// data's DSRs is altered at all.
-func GetTestDeliveryServiceRequestsIMS(t *testing.T) {
-       if len(testData.DeliveryServiceRequests) < dsrGood+1 {
-               t.Fatalf("Need at least %d Delivery Service Requests to test 
getting them with IMS", dsrGood+1)
-       }
-
-       futureTime := time.Now().AddDate(0, 0, 1)
-       time := futureTime.Format(time.RFC1123)
-
-       opts := client.NewRequestOptions()
-       opts.Header.Set(rfc.IfModifiedSince, time)
-
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       var ds *tc.DeliveryServiceV4
-       if dsr.ChangeType == tc.DSRChangeTypeDelete {
-               ds = dsr.Original
-       } else {
-               ds = dsr.Requested
-       }
-       resetDS(ds)
-       if ds == nil || ds.XMLID == nil {
-               t.Fatalf("the %dth DSR in the test data had no Delivery 
Service, or that Delivery Service had null or undefined XMLID", dsrGood)
-       }
-
-       opts.QueryParameters.Set("xmlId", *ds.XMLID)
-       resp, reqInf, err := TOSession.GetDeliveryServiceRequests(opts)
-       if err != nil {
-               t.Fatalf("Unexpected error getting Delivery Service Requests 
with XMLID '%s': %v - alerts: %+v", *ds.XMLID, err, resp.Alerts)
-       }
-       if reqInf.StatusCode != http.StatusNotModified {
-               t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
-       }
-}
-
-// Note that this test is susceptible to breaking if the structure of the test
-// data's DSRs is altered at all.
-func GetTestDeliveryServiceRequests(t *testing.T) {
-       if len(testData.DeliveryServiceRequests) < dsrGood+1 {
-               t.Fatalf("Need at least %d Delivery Service Requests to test 
getting them", dsrGood+1)
-       }
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       var ds *tc.DeliveryServiceV4
-       if dsr.ChangeType == tc.DSRChangeTypeDelete {
-               ds = dsr.Original
-       } else {
-               ds = dsr.Requested
-       }
-       resetDS(ds)
-
-       if ds == nil || ds.XMLID == nil {
-               t.Fatalf("the %dth DSR in the test data had no Delivery 
Service, or that Delivery Service had a null or undefined XMLID", dsrGood)
-       }
-
-       opts := client.NewRequestOptions()
-       opts.QueryParameters.Set("xmlId", *ds.XMLID)
-       resp, _, err := TOSession.GetDeliveryServiceRequests(opts)
-       if err != nil {
-               t.Errorf("cannot get Delivery Service Requests with XMLID '%s': 
%v - alerts: %+v", *ds.XMLID, err, resp.Alerts)
+func validatePutDSRequestFields(expectedResp map[string]interface{}) 
utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               dsReqResp := resp.(tc.DeliveryServiceRequestV40)
+               for field, expected := range expectedResp {
+                       switch field {
+                       case "STATUS":
+                               assert.Equal(t, expected, dsReqResp.Status, 
"Expected status to be %v, but got %v", expected, dsReqResp.Status)
+                       default:
+                               t.Errorf("Expected field: %v, does not exist in 
response", field)
+                       }
+               }
        }
 }
 
-// Note that this test is susceptible to breaking if the structure of the test
-// data's DSRs is altered at all.
-func UpdateTestDeliveryServiceRequests(t *testing.T) {
-       if len(testData.DeliveryServiceRequests) < dsrGood+1 {
-               t.Fatalf("Need at least %d Delivery Service Requests to test 
updating them", dsrGood+1)
-       }
-
-       // Retrieve the DeliveryServiceRequest by name so we can get the id for 
the Update
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       var ds *tc.DeliveryServiceV4
-       if dsr.ChangeType == tc.DSRChangeTypeDelete {
-               ds = dsr.Original
-       } else {
-               ds = dsr.Requested
-       }
-
-       resetDS(ds)
-       if ds == nil || ds.XMLID == nil {
-               t.Fatalf("the %dth DSR in the test data had no Delivery 
Service, or that Delivery Service had a null or undefined XMLID", dsrGood)
-       }
-
-       opts := client.NewRequestOptions()
-       opts.QueryParameters.Set("xmlId", *ds.XMLID)
-       resp, _, err := TOSession.GetDeliveryServiceRequests(opts)
-       if err != nil {
-               t.Errorf("cannot get Delivery Service Request with XMLID '%s': 
%v - alerts: %+v", *ds.XMLID, err, resp.Alerts)
-       }
-       if len(resp.Response) == 0 {
-               t.Fatalf("Expected at least one Deliver Service Request to 
exist with XMLID '%s', but none were found in Traffic Ops", *ds.XMLID)
-       }
-       respDSR := resp.Response[0]
-       if respDSR.ID == nil {
-               t.Fatalf("got a DSR by XMLID '%s' with a null or undefined ID", 
*ds.XMLID)
-       }
-       var respDS *tc.DeliveryServiceV4
-       if dsr.ChangeType == tc.DSRChangeTypeDelete {
-               respDS = dsr.Original
-       } else {
-               respDS = dsr.Requested
-       }
-       expDisplayName := "new display name"
-       respDS.DisplayName = &expDisplayName
-       id := *respDSR.ID
-       alerts, _, err := TOSession.UpdateDeliveryServiceRequest(id, respDSR, 
client.RequestOptions{})
-       if err != nil {
-               t.Errorf("cannot update Delivery Service Request #%d: %v - 
alerts: %+v", id, err, alerts.Alerts)
-               return
-       }
-
-       // Retrieve the DeliveryServiceRequest to check DeliveryServiceRequest 
name got updated
-       opts.QueryParameters.Del("xmlId")
-       opts.QueryParameters.Set("id", strconv.Itoa(id))
-       dsrResp, _, err := TOSession.GetDeliveryServiceRequests(opts)
-       if err != nil {
-               t.Fatalf("cannot get Delivery Service Request #%d: %v - alerts: 
%+v", id, err, dsrResp.Alerts)
-       }
-       if len(dsrResp.Response) != 1 {
-               t.Fatalf("Expected exactly one Delivery Service Request to have 
id %d, found: %d", id, len(dsrResp.Response))
-       }
-
-       respDSR = dsrResp.Response[0]
-       if respDSR.ChangeType == tc.DSRChangeTypeDelete {
-               respDS = dsr.Original
-       } else {
-               respDS = dsr.Requested
-       }
-
-       if respDS == nil || respDS.DisplayName == nil {
-               t.Fatalf("Got DSR by ID '%d' that had no DeliveryService - or 
said DeliveryService had no DisplayName", id)
-       }
-       if *respDS.DisplayName != expDisplayName {
-               t.Errorf("results do not match actual: %s, expected: %s", 
*respDS.DisplayName, expDisplayName)
+func CreateTestDeliveryServiceRequests(t *testing.T) {
+       for _, dsr := range testData.DeliveryServiceRequests {
+               resetDS(dsr.Original)
+               resetDS(dsr.Requested)
+               respDSR, _, err := TOSession.CreateDeliveryServiceRequest(dsr, 
client.RequestOptions{})
+               assert.NoError(t, err, "Could not create Delivery Service 
Requests: %v - alerts: %+v", err, respDSR.Alerts)
        }
 }
 
-// Note that this test is susceptible to breaking if the structure of the test
-// data's DSRs is altered at all.
 func DeleteTestDeliveryServiceRequests(t *testing.T) {
-       if len(testData.DeliveryServiceRequests) < dsrGood+1 {
-               t.Fatalf("Need at least %d Delivery Service Requests to test 
deleting them", dsrGood+1)
-       }
+       resp, _, err := 
TOSession.GetDeliveryServiceRequests(client.RequestOptions{})
+       assert.NoError(t, err, "Cannot get Delivery Service Requests: %v - 
alerts: %+v", err, resp.Alerts)
+       for _, request := range resp.Response {
+               alert, _, err := 
TOSession.DeleteDeliveryServiceRequest(*request.ID, client.RequestOptions{})
+               assert.NoError(t, err, "Cannot delete Delivery Service Request 
#%d: %v - alerts: %+v", request.ID, err, alert.Alerts)
 
-       // Retrieve the DeliveryServiceRequest by name so we can get the id for 
the Update
-       dsr := testData.DeliveryServiceRequests[dsrGood]
-       var ds *tc.DeliveryServiceV4
-       if dsr.ChangeType == tc.DSRChangeTypeDelete {
-               ds = dsr.Original
-       } else {
-               ds = dsr.Requested
-       }
-
-       resetDS(ds)
-       if ds == nil || ds.XMLID == nil {
-               t.Fatalf("the %dth DSR in the test data had no DeliveryService 
- or that DeliveryService had no XMLID", dsrGood)
-       }
-
-       opts := client.NewRequestOptions()
-       opts.QueryParameters.Set("xmlId", *ds.XMLID)
-       resp, _, err := TOSession.GetDeliveryServiceRequests(opts)
-       if err != nil {
-               t.Fatalf("cannot get Delivery Service Requests with XMLID '%s': 
%v - alerts: %+v", *ds.XMLID, err, resp.Alerts)
-       }
-       if len(resp.Response) < 1 {
-               t.Fatalf("expected at least one Delivery Service Request to 
have XMLID '%s', got none", *ds.XMLID)
-       }
-       respDSR := resp.Response[0]
-       if respDSR.ID == nil {
-               t.Fatalf("Got a DSR by XMLID '%s' that had no ID", *ds.XMLID)
-       }
-       alert, _, err := TOSession.DeleteDeliveryServiceRequest(*respDSR.ID, 
client.RequestOptions{})
-       if err != nil {
-               t.Errorf("cannot delete Delivery Service Request #%d: %v - 
alerts: %+v", respDSR.ID, err, alert.Alerts)
-       }
-
-       // Retrieve the DeliveryServiceRequest to see if it got deleted
-       dsrs, _, err := TOSession.GetDeliveryServiceRequests(opts)
-       if err != nil {
-               t.Errorf("Unexpected error fetching Delivery Service Request 
#%d after deletion: %v - alerts: %+v", *respDSR.ID, err, dsrs.Alerts)
-       }
-       if len(dsrs.Response) > 0 {
-               t.Errorf("expected Delivery Service Request #%d to be deleted, 
but it was found in Traffic Ops", *respDSR.ID)
+               // Retrieve the DeliveryServiceRequest to see if it got deleted
+               opts := client.NewRequestOptions()
+               opts.QueryParameters.Set("id", strconv.Itoa(*request.ID))
+               dsr, _, err := TOSession.GetDeliveryServiceRequests(opts)
+               assert.NoError(t, err, "Unexpected error fetching Delivery 
Service Request #%d after deletion: %v - alerts: %+v", *request.ID, err, 
dsr.Alerts)
+               assert.Equal(t, len(dsr.Response), 0, "Expected Delivery 
Service Request #%d to be deleted, but it was found in Traffic Ops", 
*request.ID)
        }
 }
diff --git a/traffic_ops/testing/api/v4/tc-fixtures.json 
b/traffic_ops/testing/api/v4/tc-fixtures.json
index ebf1fab2aa..632153f725 100644
--- a/traffic_ops/testing/api/v4/tc-fixtures.json
+++ b/traffic_ops/testing/api/v4/tc-fixtures.json
@@ -364,66 +364,8 @@
                 "cdnName": "cdn1",
                 "ccrDnsTtl": 30,
                 "deepCachingType": "NEVER",
-                "displayName": "Bad Tenant",
-                "dscp": 0,
-                "geoLimit": 0,
-                "geoProvider": 0,
-                "initialDispersion": 3,
-                "ipv6RoutingEnabled": true,
-                "logsEnabled": false,
-                "longDesc": "long desc",
-                "missLat": 0.0,
-                "missLong": 0.0,
-                "multiSiteOrigin": false,
-                "orgServerFqdn": "http://example.test";,
-                "protocol": 0,
-                "qstringIgnore": 0,
-                "rangeRequestHandling": 0,
-                "regionalGeoBlocking": false,
-                "tenant": "root",
-                "type": "HTTP",
-                "xmlId": "test-ds2"
-            },
-            "status": "draft"
-        },
-        {
-            "changeType": "create",
-            "requested": {
-                "ccrDnsTtl": 30,
-                "deepCachingType": "NEVER",
-                "displayName": "Bad Test Case CDN",
-                "dscp": 0,
-                "geoLimit": 0,
-                "geoProvider": 1,
-                "infoUrl": "xxx",
-                "initialDispersion": 1,
-                "ipv6RoutingEnabled": true,
-                "logsEnabled": true,
-                "longDesc": "long desc",
-                "missLat": 0.0,
-                "missLong": 0.0,
-                "multiSiteOrigin": false,
-                "orgServerFqdn": "http://example.test";,
-                "protocol": 0,
-                "qstringIgnore": 0,
-                "rangeRequestHandling": 0,
-                "regionalGeoBlocking": true,
-                "routingName": "x routing",
-                "tenant": "tenant1",
-                "type": "HTTP",
-                "xmlId": "test-ds3"
-            },
-            "status": "draft"
-        },
-        {
-            "changeType": "create",
-            "requested": {
-                "active": false,
-                "cdnName": "cdn1",
-                "ccrDnsTtl": 30,
-                "deepCachingType": "NEVER",
-                "displayName": "Testing transitions",
-                "dscp": 3,
+                "displayName": "Good Kabletown CDN",
+                "dscp": 1,
                 "geoLimit": 1,
                 "geoProvider": 1,
                 "initialDispersion": 1,
@@ -441,7 +383,7 @@
                 "routingName": "goodroute",
                 "tenant": "tenant1",
                 "type": "HTTP",
-                "xmlId": "test-transitions"
+                "xmlId": "test-deletion"
             },
             "status": "draft"
         }

Reply via email to