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

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


The following commit(s) were added to refs/heads/master by this push:
     new b70177377d Refactor Steering Targets Tests (#6921)
b70177377d is described below

commit b70177377dc425a8ce0b6bfb2e40330af76f7ba3
Author: Eric Holguin <[email protected]>
AuthorDate: Thu Jun 30 12:09:59 2022 -0600

    Refactor Steering Targets Tests (#6921)
    
    * Updated create prerequisite function for steering targets
    
    * Refactor v3 steering tests
    
    * Refactor v4 sterring tests
    
    * Add prerquisite for update steering target tests
    
    * Add get with header function
---
 traffic_ops/testing/api/v3/steeringtargets_test.go | 545 +++++++-------------
 traffic_ops/testing/api/v3/tc-fixtures.json        |   6 +
 traffic_ops/testing/api/v3/withobjs_test.go        |   2 +-
 traffic_ops/testing/api/v4/steeringtargets_test.go | 564 +++++++--------------
 traffic_ops/testing/api/v4/tc-fixtures.json        |   6 +
 traffic_ops/testing/api/v4/withobjs_test.go        |   2 +-
 traffic_ops/v3-client/steeringtarget.go            |   9 +
 7 files changed, 401 insertions(+), 733 deletions(-)

diff --git a/traffic_ops/testing/api/v3/steeringtargets_test.go 
b/traffic_ops/testing/api/v3/steeringtargets_test.go
index e59422d0fd..450220e251 100644
--- a/traffic_ops/testing/api/v3/steeringtargets_test.go
+++ b/traffic_ops/testing/api/v3/steeringtargets_test.go
@@ -16,400 +16,233 @@ package v3
 */
 
 import (
+       "encoding/json"
        "net/http"
        "testing"
        "time"
 
        "github.com/apache/trafficcontrol/lib/go-rfc"
+       "github.com/apache/trafficcontrol/lib/go-tc"
        "github.com/apache/trafficcontrol/lib/go-util"
-       "github.com/apache/trafficcontrol/traffic_ops/v3-client"
+       "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"
 )
 
-var SteeringUserSession *client.Session
-
 func TestSteeringTargets(t *testing.T) {
+       WithObjs(t, []TCObj{CDNs, Types, Tenants, Parameters, Profiles, 
Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, Topologies, 
ServiceCategories, DeliveryServices, Users, SteeringTargets}, func() {
+
+               steeringUserSession := utils.CreateV3Session(t, 
Config.TrafficOps.URL, "steering", "pa$$word", 
Config.Default.Session.TimeoutInSecs)
+
+               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": {
+                                       EndpointId:     GetDeliveryServiceId(t, 
"ds1"),
+                                       ClientSession:  steeringUserSession,
+                                       RequestHeaders: 
http.Header{rfc.IfModifiedSince: {tomorrow}},
+                                       Expectations:   
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusNotModified)),
+                               },
+                               "OK when VALID request": {
+                                       EndpointId:    GetDeliveryServiceId(t, 
"ds1"),
+                                       ClientSession: steeringUserSession,
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
utils.ResponseHasLength(1),
+                                               
validateSteeringTargetFields(map[string]interface{}{"DeliveryService": "ds1", 
"DeliveryServiceID": uint64(GetDeliveryServiceId(t, "ds1")()),
+                                                       "Target": "ds2", 
"TargetID": uint64(GetDeliveryServiceId(t, "ds2")()), "Type": 
"STEERING_WEIGHT", "TypeID": GetTypeID(t, "STEERING_WEIGHT")(), "Value": 
util.JSONIntStr(42)})),
+                               },
+                       },
+                       "PUT": {
+                               "OK when VALID request": {
+                                       ClientSession: steeringUserSession,
+                                       RequestBody: map[string]interface{}{
+                                               "deliveryServiceId": 
GetDeliveryServiceId(t, "ds3")(),
+                                               "targetId":          
GetDeliveryServiceId(t, "ds4")(),
+                                               "value":             -12345,
+                                               "typeId":            
GetTypeID(t, "STEERING_WEIGHT")(),
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK),
+                                               
validateSteeringTargetUpdateCreateFields(GetDeliveryServiceId(t, "ds3")(),
+                                                       
map[string]interface{}{"DeliveryService": "ds3", "DeliveryServiceID": 
uint64(GetDeliveryServiceId(t, "ds3")()),
+                                                               "Target": 
"ds4", "TargetID": uint64(GetDeliveryServiceId(t, "ds4")()), "Type": 
"STEERING_WEIGHT",
+                                                               "TypeID": 
GetTypeID(t, "STEERING_WEIGHT")(), "Value": util.JSONIntStr(-12345)})),
+                               },
+                               "PRECONDITION FAILED when updating with IMS & 
IUS Headers": {
+                                       ClientSession:  steeringUserSession,
+                                       RequestHeaders: 
http.Header{rfc.IfUnmodifiedSince: {currentTimeRFC}},
+                                       RequestBody: map[string]interface{}{
+                                               "deliveryServiceId": 
GetDeliveryServiceId(t, "ds3")(),
+                                               "targetId":          
GetDeliveryServiceId(t, "ds4")(),
+                                               "value":             -12345,
+                                               "type":              
"STEERING_WEIGHT",
+                                               "typeId":            
GetTypeID(t, "STEERING_WEIGHT")(),
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), 
utils.HasStatus(http.StatusPreconditionFailed)),
+                               },
+                               "PRECONDITION FAILED when updating with IFMATCH 
ETAG Header": {
+                                       ClientSession:  steeringUserSession,
+                                       RequestHeaders: 
http.Header{rfc.IfMatch: {rfc.ETag(currentTime)}},
+                                       RequestBody: map[string]interface{}{
+                                               "deliveryServiceId": 
GetDeliveryServiceId(t, "ds3")(),
+                                               "targetId":          
GetDeliveryServiceId(t, "ds4")(),
+                                               "value":             -12345,
+                                               "type":              
"STEERING_WEIGHT",
+                                               "typeId":            
GetTypeID(t, "STEERING_WEIGHT")(),
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), 
utils.HasStatus(http.StatusPreconditionFailed)),
+                               },
+                       },
+                       "GET AFTER CHANGES": {
+                               "OK when CHANGES made": {
+                                       EndpointId:     GetDeliveryServiceId(t, 
"ds1"),
+                                       ClientSession:  steeringUserSession,
+                                       RequestHeaders: 
http.Header{rfc.IfModifiedSince: {currentTimeRFC}},
+                                       Expectations:   
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                       },
+               }
 
-       WithObjs(t, []TCObj{CDNs, Types, Tenants, Parameters, Profiles, 
Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, Topologies, 
DeliveryServices, Users, SteeringTargets}, func() {
-               GetTestSteeringTargetsIMS(t)
-               GetTestSteeringTargets(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)
-               UpdateTestSteeringTargets(t)
-               UpdateTestSteeringTargetsWithHeaders(t, header)
-               GetTestSteeringTargetsIMSAfterChange(t, header)
-               header = make(map[string][]string)
-               etag := rfc.ETag(currentTime)
-               header.Set(rfc.IfMatch, etag)
-               UpdateTestSteeringTargetsWithHeaders(t, header)
+               for method, testCases := range methodTests {
+                       t.Run(method, func(t *testing.T) {
+                               for name, testCase := range testCases {
+                                       steeringTarget := 
tc.SteeringTargetNullable{}
+
+                                       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, 
&steeringTarget)
+                                               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.GetSteeringTargetsWithHdr(testCase.EndpointId(), 
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.CreateSteeringTarget(steeringTarget)
+                                                       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.UpdateSteeringTargetWithHdr(steeringTarget, 
testCase.RequestHeaders)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       case "DELETE":
+                                               t.Run(name, func(t *testing.T) {
+                                                       var targetID int
+                                                       if testCase.RequestBody 
!= nil {
+                                                               if val, ok := 
testCase.RequestBody["targetID"]; ok {
+                                                                       
targetID = val.(int)
+                                                               }
+                                                       }
+                                                       alerts, reqInf, err := 
testCase.ClientSession.DeleteSteeringTarget(testCase.EndpointId(), targetID)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       }
+                               }
+                       })
+               }
        })
 
 }
 
-func UpdateTestSteeringTargetsWithHeaders(t *testing.T, header http.Header) {
-       if len(testData.SteeringTargets) < 1 {
-               t.Fatal("updating steering target: no steering target test 
data")
-       }
-       st := testData.SteeringTargets[0]
-       if st.DeliveryService == nil {
-               t.Fatal("updating steering target: test data missing ds")
-       }
-       if st.Target == nil {
-               t.Fatal("updating steering target: test data missing target")
-       }
-
-       respDS, _, err := 
SteeringUserSession.GetDeliveryServiceByXMLIDNullableWithHdr(string(*st.DeliveryService),
 header)
-       if err != nil {
-               t.Fatalf("updating steering target: getting ds: %v", err)
-       }
-       if len(respDS) < 1 {
-               t.Fatal("updating steering target: getting ds: not found")
-       }
-       if respDS[0].ID == nil {
-               t.Fatal("updating steering target: getting ds: nil id returned")
-       }
-       dsID := *respDS[0].ID
-
-       sts, _, err := SteeringUserSession.GetSteeringTargets(dsID)
-       if err != nil {
-               t.Fatalf("updating steering targets: getting steering target: 
%v", err)
-       }
-       if len(sts) < 1 {
-               t.Fatal("updating steering targets: getting steering target: 
got 0")
-       }
-       st = sts[0]
-
-       expected := util.JSONIntStr(-12345)
-       if st.Value != nil && *st.Value == expected {
-               expected++
-       }
-       st.Value = &expected
-
-       _, reqInf, err := SteeringUserSession.UpdateSteeringTargetWithHdr(st, 
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 GetTestSteeringTargetsIMSAfterChange(t *testing.T, header http.Header) {
-       if len(testData.SteeringTargets) < 1 {
-               t.Fatal("updating steering target: no steering target test 
data")
-       }
-       st := testData.SteeringTargets[0]
-       if st.DeliveryService == nil {
-               t.Fatal("updating steering target: test data missing ds")
-       }
-       _, reqInf, err := 
SteeringUserSession.GetDeliveryServiceByXMLIDNullableWithHdr(string(*st.DeliveryService),
 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 = 
SteeringUserSession.GetDeliveryServiceByXMLIDNullableWithHdr(string(*st.DeliveryService),
 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 GetTestSteeringTargetsIMS(t *testing.T) {
-       if len(testData.SteeringTargets) < 1 {
-               t.Fatal("updating steering target: no steering target test 
data")
-       }
-       st := testData.SteeringTargets[0]
-       if st.DeliveryService == nil {
-               t.Fatal("updating steering target: test data missing ds")
-       }
-       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)
-       _, reqInf, err := 
SteeringUserSession.GetDeliveryServiceByXMLIDNullableWithHdr(string(*st.DeliveryService),
 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)
-       }
-}
-
-// SetupSteeringTargets calls the CreateSteeringTargets test. It also sets the 
steering user session
-// with the logged in steering user. SteeringUserSession is used by steering 
target test functions.
-// Running this function depends on CreateTestUsers.
-func SetupSteeringTargets(t *testing.T) {
-       var err error
-       toReqTimeout := time.Second * 
time.Duration(Config.Default.Session.TimeoutInSecs)
-       SteeringUserSession, _, err = client.LoginWithAgent(TOSession.URL, 
"steering", "pa$$word", true, "to-api-v1-client-tests/steering", true, 
toReqTimeout)
-       if err != nil {
-               t.Fatalf("failed to get log in with steering user: %v", 
err.Error())
-       }
-
-       CreateTestSteeringTargets(t)
-}
-
-func CreateTestSteeringTargets(t *testing.T) {
-       for _, st := range testData.SteeringTargets {
-               if st.Type == nil {
-                       t.Fatal("creating steering target: test data missing 
type")
-               }
-               if st.DeliveryService == nil {
-                       t.Fatal("creating steering target: test data missing 
ds")
-               }
-               if st.Target == nil {
-                       t.Fatal("creating steering target: test data missing 
target")
-               }
-
-               {
-                       respTypes, _, err := 
SteeringUserSession.GetTypeByName(*st.Type)
-                       if err != nil {
-                               t.Fatalf("creating steering target: getting 
type: %v", err)
-                       } else if len(respTypes) < 1 {
-                               t.Fatal("creating steering target: getting 
type: not found")
+func validateSteeringTargetFields(expectedResp map[string]interface{}) 
utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               assert.RequireNotNil(t, resp, "Expected Steering Targets 
response to not be nil.")
+               steeringTargetsResp := resp.([]tc.SteeringTargetNullable)
+               for field, expected := range expectedResp {
+                       for _, steeringTarget := range steeringTargetsResp {
+                               switch field {
+                               case "DeliveryService":
+                                       assert.RequireNotNil(t, 
steeringTarget.DeliveryService, "Expected DeliveryService to not be nil.")
+                                       assert.Equal(t, expected, 
string(*steeringTarget.DeliveryService), "Expected DeliveryService to be %v, 
but got %s", expected, *steeringTarget.DeliveryService)
+                               case "DeliveryServiceID":
+                                       assert.RequireNotNil(t, 
steeringTarget.DeliveryServiceID, "Expected DeliveryServiceID to not be nil.")
+                                       assert.Equal(t, expected, 
*steeringTarget.DeliveryServiceID, "Expected DeliveryServiceID to be %v, but 
got %s", expected, *steeringTarget.DeliveryServiceID)
+                               case "Target":
+                                       assert.RequireNotNil(t, 
steeringTarget.Target, "Expected Target to not be nil.")
+                                       assert.Equal(t, expected, 
string(*steeringTarget.Target), "Expected Target to be %v, but got %s", 
expected, *steeringTarget.Target)
+                               case "TargetID":
+                                       assert.RequireNotNil(t, 
steeringTarget.TargetID, "Expected TargetID to not be nil.")
+                                       assert.Equal(t, expected, 
*steeringTarget.TargetID, "Expected TargetID to be %v, but got %s", expected, 
*steeringTarget.TargetID)
+                               case "Type":
+                                       assert.RequireNotNil(t, 
steeringTarget.Type, "Expected Type to not be nil.")
+                                       assert.Equal(t, expected, 
*steeringTarget.Type, "Expected Type to be %v, but got %s", expected, 
*steeringTarget.Type)
+                               case "TypeID":
+                                       assert.RequireNotNil(t, 
steeringTarget.Type, "Expected TypeID to not be nil.")
+                                       assert.Equal(t, expected, 
*steeringTarget.TypeID, "Expected TypeID to be %v, but got %s", expected, 
*steeringTarget.TypeID)
+                               case "Value":
+                                       assert.RequireNotNil(t, 
steeringTarget.Value, "Expected Value to not be nil.")
+                                       assert.Equal(t, expected, 
*steeringTarget.Value, "Expected Value to be %v, but got %s", expected, 
*steeringTarget.Value)
+                               default:
+                                       t.Errorf("Expected field: %v, does not 
exist in response", field)
+                               }
                        }
-                       st.TypeID = util.IntPtr(respTypes[0].ID)
-               }
-               {
-                       respDS, _, err := 
SteeringUserSession.GetDeliveryServiceByXMLIDNullable(string(*st.DeliveryService))
-                       if err != nil {
-                               t.Fatalf("creating steering target: getting ds: 
%v", err)
-                       } else if len(respDS) < 1 {
-                               t.Fatal("creating steering target: getting ds: 
not found")
-                       } else if respDS[0].ID == nil {
-                               t.Fatal("creating steering target: getting ds: 
nil ID returned")
-                       }
-                       dsID := uint64(*respDS[0].ID)
-                       st.DeliveryServiceID = &dsID
-               }
-               {
-                       respTarget, _, err := 
SteeringUserSession.GetDeliveryServiceByXMLIDNullable(string(*st.Target))
-                       if err != nil {
-                               t.Fatalf("creating steering target: getting 
target ds: %v", err)
-                       } else if len(respTarget) < 1 {
-                               t.Fatal("creating steering target: getting 
target ds: not found")
-                       } else if respTarget[0].ID == nil {
-                               t.Fatal("creating steering target: getting 
target ds: nil ID returned")
-                       }
-                       targetID := uint64(*respTarget[0].ID)
-                       st.TargetID = &targetID
-               }
-
-               resp, _, err := SteeringUserSession.CreateSteeringTarget(st)
-               t.Log("Response: ", resp)
-               if err != nil {
-                       t.Fatalf("creating steering target: %v", err)
                }
        }
 }
 
-func UpdateTestSteeringTargets(t *testing.T) {
-       if len(testData.SteeringTargets) < 1 {
-               t.Fatal("updating steering target: no steering target test 
data")
-       }
-       st := testData.SteeringTargets[0]
-       if st.DeliveryService == nil {
-               t.Fatal("updating steering target: test data missing ds")
-       }
-       if st.Target == nil {
-               t.Fatal("updating steering target: test data missing target")
-       }
-
-       respDS, _, err := 
SteeringUserSession.GetDeliveryServiceByXMLIDNullable(string(*st.DeliveryService))
-       if err != nil {
-               t.Fatalf("updating steering target: getting ds: %v", err)
-       }
-       if len(respDS) < 1 {
-               t.Fatal("updating steering target: getting ds: not found")
-       }
-       if respDS[0].ID == nil {
-               t.Fatal("updating steering target: getting ds: nil id returned")
-       }
-       dsID := *respDS[0].ID
-
-       sts, _, err := SteeringUserSession.GetSteeringTargets(dsID)
-       if err != nil {
-               t.Fatalf("updating steering targets: getting steering target: 
%v", err)
-       }
-       if len(sts) < 1 {
-               t.Fatal("updating steering targets: getting steering target: 
got 0")
-       }
-       st = sts[0]
-
-       expected := util.JSONIntStr(-12345)
-       if st.Value != nil && *st.Value == expected {
-               expected++
-       }
-       st.Value = &expected
-
-       _, _, err = SteeringUserSession.UpdateSteeringTarget(st)
-       if err != nil {
-               t.Fatalf("updating steering targets: updating: %+v", err)
-       }
-
-       sts, _, err = SteeringUserSession.GetSteeringTargets(dsID)
-       if err != nil {
-               t.Fatalf("updating steering targets: getting updated steering 
target: %v", err)
-       }
-       if len(sts) < 1 {
-               t.Fatal("updating steering targets: getting updated steering 
target: got 0")
-       }
-       actual := sts[0]
-
-       if actual.DeliveryServiceID == nil {
-               t.Fatalf("steering target update: ds id expected %v actual %v", 
dsID, nil)
-       } else if *actual.DeliveryServiceID != uint64(dsID) {
-               t.Fatalf("steering target update: ds id expected %v actual %v", 
dsID, *actual.DeliveryServiceID)
-       }
-       if actual.TargetID == nil {
-               t.Fatalf("steering target update: ds id expected %v actual %v", 
dsID, nil)
-       } else if *actual.TargetID != *st.TargetID {
-               t.Fatalf("steering target update: ds id expected %v actual %v", 
*st.TargetID, *actual.TargetID)
-       }
-       if actual.TypeID == nil {
-               t.Fatalf("steering target update: ds id expected %v actual %v", 
*st.TypeID, nil)
-       } else if *actual.TypeID != *st.TypeID {
-               t.Fatalf("steering target update: ds id expected %v actual %v", 
*st.TypeID, *actual.TypeID)
-       }
-       if actual.DeliveryService == nil {
-               t.Fatalf("steering target update: ds expected %v actual %v", 
*st.DeliveryService, nil)
-       } else if *st.DeliveryService != *actual.DeliveryService {
-               t.Fatalf("steering target update: ds name expected %v actual 
%v", *st.DeliveryService, *actual.DeliveryService)
-       }
-       if actual.Target == nil {
-               t.Fatalf("steering target update: target expected %v actual 
%v", *st.Target, nil)
-       } else if *st.Target != *actual.Target {
-               t.Fatalf("steering target update: target expected %v actual 
%v", *st.Target, *actual.Target)
-       }
-       if actual.Type == nil {
-               t.Fatalf("steering target update: type expected %v actual %v", 
*st.Type, nil)
-       } else if *st.Type != *actual.Type {
-               t.Fatalf("steering target update: type expected %v actual %v", 
*st.Type, *actual.Type)
-       }
-       if actual.Value == nil {
-               t.Fatalf("steering target update: ds expected %v actual %v", 
*st.Value, nil)
-       } else if *st.Value != *actual.Value {
-               t.Fatalf("steering target update: value expected %v actual %v", 
*st.Value, actual.Value)
+func validateSteeringTargetUpdateCreateFields(dsId int, expectedResp 
map[string]interface{}) utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               steeringTargets, _, err := TOSession.GetSteeringTargets(dsId)
+               assert.RequireNoError(t, err, "Error getting Steering Targets: 
%v", err)
+               assert.RequireEqual(t, 1, len(steeringTargets), "Expected one 
Steering Target returned Got: %d", len(steeringTargets))
+               validateSteeringTargetFields(expectedResp)(t, 
toclientlib.ReqInf{}, steeringTargets, tc.Alerts{}, nil)
        }
 }
 
-func GetTestSteeringTargets(t *testing.T) {
-       if len(testData.SteeringTargets) < 1 {
-               t.Fatal("updating steering target: no steering target test 
data")
-       }
-       st := testData.SteeringTargets[0]
-       if st.DeliveryService == nil {
-               t.Fatal("updating steering target: test data missing ds")
-       }
-
-       respDS, _, err := 
SteeringUserSession.GetDeliveryServiceByXMLIDNullable(string(*st.DeliveryService))
-       if err != nil {
-               t.Fatalf("creating steering target: getting ds: %v", err)
-       } else if len(respDS) < 1 {
-               t.Fatal("steering target get: getting ds: not found")
-       } else if respDS[0].ID == nil {
-               t.Fatal("steering target get: getting ds: nil id returned")
-       }
-       dsID := *respDS[0].ID
-
-       sts, _, err := SteeringUserSession.GetSteeringTargets(dsID)
-       if err != nil {
-               t.Fatalf("steering target get: getting steering target: %v", 
err)
-       }
-
-       if len(sts) != len(testData.SteeringTargets) {
-               t.Fatalf("steering target get: expected %v actual %v", 
len(testData.SteeringTargets), len(sts))
-       }
-
-       expected := testData.SteeringTargets[0]
-       actual := sts[0]
-
-       if actual.DeliveryServiceID == nil {
-               t.Fatalf("steering target get: ds id expected %v actual %v", 
dsID, nil)
-       } else if *actual.DeliveryServiceID != uint64(dsID) {
-               t.Fatalf("steering target get: ds id expected %v actual %v", 
dsID, *actual.DeliveryServiceID)
-       }
-       if actual.DeliveryService == nil {
-               t.Fatalf("steering target get: ds expected %v actual %v", 
expected.DeliveryService, nil)
-       } else if *expected.DeliveryService != *actual.DeliveryService {
-               t.Fatalf("steering target get: ds name expected %v actual %v", 
expected.DeliveryService, actual.DeliveryService)
-       }
-       if actual.Target == nil {
-               t.Fatalf("steering target get: target expected %v actual %v", 
expected.Target, nil)
-       } else if *expected.Target != *actual.Target {
-               t.Fatalf("steering target get: target expected %v actual %v", 
expected.Target, actual.Target)
-       }
-       if actual.Type == nil {
-               t.Fatalf("steering target get: type expected %v actual %v", 
expected.Type, nil)
-       } else if *expected.Type != *actual.Type {
-               t.Fatalf("steering target get: type expected %v actual %v", 
expected.Type, actual.Type)
-       }
-       if actual.Value == nil {
-               t.Fatalf("steering target get: ds expected %v actual %v", 
expected.Value, nil)
-       } else if *expected.Value != *actual.Value {
-               t.Fatalf("steering target get: value expected %v actual %v", 
*expected.Value, *actual.Value)
+func CreateTestSteeringTargets(t *testing.T) {
+       steeringUserSession := utils.CreateV3Session(t, Config.TrafficOps.URL, 
"steering", "pa$$word", Config.Default.Session.TimeoutInSecs)
+       for _, st := range testData.SteeringTargets {
+               st.TypeID = util.IntPtr(GetTypeID(t, *st.Type)())
+               st.DeliveryServiceID = 
util.UInt64Ptr(uint64(GetDeliveryServiceId(t, string(*st.DeliveryService))()))
+               st.TargetID = util.UInt64Ptr(uint64(GetDeliveryServiceId(t, 
string(*st.Target))()))
+               resp, _, err := steeringUserSession.CreateSteeringTarget(st)
+               assert.RequireNoError(t, err, "Creating steering target: %v - 
alerts: %+v", err, resp.Alerts)
        }
 }
 
 func DeleteTestSteeringTargets(t *testing.T) {
+       steeringUserSession := utils.CreateV3Session(t, Config.TrafficOps.URL, 
"steering", "pa$$word", Config.Default.Session.TimeoutInSecs)
        dsIDs := []uint64{}
        for _, st := range testData.SteeringTargets {
-               if st.DeliveryService == nil {
-                       t.Fatal("deleting steering target: test data missing 
ds")
-               }
-               if st.Target == nil {
-                       t.Fatal("deleting steering target: test data missing 
target")
-               }
+               respDS, _, err := 
steeringUserSession.GetDeliveryServiceByXMLIDNullableWithHdr(string(*st.DeliveryService),
 nil)
+               assert.RequireNoError(t, err, "Deleting steering target: 
getting ds: %v", err)
+               assert.RequireEqual(t, 1, len(respDS), "Deleting steering 
target: getting ds: expected 1 delivery service")
+               assert.RequireNotNil(t, respDS[0].ID, "Deleting steering 
target: getting ds: nil ID returned")
 
-               respDS, _, err := 
SteeringUserSession.GetDeliveryServiceByXMLIDNullable(string(*st.DeliveryService))
-               if err != nil {
-                       t.Fatalf("deleting steering target: getting ds: %v", 
err)
-               } else if len(respDS) < 1 {
-                       t.Fatal("deleting steering target: getting ds: not 
found")
-               } else if respDS[0].ID == nil {
-                       t.Fatal("deleting steering target: getting ds: nil ID 
returned")
-               }
                dsID := uint64(*respDS[0].ID)
                st.DeliveryServiceID = &dsID
-
                dsIDs = append(dsIDs, dsID)
 
-               respTarget, _, err := 
SteeringUserSession.GetDeliveryServiceByXMLIDNullable(string(*st.Target))
-               if err != nil {
-                       t.Fatalf("deleting steering target: getting target ds: 
%v", err)
-               } else if len(respTarget) < 1 {
-                       t.Fatal("deleting steering target: getting target ds: 
not found")
-               } else if respTarget[0].ID == nil {
-                       t.Fatal("deleting steering target: getting target ds: 
not found")
-               }
+               respTarget, _, err := 
steeringUserSession.GetDeliveryServiceByXMLIDNullableWithHdr(string(*st.Target),
 nil)
+               assert.RequireNoError(t, err, "Deleting steering target: 
getting target ds: %v", err)
+               assert.RequireEqual(t, 1, len(respTarget), "Deleting steering 
target: getting target ds: expected 1 delivery service")
+               assert.RequireNotNil(t, respTarget[0].ID, "Deleting steering 
target: getting target ds: not found")
+
                targetID := uint64(*respTarget[0].ID)
                st.TargetID = &targetID
 
-               _, _, err = 
SteeringUserSession.DeleteSteeringTarget(int(*st.DeliveryServiceID), 
int(*st.TargetID))
-               if err != nil {
-                       t.Fatalf("deleting steering target: deleting: %+v", err)
-               }
+               resp, _, err := 
steeringUserSession.DeleteSteeringTarget(int(*st.DeliveryServiceID), 
int(*st.TargetID))
+               assert.NoError(t, err, "Deleting steering target: deleting: %v 
- alerts: %+v", err, resp.Alerts)
        }
 
        for _, dsID := range dsIDs {
-               sts, _, err := SteeringUserSession.GetSteeringTargets(int(dsID))
-               if err != nil {
-                       t.Fatalf("deleting steering targets: getting steering 
target: %v", err)
-               }
-               if len(sts) != 0 {
-                       t.Fatalf("deleting steering targets: after delete, 
getting steering target: expected 0 actual %+v", len(sts))
-               }
+               sts, _, err := steeringUserSession.GetSteeringTargets(int(dsID))
+               assert.NoError(t, err, "deleting steering targets: getting 
steering target: %v", err)
+               assert.Equal(t, 0, len(sts), "Deleting steering targets: after 
delete, getting steering target: expected 0 actual %d", len(sts))
        }
 }
diff --git a/traffic_ops/testing/api/v3/tc-fixtures.json 
b/traffic_ops/testing/api/v3/tc-fixtures.json
index 70ceccc4e2..c10c8018bc 100644
--- a/traffic_ops/testing/api/v3/tc-fixtures.json
+++ b/traffic_ops/testing/api/v3/tc-fixtures.json
@@ -5460,6 +5460,12 @@
             "target": "ds2",
             "value": 42,
             "type": "STEERING_WEIGHT"
+        },
+        {
+            "deliveryService": "ds3",
+            "target": "ds4",
+            "value": 42,
+            "type": "STEERING_WEIGHT"
         }
     ],
     "servercheck_extensions": [
diff --git a/traffic_ops/testing/api/v3/withobjs_test.go 
b/traffic_ops/testing/api/v3/withobjs_test.go
index 464eadf672..485216cfc4 100644
--- a/traffic_ops/testing/api/v3/withobjs_test.go
+++ b/traffic_ops/testing/api/v3/withobjs_test.go
@@ -121,7 +121,7 @@ var withFuncs = map[TCObj]TCObjFuncs{
        ServiceCategories:                     {CreateTestServiceCategories, 
DeleteTestServiceCategories},
        Statuses:                              {CreateTestStatuses, 
DeleteTestStatuses},
        StaticDNSEntries:                      {CreateTestStaticDNSEntries, 
DeleteTestStaticDNSEntries},
-       SteeringTargets:                       {SetupSteeringTargets, 
DeleteTestSteeringTargets},
+       SteeringTargets:                       {CreateTestSteeringTargets, 
DeleteTestSteeringTargets},
        Tenants:                               {CreateTestTenants, 
DeleteTestTenants},
        ServerCheckExtensions:                 
{CreateTestServerCheckExtensions, DeleteTestServerCheckExtensions},
        Topologies:                            {CreateTestTopologies, 
DeleteTestTopologies},
diff --git a/traffic_ops/testing/api/v4/steeringtargets_test.go 
b/traffic_ops/testing/api/v4/steeringtargets_test.go
index e011a97576..fcc6a57445 100644
--- a/traffic_ops/testing/api/v4/steeringtargets_test.go
+++ b/traffic_ops/testing/api/v4/steeringtargets_test.go
@@ -16,423 +16,237 @@ package v4
 */
 
 import (
+       "encoding/json"
        "net/http"
        "testing"
        "time"
 
        "github.com/apache/trafficcontrol/lib/go-rfc"
+       "github.com/apache/trafficcontrol/lib/go-tc"
        "github.com/apache/trafficcontrol/lib/go-util"
+       "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"
 )
 
-var SteeringUserSession *client.Session
-
 func TestSteeringTargets(t *testing.T) {
-
        WithObjs(t, []TCObj{CDNs, Types, Tenants, Parameters, Profiles, 
Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, Topologies, 
ServiceCategories, DeliveryServices, Users, SteeringTargets}, func() {
-               GetTestSteeringTargetsIMS(t)
-               GetTestSteeringTargets(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)
-               UpdateTestSteeringTargets(t)
-               UpdateTestSteeringTargetsWithHeaders(t, header)
-               GetTestSteeringTargetsIMSAfterChange(t, header)
-               header = make(map[string][]string)
-               etag := rfc.ETag(currentTime)
-               header.Set(rfc.IfMatch, etag)
-               UpdateTestSteeringTargetsWithHeaders(t, header)
-       })
-
-}
-
-func UpdateTestSteeringTargetsWithHeaders(t *testing.T, header http.Header) {
-       if len(testData.SteeringTargets) < 1 {
-               t.Fatal("updating steering target: no steering target test 
data")
-       }
-       st := testData.SteeringTargets[0]
-       if st.DeliveryService == nil {
-               t.Fatal("updating steering target: test data missing ds")
-       }
-       if st.Target == nil {
-               t.Fatal("updating steering target: test data missing target")
-       }
-
-       opts := client.NewRequestOptions()
-       opts.Header = header
-       opts.QueryParameters.Set("xmlId", string(*st.DeliveryService))
-       respDS, _, err := SteeringUserSession.GetDeliveryServices(opts)
-       if err != nil {
-               t.Fatalf("updating steering target: getting ds: %v - alerts: 
%+v", err, respDS.Alerts)
-       }
-       if len(respDS.Response) < 1 {
-               t.Fatal("updating steering target: getting ds: not found")
-       }
-       if respDS.Response[0].ID == nil {
-               t.Fatal("updating steering target: getting ds: nil id returned")
-       }
-       dsID := *respDS.Response[0].ID
-
-       sts, _, err := SteeringUserSession.GetSteeringTargets(dsID, 
client.RequestOptions{})
-       if err != nil {
-               t.Fatalf("updating steering targets: getting steering target: 
%v - alerts: %+v", err, sts.Alerts)
-       }
-       if len(sts.Response) < 1 {
-               t.Fatal("updating steering targets: getting steering target: 
got 0")
-       }
-       st = sts.Response[0]
-
-       expected := util.JSONIntStr(-12345)
-       if st.Value != nil && *st.Value == expected {
-               expected++
-       }
-       st.Value = &expected
-
-       opts.QueryParameters.Del("xmlId")
-       _, reqInf, err := SteeringUserSession.UpdateSteeringTarget(st, 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)
-       }
-}
-
-func GetTestSteeringTargetsIMSAfterChange(t *testing.T, header http.Header) {
-       if len(testData.SteeringTargets) < 1 {
-               t.Fatal("updating steering target: no steering target test 
data")
-       }
-       st := testData.SteeringTargets[0]
-       if st.DeliveryService == nil {
-               t.Fatal("updating steering target: test data missing ds")
-       }
-       opts := client.NewRequestOptions()
-       opts.Header = header
-       opts.QueryParameters.Set("xmlId", string(*st.DeliveryService))
-       respDS, reqInf, err := SteeringUserSession.GetDeliveryServices(opts)
-       if err != nil {
-               t.Fatalf("Expected no error, but got: %v - alerts: %+v", err, 
respDS.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)
-       respDS, reqInf, err = SteeringUserSession.GetDeliveryServices(opts)
-       if err != nil {
-               t.Fatalf("Expected no error, but got: %v - alerts: %+v", err, 
respDS.Alerts)
-       }
-       if reqInf.StatusCode != http.StatusNotModified {
-               t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
-       }
-}
-
-func GetTestSteeringTargetsIMS(t *testing.T) {
-       if len(testData.SteeringTargets) < 1 {
-               t.Fatal("updating steering target: no steering target test 
data")
-       }
-       st := testData.SteeringTargets[0]
-       if st.DeliveryService == nil {
-               t.Fatal("updating steering target: test data missing ds")
-       }
-
-       futureTime := time.Now().AddDate(0, 0, 1)
-       time := futureTime.Format(time.RFC1123)
-
-       opts := client.NewRequestOptions()
-       opts.Header.Set(rfc.IfModifiedSince, time)
-       opts.QueryParameters.Set("xmlId", string(*st.DeliveryService))
-       respDS, reqInf, err := SteeringUserSession.GetDeliveryServices(opts)
-       if err != nil {
-               t.Fatalf("Expected no error, but got: %v - alerts: %+v", err, 
respDS.Alerts)
-       }
-       if reqInf.StatusCode != http.StatusNotModified {
-               t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
-       }
-}
+               steeringUserSession := utils.CreateV4Session(t, 
Config.TrafficOps.URL, "steering", "pa$$word", 
Config.Default.Session.TimeoutInSecs)
+
+               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": {
+                                       EndpointId:    GetDeliveryServiceId(t, 
"ds1"),
+                                       ClientSession: steeringUserSession,
+                                       RequestOpts:   
client.RequestOptions{Header: http.Header{rfc.IfModifiedSince: {tomorrow}}},
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusNotModified)),
+                               },
+                               "OK when VALID request": {
+                                       EndpointId:    GetDeliveryServiceId(t, 
"ds1"),
+                                       ClientSession: steeringUserSession,
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
utils.ResponseHasLength(1),
+                                               
validateSteeringTargetFields(map[string]interface{}{"DeliveryService": "ds1", 
"DeliveryServiceID": uint64(GetDeliveryServiceId(t, "ds1")()),
+                                                       "Target": "ds2", 
"TargetID": uint64(GetDeliveryServiceId(t, "ds2")()), "Type": 
"STEERING_WEIGHT", "TypeID": GetTypeID(t, "STEERING_WEIGHT")(), "Value": 
util.JSONIntStr(42)})),
+                               },
+                       },
+                       "PUT": {
+                               "OK when VALID request": {
+                                       ClientSession: steeringUserSession,
+                                       RequestBody: map[string]interface{}{
+                                               "deliveryServiceId": 
GetDeliveryServiceId(t, "ds3")(),
+                                               "targetId":          
GetDeliveryServiceId(t, "ds4")(),
+                                               "value":             -12345,
+                                               "typeId":            
GetTypeID(t, "STEERING_WEIGHT")(),
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK),
+                                               
validateSteeringTargetUpdateCreateFields(GetDeliveryServiceId(t, "ds3")(),
+                                                       
map[string]interface{}{"DeliveryService": "ds3", "DeliveryServiceID": 
uint64(GetDeliveryServiceId(t, "ds3")()),
+                                                               "Target": 
"ds4", "TargetID": uint64(GetDeliveryServiceId(t, "ds4")()), "Type": 
"STEERING_WEIGHT",
+                                                               "TypeID": 
GetTypeID(t, "STEERING_WEIGHT")(), "Value": util.JSONIntStr(-12345)})),
+                               },
+                               "PRECONDITION FAILED when updating with IMS & 
IUS Headers": {
+                                       ClientSession: steeringUserSession,
+                                       RequestOpts:   
client.RequestOptions{Header: http.Header{rfc.IfUnmodifiedSince: 
{currentTimeRFC}}},
+                                       RequestBody: map[string]interface{}{
+                                               "deliveryServiceId": 
GetDeliveryServiceId(t, "ds3")(),
+                                               "targetId":          
GetDeliveryServiceId(t, "ds4")(),
+                                               "value":             -12345,
+                                               "type":              
"STEERING_WEIGHT",
+                                               "typeId":            
GetTypeID(t, "STEERING_WEIGHT")(),
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), 
utils.HasStatus(http.StatusPreconditionFailed)),
+                               },
+                               "PRECONDITION FAILED when updating with IFMATCH 
ETAG Header": {
+                                       ClientSession: steeringUserSession,
+                                       RequestOpts:   
client.RequestOptions{Header: http.Header{rfc.IfMatch: 
{rfc.ETag(currentTime)}}},
+                                       RequestBody: map[string]interface{}{
+                                               "deliveryServiceId": 
GetDeliveryServiceId(t, "ds3")(),
+                                               "targetId":          
GetDeliveryServiceId(t, "ds4")(),
+                                               "value":             -12345,
+                                               "type":              
"STEERING_WEIGHT",
+                                               "typeId":            
GetTypeID(t, "STEERING_WEIGHT")(),
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), 
utils.HasStatus(http.StatusPreconditionFailed)),
+                               },
+                       },
+                       "GET AFTER CHANGES": {
+                               "OK when CHANGES made": {
+                                       EndpointId:    GetDeliveryServiceId(t, 
"ds1"),
+                                       ClientSession: steeringUserSession,
+                                       RequestOpts:   
client.RequestOptions{Header: http.Header{rfc.IfModifiedSince: 
{currentTimeRFC}}},
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                       },
+               }
 
-// SetupSteeringTargets calls the CreateSteeringTargets test. It also sets the 
steering user session
-// with the logged in steering user. SteeringUserSession is used by steering 
target test functions.
-// Running this function depends on CreateTestUsers.
-func SetupSteeringTargets(t *testing.T) {
-       var err error
-       toReqTimeout := time.Second * 
time.Duration(Config.Default.Session.TimeoutInSecs)
-       SteeringUserSession, _, err = client.LoginWithAgent(TOSession.URL, 
"steering", "pa$$word", true, "to-api-v1-client-tests/steering", true, 
toReqTimeout)
-       if err != nil {
-               t.Fatalf("failed to get log in with steering user: %v", 
err.Error())
-       }
+               for method, testCases := range methodTests {
+                       t.Run(method, func(t *testing.T) {
+                               for name, testCase := range testCases {
+                                       steeringTarget := 
tc.SteeringTargetNullable{}
+
+                                       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, 
&steeringTarget)
+                                               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.GetSteeringTargets(testCase.EndpointId(), 
testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, resp.Response, resp.Alerts, err)
+                                                       }
+                                               })
+                                       case "POST":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.CreateSteeringTarget(steeringTarget, 
testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       case "PUT":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.UpdateSteeringTarget(steeringTarget, 
testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       case "DELETE":
+                                               t.Run(name, func(t *testing.T) {
+                                                       var targetID int
+                                                       if testCase.RequestBody 
!= nil {
+                                                               if val, ok := 
testCase.RequestBody["targetID"]; ok {
+                                                                       
targetID = val.(int)
+                                                               }
+                                                       }
+                                                       alerts, reqInf, err := 
testCase.ClientSession.DeleteSteeringTarget(testCase.EndpointId(), targetID, 
testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       }
+                               }
+                       })
+               }
+       })
 
-       CreateTestSteeringTargets(t)
 }
 
-func CreateTestSteeringTargets(t *testing.T) {
-       for _, st := range testData.SteeringTargets {
-               if st.Type == nil {
-                       t.Fatal("creating steering target: test data missing 
type")
-               }
-               if st.DeliveryService == nil {
-                       t.Fatal("creating steering target: test data missing 
ds")
-               }
-               if st.Target == nil {
-                       t.Fatal("creating steering target: test data missing 
target")
-               }
-
-               {
-                       opts := client.NewRequestOptions()
-                       opts.QueryParameters.Set("name", *st.Type)
-                       respTypes, _, err := SteeringUserSession.GetTypes(opts)
-                       if err != nil {
-                               t.Fatalf("creating steering target: getting 
Type: %v - alerts: %+v", err, respTypes.Alerts)
-                       } else if len(respTypes.Response) < 1 {
-                               t.Fatal("creating steering target: getting 
Type: not found")
-                       }
-                       st.TypeID = util.IntPtr(respTypes.Response[0].ID)
-               }
-               {
-                       opts := client.NewRequestOptions()
-                       opts.QueryParameters.Set("xmlId", 
string(*st.DeliveryService))
-                       respDS, _, err := 
SteeringUserSession.GetDeliveryServices(opts)
-                       if err != nil {
-                               t.Fatalf("creating steering target: getting ds: 
%v - alerts: %+v", err, respDS.Alerts)
-                       } else if len(respDS.Response) < 1 {
-                               t.Fatal("creating steering target: getting ds: 
not found")
-                       } else if respDS.Response[0].ID == nil {
-                               t.Fatal("creating steering target: getting ds: 
nil ID returned")
-                       }
-                       dsID := uint64(*respDS.Response[0].ID)
-                       st.DeliveryServiceID = &dsID
-               }
-               {
-                       opts := client.NewRequestOptions()
-                       opts.QueryParameters.Set("xmlId", string(*st.Target))
-                       respTarget, _, err := 
SteeringUserSession.GetDeliveryServices(opts)
-                       if err != nil {
-                               t.Fatalf("creating steering target: getting 
target ds: %v - alerts: %+v", err, respTarget.Alerts)
-                       } else if len(respTarget.Response) < 1 {
-                               t.Fatal("creating steering target: getting 
target ds: not found")
-                       } else if respTarget.Response[0].ID == nil {
-                               t.Fatal("creating steering target: getting 
target ds: nil ID returned")
+func validateSteeringTargetFields(expectedResp map[string]interface{}) 
utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               assert.RequireNotNil(t, resp, "Expected Steering Targets 
response to not be nil.")
+               steeringTargetsResp := resp.([]tc.SteeringTargetNullable)
+               for field, expected := range expectedResp {
+                       for _, steeringTarget := range steeringTargetsResp {
+                               switch field {
+                               case "DeliveryService":
+                                       assert.RequireNotNil(t, 
steeringTarget.DeliveryService, "Expected DeliveryService to not be nil.")
+                                       assert.Equal(t, expected, 
string(*steeringTarget.DeliveryService), "Expected DeliveryService to be %v, 
but got %s", expected, *steeringTarget.DeliveryService)
+                               case "DeliveryServiceID":
+                                       assert.RequireNotNil(t, 
steeringTarget.DeliveryServiceID, "Expected DeliveryServiceID to not be nil.")
+                                       assert.Equal(t, expected, 
*steeringTarget.DeliveryServiceID, "Expected DeliveryServiceID to be %v, but 
got %s", expected, *steeringTarget.DeliveryServiceID)
+                               case "Target":
+                                       assert.RequireNotNil(t, 
steeringTarget.Target, "Expected Target to not be nil.")
+                                       assert.Equal(t, expected, 
string(*steeringTarget.Target), "Expected Target to be %v, but got %s", 
expected, *steeringTarget.Target)
+                               case "TargetID":
+                                       assert.RequireNotNil(t, 
steeringTarget.TargetID, "Expected TargetID to not be nil.")
+                                       assert.Equal(t, expected, 
*steeringTarget.TargetID, "Expected TargetID to be %v, but got %s", expected, 
*steeringTarget.TargetID)
+                               case "Type":
+                                       assert.RequireNotNil(t, 
steeringTarget.Type, "Expected Type to not be nil.")
+                                       assert.Equal(t, expected, 
*steeringTarget.Type, "Expected Type to be %v, but got %s", expected, 
*steeringTarget.Type)
+                               case "TypeID":
+                                       assert.RequireNotNil(t, 
steeringTarget.Type, "Expected TypeID to not be nil.")
+                                       assert.Equal(t, expected, 
*steeringTarget.TypeID, "Expected TypeID to be %v, but got %s", expected, 
*steeringTarget.TypeID)
+                               case "Value":
+                                       assert.RequireNotNil(t, 
steeringTarget.Value, "Expected Value to not be nil.")
+                                       assert.Equal(t, expected, 
*steeringTarget.Value, "Expected Value to be %v, but got %s", expected, 
*steeringTarget.Value)
+                               default:
+                                       t.Errorf("Expected field: %v, does not 
exist in response", field)
+                               }
                        }
-                       targetID := uint64(*respTarget.Response[0].ID)
-                       st.TargetID = &targetID
-               }
-
-               resp, _, err := SteeringUserSession.CreateSteeringTarget(st, 
client.RequestOptions{})
-               if err != nil {
-                       t.Fatalf("creating steering target: %v - alerts: %+v", 
err, resp.Alerts)
                }
        }
 }
 
-func UpdateTestSteeringTargets(t *testing.T) {
-       if len(testData.SteeringTargets) < 1 {
-               t.Fatal("updating steering target: no steering target test 
data")
-       }
-       st := testData.SteeringTargets[0]
-       if st.DeliveryService == nil {
-               t.Fatal("updating steering target: test data missing ds")
-       }
-       if st.Target == nil {
-               t.Fatal("updating steering target: test data missing target")
-       }
-
-       opts := client.NewRequestOptions()
-       opts.QueryParameters.Set("xmlId", string(*st.DeliveryService))
-       respDS, _, err := SteeringUserSession.GetDeliveryServices(opts)
-       if err != nil {
-               t.Fatalf("updating steering target: getting ds: %v - alerts: 
%+v", err, respDS.Alerts)
-       }
-       if len(respDS.Response) < 1 {
-               t.Fatal("updating steering target: getting ds: not found")
-       }
-       if respDS.Response[0].ID == nil {
-               t.Fatal("updating steering target: getting ds: nil id returned")
-       }
-       dsID := *respDS.Response[0].ID
-
-       sts, _, err := SteeringUserSession.GetSteeringTargets(dsID, 
client.RequestOptions{})
-       if err != nil {
-               t.Fatalf("updating steering targets: getting steering target: 
%v - alerts: %+v", err, sts.Alerts)
-       }
-       if len(sts.Response) < 1 {
-               t.Fatal("updating steering targets: getting steering target: 
got 0")
-       }
-       st = sts.Response[0]
-
-       expected := util.JSONIntStr(-12345)
-       if st.Value != nil && *st.Value == expected {
-               expected++
-       }
-       st.Value = &expected
-
-       alerts, _, err := SteeringUserSession.UpdateSteeringTarget(st, 
client.RequestOptions{})
-       if err != nil {
-               t.Fatalf("updating steering targets: updating: %v - alerts: 
%+v", err, alerts.Alerts)
-       }
-
-       sts, _, err = SteeringUserSession.GetSteeringTargets(dsID, 
client.RequestOptions{})
-       if err != nil {
-               t.Fatalf("updating steering targets: getting updated steering 
target: %v - alerts: %+v", err, sts.Alerts)
-       }
-       if len(sts.Response) < 1 {
-               t.Fatal("updating steering targets: getting updated steering 
target: got 0")
-       }
-       actual := sts.Response[0]
-
-       if actual.DeliveryServiceID == nil {
-               t.Fatalf("steering target update: ds id expected %v actual %v", 
dsID, nil)
-       } else if *actual.DeliveryServiceID != uint64(dsID) {
-               t.Fatalf("steering target update: ds id expected %v actual %v", 
dsID, *actual.DeliveryServiceID)
-       }
-       if actual.TargetID == nil {
-               t.Fatalf("steering target update: ds id expected %v actual %v", 
dsID, nil)
-       } else if *actual.TargetID != *st.TargetID {
-               t.Fatalf("steering target update: ds id expected %v actual %v", 
*st.TargetID, *actual.TargetID)
-       }
-       if actual.TypeID == nil {
-               t.Fatalf("steering target update: ds id expected %v actual %v", 
*st.TypeID, nil)
-       } else if *actual.TypeID != *st.TypeID {
-               t.Fatalf("steering target update: ds id expected %v actual %v", 
*st.TypeID, *actual.TypeID)
-       }
-       if actual.DeliveryService == nil {
-               t.Fatalf("steering target update: ds expected %v actual %v", 
*st.DeliveryService, nil)
-       } else if *st.DeliveryService != *actual.DeliveryService {
-               t.Fatalf("steering target update: ds name expected %v actual 
%v", *st.DeliveryService, *actual.DeliveryService)
-       }
-       if actual.Target == nil {
-               t.Fatalf("steering target update: target expected %v actual 
%v", *st.Target, nil)
-       } else if *st.Target != *actual.Target {
-               t.Fatalf("steering target update: target expected %v actual 
%v", *st.Target, *actual.Target)
-       }
-       if actual.Type == nil {
-               t.Fatalf("steering target update: type expected %v actual %v", 
*st.Type, nil)
-       } else if *st.Type != *actual.Type {
-               t.Fatalf("steering target update: type expected %v actual %v", 
*st.Type, *actual.Type)
-       }
-       if actual.Value == nil {
-               t.Fatalf("steering target update: ds expected %v actual %v", 
*st.Value, nil)
-       } else if *st.Value != *actual.Value {
-               t.Fatalf("steering target update: value expected %v actual %v", 
*st.Value, actual.Value)
+func validateSteeringTargetUpdateCreateFields(dsId int, expectedResp 
map[string]interface{}) utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               steeringTargets, _, err := TOSession.GetSteeringTargets(dsId, 
client.RequestOptions{})
+               assert.RequireNoError(t, err, "Error getting Steering Targets: 
%v - alerts: %+v", err, steeringTargets.Alerts)
+               assert.RequireEqual(t, 1, len(steeringTargets.Response), 
"Expected one Steering Target returned Got: %d", len(steeringTargets.Response))
+               validateSteeringTargetFields(expectedResp)(t, 
toclientlib.ReqInf{}, steeringTargets.Response, tc.Alerts{}, nil)
        }
 }
 
-func GetTestSteeringTargets(t *testing.T) {
-       if len(testData.SteeringTargets) < 1 {
-               t.Fatal("updating steering target: no steering target test 
data")
-       }
-       st := testData.SteeringTargets[0]
-       if st.DeliveryService == nil {
-               t.Fatal("updating steering target: test data missing ds")
-       }
-
-       opts := client.NewRequestOptions()
-       opts.QueryParameters.Set("xmlId", string(*st.DeliveryService))
-       respDS, _, err := SteeringUserSession.GetDeliveryServices(opts)
-       if err != nil {
-               t.Fatalf("creating steering target: getting ds: %v - alerts: 
%+v", err, respDS.Alerts)
-       } else if len(respDS.Response) < 1 {
-               t.Fatal("steering target get: getting ds: not found")
-       } else if respDS.Response[0].ID == nil {
-               t.Fatal("steering target get: getting ds: nil id returned")
-       }
-       dsID := *respDS.Response[0].ID
-
-       sts, _, err := SteeringUserSession.GetSteeringTargets(dsID, 
client.RequestOptions{})
-       if err != nil {
-               t.Fatalf("steering target get: getting steering target: %v - 
alerts: %+v", err, sts.Alerts)
-       }
-
-       if len(sts.Response) != len(testData.SteeringTargets) {
-               t.Fatalf("steering target get: expected %d actual %d", 
len(testData.SteeringTargets), len(sts.Response))
-       }
-
-       expected := testData.SteeringTargets[0]
-       actual := sts.Response[0]
-
-       if actual.DeliveryServiceID == nil {
-               t.Fatalf("steering target get: ds id expected %v actual %v", 
dsID, nil)
-       } else if *actual.DeliveryServiceID != uint64(dsID) {
-               t.Fatalf("steering target get: ds id expected %v actual %v", 
dsID, *actual.DeliveryServiceID)
-       }
-       if actual.DeliveryService == nil {
-               t.Fatalf("steering target get: ds expected %v actual %v", 
expected.DeliveryService, nil)
-       } else if *expected.DeliveryService != *actual.DeliveryService {
-               t.Fatalf("steering target get: ds name expected %v actual %v", 
expected.DeliveryService, actual.DeliveryService)
-       }
-       if actual.Target == nil {
-               t.Fatalf("steering target get: target expected %v actual %v", 
expected.Target, nil)
-       } else if *expected.Target != *actual.Target {
-               t.Fatalf("steering target get: target expected %v actual %v", 
expected.Target, actual.Target)
-       }
-       if actual.Type == nil {
-               t.Fatalf("steering target get: type expected %v actual %v", 
expected.Type, nil)
-       } else if *expected.Type != *actual.Type {
-               t.Fatalf("steering target get: type expected %v actual %v", 
expected.Type, actual.Type)
-       }
-       if actual.Value == nil {
-               t.Fatalf("steering target get: ds expected %v actual %v", 
expected.Value, nil)
-       } else if *expected.Value != *actual.Value {
-               t.Fatalf("steering target get: value expected %v actual %v", 
*expected.Value, *actual.Value)
+func CreateTestSteeringTargets(t *testing.T) {
+       steeringUserSession := utils.CreateV4Session(t, Config.TrafficOps.URL, 
"steering", "pa$$word", Config.Default.Session.TimeoutInSecs)
+       for _, st := range testData.SteeringTargets {
+               st.TypeID = util.IntPtr(GetTypeID(t, *st.Type)())
+               st.DeliveryServiceID = 
util.UInt64Ptr(uint64(GetDeliveryServiceId(t, string(*st.DeliveryService))()))
+               st.TargetID = util.UInt64Ptr(uint64(GetDeliveryServiceId(t, 
string(*st.Target))()))
+               resp, _, err := steeringUserSession.CreateSteeringTarget(st, 
client.RequestOptions{})
+               assert.RequireNoError(t, err, "Creating steering target: %v - 
alerts: %+v", err, resp.Alerts)
        }
 }
 
 func DeleteTestSteeringTargets(t *testing.T) {
+       steeringUserSession := utils.CreateV4Session(t, Config.TrafficOps.URL, 
"steering", "pa$$word", Config.Default.Session.TimeoutInSecs)
        dsIDs := []uint64{}
        for _, st := range testData.SteeringTargets {
-               if st.DeliveryService == nil {
-                       t.Fatal("deleting steering target: test data missing 
ds")
-               }
-               if st.Target == nil {
-                       t.Fatal("deleting steering target: test data missing 
target")
-               }
-
                opts := client.NewRequestOptions()
                opts.QueryParameters.Set("xmlId", string(*st.DeliveryService))
-               respDS, _, err := SteeringUserSession.GetDeliveryServices(opts)
-               if err != nil {
-                       t.Fatalf("deleting steering target: getting ds: %v - 
alerts: %+v", err, respDS.Alerts)
-               } else if len(respDS.Response) < 1 {
-                       t.Fatal("deleting steering target: getting ds: not 
found")
-               } else if respDS.Response[0].ID == nil {
-                       t.Fatal("deleting steering target: getting ds: nil ID 
returned")
-               }
+               respDS, _, err := steeringUserSession.GetDeliveryServices(opts)
+               assert.RequireNoError(t, err, "Deleting steering target: 
getting ds: %v - alerts: %+v", err, respDS.Alerts)
+               assert.RequireEqual(t, 1, len(respDS.Response), "Deleting 
steering target: getting ds: expected 1 delivery service")
+               assert.RequireNotNil(t, respDS.Response[0].ID, "Deleting 
steering target: getting ds: nil ID returned")
+
                dsID := uint64(*respDS.Response[0].ID)
                st.DeliveryServiceID = &dsID
-
                dsIDs = append(dsIDs, dsID)
 
                opts.QueryParameters.Set("xmlId", string(*st.Target))
-               respTarget, _, err := 
SteeringUserSession.GetDeliveryServices(opts)
-               if err != nil {
-                       t.Fatalf("deleting steering target: getting target ds: 
%v - alerts: %+v", err, respTarget.Alerts)
-               } else if len(respTarget.Response) < 1 {
-                       t.Fatal("deleting steering target: getting target ds: 
not found")
-               } else if respTarget.Response[0].ID == nil {
-                       t.Fatal("deleting steering target: getting target ds: 
not found")
-               }
+               respTarget, _, err := 
steeringUserSession.GetDeliveryServices(opts)
+               assert.RequireNoError(t, err, "Deleting steering target: 
getting target ds: %v - alerts: %+v", err, respTarget.Alerts)
+               assert.RequireEqual(t, 1, len(respTarget.Response), "Deleting 
steering target: getting target ds: expected 1 delivery service")
+               assert.RequireNotNil(t, respTarget.Response[0].ID, "Deleting 
steering target: getting target ds: not found")
+
                targetID := uint64(*respTarget.Response[0].ID)
                st.TargetID = &targetID
 
-               resp, _, err := 
SteeringUserSession.DeleteSteeringTarget(int(*st.DeliveryServiceID), 
int(*st.TargetID), client.RequestOptions{})
-               if err != nil {
-                       t.Fatalf("deleting steering target: deleting: %v - 
alerts: %+v", err, resp.Alerts)
-               }
+               resp, _, err := 
steeringUserSession.DeleteSteeringTarget(int(*st.DeliveryServiceID), 
int(*st.TargetID), client.RequestOptions{})
+               assert.NoError(t, err, "Deleting steering target: deleting: %v 
- alerts: %+v", err, resp.Alerts)
        }
 
        for _, dsID := range dsIDs {
-               sts, _, err := 
SteeringUserSession.GetSteeringTargets(int(dsID), client.RequestOptions{})
-               if err != nil {
-                       t.Fatalf("deleting steering targets: getting steering 
target: %v - alerts: %+v", err, sts.Alerts)
-               }
-               if len(sts.Response) != 0 {
-                       t.Fatalf("deleting steering targets: after delete, 
getting steering target: expected 0 actual %d", len(sts.Response))
-               }
+               sts, _, err := 
steeringUserSession.GetSteeringTargets(int(dsID), client.RequestOptions{})
+               assert.NoError(t, err, "deleting steering targets: getting 
steering target: %v - alerts: %+v", err, sts.Alerts)
+               assert.Equal(t, 0, len(sts.Response), "Deleting steering 
targets: after delete, getting steering target: expected 0 actual %d", 
len(sts.Response))
        }
 }
diff --git a/traffic_ops/testing/api/v4/tc-fixtures.json 
b/traffic_ops/testing/api/v4/tc-fixtures.json
index c98d475bdd..9ab6382c96 100644
--- a/traffic_ops/testing/api/v4/tc-fixtures.json
+++ b/traffic_ops/testing/api/v4/tc-fixtures.json
@@ -6120,6 +6120,12 @@
             "target": "ds2",
             "value": 42,
             "type": "STEERING_WEIGHT"
+        },
+        {
+            "deliveryService": "ds3",
+            "target": "ds4",
+            "value": 42,
+            "type": "STEERING_WEIGHT"
         }
     ],
     "servercheck_extensions": [
diff --git a/traffic_ops/testing/api/v4/withobjs_test.go 
b/traffic_ops/testing/api/v4/withobjs_test.go
index feb77b15d4..7d64632f7a 100644
--- a/traffic_ops/testing/api/v4/withobjs_test.go
+++ b/traffic_ops/testing/api/v4/withobjs_test.go
@@ -123,7 +123,7 @@ var withFuncs = map[TCObj]TCObjFuncs{
        ServiceCategories:                     {CreateTestServiceCategories, 
DeleteTestServiceCategories},
        Statuses:                              {CreateTestStatuses, 
DeleteTestStatuses},
        StaticDNSEntries:                      {CreateTestStaticDNSEntries, 
DeleteTestStaticDNSEntries},
-       SteeringTargets:                       {SetupSteeringTargets, 
DeleteTestSteeringTargets},
+       SteeringTargets:                       {CreateTestSteeringTargets, 
DeleteTestSteeringTargets},
        Tenants:                               {CreateTestTenants, 
DeleteTestTenants},
        ServerCheckExtensions:                 
{CreateTestServerCheckExtensions, DeleteTestServerCheckExtensions},
        Topologies:                            {CreateTestTopologies, 
DeleteTestTopologies},
diff --git a/traffic_ops/v3-client/steeringtarget.go 
b/traffic_ops/v3-client/steeringtarget.go
index c1170569ac..33c1abb7fb 100644
--- a/traffic_ops/v3-client/steeringtarget.go
+++ b/traffic_ops/v3-client/steeringtarget.go
@@ -53,6 +53,15 @@ func (to *Session) UpdateSteeringTarget(st 
tc.SteeringTargetNullable) (tc.Alerts
        return to.UpdateSteeringTargetWithHdr(st, nil)
 }
 
+func (to *Session) GetSteeringTargetsWithHdr(dsID int, header http.Header) 
([]tc.SteeringTargetNullable, toclientlib.ReqInf, error) {
+       route := fmt.Sprintf("/steering/%d/targets", dsID)
+       data := struct {
+               Response []tc.SteeringTargetNullable `json:"response"`
+       }{}
+       reqInf, err := to.get(route, header, &data)
+       return data.Response, reqInf, err
+}
+
 func (to *Session) GetSteeringTargets(dsID int) ([]tc.SteeringTargetNullable, 
toclientlib.ReqInf, error) {
        route := fmt.Sprintf("/steering/%d/targets", dsID)
        data := struct {

Reply via email to