You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by oc...@apache.org on 2022/08/30 02:15:43 UTC

[trafficcontrol] branch master updated: Refactor Origins Tests (#7013)

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

ocket8888 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 3a9517ccbb Refactor Origins Tests (#7013)
3a9517ccbb is described below

commit 3a9517ccbb0cdeee4c0ad03350dcca070fa47e5d
Author: Eric Holguin <14...@users.noreply.github.com>
AuthorDate: Mon Aug 29 20:15:38 2022 -0600

    Refactor Origins Tests (#7013)
    
    * Initial Origins test refactor
    
    * Refactor Origins tests
---
 traffic_ops/testing/api/v3/origins_test.go |  534 +++++-----
 traffic_ops/testing/api/v4/origins_test.go | 1450 ++++++++++++----------------
 2 files changed, 932 insertions(+), 1052 deletions(-)

diff --git a/traffic_ops/testing/api/v3/origins_test.go b/traffic_ops/testing/api/v3/origins_test.go
index 4e990230a3..5c08d3b3aa 100644
--- a/traffic_ops/testing/api/v3/origins_test.go
+++ b/traffic_ops/testing/api/v3/origins_test.go
@@ -16,257 +16,355 @@ package v3
 */
 
 import (
+	"encoding/json"
 	"net/http"
-	"reflect"
-	"strings"
+	"net/url"
 	"testing"
 	"time"
 
 	"github.com/apache/trafficcontrol/lib/go-rfc"
 	"github.com/apache/trafficcontrol/lib/go-tc"
-	"github.com/apache/trafficcontrol/lib/go-util"
-	toclient "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"
 )
 
 func TestOrigins(t *testing.T) {
-	WithObjs(t, []TCObj{CDNs, Coordinates, Types, Tenants, Parameters, Profiles, Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, Users, Topologies, DeliveryServices, Origins}, func() {
-		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.IfUnmodifiedSince, time)
-		UpdateTestOrigins(t)
-		UpdateTestOriginsWithHeaders(t, header)
-		GetTestOrigins(t)
-		NotFoundDeleteTest(t)
-		OriginTenancyTest(t)
-		VerifyPaginationSupport(t)
-		header = make(map[string][]string)
-		etag := rfc.ETag(currentTime)
-		header.Set(rfc.IfMatch, etag)
-		UpdateTestOriginsWithHeaders(t, header)
-	})
-}
-
-func UpdateTestOriginsWithHeaders(t *testing.T, header http.Header) {
-	if len(testData.Origins) > 0 {
-		firstOrigin := testData.Origins[0]
-		if firstOrigin.Name == nil {
-			t.Fatalf("couldn't get the name of test origin server")
-		}
-		// Retrieve the origin by name so we can get the id for the Update
-		resp, _, err := TOSession.GetOriginByName(*firstOrigin.Name)
-		if err != nil {
-			t.Errorf("cannot GET origin by name: %v - %v", *firstOrigin.Name, err)
+	WithObjs(t, []TCObj{CDNs, Coordinates, Types, Tenants, Parameters, Profiles, Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, Users, Topologies, ServiceCategories, DeliveryServices, Origins}, func() {
+
+		currentTime := time.Now().UTC().Add(-15 * time.Second)
+		currentTimeRFC := currentTime.Format(time.RFC1123)
+
+		tenant4UserSession := utils.CreateV3Session(t, Config.TrafficOps.URL, "tenant4user", "pa$$word", Config.Default.Session.TimeoutInSecs)
+
+		methodTests := utils.V3TestCase{
+			"GET": {
+				"OK when VALID request": {
+					ClientSession: TOSession,
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseLengthGreaterOrEqual(1)),
+				},
+				"OK when VALID NAME parameter": {
+					ClientSession: TOSession,
+					RequestParams: url.Values{"name": {"origin1"}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(1),
+						validateOriginsFields(map[string]interface{}{"Name": "origin1"})),
+				},
+				"EMPTY RESPONSE when CHILD TENANT reads PARENT TENANT ORIGIN": {
+					ClientSession: tenant4UserSession,
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(0)),
+				},
+			},
+			"GET QUERY PARAMS": {
+				"FIRST RESULT when LIMIT=1": {
+					ClientSession: TOSession,
+					RequestParams: url.Values{"orderby": {"id"}, "limit": {"1"}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateOriginsPagination("limit")),
+				},
+				"SECOND RESULT when LIMIT=1 OFFSET=1": {
+					ClientSession: TOSession,
+					RequestParams: url.Values{"orderby": {"id"}, "limit": {"1"}, "offset": {"1"}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateOriginsPagination("offset")),
+				},
+				"SECOND RESULT when LIMIT=1 PAGE=2": {
+					ClientSession: TOSession,
+					RequestParams: url.Values{"orderby": {"id"}, "limit": {"1"}, "page": {"2"}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateOriginsPagination("page")),
+				},
+				"BAD REQUEST when INVALID LIMIT parameter": {
+					ClientSession: TOSession,
+					RequestParams: url.Values{"limit": {"-2"}},
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"BAD REQUEST when INVALID OFFSET parameter": {
+					ClientSession: TOSession,
+					RequestParams: url.Values{"limit": {"1"}, "offset": {"0"}},
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"BAD REQUEST when INVALID PAGE parameter": {
+					ClientSession: TOSession,
+					RequestParams: url.Values{"limit": {"1"}, "page": {"0"}},
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+			},
+			"PUT": {
+				"OK when VALID request": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":            "origin2",
+						"cachegroup":      "multiOriginCachegroup",
+						"Coordinate":      "coordinate2",
+						"deliveryService": "ds3",
+						"fqdn":            "originupdated.example.com",
+						"ipAddress":       "1.2.3.4",
+						"ip6Address":      "0000::1111",
+						"port":            1234,
+						"protocol":        "http",
+						"tenantId":        GetTenantID(t, "tenant2")(),
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK),
+						validateOriginsUpdateCreateFields("origin2", map[string]interface{}{"Cachegroup": "multiOriginCachegroup", "Coordinate": "coordinate2", "DeliveryService": "ds3",
+							"FQDN": "originupdated.example.com", "IPAddress": "1.2.3.4", "IP6Address": "0000::1111", "Port": 1234, "Protocol": "http", "Tenant": "tenant2"})),
+				},
+				"FORBIDDEN when CHILD TENANT updates PARENT TENANT ORIGIN": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: tenant4UserSession,
+					RequestBody: map[string]interface{}{
+						"name":              "testtenancy",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "testtenancy.example.com",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+				"NOT FOUND when ORIGIN DOESNT EXIST": {
+					EndpointId:    func() int { return 1111111 },
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "testid",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "testid.example.com",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusNotFound)),
+				},
+				"PRECONDITION FAILED when updating with IMS & IUS Headers": {
+					EndpointId:     GetOriginID(t, "origin2"),
+					ClientSession:  TOSession,
+					RequestHeaders: http.Header{rfc.IfUnmodifiedSince: {currentTimeRFC}},
+					RequestBody: map[string]interface{}{
+						"name":            "origin2",
+						"cachegroup":      "originCachegroup",
+						"deliveryService": "ds2",
+						"fqdn":            "origin2.example.com",
+						"protocol":        "http",
+						"tenantId":        GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusPreconditionFailed)),
+				},
+				"PRECONDITION FAILED when updating with IFMATCH ETAG Header": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":            "origin2",
+						"cachegroup":      "originCachegroup",
+						"deliveryService": "ds2",
+						"fqdn":            "origin2.example.com",
+						"protocol":        "http",
+						"tenantId":        GetTenantID(t, "tenant1")(),
+					},
+					RequestHeaders: http.Header{rfc.IfMatch: {rfc.ETag(currentTime)}},
+					Expectations:   utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusPreconditionFailed)),
+				},
+			},
+			"DELETE": {
+				"NOT FOUND when DOESNT EXIST": {
+					EndpointId:    func() int { return 11111111 },
+					ClientSession: TOSession,
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusNotFound)),
+				},
+				"FORBIDDEN when CHILD TENANT deletes PARENT TENANT ORIGIN": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: tenant4UserSession,
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
 		}
-		if len(resp) > 0 {
-			remoteOrigin := resp[0]
-			if remoteOrigin.ID == nil {
-				t.Fatalf("couldn't get the ID of the response origin server")
-			}
-			updatedPort := 4321
-			updatedFQDN := "updated.example.com"
 
-			// update port and FQDN values on origin
-			remoteOrigin.Port = &updatedPort
-			remoteOrigin.FQDN = &updatedFQDN
-			_, reqInf, err := TOSession.UpdateOriginByIDWithHdr(*remoteOrigin.ID, remoteOrigin, 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)
-			}
+		for method, testCases := range methodTests {
+			t.Run(method, func(t *testing.T) {
+				for name, testCase := range testCases {
+					origin := tc.Origin{}
+
+					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, &origin)
+						assert.NoError(t, err, "Error occurred when unmarshalling request body: %v", err)
+					}
+
+					switch method {
+					case "GET":
+						t.Run(name, func(t *testing.T) {
+							if name == "OK when VALID NAME parameter" {
+								resp, reqInf, err := testCase.ClientSession.GetOriginByName(testCase.RequestParams["name"][0])
+								for _, check := range testCase.Expectations {
+									check(t, reqInf, resp, tc.Alerts{}, err)
+								}
+							} else {
+								resp, reqInf, err := testCase.ClientSession.GetOrigins()
+								for _, check := range testCase.Expectations {
+									check(t, reqInf, resp, tc.Alerts{}, err)
+								}
+							}
+						})
+					case "GET QUERY PARAMS":
+						t.Run(name, func(t *testing.T) {
+							queryParams := "?" + testCase.RequestParams.Encode()
+							resp, reqInf, err := testCase.ClientSession.GetOriginsByQueryParams(queryParams)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, resp, tc.Alerts{}, err)
+							}
+						})
+					case "POST":
+						t.Run(name, func(t *testing.T) {
+							resp, reqInf, err := testCase.ClientSession.CreateOrigin(origin)
+							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.UpdateOriginByIDWithHdr(testCase.EndpointId(), origin, testCase.RequestHeaders)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, resp.Response, resp.Alerts, err)
+							}
+						})
+					case "DELETE":
+						t.Run(name, func(t *testing.T) {
+							alerts, reqInf, err := testCase.ClientSession.DeleteOriginByID(testCase.EndpointId())
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, nil, alerts, err)
+							}
+						})
+					}
+				}
+			})
 		}
-	}
+	})
 }
 
-func CreateTestOrigins(t *testing.T) {
-	// loop through origins, assign FKs and create
-	for _, origin := range testData.Origins {
-		_, _, err := TOSession.CreateOrigin(origin)
-		if err != nil {
-			t.Errorf("could not CREATE origins: %v", err)
+func validateOriginsFields(expectedResp map[string]interface{}) utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ tc.Alerts, _ error) {
+		assert.RequireNotNil(t, resp, "Expected Origin response to not be nil.")
+		originResp := resp.([]tc.Origin)
+		for field, expected := range expectedResp {
+			for _, origin := range originResp {
+				switch field {
+				case "Cachegroup":
+					assert.RequireNotNil(t, origin.Cachegroup, "Expected Cachegroup to not be nil.")
+					assert.Equal(t, expected, *origin.Cachegroup, "Expected Cachegroup to be %v, but got %s", expected, *origin.Cachegroup)
+				case "CachegroupID":
+					assert.RequireNotNil(t, origin.CachegroupID, "Expected CachegroupID to not be nil.")
+					assert.Equal(t, expected, *origin.CachegroupID, "Expected CachegroupID to be %v, but got %d", expected, *origin.Cachegroup)
+				case "Coordinate":
+					assert.RequireNotNil(t, origin.Coordinate, "Expected Coordinate to not be nil.")
+					assert.Equal(t, expected, *origin.Coordinate, "Expected Coordinate to be %v, but got %s", expected, *origin.Coordinate)
+				case "CoordinateID":
+					assert.RequireNotNil(t, origin.CoordinateID, "Expected CoordinateID to not be nil.")
+					assert.Equal(t, expected, *origin.CoordinateID, "Expected CoordinateID to be %v, but got %d", expected, *origin.CoordinateID)
+				case "DeliveryService":
+					assert.RequireNotNil(t, origin.DeliveryService, "Expected DeliveryService to not be nil.")
+					assert.Equal(t, expected, *origin.DeliveryService, "Expected DeliveryService to be %v, but got %s", expected, *origin.DeliveryService)
+				case "DeliveryServiceID":
+					assert.RequireNotNil(t, origin.DeliveryServiceID, "Expected DeliveryServiceID to not be nil.")
+					assert.Equal(t, expected, *origin.DeliveryServiceID, "Expected DeliveryServiceID to be %v, but got %d", expected, *origin.DeliveryServiceID)
+				case "FQDN":
+					assert.RequireNotNil(t, origin.FQDN, "Expected FQDN to not be nil.")
+					assert.Equal(t, expected, *origin.FQDN, "Expected FQDN to be %v, but got %s", expected, *origin.FQDN)
+				case "ID":
+					assert.RequireNotNil(t, origin.ID, "Expected ID to not be nil.")
+					assert.Equal(t, expected, *origin.ID, "Expected ID to be %v, but got %d", expected, *origin.ID)
+				case "IPAddress":
+					assert.RequireNotNil(t, origin.IPAddress, "Expected IPAddress to not be nil.")
+					assert.Equal(t, expected, *origin.IPAddress, "Expected IPAddress to be %v, but got %s", expected, *origin.IPAddress)
+				case "IP6Address":
+					assert.RequireNotNil(t, origin.IP6Address, "Expected IP6Address to not be nil.")
+					assert.Equal(t, expected, *origin.IP6Address, "Expected IP6Address to be %v, but got %s", expected, *origin.IP6Address)
+				case "IsPrimary":
+					assert.RequireNotNil(t, origin.IsPrimary, "Expected IsPrimary to not be nil.")
+					assert.Equal(t, expected, *origin.IsPrimary, "Expected IsPrimary to be %v, but got %v", expected, *origin.IsPrimary)
+				case "Name":
+					assert.RequireNotNil(t, origin.Name, "Expected Name to not be nil.")
+					assert.Equal(t, expected, *origin.Name, "Expected Name to be %v, but got %s", expected, *origin.Name)
+				case "Port":
+					assert.RequireNotNil(t, origin.Port, "Expected Port to not be nil.")
+					assert.Equal(t, expected, *origin.Port, "Expected Port to be %v, but got %d", expected, *origin.Port)
+				case "Profile":
+					assert.RequireNotNil(t, origin.Profile, "Expected Profile to not be nil.")
+					assert.Equal(t, expected, *origin.Profile, "Expected Profile to be %v, but got %s", expected, *origin.Profile)
+				case "ProfileID":
+					assert.RequireNotNil(t, origin.ProfileID, "Expected ProfileID to not be nil.")
+					assert.Equal(t, expected, *origin.ProfileID, "Expected ProfileID to be %v, but got %d", expected, *origin.ProfileID)
+				case "Protocol":
+					assert.RequireNotNil(t, origin.Protocol, "Expected Protocol to not be nil.")
+					assert.Equal(t, expected, *origin.Protocol, "Expected Tenant to be %v, but got %s", expected, *origin.Protocol)
+				case "Tenant":
+					assert.RequireNotNil(t, origin.Tenant, "Expected Tenant to not be nil.")
+					assert.Equal(t, expected, *origin.Tenant, "Expected Tenant to be %v, but got %s", expected, *origin.Tenant)
+				case "TenantID":
+					assert.RequireNotNil(t, origin.TenantID, "Expected TenantID to not be nil.")
+					assert.Equal(t, expected, *origin.TenantID, "Expected TenantID to be %v, but got %d", expected, *origin.TenantID)
+				default:
+					t.Errorf("Expected field: %v, does not exist in response", field)
+				}
+			}
 		}
 	}
 }
 
-func NotFoundDeleteTest(t *testing.T) {
-	_, _, err := TOSession.DeleteOriginByID(2020)
-	if err == nil {
-		t.Error("deleting origin with what should be a non-existent id - expected: error, actual: nil error")
-	} else if !strings.Contains(err.Error(), "not found") {
-		t.Errorf("deleted origin with what should be a non-existent id - expected: 'not found' error, actual: %s", err.Error())
-	}
-}
-
-func GetTestOrigins(t *testing.T) {
-	_, _, err := TOSession.GetOrigins()
-	if err != nil {
-		t.Errorf("cannot GET origins: %v", err)
-	}
-
-	for _, origin := range testData.Origins {
-		resp, _, err := TOSession.GetOriginByName(*origin.Name)
-		if err != nil {
-			t.Errorf("cannot GET Origin by name: %v - %v", err, resp)
-		}
+func validateOriginsUpdateCreateFields(name string, expectedResp map[string]interface{}) utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ tc.Alerts, _ error) {
+		origin, _, err := TOSession.GetOriginByName(name)
+		assert.RequireNoError(t, err, "Error getting Origin: %v", err)
+		assert.RequireEqual(t, 1, len(origin), "Expected one Origin returned Got: %d", len(origin))
+		validateOriginsFields(expectedResp)(t, toclientlib.ReqInf{}, origin, tc.Alerts{}, nil)
 	}
 }
 
-func UpdateTestOrigins(t *testing.T) {
-	firstOrigin := testData.Origins[0]
-	// Retrieve the origin by name so we can get the id for the Update
-	resp, _, err := TOSession.GetOriginByName(*firstOrigin.Name)
-	if err != nil {
-		t.Errorf("cannot GET origin by name: %v - %v", *firstOrigin.Name, err)
-	}
-	if len(resp) > 0 {
-		remoteOrigin := resp[0]
-		updatedPort := 4321
-		updatedFQDN := "updated.example.com"
-
-		// update port and FQDN values on origin
-		remoteOrigin.Port = &updatedPort
-		remoteOrigin.FQDN = &updatedFQDN
-		updResp, _, err := TOSession.UpdateOriginByID(*remoteOrigin.ID, remoteOrigin)
-		if err != nil && updResp != nil {
-			t.Errorf("cannot UPDATE Origin by name: %v - %v", err, updResp.Alerts)
-		}
-
-		// Retrieve the origin to check port and FQDN values were updated
-		resp, _, err = TOSession.GetOriginByID(*remoteOrigin.ID)
-		if err != nil {
-			t.Errorf("cannot GET Origin by ID: %v - %v", *remoteOrigin.Name, err)
-		}
-
-		if len(resp) > 0 {
-			respOrigin := resp[0]
-			if *respOrigin.Port != updatedPort {
-				t.Errorf("results do not match actual: %d, expected: %d", *respOrigin.Port, updatedPort)
-			}
-			if *respOrigin.FQDN != updatedFQDN {
-				t.Errorf("results do not match actual: %s, expected: %s", *respOrigin.FQDN, updatedFQDN)
-			}
+func validateOriginsPagination(paginationParam string) utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ tc.Alerts, _ error) {
+		paginationResp := resp.([]tc.Origin)
+		respBase, _, err := TOSession.GetOriginsByQueryParams("?orderby=id")
+		assert.RequireNoError(t, err, "Cannot get Origins: %v", err)
+
+		origin := respBase
+		assert.RequireGreaterOrEqual(t, len(origin), 3, "Need at least 3 Origins in Traffic Ops to test pagination support, found: %d", len(origin))
+		switch paginationParam {
+		case "limit:":
+			assert.Exactly(t, origin[:1], paginationResp, "expected GET Origins with limit = 1 to return first result")
+		case "offset":
+			assert.Exactly(t, origin[1:2], paginationResp, "expected GET Origins with limit = 1, offset = 1 to return second result")
+		case "page":
+			assert.Exactly(t, origin[1:2], paginationResp, "expected GET Origins with limit = 1, page = 2 to return second result")
 		}
 	}
 }
 
-func OriginTenancyTest(t *testing.T) {
-	origins, _, err := TOSession.GetOrigins()
-	if err != nil {
-		t.Errorf("cannot GET origins: %v", err)
-	}
-	tenant3Origin := tc.Origin{}
-	foundTenant3Origin := false
-	for _, o := range origins {
-		if *o.FQDN == "origin.ds3.example.net" {
-			tenant3Origin = o
-			foundTenant3Origin = true
-		}
-	}
-	if !foundTenant3Origin {
-		t.Error("expected to find origin with tenant 'tenant3' and fqdn 'origin.ds3.example.net'")
-	}
-
-	toReqTimeout := time.Second * time.Duration(Config.Default.Session.TimeoutInSecs)
-	tenant4TOClient, _, err := toclient.LoginWithAgent(TOSession.URL, "tenant4user", "pa$$word", true, "to-api-v3-client-tests/tenant4user", true, toReqTimeout)
-	if err != nil {
-		t.Fatalf("failed to log in with tenant4user: %v", err.Error())
-	}
-
-	originsReadableByTenant4, _, err := tenant4TOClient.GetOrigins()
-	if err != nil {
-		t.Error("tenant4user cannot GET origins")
-	}
-
-	// assert that tenant4user cannot read origins outside of its tenant
-	for _, origin := range originsReadableByTenant4 {
-		if *origin.FQDN == "origin.ds3.example.net" {
-			t.Error("expected tenant4 to be unable to read origins from tenant 3")
-		}
-	}
-
-	// assert that tenant4user cannot update tenant3user's origin
-	if _, _, err = tenant4TOClient.UpdateOriginByID(*tenant3Origin.ID, tenant3Origin); err == nil {
-		t.Error("expected tenant4user to be unable to update tenant3's origin")
-	}
-
-	// assert that tenant4user cannot delete an origin outside of its tenant
-	if _, _, err = tenant4TOClient.DeleteOriginByID(*origins[0].ID); err == nil {
-		t.Errorf("expected tenant4user to be unable to delete an origin outside of its tenant (origin %s)", *origins[0].Name)
-	}
-
-	// assert that tenant4user cannot create origins outside of its tenant
-	tenant3Origin.FQDN = util.StrPtr("origin.tenancy.test.example.com")
-	if _, _, err = tenant4TOClient.CreateOrigin(tenant3Origin); err == nil {
-		t.Error("expected tenant4user to be unable to create an origin outside of its tenant")
+func GetOriginID(t *testing.T, name string) func() int {
+	return func() int {
+		origins, _, err := TOSession.GetOriginByName(name)
+		assert.RequireNoError(t, err, "Get Origins Request failed with error:", err)
+		assert.RequireEqual(t, 1, len(origins), "Expected response object length 1, but got %d", len(origins))
+		assert.RequireNotNil(t, origins[0].ID, "Expected ID to not be nil.")
+		return *origins[0].ID
 	}
 }
 
-func VerifyPaginationSupport(t *testing.T) {
-	origins, _, err := TOSession.GetOriginsByQueryParams("?orderby=id")
-	if err != nil {
-		t.Fatalf("cannot GET origins: %v", err)
-	}
-
-	originsWithLimit, _, err := TOSession.GetOriginsByQueryParams("?orderby=id&limit=1")
-	if !reflect.DeepEqual(origins[:1], originsWithLimit) {
-		t.Error("expected GET origins with limit = 1 to return first result")
-	}
-
-	originsWithOffset, _, err := TOSession.GetOriginsByQueryParams("?orderby=id&limit=1&offset=1")
-	if !reflect.DeepEqual(origins[1:2], originsWithOffset) {
-		t.Error("expected GET origins with limit = 1, offset = 1 to return second result")
-	}
-
-	originsWithPage, _, err := TOSession.GetOriginsByQueryParams("?orderby=id&limit=1&page=2")
-	if !reflect.DeepEqual(origins[1:2], originsWithPage) {
-		t.Error("expected GET origins with limit = 1, page = 2 to return second result")
-	}
-
-	_, _, err = TOSession.GetOriginsByQueryParams("?limit=-2")
-	if err == nil {
-		t.Error("expected GET origins to return an error when limit is not bigger than -1")
-	} else if !strings.Contains(err.Error(), "must be bigger than -1") {
-		t.Errorf("expected GET origins to return an error for limit is not bigger than -1, actual error: " + err.Error())
-	}
-	_, _, err = TOSession.GetOriginsByQueryParams("?limit=1&offset=0")
-	if err == nil {
-		t.Error("expected GET origins to return an error when offset is not a positive integer")
-	} else if !strings.Contains(err.Error(), "must be a positive integer") {
-		t.Errorf("expected GET origins to return an error for offset is not a positive integer, actual error: " + err.Error())
-	}
-	_, _, err = TOSession.GetOriginsByQueryParams("?limit=1&page=0")
-	if err == nil {
-		t.Error("expected GET origins to return an error when page is not a positive integer")
-	} else if !strings.Contains(err.Error(), "must be a positive integer") {
-		t.Errorf("expected GET origins to return an error for page is not a positive integer, actual error: " + err.Error())
+func CreateTestOrigins(t *testing.T) {
+	for _, origin := range testData.Origins {
+		resp, _, err := TOSession.CreateOrigin(origin)
+		assert.RequireNoError(t, err, "Could not create Origins: %v - alerts: %+v", err, resp.Alerts)
 	}
 }
 
 func DeleteTestOrigins(t *testing.T) {
-	for _, origin := range testData.Origins {
-		resp, _, err := TOSession.GetOriginByName(*origin.Name)
-		if err != nil {
-			t.Errorf("cannot GET Origin by name: %v - %v", *origin.Name, err)
-		}
-		if len(resp) > 0 {
-			respOrigin := resp[0]
-
-			delResp, _, err := TOSession.DeleteOriginByID(*respOrigin.ID)
-			if err != nil {
-				t.Errorf("cannot DELETE Origin by ID: %v - %v", err, delResp)
-			}
-
+	origins, _, err := TOSession.GetOrigins()
+	assert.NoError(t, err, "Cannot get Origins : %v", err)
+
+	for _, origin := range origins {
+		assert.RequireNotNil(t, origin.ID, "Expected origin ID to not be nil.")
+		assert.RequireNotNil(t, origin.Name, "Expected origin ID to not be nil.")
+		assert.RequireNotNil(t, origin.IsPrimary, "Expected origin ID to not be nil.")
+		if !*origin.IsPrimary {
+			alerts, _, err := TOSession.DeleteOriginByID(*origin.ID)
+			assert.NoError(t, err, "Unexpected error deleting Origin '%s' (#%d): %v - alerts: %+v", *origin.Name, *origin.ID, err, alerts.Alerts)
 			// Retrieve the Origin to see if it got deleted
-			org, _, err := TOSession.GetOriginByName(*origin.Name)
-			if err != nil {
-				t.Errorf("error deleting Origin name: %s", err.Error())
-			}
-			if len(org) > 0 {
-				t.Errorf("expected Origin name: %s to be deleted", *origin.Name)
-			}
+			getOrigin, _, err := TOSession.GetOriginByID(*origin.ID)
+			assert.NoError(t, err, "Error getting Origin '%s' after deletion: %v", *origin.Name, err)
+			assert.Equal(t, 0, len(getOrigin), "Expected Origin '%s' to be deleted, but it was found in Traffic Ops", *origin.Name)
 		}
 	}
 }
diff --git a/traffic_ops/testing/api/v4/origins_test.go b/traffic_ops/testing/api/v4/origins_test.go
index 7cac422d62..fadf6038d6 100644
--- a/traffic_ops/testing/api/v4/origins_test.go
+++ b/traffic_ops/testing/api/v4/origins_test.go
@@ -16,8 +16,9 @@ package v4
 */
 
 import (
+	"encoding/json"
 	"net/http"
-	"reflect"
+	"net/url"
 	"strconv"
 	"strings"
 	"testing"
@@ -25,339 +26,649 @@ import (
 
 	"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"
 )
 
 func TestOrigins(t *testing.T) {
 	WithObjs(t, []TCObj{CDNs, Coordinates, Types, Tenants, Parameters, Profiles, Statuses, Divisions, Regions, PhysLocations, CacheGroups, Servers, Users, Topologies, ServiceCategories, DeliveryServices, Origins}, func() {
-		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.IfUnmodifiedSince, time)
-		CreateTestOriginDuplicateData(t)
-		GetTestOriginsByParams(t)
-		GetTestOriginsByInvalidParams(t)
-		UpdateTestOrigins(t)
-		UpdateTestOriginsWithHeaders(t, header)
-		GetTestOrigins(t)
-		NotFoundDeleteTest(t)
-		OriginTenancyTest(t)
-		GetTestPaginationSupportOrigins(t)
-		header = make(map[string][]string)
-		etag := rfc.ETag(currentTime)
-		header.Set(rfc.IfMatch, etag)
-		UpdateTestOriginsWithHeaders(t, header)
-		CreateTestOriginInvalidData(t)
-		updateTestOriginsWithInvalidData(t)
-	})
-}
-
-func UpdateTestOriginsWithHeaders(t *testing.T, header http.Header) {
-	if len(testData.Origins) < 1 {
-		t.Fatal("Need at least one Origin to test updating Origins with an HTTP header")
-	}
-	firstOrigin := testData.Origins[0]
-	if firstOrigin.Name == nil {
-		t.Fatalf("couldn't get the name of test origin server")
-	}
-
-	// Retrieve the origin by name so we can get the id for the Update
-	opts := client.NewRequestOptions()
-	opts.QueryParameters.Set("name", *firstOrigin.Name)
-	resp, _, err := TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Errorf("cannot get Origin '%s'': %v - alerts: %+v", *firstOrigin.Name, err, resp.Alerts)
-	}
-	if len(resp.Response) != 1 {
-		t.Fatalf("Expected exactly one Origin to exist with name '%s', found: %d", *firstOrigin.Name, len(resp.Response))
-	}
 
-	remoteOrigin := resp.Response[0]
-	if remoteOrigin.ID == nil {
-		t.Fatal("couldn't get the ID of the response origin server")
-	}
-	updatedPort := 4321
-	updatedFQDN := "updated.example.com"
+		currentTime := time.Now().UTC().Add(-15 * time.Second)
+		currentTimeRFC := currentTime.Format(time.RFC1123)
+
+		tenant4UserSession := utils.CreateV4Session(t, Config.TrafficOps.URL, "tenant4user", "pa$$word", Config.Default.Session.TimeoutInSecs)
+
+		methodTests := utils.V4TestCase{
+			"GET": {
+				"OK when VALID request": {
+					ClientSession: TOSession,
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseLengthGreaterOrEqual(1)),
+				},
+				"OK when VALID NAME parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"name": {"origin1"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(1),
+						validateOriginsFields(map[string]interface{}{"Name": "origin1"})),
+				},
+				"OK when VALID DELIVERYSERVICE parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"deliveryservice": {strconv.Itoa(GetDeliveryServiceId(t, "ds1")())}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseLengthGreaterOrEqual(1),
+						validateOriginsFields(map[string]interface{}{"DeliveryServiceID": GetDeliveryServiceId(t, "ds1")()})),
+				},
+				"OK when VALID CACHEGROUP parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"cachegroup": {strconv.Itoa(GetCacheGroupId(t, "originCachegroup")())}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseLengthGreaterOrEqual(1),
+						validateOriginsFields(map[string]interface{}{"CachegroupID": GetCacheGroupId(t, "originCachegroup")()})),
+				},
+				"OK when VALID COORDINATE parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"coordinate": {strconv.Itoa(GetCoordinateID(t, "coordinate1")())}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseLengthGreaterOrEqual(1),
+						validateOriginsFields(map[string]interface{}{"Coordinate": "coordinate1"})),
+				},
+				"OK when VALID PROFILEID parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"profileId": {strconv.Itoa(GetProfileId(t, "ATS_EDGE_TIER_CACHE"))}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseLengthGreaterOrEqual(1),
+						validateOriginsFields(map[string]interface{}{"ProfileID": GetProfileId(t, "ATS_EDGE_TIER_CACHE")})),
+				},
+				"OK when VALID PRIMARY parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"primary": {"true"}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseLengthGreaterOrEqual(1),
+						validateOriginsFields(map[string]interface{}{"IsPrimary": true})),
+				},
+				"OK when VALID TENANT parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"tenant": {strconv.Itoa(GetTenantID(t, "tenant1")())}}},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseLengthGreaterOrEqual(1),
+						validateOriginsFields(map[string]interface{}{"TenantID": GetTenantID(t, "tenant1")()})),
+				},
+				"EMPTY RESPONSE when CHILD TENANT reads PARENT TENANT ORIGIN": {
+					ClientSession: tenant4UserSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"tenant": {strconv.Itoa(GetTenantID(t, "tenant3")())}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(0)),
+				},
+				"EMPTY RESPONSE when NAME parameter that DOESNT EXIST": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"name": {"doesntexist"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(0)),
+				},
+				"EMPTY RESPONSE when DELIVERYSERVICE parameter that DOESNT EXIST": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"deliveryservice": {"1000000"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(0)),
+				},
+				"EMPTY RESPONSE when CACHEGROUP parameter that DOESNT EXIST": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"cachegroup": {"1000000"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(0)),
+				},
+				"EMPTY RESPONSE when COORDINATE parameter that DOESNT EXIST": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"coordinate": {"1000000"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(0)),
+				},
+				"EMPTY RESPONSE when PROFILEID parameter that DOESNT EXIST": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"profileId": {"1000000"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(0)),
+				},
+				"BAD REQUEST when INVALID PRIMARY parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"primary": {"1000000"}}},
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"EMPTY RESPONSE when TENANT parameter that DOESNT EXIST": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"tenant": {"1000000"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), utils.ResponseHasLength(0)),
+				},
+				"FIRST RESULT when LIMIT=1": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"orderby": {"id"}, "limit": {"1"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateOriginsPagination("limit")),
+				},
+				"SECOND RESULT when LIMIT=1 OFFSET=1": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"orderby": {"id"}, "limit": {"1"}, "offset": {"1"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateOriginsPagination("offset")),
+				},
+				"SECOND RESULT when LIMIT=1 PAGE=2": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"orderby": {"id"}, "limit": {"1"}, "page": {"2"}}},
+					Expectations:  utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), validateOriginsPagination("page")),
+				},
+				"BAD REQUEST when INVALID LIMIT parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"limit": {"-2"}}},
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"BAD REQUEST when INVALID OFFSET parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"limit": {"1"}, "offset": {"0"}}},
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"BAD REQUEST when INVALID PAGE parameter": {
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{QueryParameters: url.Values{"limit": {"1"}, "page": {"0"}}},
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+			},
+			"POST": {
+				"BAD REQUEST when ALREADY EXISTS": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":            "origin1",
+						"cachegroup":      "originCachegroup",
+						"Coordinate":      "coordinate1",
+						"deliveryService": "ds1",
+						"fqdn":            "origin1.example.com",
+						"ipAddress":       "1.2.3.4",
+						"ip6Address":      "dead:beef:cafe::42",
+						"port":            1234,
+						"Profile":         "ATS_EDGE_TIER_CACHE",
+						"protocol":        "http",
+						"tenantId":        GetTenantID(t, "tenant1")(),
+						"isPrimary":       true,
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"FORBIDDEN when CHILD TENANT CREATES ORIGIN OUTSIDE TENANCY": {
+					ClientSession: tenant4UserSession,
+					RequestBody: map[string]interface{}{
+						"name":              "originTenancyTest",
+						"cachegroup":        "originCachegroup",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "origintenancy.example.com",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant3")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+				"NOT FOUND when CACHEGROUP DOESNT EXIST": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "testcg",
+						"cachegroupId":      10000000,
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "test.cachegroupId.com",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusNotFound)),
+				},
+				"NOT FOUND when PROFILEID DOESNT EXIST": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "testprofile",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "test.profileId.com",
+						"profileId":         1000000,
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusNotFound)),
+				},
+				"NOT FOUND when COORDINATE DOESNT EXIST": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "testcoordinate",
+						"coordinateId":      10000000,
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "test.coordinate.com",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusNotFound)),
+				},
+				"FORBIDDEN when INVALID TENANT": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "testtenant",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "test.tenant.com",
+						"protocol":          "http",
+						"tenantId":          11111111,
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+				"BAD REQUEST when INVALID PROTOCOL": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "testprotocol",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "test.protocol.com",
+						"protocol":          "httttpppss",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"BAD REQUEST when INVALID IPV4 ADDRESS": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "testip",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "test.ip.com",
+						"ipAddress":         "311.255.323.412",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"BAD REQUEST when INVALID IPV6 ADDRESS": {
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "testipv6",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "origin1.example.com",
+						"ip6Address":        "badipv6::addresss",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+			},
+			"PUT": {
+				"OK when VALID request": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":            "origin2",
+						"cachegroup":      "multiOriginCachegroup",
+						"Coordinate":      "coordinate2",
+						"deliveryService": "ds3",
+						"fqdn":            "originupdated.example.com",
+						"ipAddress":       "1.2.3.4",
+						"ip6Address":      "0000::1111",
+						"port":            1234,
+						"protocol":        "http",
+						"tenantId":        GetTenantID(t, "tenant2")(),
+					},
+					Expectations: utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK),
+						validateOriginsUpdateCreateFields("origin2", map[string]interface{}{"Cachegroup": "multiOriginCachegroup", "Coordinate": "coordinate2", "DeliveryService": "ds3",
+							"FQDN": "originupdated.example.com", "IPAddress": "1.2.3.4", "IP6Address": "0000::1111", "Port": 1234, "Protocol": "http", "Tenant": "tenant2"})),
+				},
+				"FORBIDDEN when CHILD TENANT updates PARENT TENANT ORIGIN": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: tenant4UserSession,
+					RequestBody: map[string]interface{}{
+						"name":              "testtenancy",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "testtenancy.example.com",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+				"NOT FOUND when ORIGIN DOESNT EXIST": {
+					EndpointId:    func() int { return 1111111 },
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "testid",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "testid.example.com",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusNotFound)),
+				},
+				"BAD REQUEST when DELIVERY SERVICE DOESNT EXIST": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "origin2",
+						"deliveryServiceId": 11111111,
+						"fqdn":              "origin2.example.com",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"NOT FOUND when CACHEGROUP DOESNT EXIST": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "origin2",
+						"cachegroupId":      1111111,
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "origin2.example.com",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusNotFound)),
+				},
+				"NOT FOUND when PROFILEID DOESNT EXIST": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "origin2",
+						"cachegroup":        "originCachegroup",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "origin2.example.com",
+						"profileId":         11111111,
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusNotFound)),
+				},
+				"NOT FOUND when COORDINATE DOESNT EXIST": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "origin2",
+						"cachegroup":        "originCachegroup",
+						"coordinateId":      1111111,
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "origin2.example.com",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusNotFound)),
+				},
+				"FORBIDDEN when INVALID TENANT": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "origin1",
+						"cachegroup":        "originCachegroup",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "origin1.example.com",
+						"protocol":          "http",
+						"tenantId":          1111111,
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+				"BAD REQUEST when INVALID PROTOCOL": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "origin2",
+						"cachegroup":        "originCachegroup",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds1")(),
+						"fqdn":              "origin2.example.com",
+						"protocol":          "htttttpssss",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"BAD REQUEST when INVALID IPV4 ADDRESS": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "origin2",
+						"cachegroup":        "originCachegroup",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds2")(),
+						"fqdn":              "origin2.example.com",
+						"ipAddress":         "300.254.123.1",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"BAD REQUEST when INVALID IPV6 ADDRESS": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "origin2",
+						"cachegroup":        "originCachegroup",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds2")(),
+						"fqdn":              "origin2.example.com",
+						"ip6Address":        "test::42",
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"BAD REQUEST when INVALID PORT": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":              "origin2",
+						"cachegroup":        "originCachegroup",
+						"deliveryServiceId": GetDeliveryServiceId(t, "ds2")(),
+						"fqdn":              "origin2.example.com",
+						"port":              80000,
+						"protocol":          "http",
+						"tenantId":          GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+				},
+				"PRECONDITION FAILED when updating with IMS & IUS Headers": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestOpts:   client.RequestOptions{Header: http.Header{rfc.IfUnmodifiedSince: {currentTimeRFC}}},
+					RequestBody: map[string]interface{}{
+						"name":            "origin2",
+						"cachegroup":      "originCachegroup",
+						"deliveryService": "ds2",
+						"fqdn":            "origin2.example.com",
+						"protocol":        "http",
+						"tenantId":        GetTenantID(t, "tenant1")(),
+					},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusPreconditionFailed)),
+				},
+				"PRECONDITION FAILED when updating with IFMATCH ETAG Header": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: TOSession,
+					RequestBody: map[string]interface{}{
+						"name":            "origin2",
+						"cachegroup":      "originCachegroup",
+						"deliveryService": "ds2",
+						"fqdn":            "origin2.example.com",
+						"protocol":        "http",
+						"tenantId":        GetTenantID(t, "tenant1")(),
+					},
+					RequestOpts:  client.RequestOptions{Header: http.Header{rfc.IfMatch: {rfc.ETag(currentTime)}}},
+					Expectations: utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusPreconditionFailed)),
+				},
+			},
+			"DELETE": {
+				"NOT FOUND when DOESNT EXIST": {
+					EndpointId:    func() int { return 11111111 },
+					ClientSession: TOSession,
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusNotFound)),
+				},
+				"FORBIDDEN when CHILD TENANT deletes PARENT TENANT ORIGIN": {
+					EndpointId:    GetOriginID(t, "origin2"),
+					ClientSession: tenant4UserSession,
+					Expectations:  utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusForbidden)),
+				},
+			},
+		}
 
-	// update port and FQDN values on origin
-	remoteOrigin.Port = &updatedPort
-	remoteOrigin.FQDN = &updatedFQDN
-	opts.QueryParameters.Del("name")
-	opts.Header = header
-	_, reqInf, err := TOSession.UpdateOrigin(*remoteOrigin.ID, remoteOrigin, 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)
-	}
+		for method, testCases := range methodTests {
+			t.Run(method, func(t *testing.T) {
+				for name, testCase := range testCases {
+					origin := tc.Origin{}
+
+					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, &origin)
+						assert.NoError(t, err, "Error occurred when unmarshalling request body: %v", err)
+					}
+
+					switch method {
+					case "GET":
+						t.Run(name, func(t *testing.T) {
+							resp, reqInf, err := testCase.ClientSession.GetOrigins(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.CreateOrigin(origin, 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.UpdateOrigin(testCase.EndpointId(), origin, testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, resp.Response, resp.Alerts, err)
+							}
+						})
+					case "DELETE":
+						t.Run(name, func(t *testing.T) {
+							alerts, reqInf, err := testCase.ClientSession.DeleteOrigin(testCase.EndpointId(), testCase.RequestOpts)
+							for _, check := range testCase.Expectations {
+								check(t, reqInf, nil, alerts, err)
+							}
+						})
+					}
+				}
+			})
+		}
+	})
 }
 
-func CreateTestOrigins(t *testing.T) {
-	// loop through origins, assign FKs and create
-	for _, origin := range testData.Origins {
-		resp, _, err := TOSession.CreateOrigin(origin, client.RequestOptions{})
-		if err != nil {
-			t.Errorf("could not create Origins: %v - alerts: %+v", err, resp.Alerts)
+func validateOriginsFields(expectedResp map[string]interface{}) utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ tc.Alerts, _ error) {
+		assert.RequireNotNil(t, resp, "Expected Origin response to not be nil.")
+		originResp := resp.([]tc.Origin)
+		for field, expected := range expectedResp {
+			for _, origin := range originResp {
+				switch field {
+				case "Cachegroup":
+					assert.RequireNotNil(t, origin.Cachegroup, "Expected Cachegroup to not be nil.")
+					assert.Equal(t, expected, *origin.Cachegroup, "Expected Cachegroup to be %v, but got %s", expected, *origin.Cachegroup)
+				case "CachegroupID":
+					assert.RequireNotNil(t, origin.CachegroupID, "Expected CachegroupID to not be nil.")
+					assert.Equal(t, expected, *origin.CachegroupID, "Expected CachegroupID to be %v, but got %d", expected, *origin.Cachegroup)
+				case "Coordinate":
+					assert.RequireNotNil(t, origin.Coordinate, "Expected Coordinate to not be nil.")
+					assert.Equal(t, expected, *origin.Coordinate, "Expected Coordinate to be %v, but got %s", expected, *origin.Coordinate)
+				case "CoordinateID":
+					assert.RequireNotNil(t, origin.CoordinateID, "Expected CoordinateID to not be nil.")
+					assert.Equal(t, expected, *origin.CoordinateID, "Expected CoordinateID to be %v, but got %d", expected, *origin.CoordinateID)
+				case "DeliveryService":
+					assert.RequireNotNil(t, origin.DeliveryService, "Expected DeliveryService to not be nil.")
+					assert.Equal(t, expected, *origin.DeliveryService, "Expected DeliveryService to be %v, but got %s", expected, *origin.DeliveryService)
+				case "DeliveryServiceID":
+					assert.RequireNotNil(t, origin.DeliveryServiceID, "Expected DeliveryServiceID to not be nil.")
+					assert.Equal(t, expected, *origin.DeliveryServiceID, "Expected DeliveryServiceID to be %v, but got %d", expected, *origin.DeliveryServiceID)
+				case "FQDN":
+					assert.RequireNotNil(t, origin.FQDN, "Expected FQDN to not be nil.")
+					assert.Equal(t, expected, *origin.FQDN, "Expected FQDN to be %v, but got %s", expected, *origin.FQDN)
+				case "ID":
+					assert.RequireNotNil(t, origin.ID, "Expected ID to not be nil.")
+					assert.Equal(t, expected, *origin.ID, "Expected ID to be %v, but got %d", expected, *origin.ID)
+				case "IPAddress":
+					assert.RequireNotNil(t, origin.IPAddress, "Expected IPAddress to not be nil.")
+					assert.Equal(t, expected, *origin.IPAddress, "Expected IPAddress to be %v, but got %s", expected, *origin.IPAddress)
+				case "IP6Address":
+					assert.RequireNotNil(t, origin.IP6Address, "Expected IP6Address to not be nil.")
+					assert.Equal(t, expected, *origin.IP6Address, "Expected IP6Address to be %v, but got %s", expected, *origin.IP6Address)
+				case "IsPrimary":
+					assert.RequireNotNil(t, origin.IsPrimary, "Expected IsPrimary to not be nil.")
+					assert.Equal(t, expected, *origin.IsPrimary, "Expected IsPrimary to be %v, but got %v", expected, *origin.IsPrimary)
+				case "Name":
+					assert.RequireNotNil(t, origin.Name, "Expected Name to not be nil.")
+					assert.Equal(t, expected, *origin.Name, "Expected Name to be %v, but got %s", expected, *origin.Name)
+				case "Port":
+					assert.RequireNotNil(t, origin.Port, "Expected Port to not be nil.")
+					assert.Equal(t, expected, *origin.Port, "Expected Port to be %v, but got %d", expected, *origin.Port)
+				case "Profile":
+					assert.RequireNotNil(t, origin.Profile, "Expected Profile to not be nil.")
+					assert.Equal(t, expected, *origin.Profile, "Expected Profile to be %v, but got %s", expected, *origin.Profile)
+				case "ProfileID":
+					assert.RequireNotNil(t, origin.ProfileID, "Expected ProfileID to not be nil.")
+					assert.Equal(t, expected, *origin.ProfileID, "Expected ProfileID to be %v, but got %d", expected, *origin.ProfileID)
+				case "Protocol":
+					assert.RequireNotNil(t, origin.Protocol, "Expected Protocol to not be nil.")
+					assert.Equal(t, expected, *origin.Protocol, "Expected Tenant to be %v, but got %s", expected, *origin.Protocol)
+				case "Tenant":
+					assert.RequireNotNil(t, origin.Tenant, "Expected Tenant to not be nil.")
+					assert.Equal(t, expected, *origin.Tenant, "Expected Tenant to be %v, but got %s", expected, *origin.Tenant)
+				case "TenantID":
+					assert.RequireNotNil(t, origin.TenantID, "Expected TenantID to not be nil.")
+					assert.Equal(t, expected, *origin.TenantID, "Expected TenantID to be %v, but got %d", expected, *origin.TenantID)
+				default:
+					t.Errorf("Expected field: %v, does not exist in response", field)
+				}
+			}
 		}
 	}
 }
 
-func CreateTestOriginDuplicateData(t *testing.T) {
-	if len(testData.Origins) < 1 {
-		t.Fatal("Need at least one Origin to test duplicate scenario")
-	}
-	firstOrigin := testData.Origins[0]
-	if firstOrigin.Name == nil {
-		t.Fatalf("couldn't get the name of test origin server")
-	}
-	resp, reqInf, err := TOSession.CreateOrigin(firstOrigin, client.RequestOptions{})
-	if reqInf.StatusCode != http.StatusBadRequest {
-		t.Errorf("Expected 400 Status code, but found %d", reqInf.StatusCode)
-	}
-	if err == nil {
-		t.Errorf("Expected, origin name %s already exists, but no error found - Alerts %v", *firstOrigin.Name, resp.Alerts)
+func validateOriginsUpdateCreateFields(name string, expectedResp map[string]interface{}) utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ tc.Alerts, _ error) {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", name)
+		origin, _, err := TOSession.GetOrigins(opts)
+		assert.RequireNoError(t, err, "Error getting Origin: %v - alerts: %+v", err, origin.Alerts)
+		assert.RequireEqual(t, 1, len(origin.Response), "Expected one Origin returned Got: %d", len(origin.Response))
+		validateOriginsFields(expectedResp)(t, toclientlib.ReqInf{}, origin.Response, tc.Alerts{}, nil)
 	}
 }
 
-func NotFoundDeleteTest(t *testing.T) {
-	resp, _, err := TOSession.DeleteOrigin(2020, client.RequestOptions{})
-	if err == nil {
-		t.Fatal("deleting origin with what should be a non-existent id - expected: error, actual: nil error")
-	}
-
-	found := false
-	for _, alert := range resp.Alerts {
-		if alert.Level == tc.ErrorLevel.String() && strings.Contains(alert.Text, "not found") {
-			found = true
-			break
+func validateOriginsPagination(paginationParam string) utils.CkReqFunc {
+	return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ tc.Alerts, _ error) {
+		paginationResp := resp.([]tc.Origin)
+
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("orderby", "id")
+		respBase, _, err := TOSession.GetOrigins(opts)
+		assert.RequireNoError(t, err, "Cannot get Origins: %v - alerts: %+v", err, respBase.Alerts)
+
+		origin := respBase.Response
+		assert.RequireGreaterOrEqual(t, len(origin), 3, "Need at least 3 Origins in Traffic Ops to test pagination support, found: %d", len(origin))
+		switch paginationParam {
+		case "limit:":
+			assert.Exactly(t, origin[:1], paginationResp, "expected GET Origins with limit = 1 to return first result")
+		case "offset":
+			assert.Exactly(t, origin[1:2], paginationResp, "expected GET Origins with limit = 1, offset = 1 to return second result")
+		case "page":
+			assert.Exactly(t, origin[1:2], paginationResp, "expected GET Origins with limit = 1, page = 2 to return second result")
 		}
 	}
-	if !found {
-		t.Errorf("deleted origin with what should be a non-existent id - expected: 'not found' error-level alert, actual: %v - alerts: %+v", err, resp.Alerts)
-	}
 }
 
-func GetTestOrigins(t *testing.T) {
-	resp, _, err := TOSession.GetOrigins(client.RequestOptions{})
-	if err != nil {
-		t.Errorf("cannot get Origins: %v - alerts: %+v", err, resp.Alerts)
-	}
-
-	opts := client.NewRequestOptions()
-	for _, origin := range testData.Origins {
-		opts.QueryParameters.Set("name", *origin.Name)
-		resp, _, err := TOSession.GetOrigins(opts)
-		if err != nil {
-			t.Errorf("cannot get Origin by name: %v - alerts: %+v", err, resp.Alerts)
-		}
+func GetOriginID(t *testing.T, name string) func() int {
+	return func() int {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", name)
+		origins, _, err := TOSession.GetOrigins(opts)
+		assert.RequireNoError(t, err, "Get Origins Request failed with error:", err)
+		assert.RequireEqual(t, 1, len(origins.Response), "Expected response object length 1, but got %d", len(origins.Response))
+		assert.RequireNotNil(t, origins.Response[0].ID, "Expected ID to not be nil.")
+		return *origins.Response[0].ID
 	}
 }
 
-func UpdateTestOrigins(t *testing.T) {
-	if len(testData.Origins) < 1 {
-		t.Fatal("Need at least one Origin to test updating Origins")
-	}
-	firstOrigin := testData.Origins[0]
-	if firstOrigin.Name == nil {
-		t.Fatal("Found an Origin in the testing data with null or undefined name")
-	}
-	foName := *firstOrigin.Name
-
-	// Retrieve the origin by name so we can get the id for the Update
-	opts := client.NewRequestOptions()
-	opts.QueryParameters.Set("name", foName)
-	resp, _, err := TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Errorf("cannot get Origin '%s': %v - alerts: %+v", foName, err, resp.Alerts)
-	}
-	if len(resp.Response) != 1 {
-		t.Fatalf("Expected exactly one Origin to exist with name '%s', found: %d", foName, len(resp.Response))
-	}
-
-	remoteOrigin := resp.Response[0]
-	if remoteOrigin.ID == nil {
-		t.Fatalf("Traffic Ops responded with a representation of Origin '%s' that had null or undefined ID", foName)
-	}
-	updatedPort := 4321
-	updatedFQDN := "updated.example.com"
-	updatedIpAddress := "5.6.7.8"
-	updatedIpv6Address := "dead:beef:cafe::455"
-	updatedIsPrimary := false
-	updatedProfile := "EDGEInCDN2"
-	updateDeliveryService := "ds3"
-	updateCachegroup := "multiOriginCachegroup"
-	updateCoordinate := "coordinate2"
-	updateProtocol := "https"
-	updateTenant := "tenant2"
-
-	// update Cachegroup/Coordinate/Name/Delivery Service/Port/FQDN/IPAddress/IPV6Address/Profile/IsPrimary/Protocol/Tenant values on origin
-	originRequest := tc.Origin{
-		Cachegroup:      &updateCachegroup,
-		Coordinate:      &updateCoordinate,
-		Name:            remoteOrigin.Name,
-		DeliveryService: &updateDeliveryService,
-		FQDN:            &updatedFQDN,
-		IP6Address:      &updatedIpv6Address,
-		IPAddress:       &updatedIpAddress,
-		IsPrimary:       &updatedIsPrimary,
-		Port:            &updatedPort,
-		Profile:         &updatedProfile,
-		Protocol:        &updateProtocol,
-		Tenant:          &updateTenant,
-	}
-
-	updResp, reqInf, err := TOSession.UpdateOrigin(*remoteOrigin.ID, originRequest, client.RequestOptions{})
-	if err != nil {
-		t.Errorf("cannot update Origin '%s' (#%d): %v - %v", foName, *remoteOrigin.ID, err, updResp.Alerts)
-	}
-	if reqInf.StatusCode != http.StatusOK {
-		t.Errorf("Expected 200 Status Code, but found %d", reqInf.StatusCode)
-	}
-	// Retrieve the origin to check cachegroup, coordinate, deliveryservice, port, FQDN, IPAddress, IPV6Address, Profile, IsPrimary, Protocol, Tenant values were updated
-	opts.QueryParameters.Del("name")
-	opts.QueryParameters.Set("id", strconv.Itoa(*remoteOrigin.ID))
-	resp, _, err = TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Errorf("cannot get Origin #%d ('%s'): %v - alerts: %+v", *remoteOrigin.ID, foName, err, resp.Alerts)
-	}
-	if len(resp.Response) != 1 {
-		t.Fatalf("Expected exactly one Origin to exist with ID %d, found: %d", *remoteOrigin.ID, len(resp.Response))
-	}
-	respOrigin := resp.Response[0]
-
-	if respOrigin.Cachegroup == nil {
-		t.Errorf("results do not match, actual: null or undefined - expected: %s", updateCachegroup)
-	} else if *respOrigin.Cachegroup != updateCachegroup {
-		t.Errorf("results do not match actual: %s, expected: %s", *respOrigin.Cachegroup, updateCachegroup)
-	}
-
-	if respOrigin.Coordinate == nil {
-		t.Errorf("results do not match, actual: null or undefined - expected: %s", updateCoordinate)
-	} else if *respOrigin.Coordinate != updateCoordinate {
-		t.Errorf("results do not match actual: %s, expected: %s", *respOrigin.Coordinate, updateCoordinate)
-	}
-
-	if respOrigin.DeliveryService == nil {
-		t.Errorf("results do not match, actual: null or undefined - expected: %s", updateDeliveryService)
-	} else if *respOrigin.DeliveryService != updateDeliveryService {
-		t.Errorf("results do not match actual: %s, expected: %s", *respOrigin.DeliveryService, updateDeliveryService)
-	}
-
-	if respOrigin.Port == nil {
-		t.Errorf("results do not match, actual: null or undefined - expected: %d", updatedPort)
-	} else if *respOrigin.Port != updatedPort {
-		t.Errorf("results do not match actual: %d, expected: %d", *respOrigin.Port, updatedPort)
-	}
-	if respOrigin.FQDN == nil {
-		t.Errorf("results do not match, actual: null or undefined, expected: '%s'", updatedFQDN)
-	} else if *respOrigin.FQDN != updatedFQDN {
-		t.Errorf("results do not match actual: %s, expected: %s", *respOrigin.FQDN, updatedFQDN)
-	}
-	if respOrigin.IPAddress == nil {
-		t.Errorf("results do not match, actual: null or undefined, expected: '%s'", updatedIpAddress)
-	} else if *respOrigin.IPAddress != updatedIpAddress {
-		t.Errorf("results do not match actual: %s, expected: %s", *respOrigin.IPAddress, updatedIpAddress)
-	}
-
-	if respOrigin.IP6Address == nil {
-		t.Errorf("results do not match, actual: null or undefined, expected: '%s'", updatedIpv6Address)
-	} else if *respOrigin.IP6Address != updatedIpv6Address {
-		t.Errorf("results do not match actual: %s, expected: %s", *respOrigin.IP6Address, updatedIpv6Address)
-	}
-
-	if respOrigin.IsPrimary == nil {
-		t.Errorf("results do not match, actual: null or undefined, expected: '%t'", updatedIsPrimary)
-	} else if *respOrigin.IsPrimary != updatedIsPrimary {
-		t.Errorf("results do not match actual: %t, expected: %t", *respOrigin.IsPrimary, updatedIsPrimary)
-	}
-
-	if respOrigin.Profile == nil {
-		t.Errorf("results do not match, actual: null or undefined, expected: '%s'", updatedProfile)
-	} else if *respOrigin.Profile != updatedProfile {
-		t.Errorf("results do not match actual: %s, expected: %s", *respOrigin.Profile, updatedProfile)
-	}
-
-	if respOrigin.Protocol == nil {
-		t.Errorf("results do not match, actual: null or undefined, expected: '%s'", updateProtocol)
-	} else if *respOrigin.Protocol != updateProtocol {
-		t.Errorf("results do not match actual: %s, expected: %s", *respOrigin.Protocol, updateProtocol)
-	}
-
-	if respOrigin.Tenant == nil {
-		t.Errorf("results do not match, actual: null or undefined, expected: '%s'", updateTenant)
-	} else if *respOrigin.Tenant != updateTenant {
-		t.Errorf("results do not match actual: %s, expected: %s", *respOrigin.Tenant, updateTenant)
+func CreateTestOrigins(t *testing.T) {
+	for _, origin := range testData.Origins {
+		resp, _, err := TOSession.CreateOrigin(origin, client.RequestOptions{})
+		assert.RequireNoError(t, err, "Could not create Origins: %v - alerts: %+v", err, resp.Alerts)
 	}
 }
 
-func OriginTenancyTest(t *testing.T) {
+func DeleteTestOrigins(t *testing.T) {
 	origins, _, err := TOSession.GetOrigins(client.RequestOptions{})
-	if err != nil {
-		t.Errorf("cannot get Origins: %v - alerts: %+v", err, origins.Alerts)
-	}
-	if len(origins.Response) < 1 {
-		t.Fatal("Need at least one Origin to exist in Traffic Ops to test Tenancy for Origins")
-	}
-	// This ID check specifically needs to be a fatal condition, despite also being an error below,
-	// because we explicitly dereference the ID of the 0th Origin in this slice later on.
-	if origins.Response[0].ID == nil || origins.Response[0].Name == nil {
-		t.Fatal("Traffic Ops returned a representation for an Origin with null or undefined ID and/or Name")
-	}
-
-	var tenant3Origin tc.Origin
-	foundTenant3Origin := false
-	for _, o := range origins.Response {
-		if o.FQDN == nil || o.ID == nil {
-			t.Error("Traffic Ops responded with a representation of an Origin with null or undefined FQDN and/or ID")
-			continue
-		}
-		if *o.FQDN == "origin.ds3.example.net" {
-			tenant3Origin = o
-			foundTenant3Origin = true
-		}
-	}
-	if !foundTenant3Origin {
-		t.Error("expected to find origin with tenant 'tenant3' and fqdn 'origin.ds3.example.net'")
-	}
-
-	toReqTimeout := time.Second * time.Duration(Config.Default.Session.TimeoutInSecs)
-	tenant4TOClient, _, err := client.LoginWithAgent(TOSession.URL, "tenant4user", "pa$$word", true, "to-api-v3-client-tests/tenant4user", true, toReqTimeout)
-	if err != nil {
-		t.Fatalf("failed to log in with tenant4user: %v", err)
-	}
-
-	originsReadableByTenant4, _, err := tenant4TOClient.GetOrigins(client.RequestOptions{})
-	if err != nil {
-		t.Errorf("tenant4user cannot get Origins: %v - alerts: %+v", err, originsReadableByTenant4.Alerts)
-	}
-
-	// assert that tenant4user cannot read origins outside of its tenant
-	for _, origin := range originsReadableByTenant4.Response {
-		if origin.FQDN == nil {
-			t.Error("Traffic Ops returned a representation of an Origin with null or undefined FQDN")
-		} else if *origin.FQDN == "origin.ds3.example.net" {
-			t.Error("expected tenant4 to be unable to read origins from tenant 3")
+	assert.NoError(t, err, "Cannot get Origins : %v - alerts: %+v", err, origins.Alerts)
+
+	for _, origin := range origins.Response {
+		assert.RequireNotNil(t, origin.ID, "Expected origin ID to not be nil.")
+		assert.RequireNotNil(t, origin.Name, "Expected origin ID to not be nil.")
+		assert.RequireNotNil(t, origin.IsPrimary, "Expected origin ID to not be nil.")
+		if !*origin.IsPrimary {
+			alerts, _, err := TOSession.DeleteOrigin(*origin.ID, client.RequestOptions{})
+			assert.NoError(t, err, "Unexpected error deleting Origin '%s' (#%d): %v - alerts: %+v", *origin.Name, *origin.ID, err, alerts.Alerts)
+			// Retrieve the Origin to see if it got deleted
+			opts := client.NewRequestOptions()
+			opts.QueryParameters.Set("id", strconv.Itoa(*origin.ID))
+			getOrigin, _, err := TOSession.GetOrigins(opts)
+			assert.NoError(t, err, "Error getting Origin '%s' after deletion: %v - alerts: %+v", *origin.Name, err, getOrigin.Alerts)
+			assert.Equal(t, 0, len(getOrigin.Response), "Expected Origin '%s' to be deleted, but it was found in Traffic Ops", *origin.Name)
 		}
 	}
-
-	// assert that tenant4user cannot update tenant3user's origin
-	if _, _, err = tenant4TOClient.UpdateOrigin(*tenant3Origin.ID, tenant3Origin, client.RequestOptions{}); err == nil {
-		t.Error("expected tenant4user to be unable to update tenant3's origin")
-	}
-
-	// assert that tenant4user cannot delete an origin outside of its tenant
-	if _, _, err = tenant4TOClient.DeleteOrigin(*origins.Response[0].ID, client.RequestOptions{}); err == nil {
-		t.Errorf("expected tenant4user to be unable to delete an origin outside of its tenant (origin %s)", *origins.Response[0].Name)
-	}
-
-	// assert that tenant4user cannot create origins outside of its tenant
-	tenant3Origin.FQDN = util.StrPtr("origin.tenancy.test.example.com")
-	if _, _, err = tenant4TOClient.CreateOrigin(tenant3Origin, client.RequestOptions{}); err == nil {
-		t.Error("expected tenant4user to be unable to create an origin outside of its tenant")
-	}
 }
 
 func alertsHaveError(alerts []tc.Alert, err string) bool {
@@ -368,532 +679,3 @@ func alertsHaveError(alerts []tc.Alert, err string) bool {
 	}
 	return false
 }
-
-func GetTestPaginationSupportOrigins(t *testing.T) {
-	opts := client.NewRequestOptions()
-	opts.QueryParameters.Set("orderby", "id")
-	resp, _, err := TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Fatalf("cannot get Origins: %v - alerts: %+v", err, resp.Alerts)
-	}
-	origins := resp.Response
-	if len(origins) < 3 {
-		t.Fatalf("Need at least 3 Origins in Traffic Ops to test pagination, found: %d", len(resp.Response))
-	}
-
-	opts.QueryParameters.Set("limit", "1")
-	originsWithLimit, _, err := TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Fatalf("cannot get Origins with limit: %v - alerts: %+v", err, originsWithLimit.Alerts)
-	}
-	if !reflect.DeepEqual(origins[:1], originsWithLimit.Response) {
-		t.Error("expected GET origins with limit = 1 to return first result")
-	}
-
-	opts.QueryParameters.Set("offset", "1")
-	originsWithOffset, _, err := TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Fatalf("cannot get Origins with offset: %v - alerts: %+v", err, originsWithOffset.Alerts)
-	}
-	if !reflect.DeepEqual(origins[1:2], originsWithOffset.Response) {
-		t.Error("expected GET origins with limit = 1, offset = 1 to return second result")
-	}
-
-	opts.QueryParameters.Del("offset")
-	opts.QueryParameters.Set("page", "2")
-	originsWithPage, _, err := TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Fatalf("cannot get Origins with page: %v - alerts: %+v", err, originsWithPage.Alerts)
-	}
-	if !reflect.DeepEqual(origins[1:2], originsWithPage.Response) {
-		t.Error("expected GET origins with limit = 1, page = 2 to return second result")
-	}
-
-	opts.QueryParameters.Del("page")
-	opts.QueryParameters.Del("orderby")
-	opts.QueryParameters.Set("limit", "-2")
-	resp, _, err = TOSession.GetOrigins(opts)
-	if err == nil {
-		t.Error("expected GET origins to return an error when limit is not bigger than -1")
-	} else if !alertsHaveError(resp.Alerts.Alerts, "must be bigger than -1") {
-		t.Errorf("expected GET origins to return an error for limit is not bigger than -1, actual error: " + err.Error())
-	}
-
-	opts.QueryParameters.Set("limit", "1")
-	opts.QueryParameters.Set("offset", "0")
-	resp, _, err = TOSession.GetOrigins(opts)
-	if err == nil {
-		t.Error("expected GET origins to return an error when offset is not a positive integer")
-	} else if !alertsHaveError(resp.Alerts.Alerts, "must be a positive integer") {
-		t.Errorf("expected GET origins to return an error for offset is not a positive integer, actual error: " + err.Error())
-	}
-
-	opts.QueryParameters.Del("offset")
-	opts.QueryParameters.Set("page", "0")
-	resp, _, err = TOSession.GetOrigins(opts)
-	if err == nil {
-		t.Error("expected GET origins to return an error when page is not a positive integer")
-	} else if !alertsHaveError(resp.Alerts.Alerts, "must be a positive integer") {
-		t.Errorf("expected GET origins to return an error for page is not a positive integer, actual error: " + err.Error())
-	}
-}
-
-func DeleteTestOrigins(t *testing.T) {
-	opts := client.NewRequestOptions()
-	for _, origin := range testData.Origins {
-		if origin.Name == nil {
-			t.Error("Found an Origin in the testing data with null or undefined name")
-			continue
-		}
-
-		opts.QueryParameters.Set("name", *origin.Name)
-		resp, _, err := TOSession.GetOrigins(opts)
-		if err != nil {
-			t.Errorf("cannot get Origin '%s': %v - alerts: %+v", *origin.Name, err, resp.Alerts)
-		}
-		if len(resp.Response) > 0 {
-			respOrigin := resp.Response[0]
-			if respOrigin.ID == nil {
-				t.Error("Traffic Ops returned a representation for an Origin that has null or undefined ID")
-				continue
-			}
-			delResp, _, err := TOSession.DeleteOrigin(*respOrigin.ID, client.RequestOptions{})
-			if err != nil {
-				t.Errorf("cannot DELETE Origin by ID: %v - %v", err, delResp)
-			}
-
-			// Retrieve the Origin to see if it got deleted
-			org, _, err := TOSession.GetOrigins(opts)
-			if err != nil {
-				t.Errorf("error fetching Origin '%s' after deletion: %v - alerts: %+v", *origin.Name, err, org.Alerts)
-			}
-			if len(org.Response) > 0 {
-				t.Errorf("expected Origin '%s' to be deleted, but it was found in Traffic Ops", *origin.Name)
-			}
-		}
-	}
-}
-
-func GetTestOriginsByParams(t *testing.T) {
-	if len(testData.Origins) < 1 {
-		t.Fatal("Need at least one Origin to test Get Origins by params")
-	}
-	origins := testData.Origins[0]
-	if origins.Name == nil || len(*origins.Name) == 0 {
-		t.Fatal("Found nil value in Origin name")
-	}
-	opts := client.NewRequestOptions()
-	opts.QueryParameters.Set("name", *origins.Name)
-	originByName, _, _ := TOSession.GetOrigins(opts)
-	if len(originByName.Response) < 1 {
-		t.Fatalf("Expected atleast one Origin for GET Origin by Delivery Service, but found %d", len(originByName.Response))
-	}
-	if originByName.Response[0].DeliveryServiceID == nil {
-		t.Fatal("Found nil value in delivery service")
-	}
-	if originByName.Response[0].CachegroupID == nil {
-		t.Fatal("Found nil value in Cachegroup")
-	}
-	if originByName.Response[0].CoordinateID == nil {
-		t.Fatal("Found nil value in Coordinate")
-	}
-	if originByName.Response[0].ProfileID == nil {
-		t.Fatal("Found nil value in Profile")
-	}
-	if originByName.Response[0].IsPrimary == nil {
-		t.Fatal("Found nil value in IsPrimary field")
-	}
-
-	//Get Origins by DSID
-	dsId := *originByName.Response[0].DeliveryServiceID
-	opts.QueryParameters.Del("name")
-	opts.QueryParameters.Set("deliveryservice", strconv.Itoa(dsId))
-	originByDs, _, err := TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Errorf("cannot get Origin by DeliveryService ID: %v - alerts: %+v", err, originByDs.Alerts)
-	}
-	if len(originByDs.Response) < 1 {
-		t.Fatalf("Expected atleast one Origin for GET Origin by Delivery Service, but found %d", len(originByDs.Response))
-	}
-
-	//Get Origins by Cachegroup
-	cachegroupID := *originByName.Response[0].CachegroupID
-	opts.QueryParameters.Del("deliveryservice")
-	opts.QueryParameters.Set("cachegroup", strconv.Itoa(cachegroupID))
-	originByCg, _, err := TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Errorf("cannot get Origin by Cachegroup ID: %v - alerts: %+v", err, originByCg.Alerts)
-	}
-	if len(originByCg.Response) < 1 {
-		t.Fatalf("Expected atleast one Origin for GET Origin by Cachegroups, but found %d", len(originByCg.Response))
-	}
-
-	//Get Origins by Coordinate
-	CoordinateID := *originByName.Response[0].CoordinateID
-	opts.QueryParameters.Del("cachegroup")
-	opts.QueryParameters.Set("coordinate", strconv.Itoa(CoordinateID))
-	originByCoordinate, _, err := TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Errorf("cannot get Origin by Coordinate ID: %v - alerts: %+v", err, originByCoordinate.Alerts)
-	}
-	if len(originByCoordinate.Response) < 1 {
-		t.Fatalf("Expected atleast one Origin for GET Origin by Coordinate, but found %d", len(originByCoordinate.Response))
-	}
-
-	//Get Origins by Profile
-	profileId := *originByName.Response[0].ProfileID
-	opts.QueryParameters.Del("coordinate")
-	opts.QueryParameters.Set("profileId", strconv.Itoa(profileId))
-	originByProfile, _, err := TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Errorf("cannot get Origin by Profile ID: %v - alerts: %+v", err, originByProfile.Alerts)
-	}
-	if len(originByProfile.Response) < 1 {
-		t.Fatalf("Expected atleast one Origin for GET Origin by Profile, but found %d", len(originByProfile.Response))
-	}
-
-	//Get Origins by Primary
-	isPrimary := *originByName.Response[0].IsPrimary
-	opts.QueryParameters.Del("profileId")
-	opts.QueryParameters.Set("isPrimary", strconv.FormatBool(isPrimary))
-	originByPrimary, _, err := TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Errorf("cannot get Origin by Primary ID: %v - alerts: %+v", err, originByPrimary.Alerts)
-	}
-	if len(originByPrimary.Response) < 1 {
-		t.Fatalf("Expected atleast one Origin for GET Origin by Primary, but found %d", len(originByPrimary.Response))
-	}
-
-	//Get Origins by Tenant
-	tenant := *originByName.Response[0].TenantID
-	opts.QueryParameters.Del("isPrimary")
-	opts.QueryParameters.Set("tenant", strconv.Itoa(tenant))
-	originByTenant, _, err := TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Errorf("cannot get Origin by Tenant ID: %v - alerts: %+v", err, originByTenant.Alerts)
-	}
-	if len(originByTenant.Response) < 1 {
-		t.Fatalf("Expected atleast one Origin for GET Origin by Tenant, but found %d", len(originByTenant.Response))
-	}
-}
-
-func GetTestOriginsByInvalidParams(t *testing.T) {
-
-	opts := client.NewRequestOptions()
-	opts.QueryParameters.Set("deliveryservice", "12345")
-	originByDs, _, _ := TOSession.GetOrigins(opts)
-	if len(originByDs.Response) > 0 {
-		t.Fatalf("Expected empty response for GET Origin by invalid Delivery Service, but found %d", len(originByDs.Response))
-	}
-
-	//Get Origins by Cachegroup
-	opts.QueryParameters.Del("deliveryservice")
-	opts.QueryParameters.Set("cachegroup", "12345")
-	originByCg, _, _ := TOSession.GetOrigins(opts)
-	if len(originByCg.Response) > 0 {
-		t.Fatalf("Expected empty response for GET Origin by invalid Cachegroups, but found %d", len(originByCg.Response))
-	}
-
-	//Get Origins by Coordinate
-	opts.QueryParameters.Del("cachegroup")
-	opts.QueryParameters.Set("coordinate", "12345")
-	originByCoordinate, _, _ := TOSession.GetOrigins(opts)
-	if len(originByCoordinate.Response) > 0 {
-		t.Fatalf("Expected empty response for GET Origin by invalid Coordinate, but found %d", len(originByCoordinate.Response))
-	}
-
-	//Get Origins by Profile
-	opts.QueryParameters.Del("coordinate")
-	opts.QueryParameters.Set("profileId", "12345")
-	originByProfile, _, _ := TOSession.GetOrigins(opts)
-	if len(originByProfile.Response) > 0 {
-		t.Fatalf("Expected empty response for GET Origin by invalid Profile, but found %d", len(originByProfile.Response))
-	}
-
-	//Get Origins by Tenant
-	opts.QueryParameters.Del("profileId")
-	opts.QueryParameters.Set("tenant", "12345")
-	originByTenant, _, _ := TOSession.GetOrigins(opts)
-	if len(originByTenant.Response) > 0 {
-		t.Fatalf("Expected empty response for GET Origin by invalid Tenant, but found %d", len(originByTenant.Response))
-	}
-
-	//Get Origins by Name
-	opts.QueryParameters.Del("tenant")
-	opts.QueryParameters.Set("name", "abcdef")
-	originByName, _, _ := TOSession.GetOrigins(opts)
-	if len(originByName.Response) > 0 {
-		t.Fatalf("Expected empty response for GET Origin by invalid name, but found %d", len(originByName.Response))
-	}
-
-	//Get Origins by Primary
-	opts.QueryParameters.Del("name")
-	opts.QueryParameters.Set("primary", "12345")
-	originByPrimary, _, _ := TOSession.GetOrigins(opts)
-	if len(originByPrimary.Response) > 0 {
-		t.Fatalf("Expected empty response for GET Origin by invalid Primary, but found %d", len(originByPrimary.Response))
-	}
-}
-
-func CreateTestOriginInvalidData(t *testing.T) {
-	if len(testData.Origins) < 1 {
-		t.Fatal("Need at least one Origin to test duplicate Origins")
-	}
-	firstOrigin := testData.Origins[0]
-	if firstOrigin.Name == nil {
-		t.Fatalf("couldn't get the name of test origin server")
-	}
-	oldCachegroupId := firstOrigin.CachegroupID
-	oldProfileId := firstOrigin.ProfileID
-	oldTenantId := firstOrigin.TenantID
-	oldProtocol := firstOrigin.Protocol
-	oldCoordinateId := firstOrigin.CoordinateID
-	oldIpv4 := firstOrigin.IPAddress
-
-	//invalid cg id
-	cachegroupID := new(int)
-	*cachegroupID = 12345
-	name := new(string)
-	*name = "invalid"
-	firstOrigin.CachegroupID = cachegroupID
-	firstOrigin.Name = name
-	resp, reqInf, err := TOSession.CreateOrigin(firstOrigin, client.RequestOptions{})
-	if reqInf.StatusCode != http.StatusNotFound {
-		t.Errorf("Expected 404 Status code, but found %d", reqInf.StatusCode)
-	}
-	if err == nil {
-		t.Errorf("Expected cachegroup not found - Alerts %v", resp.Alerts)
-	}
-
-	//invalid profile id
-	firstOrigin.CachegroupID = oldCachegroupId
-	profileId := new(int)
-	*profileId = 12345
-	firstOrigin.ProfileID = profileId
-	resp, reqInf, err = TOSession.CreateOrigin(firstOrigin, client.RequestOptions{})
-	if reqInf.StatusCode != http.StatusNotFound {
-		t.Errorf("Expected 404 Status code, but found %d", reqInf.StatusCode)
-	}
-	if err == nil {
-		t.Errorf("Expected profile not found - Alerts %v", resp.Alerts)
-	}
-
-	//invalid tenant id
-	firstOrigin.ProfileID = oldProfileId
-	tenantId := new(int)
-	*tenantId = 12345
-	firstOrigin.TenantID = tenantId
-	resp, reqInf, err = TOSession.CreateOrigin(firstOrigin, client.RequestOptions{})
-	if reqInf.StatusCode != http.StatusForbidden {
-		t.Errorf("Expected 403 Status code, but found %d", reqInf.StatusCode)
-	}
-	if err == nil {
-		t.Errorf("Expected user not authorized for requested tenant - Alerts %v", resp.Alerts)
-	}
-
-	//invalid protocol id
-	firstOrigin.TenantID = oldTenantId
-	protocol := new(string)
-	*protocol = "abcd"
-	firstOrigin.Protocol = protocol
-	resp, reqInf, err = TOSession.CreateOrigin(firstOrigin, client.RequestOptions{})
-	if reqInf.StatusCode != http.StatusBadRequest {
-		t.Errorf("Expected 400 Status code, but found %d", reqInf.StatusCode)
-	}
-	if err == nil {
-		t.Errorf("Expected 'protocol' must be http or https - Alerts %v", resp.Alerts)
-	}
-
-	//invalid coordinate id
-	firstOrigin.Protocol = oldProtocol
-	coordinateId := new(int)
-	*coordinateId = 12345
-	firstOrigin.CoordinateID = coordinateId
-	resp, reqInf, err = TOSession.CreateOrigin(firstOrigin, client.RequestOptions{})
-	if reqInf.StatusCode != http.StatusNotFound {
-		t.Errorf("Expected 404 Status code, but found %d", reqInf.StatusCode)
-	}
-	if err == nil {
-		t.Errorf("Expected coordinate not found - Alerts %v", resp.Alerts)
-	}
-
-	//invalid IPV4
-	firstOrigin.CoordinateID = oldCoordinateId
-	ipv4 := new(string)
-	*ipv4 = "1.11"
-	firstOrigin.IPAddress = ipv4
-	resp, reqInf, err = TOSession.CreateOrigin(firstOrigin, client.RequestOptions{})
-	if reqInf.StatusCode != http.StatusBadRequest {
-		t.Errorf("Expected 400 Status code, but found %d", reqInf.StatusCode)
-	}
-	if err == nil {
-		t.Errorf("Expected 'ipAddress' must be a valid IPv4 address - Alerts %v", resp.Alerts)
-	}
-
-	//invalid IPV6
-	firstOrigin.IPAddress = oldIpv4
-	ipv6 := new(string)
-	*ipv6 = "1:1:1:1:1"
-	firstOrigin.IP6Address = ipv6
-	resp, reqInf, err = TOSession.CreateOrigin(firstOrigin, client.RequestOptions{})
-	if reqInf.StatusCode != http.StatusBadRequest {
-		t.Errorf("Expected 400 Status code, but found %d", reqInf.StatusCode)
-	}
-	if err == nil {
-		t.Errorf("Expected 'ip6Address' must be a valid IPv6 address - Alerts %v", resp.Alerts)
-	}
-}
-
-func updateTestOriginsWithInvalidData(t *testing.T) {
-	if len(testData.Origins) < 1 {
-		t.Fatal("Need at least one Origin to test updating Origins")
-	}
-	firstOrigin := testData.Origins[0]
-	if firstOrigin.Name == nil {
-		t.Fatal("Found an Origin in the testing data with null or undefined name")
-	}
-	foName := *firstOrigin.Name
-	// Retrieve the origin by name so we can get the id for the Update
-	opts := client.NewRequestOptions()
-	opts.QueryParameters.Set("name", foName)
-	resp, _, err := TOSession.GetOrigins(opts)
-	if err != nil {
-		t.Errorf("cannot get Origin '%s': %v - alerts: %+v", foName, err, resp.Alerts)
-	}
-	if len(resp.Response) != 1 {
-		t.Fatalf("Expected exactly one Origin to exist with name '%s', found: %d", foName, len(resp.Response))
-	}
-	remoteOrigin := resp.Response[0]
-	if remoteOrigin.ID == nil {
-		t.Fatalf("Traffic Ops responded with a representation of Origin '%s' that had null or undefined ID", foName)
-	}
-
-	oldCachegroupId := remoteOrigin.CachegroupID
-	oldProfileId := remoteOrigin.ProfileID
-	oldTenantId := remoteOrigin.TenantID
-	oldProtocol := remoteOrigin.Protocol
-	oldCoordinateId := remoteOrigin.CoordinateID
-	oldIpv4 := remoteOrigin.IPAddress
-	oldIpv6 := remoteOrigin.IP6Address
-	oldPort := remoteOrigin.Port
-	oldDeliveryServiceId := remoteOrigin.DeliveryServiceID
-
-	//update invalid port
-	updatedPort := 123456
-	remoteOrigin.Port = &updatedPort
-	updResp, reqInf, err := TOSession.UpdateOrigin(*remoteOrigin.ID, remoteOrigin, client.RequestOptions{})
-	if err == nil {
-		t.Errorf("Expected - Port must be a valid integer between 1 and 65535. Port - %d, Alerts %v", updatedPort, updResp.Alerts)
-	}
-	if reqInf.StatusCode != http.StatusBadRequest {
-		t.Errorf("Expected 400 Status Code, but found %d", reqInf.StatusCode)
-	}
-
-	//update cachegroup id
-	remoteOrigin.Port = oldPort
-	updatedCachegroupId := 123456
-	remoteOrigin.CachegroupID = &updatedCachegroupId
-	updResp, reqInf, err = TOSession.UpdateOrigin(*remoteOrigin.ID, remoteOrigin, client.RequestOptions{})
-	if err == nil {
-		t.Errorf("Expected - Cachegroup not found. Cachegroup - %d, Alerts %v", updatedCachegroupId, updResp.Alerts)
-	}
-	if reqInf.StatusCode != http.StatusNotFound {
-		t.Errorf("Expected 404 Status Code, but found %d", reqInf.StatusCode)
-	}
-
-	//update coordinate id
-	remoteOrigin.CachegroupID = oldCachegroupId
-	updatedCoordinateId := 123456
-	remoteOrigin.CoordinateID = &updatedCoordinateId
-	updResp, reqInf, err = TOSession.UpdateOrigin(*remoteOrigin.ID, remoteOrigin, client.RequestOptions{})
-	if err == nil {
-		t.Errorf("Expected - Coordinate not found, Coordinate - %d, Alerts %v", updatedCoordinateId, updResp.Alerts)
-	}
-	if reqInf.StatusCode != http.StatusNotFound {
-		t.Errorf("Expected 404 Status Code, but found %d", reqInf.StatusCode)
-	}
-
-	//update invalid ds id
-	remoteOrigin.CoordinateID = oldCoordinateId
-	updatedDeliveryServiceId := 123456
-	remoteOrigin.DeliveryServiceID = &updatedDeliveryServiceId
-	updResp, reqInf, err = TOSession.UpdateOrigin(*remoteOrigin.ID, remoteOrigin, client.RequestOptions{})
-	if err == nil {
-		t.Errorf("Expected - checking tenancy: requested delivery service does not exist, Delivery Service - %d, Alerts %v", updatedDeliveryServiceId, updResp.Alerts)
-	}
-	if reqInf.StatusCode != http.StatusBadRequest {
-		t.Errorf("Expected 400 Status Code, but found %d", reqInf.StatusCode)
-	}
-
-	//update invalid protocol
-	remoteOrigin.DeliveryServiceID = oldDeliveryServiceId
-	updatedProtocol := "httpsss"
-	remoteOrigin.Protocol = &updatedProtocol
-	updResp, reqInf, err = TOSession.UpdateOrigin(*remoteOrigin.ID, remoteOrigin, client.RequestOptions{})
-	if err == nil {
-		t.Errorf("Expected - Protocol must be http or https. Protocol - %s, Alerts %v", updatedProtocol, updResp.Alerts)
-	}
-	if reqInf.StatusCode != http.StatusBadRequest {
-		t.Errorf("Expected 400 Status Code, but found %d", reqInf.StatusCode)
-	}
-
-	//update invalid ipv6
-	remoteOrigin.Protocol = oldProtocol
-	updatedIpv6 := "1.1"
-	remoteOrigin.IP6Address = &updatedIpv6
-	updResp, reqInf, err = TOSession.UpdateOrigin(*remoteOrigin.ID, remoteOrigin, client.RequestOptions{})
-	if err == nil {
-		t.Errorf("Expected - Ip6Address must be a valid IPv6 address. IPV6 Address - %s, Alerts %v", updatedIpv6, updResp.Alerts)
-	}
-	if reqInf.StatusCode != http.StatusBadRequest {
-		t.Errorf("Expected 400 Status Code, but found %d", reqInf.StatusCode)
-	}
-
-	//update invalid ipv4
-	remoteOrigin.IP6Address = oldIpv6
-	updatedIpv4 := "1.1"
-	remoteOrigin.IPAddress = &updatedIpv4
-	updResp, reqInf, err = TOSession.UpdateOrigin(*remoteOrigin.ID, remoteOrigin, client.RequestOptions{})
-	if err == nil {
-		t.Errorf("Expected - IpAddress must be a valid IPv4 address. IPV4 - %s, Alerts %v", updatedIpv4, updResp.Alerts)
-	}
-	if reqInf.StatusCode != http.StatusBadRequest {
-		t.Errorf("Expected 400 Status Code, but found %d", reqInf.StatusCode)
-	}
-
-	//update invalid tenant
-	remoteOrigin.IPAddress = oldIpv4
-	updatedTenantId := 11111
-	remoteOrigin.TenantID = &updatedTenantId
-	updResp, reqInf, err = TOSession.UpdateOrigin(*remoteOrigin.ID, remoteOrigin, client.RequestOptions{})
-	if err == nil {
-		t.Errorf("Expected - user not authorized for requested tenant. Tenant - %d, Alerts %v", updatedTenantId, updResp.Alerts)
-	}
-	if reqInf.StatusCode != http.StatusForbidden {
-		t.Errorf("Expected 403 Status Code, but found %d", reqInf.StatusCode)
-	}
-
-	//update invalid profile
-	remoteOrigin.TenantID = oldTenantId
-	updatedProfileId := 12345
-	remoteOrigin.ProfileID = &updatedProfileId
-	updResp, reqInf, err = TOSession.UpdateOrigin(*remoteOrigin.ID, remoteOrigin, client.RequestOptions{})
-	if err == nil {
-		t.Errorf("Expected - profile not found %d - Alerts %v", updatedProfileId, updResp.Alerts)
-	}
-	if reqInf.StatusCode != http.StatusNotFound {
-		t.Errorf("Expected 404 Status Code, but found %d", reqInf.StatusCode)
-	}
-
-	//update invalid id
-	remoteOrigin.ProfileID = oldProfileId
-	invalidId := new(int)
-	*invalidId = 12345
-	updResp, reqInf, err = TOSession.UpdateOrigin(*invalidId, remoteOrigin, client.RequestOptions{})
-	if err == nil {
-		t.Errorf("Expected - Origin not found. Origin ID - %d, Alerts %v", *invalidId, updResp.Alerts)
-	}
-	if reqInf.StatusCode != http.StatusNotFound {
-		t.Errorf("Expected 404 Status Code, but found %d", reqInf.StatusCode)
-	}
-}