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 7e006bca66 Refactor/types test (#6911)
7e006bca66 is described below

commit 7e006bca66c4d5f24de73faca57c853532c3a7a1
Author: Rima Shah <[email protected]>
AuthorDate: Fri Jun 17 21:28:33 2022 -0600

    Refactor/types test (#6911)
    
    * Created test framework.
    
    * Refactored types test for both v3 and v4
    
    * Update based on feedback.
    
    * Update based on feedback-1.
---
 traffic_ops/testing/api/v3/types_test.go | 398 +++++++++++++++++--------------
 traffic_ops/testing/api/v4/types_test.go | 384 +++++++++++++++--------------
 2 files changed, 419 insertions(+), 363 deletions(-)

diff --git a/traffic_ops/testing/api/v3/types_test.go 
b/traffic_ops/testing/api/v3/types_test.go
index 34561c0442..fc5a04d647 100644
--- a/traffic_ops/testing/api/v3/types_test.go
+++ b/traffic_ops/testing/api/v3/types_test.go
@@ -16,8 +16,14 @@ package v3
 */
 
 import (
+       "encoding/json"
        "fmt"
+       "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"
        "net/http"
+       "net/url"
        "sort"
        "testing"
        "time"
@@ -28,224 +34,254 @@ import (
 
 func TestTypes(t *testing.T) {
        WithObjs(t, []TCObj{Parameters, Types}, func() {
-               GetTestTypesIMS(t)
-               currentTime := time.Now().UTC().Add(-5 * time.Second)
-               time := currentTime.Format(time.RFC1123)
-               var header http.Header
-               header = make(map[string][]string)
-               header.Set(rfc.IfModifiedSince, time)
-               SortTestTypes(t)
-               UpdateTestTypes(t)
-               GetTestTypes(t)
-               GetTestTypesIMSAfterChange(t, header)
+
+               currentTime := time.Now().UTC().Add(-15 * time.Second)
+               currentTimeRFC := currentTime.Format(time.RFC1123)
+               tomorrow := currentTime.AddDate(0, 0, 1).Format(time.RFC1123)
+
+               methodTests := utils.V3TestCase{
+                       "GET": {
+                               "NOT MODIFIED when NO CHANGES made": {
+                                       ClientSession:  TOSession,
+                                       RequestHeaders: 
http.Header{rfc.IfModifiedSince: {tomorrow}},
+                                       Expectations:   
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusNotModified)),
+                               },
+                               "OK when VALID request": {
+                                       ClientSession: TOSession,
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
utils.ResponseLengthGreaterOrEqual(1),
+                                               validateTypeSort()),
+                               },
+                               "OK when VALID NAME parameter": {
+                                       ClientSession: TOSession,
+                                       RequestParams: url.Values{"name": 
{"ORG"}},
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
utils.ResponseHasLength(1),
+                                               
validateTypeFields(map[string]interface{}{"Name": "ORG"})),
+                               },
+                       },
+                       "POST": {
+                               "BAD REQUEST when useInTable NOT server": {
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "description": "Host header 
regular expression-Test",
+                                               "name":        "TEST_1",
+                                               "useInTable":  "regex",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "OK when VALID request when useInTable=server": 
{
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "description": "Host header 
regular expression-Test",
+                                               "lastUpdated": 
"2022-06-17T19:13:46.802044+00:00",
+                                               "name":        "TEST_4",
+                                               "useInTable":  "server",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK),
+                                               
validateTypeUpdateCreateFields("TEST_4", map[string]interface{}{"Name": 
"TEST_4"})),
+                               },
+                       },
+                       "PUT": {
+                               "BAD REQUEST when useInTable NOT server": {
+                                       EndpointId:    GetTypeID(t, 
"ACTIVE_DIRECTORY"),
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "description": "Active 
Directory User",
+                                               "name":        "TEST_3",
+                                               "useInTable":  "cachegroup",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "OK when VALID request when useInTable=server": 
{
+                                       EndpointId:    GetTypeID(t, "RIAK"),
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "description": "riak type",
+                                               "name":        "TEST_5",
+                                               "useInTable":  "server",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK),
+                                               
validateTypeUpdateCreateFields("TEST_5", map[string]interface{}{"Name": 
"TEST_5"})),
+                               },
+                       },
+                       "DELETE": {
+                               "OK when VALID request": {
+                                       EndpointId:    GetTypeID(t, "INFLUXDB"),
+                                       ClientSession: TOSession,
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                       },
+                       "GET AFTER CHANGES": {
+                               "OK when CHANGES made": {
+                                       ClientSession:  TOSession,
+                                       RequestHeaders: 
http.Header{rfc.IfModifiedSince: {currentTimeRFC}},
+                                       Expectations:   
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                       },
+               }
+
+               for method, testCases := range methodTests {
+                       t.Run(method, func(t *testing.T) {
+                               for name, testCase := range testCases {
+                                       typ := tc.Type{}
+                                       params := make(map[string]string)
+                                       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, &typ)
+                                               assert.NoError(t, err, "Error 
occurred when unmarshalling request body: %v", err)
+                                       }
+
+                                       if testCase.RequestParams != nil {
+                                               for k, v := range 
testCase.RequestParams {
+                                                       params[k] = v[0]
+                                               }
+                                       }
+
+                                       switch method {
+                                       case "GET", "GET AFTER CHANGES":
+                                               t.Run(name, func(t *testing.T) {
+                                                       var resp []tc.Type
+                                                       var reqInf 
toclientlib.ReqInf
+                                                       var err error
+                                                       if len(params) != 0 {
+                                                               resp, reqInf, 
err = testCase.ClientSession.GetTypeByNameWithHdr(params["name"], 
testCase.RequestHeaders)
+                                                       } else {
+                                                               resp, reqInf, 
err = testCase.ClientSession.GetTypesWithHdr(testCase.RequestHeaders)
+                                                       }
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, resp, tc.Alerts{}, err)
+                                                       }
+                                               })
+                                       case "POST":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.CreateType(typ)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       case "PUT":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.UpdateTypeByIDWithHdr(testCase.EndpointId(), typ, 
testCase.RequestHeaders)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       case "DELETE":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.DeleteTypeByID(testCase.EndpointId())
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       }
+                               }
+                       })
+               }
        })
 }
 
-func GetTestTypesIMSAfterChange(t *testing.T, header http.Header) {
-       for _, typ := range testData.Types {
-               _, reqInf, err := TOSession.GetTypeByNameWithHdr(typ.Name, 
header)
-               if err != nil {
-                       t.Fatalf("Expected no error, but got %v", err.Error())
-               }
-               if reqInf.StatusCode != http.StatusOK {
-                       t.Fatalf("Expected 200 status code, got %v", 
reqInf.StatusCode)
+func validateTypeSort() utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, 
alerts tc.Alerts, _ error) {
+               assert.RequireNotNil(t, resp, "Expected Type response to not be 
nil.")
+               var typeNames []string
+               typeResp := resp.([]tc.Type)
+               for _, typ := range typeResp {
+                       typeNames = append(typeNames, typ.Name)
                }
+               assert.Equal(t, true, sort.StringsAreSorted(typeNames), "List 
is not sorted by their names: %v", typeNames)
        }
-       currentTime := time.Now().UTC()
-       currentTime = currentTime.Add(1 * time.Second)
-       timeStr := currentTime.Format(time.RFC1123)
-       header.Set(rfc.IfModifiedSince, timeStr)
-       for _, typ := range testData.Types {
-               _, reqInf, err := TOSession.GetTypeByNameWithHdr(typ.Name, 
header)
-               if err != nil {
-                       t.Fatalf("Expected no error, but got %v", err.Error())
-               }
-               if reqInf.StatusCode != http.StatusNotModified {
-                       t.Fatalf("Expected 304 status code, got %v", 
reqInf.StatusCode)
+}
+
+func validateTypeFields(expectedResp map[string]interface{}) utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               assert.RequireNotNil(t, resp, "Expected Type response to not be 
nil.")
+               typeResp := resp.([]tc.Type)
+               for field, expected := range expectedResp {
+                       for _, typ := range typeResp {
+                               switch field {
+                               case "Name":
+                                       assert.Equal(t, expected, typ.Name, 
"Expected Name to be %v, but got %s", expected, typ.Name)
+                               case "UseInTable":
+                                       assert.Equal(t, expected, 
typ.UseInTable, "Expected UseInTable to be %v, but got %s", expected, 
typ.UseInTable)
+                               default:
+                                       t.Errorf("Expected field: %v, does not 
exist in response", field)
+                               }
+                       }
                }
        }
 }
 
-func GetTestTypesIMS(t *testing.T) {
-       var header http.Header
-       header = make(map[string][]string)
-       futureTime := time.Now().AddDate(0, 0, 1)
-       time := futureTime.Format(time.RFC1123)
-       header.Set(rfc.IfModifiedSince, time)
-       t.Log("---- GetTestTypes ----")
+func validateTypeUpdateCreateFields(name string, expectedResp 
map[string]interface{}) utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               typ, _, err := TOSession.GetTypeByNameWithHdr(name, nil)
+               assert.RequireNoError(t, err, "Error getting Types: %v", err)
+               assert.RequireEqual(t, 1, len(typ), "Expected one Type 
returned, Got: %d", len(typ))
+               validateTypeFields(expectedResp)(t, toclientlib.ReqInf{}, typ, 
tc.Alerts{}, nil)
+       }
+}
 
-       for _, typ := range testData.Types {
-               _, reqInf, err := TOSession.GetTypeByNameWithHdr(typ.Name, 
header)
-               if err != nil {
-                       t.Fatalf("Expected no error, but got %v", err.Error())
-               }
-               if reqInf.StatusCode != http.StatusNotModified {
-                       t.Fatalf("Expected 304 status code, got %v", 
reqInf.StatusCode)
-               }
+func GetTypeID(t *testing.T, typeName string) func() int {
+       return func() int {
+               resp, _, err := TOSession.GetTypeByNameWithHdr(typeName, nil)
+               assert.RequireNoError(t, err, "Get Types Request failed with 
error: %v", err)
+               assert.RequireEqual(t, 1, len(resp), "Expected response object 
length 1, but got %d", len(resp))
+
+               return resp[0].ID
        }
 }
 
 func CreateTestTypes(t *testing.T) {
-       t.Log("---- CreateTestTypes ----")
-
        db, err := OpenConnection()
-       if err != nil {
-               t.Fatal("cannot open db")
-       }
+       assert.RequireNoError(t, err, "cannot open db")
+
        defer func() {
                err := db.Close()
-               if err != nil {
-                       t.Errorf("unable to close connection to db, error: %v", 
err)
-               }
+               assert.NoError(t, err, "unable to close connection to db, 
error: %v", err)
        }()
-       dbQueryTemplate := "INSERT INTO type (name, description, use_in_table) 
VALUES ('%v', '%v', '%v');"
+       dbQueryTemplate := "INSERT INTO type (name, description, use_in_table) 
VALUES ('%s', '%s', '%s');"
 
        for _, typ := range testData.Types {
-               foundTypes, _, err := TOSession.GetTypeByName(typ.Name)
-               if err == nil && len(foundTypes) > 0 {
-                       t.Logf("Type %v already exists (%v match(es))", 
typ.Name, len(foundTypes))
-                       continue
-               }
-
                if typ.UseInTable != "server" {
                        err = execSQL(db, fmt.Sprintf(dbQueryTemplate, 
typ.Name, typ.Description, typ.UseInTable))
+                       assert.RequireNoError(t, err, "could not create Type 
using database operations: %v", err)
                } else {
-                       _, _, err = TOSession.CreateType(typ)
-               }
-
-               if err != nil {
-                       t.Fatalf("could not CREATE types: %v", err)
-               }
-       }
-}
-
-func SortTestTypes(t *testing.T) {
-       var header http.Header
-       var sortedList []string
-       resp, _, err := TOSession.GetTypesWithHdr(header)
-       if err != nil {
-               t.Fatalf("Expected no error, but got %v", err.Error())
-       }
-       for i, _ := range resp {
-               sortedList = append(sortedList, resp[i].Name)
-       }
-
-       res := sort.SliceIsSorted(sortedList, func(p, q int) bool {
-               return sortedList[p] < sortedList[q]
-       })
-       if res != true {
-               t.Errorf("list is not sorted by their names: %v", sortedList)
-       }
-}
-
-func UpdateTestTypes(t *testing.T) {
-       t.Log("---- UpdateTestTypes ----")
-
-       for i, typ := range testData.Types {
-               expectedTypeName := fmt.Sprintf("testType%v", i)
-               originalType := typ
-               resp, _, err := TOSession.GetTypeByName(originalType.Name)
-               if err != nil {
-                       t.Fatalf("cannot GET Type by name: %v - %v", 
originalType.Name, err)
-               }
-               if len(resp) < 1 {
-                       t.Fatalf("no types by name: %v", originalType.Name)
-               }
-
-               remoteType := resp[0]
-               remoteType.Name = expectedTypeName
-               // Ensure TO checks DB for UseInTable value
-               remoteType.UseInTable = "server"
-
-               var alert tc.Alerts
-               alert, _, err = TOSession.UpdateTypeByID(remoteType.ID, 
remoteType)
-               if originalType.UseInTable != "server" {
-                       if err == nil {
-                               t.Fatalf("expected UPDATE on type %v to fail", 
remoteType.ID)
-                       }
-                       continue
-               } else if err != nil {
-                       t.Fatalf("cannot UPDATE Type by id: %v - %v", err, 
alert)
-               }
-
-               // Retrieve the Type to check Type name got updated
-               resp, _, err = TOSession.GetTypeByID(remoteType.ID)
-               if err != nil {
-                       t.Fatalf("cannot GET Type by ID: %v - %v", 
originalType.ID, err)
-               }
-               respType := resp[0]
-               if respType.Name != expectedTypeName {
-                       t.Fatalf("results do not match actual: %s, expected: 
%s", respType.Name, expectedTypeName)
-               }
-               if respType.UseInTable != originalType.UseInTable {
-                       t.Fatalf("use in table should never be updated, got: 
%v, expected %v", respType.UseInTable, originalType.UseInTable)
-               }
-
-               // Revert name change
-               respType.Name = originalType.Name
-               alert, _, err = TOSession.UpdateTypeByID(respType.ID, respType)
-               if err != nil {
-                       t.Fatalf("cannot restore UPDATE Type by id: %v - %v", 
err, alert)
+                       alerts, _, err := TOSession.CreateType(typ)
+                       assert.RequireNoError(t, err, "could not create Type: 
%v - alerts: %+v", err, alerts.Alerts)
                }
        }
 }
 
-func GetTestTypes(t *testing.T) {
-       t.Log("---- GetTestTypes ----")
-
-       for _, typ := range testData.Types {
-               resp, _, err := TOSession.GetTypeByName(typ.Name)
-               if err != nil {
-                       t.Errorf("cannot GET Type by name: %v - %v", err, resp)
-
-               }
-
-               t.Log("Response: ", resp)
-       }
-}
-
 func DeleteTestTypes(t *testing.T) {
-       t.Log("---- DeleteTestTypes ----")
-
        db, err := OpenConnection()
-       if err != nil {
-               t.Fatal("cannot open db")
-       }
+       assert.RequireNoError(t, err, "cannot open db")
+
        defer func() {
                err := db.Close()
-               if err != nil {
-                       t.Errorf("unable to close connection to db, error: %v", 
err)
-               }
+               assert.NoError(t, err, "unable to close connection to db, 
error: %v", err)
        }()
-       dbDeleteTemplate := "DELETE FROM type WHERE name='%v';"
+       dbDeleteTemplate := "DELETE FROM type WHERE name='%s';"
 
-       for _, typ := range testData.Types {
-               // Retrieve the Type by name so we can get the id for the Update
-               resp, _, err := TOSession.GetTypeByName(typ.Name)
-               if err != nil || len(resp) == 0 {
-                       t.Fatalf("cannot GET Type by name: %v - %v", typ.Name, 
err)
+       types, _, err := TOSession.GetTypesWithHdr(nil)
+       assert.NoError(t, err, "Cannot get Types: %v: %+v", err)
+
+       for _, typ := range types {
+               if typ.Name == "CHECK_EXTENSION_BOOL" || typ.Name == 
"CHECK_EXTENSION_NUM" || typ.Name == "CHECK_EXTENSION_OPEN_SLOT" {
+                       continue
                }
-               respType := resp[0]
 
-               if respType.UseInTable != "server" {
-                       err := execSQL(db, fmt.Sprintf(dbDeleteTemplate, 
respType.Name))
-                       if err != nil {
-                               t.Fatalf("cannot DELETE Type by name: %v", err)
-                       }
+               if typ.UseInTable != "server" {
+                       err := execSQL(db, fmt.Sprintf(dbDeleteTemplate, 
typ.Name))
+                       assert.RequireNoError(t, err, "cannot delete Type using 
database operations: %v", err)
                } else {
-                       delResp, _, err := TOSession.DeleteTypeByID(respType.ID)
-                       if err != nil {
-                               t.Fatalf("cannot DELETE Type by name: %v - %v", 
err, delResp)
-                       }
+                       delResp, _, err := TOSession.DeleteTypeByID(typ.ID)
+                       assert.RequireNoError(t, err, "cannot delete Type using 
the API: %v - alerts: %+v", err, delResp.Alerts)
                }
 
-               // Retrieve the Type to see if it got deleted
-               types, _, err := TOSession.GetTypeByName(typ.Name)
-               if err != nil {
-                       t.Errorf("error deleting Type name: %v", err)
-               }
-               if len(types) > 0 {
-                       t.Errorf("expected Type name: %s to be deleted", 
typ.Name)
-               }
+               // Retrieve the Type by name to see if it was deleted.
+               opts := client.NewRequestOptions()
+               opts.QueryParameters.Set("name", typ.Name)
+               types, _, err := TOSession.GetTypesWithHdr(nil, typ.Name)
+               assert.NoError(t, err, "error fetching Types filtered by 
presumably deleted name: %v", err)
+               assert.Equal(t, 0, len(types), "expected Type '%s' to be 
deleted", typ.Name)
        }
 }
diff --git a/traffic_ops/testing/api/v4/types_test.go 
b/traffic_ops/testing/api/v4/types_test.go
index 96c38725ae..10012dc195 100644
--- a/traffic_ops/testing/api/v4/types_test.go
+++ b/traffic_ops/testing/api/v4/types_test.go
@@ -16,243 +16,263 @@ package v4
 */
 
 import (
+       "encoding/json"
        "fmt"
+       "github.com/apache/trafficcontrol/traffic_ops/testing/api/assert"
+       "github.com/apache/trafficcontrol/traffic_ops/toclientlib"
        "net/http"
+       "net/url"
        "sort"
-       "strconv"
        "testing"
        "time"
 
        "github.com/apache/trafficcontrol/lib/go-rfc"
        tc "github.com/apache/trafficcontrol/lib/go-tc"
+       "github.com/apache/trafficcontrol/traffic_ops/testing/api/utils"
        client "github.com/apache/trafficcontrol/traffic_ops/v4-client"
 )
 
 func TestTypes(t *testing.T) {
        WithObjs(t, []TCObj{Parameters, Types}, func() {
-               GetTestTypesIMS(t)
-               currentTime := time.Now().UTC().Add(-5 * time.Second)
-               time := currentTime.Format(time.RFC1123)
-               var header http.Header
-               header = make(map[string][]string)
-               header.Set(rfc.IfModifiedSince, time)
-               SortTestTypes(t)
-               UpdateTestTypes(t)
-               GetTestTypes(t)
-               GetTestTypesIMSAfterChange(t, header)
+
+               currentTime := time.Now().UTC().Add(-15 * time.Second)
+               currentTimeRFC := currentTime.Format(time.RFC1123)
+               tomorrow := currentTime.AddDate(0, 0, 1).Format(time.RFC1123)
+
+               methodTests := utils.V4TestCase{
+                       "GET": {
+                               "NOT MODIFIED when NO CHANGES made": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{Header: http.Header{rfc.IfModifiedSince: {tomorrow}}},
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusNotModified)),
+                               },
+                               "OK when VALID request": {
+                                       ClientSession: TOSession,
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
utils.ResponseLengthGreaterOrEqual(1),
+                                               validateTypeSort()),
+                               },
+                               "OK when VALID NAME parameter": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{QueryParameters: url.Values{"name": {"ORG"}}},
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK), 
utils.ResponseHasLength(1),
+                                               
validateTypeFields(map[string]interface{}{"Name": "ORG"})),
+                               },
+                       },
+                       "POST": {
+                               "BAD REQUEST when useInTable NOT server": {
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "description": "Host header 
regular expression-Test",
+                                               "name":        "TEST_1",
+                                               "useInTable":  "regex",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "OK when VALID request when useInTable=server": 
{
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "description": "Host header 
regular expression-Test",
+                                               "name":        "TEST_4",
+                                               "useInTable":  "server",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK),
+                                               
validateTypeUpdateCreateFields("TEST_4", map[string]interface{}{"Name": 
"TEST_4"})),
+                               },
+                       },
+                       "PUT": {
+                               "BAD REQUEST when useInTable NOT server": {
+                                       EndpointId:    GetTypeID(t, 
"ACTIVE_DIRECTORY"),
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "description": "Active 
Directory User",
+                                               "name":        "TEST_3",
+                                               "useInTable":  "cachegroup",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.HasError(), utils.HasStatus(http.StatusBadRequest)),
+                               },
+                               "OK when VALID request when useInTable=server": 
{
+                                       EndpointId:    GetTypeID(t, "RIAK"),
+                                       ClientSession: TOSession,
+                                       RequestBody: map[string]interface{}{
+                                               "description": "riak type",
+                                               "name":        "TEST_5",
+                                               "useInTable":  "server",
+                                       },
+                                       Expectations: 
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK),
+                                               
validateTypeUpdateCreateFields("TEST_5", map[string]interface{}{"Name": 
"TEST_5"})),
+                               },
+                       },
+                       "DELETE": {
+                               "OK when VALID request": {
+                                       EndpointId:    GetTypeID(t, "INFLUXDB"),
+                                       ClientSession: TOSession,
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                       },
+                       "GET AFTER CHANGES": {
+                               "OK when CHANGES made": {
+                                       ClientSession: TOSession,
+                                       RequestOpts:   
client.RequestOptions{Header: http.Header{rfc.IfModifiedSince: 
{currentTimeRFC}}},
+                                       Expectations:  
utils.CkRequest(utils.NoError(), utils.HasStatus(http.StatusOK)),
+                               },
+                       },
+               }
+
+               for method, testCases := range methodTests {
+                       t.Run(method, func(t *testing.T) {
+                               for name, testCase := range testCases {
+                                       typ := tc.Type{}
+
+                                       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, &typ)
+                                               assert.NoError(t, err, "Error 
occurred when unmarshalling request body: %v", err)
+                                       }
+
+                                       switch method {
+                                       case "GET", "GET AFTER CHANGES":
+                                               t.Run(name, func(t *testing.T) {
+                                                       resp, reqInf, err := 
testCase.ClientSession.GetTypes(testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, resp.Response, resp.Alerts, err)
+                                                       }
+                                               })
+                                       case "POST":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.CreateType(typ, client.RequestOptions{})
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       case "PUT":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.UpdateType(testCase.EndpointId(), typ, 
testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       case "DELETE":
+                                               t.Run(name, func(t *testing.T) {
+                                                       alerts, reqInf, err := 
testCase.ClientSession.DeleteType(testCase.EndpointId(), testCase.RequestOpts)
+                                                       for _, check := range 
testCase.Expectations {
+                                                               check(t, 
reqInf, nil, alerts, err)
+                                                       }
+                                               })
+                                       }
+                               }
+                       })
+               }
        })
 }
 
-func GetTestTypesIMSAfterChange(t *testing.T, header http.Header) {
-       opts := client.NewRequestOptions()
-       opts.Header = header
-       for _, typ := range testData.Types {
-               opts.QueryParameters.Set("name", typ.Name)
-               resp, reqInf, err := TOSession.GetTypes(opts)
-               if err != nil {
-                       t.Fatalf("Expected no error, but got: %v - alerts: 
%+v", err, resp.Alerts)
-               }
-               if reqInf.StatusCode != http.StatusOK {
-                       t.Fatalf("Expected 200 status code, got %v", 
reqInf.StatusCode)
+func validateTypeSort() utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, 
alerts tc.Alerts, _ error) {
+               assert.RequireNotNil(t, resp, "Expected Type response to not be 
nil.")
+               var typeNames []string
+               typeResp := resp.([]tc.Type)
+               for _, typ := range typeResp {
+                       typeNames = append(typeNames, typ.Name)
                }
+               assert.Equal(t, true, sort.StringsAreSorted(typeNames), "List 
is not sorted by their names: %v", typeNames)
        }
+}
 
-       currentTime := time.Now().UTC()
-       currentTime = currentTime.Add(1 * time.Second)
-       timeStr := currentTime.Format(time.RFC1123)
-       opts.Header.Set(rfc.IfModifiedSince, timeStr)
-
-       for _, typ := range testData.Types {
-               opts.QueryParameters.Set("name", typ.Name)
-               resp, reqInf, err := TOSession.GetTypes(opts)
-               if err != nil {
-                       t.Fatalf("Expected no error, but got: %v - alerts: 
%+v", err, resp.Alerts)
-               }
-               if reqInf.StatusCode != http.StatusNotModified {
-                       t.Fatalf("Expected 304 status code, got %v", 
reqInf.StatusCode)
+func validateTypeFields(expectedResp map[string]interface{}) utils.CkReqFunc {
+       return func(t *testing.T, _ toclientlib.ReqInf, resp interface{}, _ 
tc.Alerts, _ error) {
+               assert.RequireNotNil(t, resp, "Expected Type response to not be 
nil.")
+               typeResp := resp.([]tc.Type)
+               for field, expected := range expectedResp {
+                       for _, typ := range typeResp {
+                               switch field {
+                               case "Name":
+                                       assert.Equal(t, expected, typ.Name, 
"Expected Name to be %v, but got %s", expected, typ.Name)
+                               case "UseInTable":
+                                       assert.Equal(t, expected, 
typ.UseInTable, "Expected UseInTable to be %v, but got %s", expected, 
typ.UseInTable)
+                               default:
+                                       t.Errorf("Expected field: %v, does not 
exist in response", field)
+                               }
+                       }
                }
        }
 }
 
-func GetTestTypesIMS(t *testing.T) {
-       futureTime := time.Now().AddDate(0, 0, 1)
-       time := futureTime.Format(time.RFC1123)
+func validateTypeUpdateCreateFields(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)
+               typ, _, err := TOSession.GetTypes(opts)
+               assert.RequireNoError(t, err, "Error getting Types: %v - 
alerts: %+v", err, typ.Alerts)
+               assert.RequireEqual(t, 1, len(typ.Response), "Expected one Type 
returned, Got: %d", len(typ.Response))
+               validateTypeFields(expectedResp)(t, toclientlib.ReqInf{}, 
typ.Response, tc.Alerts{}, nil)
+       }
+}
 
-       opts := client.NewRequestOptions()
-       opts.Header.Set(rfc.IfModifiedSince, time)
+func GetTypeID(t *testing.T, typeName string) func() int {
+       return func() int {
+               opts := client.NewRequestOptions()
+               opts.QueryParameters.Set("name", typeName)
+               resp, _, err := TOSession.GetTypes(opts)
 
-       for _, typ := range testData.Types {
-               opts.QueryParameters.Set("name", typ.Name)
-               resp, reqInf, err := TOSession.GetTypes(opts)
-               if err != nil {
-                       t.Fatalf("Expected no error, but got: %v - alerts: 
%+v", err, resp.Alerts)
-               }
-               if reqInf.StatusCode != http.StatusNotModified {
-                       t.Fatalf("Expected 304 status code, got %v", 
reqInf.StatusCode)
-               }
+               assert.RequireNoError(t, err, "Get Types Request failed with 
error: %v", err)
+               assert.RequireEqual(t, 1, len(resp.Response), "Expected 
response object length 1, but got %d", len(resp.Response))
+
+               return resp.Response[0].ID
        }
 }
 
 func CreateTestTypes(t *testing.T) {
        db, err := OpenConnection()
-       if err != nil {
-               t.Fatal("cannot open db")
-       }
+       assert.RequireNoError(t, err, "cannot open db")
+
        defer func() {
                err := db.Close()
-               if err != nil {
-                       t.Errorf("unable to close connection to db, error: %v", 
err)
-               }
+               assert.NoError(t, err, "unable to close connection to db, 
error: %v", err)
        }()
        dbQueryTemplate := "INSERT INTO type (name, description, use_in_table) 
VALUES ('%s', '%s', '%s');"
 
-       opts := client.NewRequestOptions()
        for _, typ := range testData.Types {
-               opts.QueryParameters.Set("name", typ.Name)
-               foundTypes, _, err := TOSession.GetTypes(opts)
-               if err == nil && len(foundTypes.Response) > 0 {
-                       t.Logf("Type %v already exists (%v match(es))", 
typ.Name, len(foundTypes.Response))
-                       continue
-               }
-
-               var alerts tc.Alerts
                if typ.UseInTable != "server" {
                        err = execSQL(db, fmt.Sprintf(dbQueryTemplate, 
typ.Name, typ.Description, typ.UseInTable))
+                       assert.RequireNoError(t, err, "could not create Type 
using database operations: %v", err)
                } else {
-                       alerts, _, err = TOSession.CreateType(typ, 
client.RequestOptions{})
-               }
-
-               if err != nil {
-                       t.Fatalf("could not create Type: %v - alerts: %+v", 
err, alerts.Alerts)
-               }
-       }
-}
-
-func SortTestTypes(t *testing.T) {
-       resp, _, err := TOSession.GetTypes(client.RequestOptions{})
-       if err != nil {
-               t.Fatalf("Expected no error, but got: %v - alerts: %+v", err, 
resp.Alerts)
-       }
-
-       sortedList := make([]string, 0, len(resp.Response))
-       for _, typ := range resp.Response {
-               sortedList = append(sortedList, typ.Name)
-       }
-
-       if !sort.StringsAreSorted(sortedList) {
-               t.Errorf("list is not sorted by their names: %v", sortedList)
-       }
-}
-
-func UpdateTestTypes(t *testing.T) {
-
-       for i, typ := range testData.Types {
-               expectedTypeName := fmt.Sprintf("testType%v", i)
-               originalType := typ
-
-               opts := client.NewRequestOptions()
-               opts.QueryParameters.Set("name", originalType.Name)
-               resp, _, err := TOSession.GetTypes(opts)
-               if err != nil {
-                       t.Fatalf("cannot get Types filtered by name '%s': %v - 
alerts: %+v", originalType.Name, err, resp.Alerts)
-               }
-               if len(resp.Response) < 1 {
-                       t.Fatalf("no Types exist by name '%s'", 
originalType.Name)
-               }
-
-               remoteType := resp.Response[0]
-               remoteType.Name = expectedTypeName
-               // Ensure TO checks DB for UseInTable value
-               remoteType.UseInTable = "server"
-
-               alert, _, err := TOSession.UpdateType(remoteType.ID, 
remoteType, client.RequestOptions{})
-               if originalType.UseInTable != "server" {
-                       if err == nil {
-                               t.Fatalf("expected update on Type #%d to fail", 
remoteType.ID)
-                       }
-                       continue
-               } else if err != nil {
-                       t.Fatalf("cannot update Type: %v - alerts: %+v", err, 
alert.Alerts)
-               }
-
-               // Retrieve the Type to check Type name got updated
-               opts.QueryParameters.Del("name")
-               opts.QueryParameters.Set("id", strconv.Itoa(remoteType.ID))
-               resp, _, err = TOSession.GetTypes(opts)
-               opts.QueryParameters.Del("id")
-               if err != nil {
-                       t.Fatalf("cannot get Type by ID %d: %v - alerts: %+v", 
originalType.ID, err, resp.Alerts)
-               }
-               respType := resp.Response[0]
-               if respType.Name != expectedTypeName {
-                       t.Fatalf("results do not match actual: %s, expected: 
%s", respType.Name, expectedTypeName)
-               }
-               if respType.UseInTable != originalType.UseInTable {
-                       t.Fatalf("use in table should never be updated, got: 
%v, expected %v", respType.UseInTable, originalType.UseInTable)
-               }
-
-               // Revert name change
-               respType.Name = originalType.Name
-               alert, _, err = TOSession.UpdateType(respType.ID, respType, 
client.RequestOptions{})
-               if err != nil {
-                       t.Fatalf("cannot restore/update Type: %v - %+v", err, 
alert.Alerts)
-               }
-       }
-}
-
-func GetTestTypes(t *testing.T) {
-       opts := client.NewRequestOptions()
-       for _, typ := range testData.Types {
-               opts.QueryParameters.Set("name", typ.Name)
-               resp, _, err := TOSession.GetTypes(opts)
-               if err != nil {
-                       t.Errorf("cannot get Type: %v - alerts: %+v", err, 
resp.Alerts)
+                       alerts, _, err := TOSession.CreateType(typ, 
client.RequestOptions{})
+                       assert.RequireNoError(t, err, "could not create Type: 
%v - alerts: %+v", err, alerts.Alerts)
                }
        }
 }
 
 func DeleteTestTypes(t *testing.T) {
        db, err := OpenConnection()
-       if err != nil {
-               t.Fatal("cannot open db")
-       }
+       assert.RequireNoError(t, err, "cannot open db")
+
        defer func() {
                err := db.Close()
-               if err != nil {
-                       t.Errorf("unable to close connection to db, error: %v", 
err)
-               }
+               assert.NoError(t, err, "unable to close connection to db, 
error: %v", err)
        }()
        dbDeleteTemplate := "DELETE FROM type WHERE name='%s';"
 
-       opts := client.NewRequestOptions()
-       for _, typ := range testData.Types {
-               // Retrieve the Type by name so we can get the id for the Update
-               opts.QueryParameters.Set("name", typ.Name)
-               resp, _, err := TOSession.GetTypes(opts)
-               if err != nil || len(resp.Response) == 0 {
-                       t.Fatalf("cannot get Types filtered by name '%s': %v - 
alerts: %+v", typ.Name, err, resp.Alerts)
+       types, _, err := TOSession.GetTypes(client.RequestOptions{})
+       assert.NoError(t, err, "Cannot get Types: %v - alerts: %+v", err, 
types.Alerts)
+
+       for _, typ := range types.Response {
+               if typ.Name == "CHECK_EXTENSION_BOOL" || typ.Name == 
"CHECK_EXTENSION_NUM" || typ.Name == "CHECK_EXTENSION_OPEN_SLOT" {
+                       continue
                }
-               respType := resp.Response[0]
 
-               if respType.UseInTable != "server" {
-                       err := execSQL(db, fmt.Sprintf(dbDeleteTemplate, 
respType.Name))
-                       if err != nil {
-                               t.Fatalf("cannot delete Type using database 
operations: %v", err)
-                       }
+               if typ.UseInTable != "server" {
+                       err := execSQL(db, fmt.Sprintf(dbDeleteTemplate, 
typ.Name))
+                       assert.RequireNoError(t, err, "cannot delete Type using 
database operations: %v", err)
                } else {
-                       delResp, _, err := TOSession.DeleteType(respType.ID, 
client.RequestOptions{})
-                       if err != nil {
-                               t.Fatalf("cannot delete Type using the API: %v 
- alerts: %+v", err, delResp.Alerts)
-                       }
+                       delResp, _, err := TOSession.DeleteType(typ.ID, 
client.RequestOptions{})
+                       assert.RequireNoError(t, err, "cannot delete Type using 
the API: %v - alerts: %+v", err, delResp.Alerts)
                }
 
-               // Retrieve the Type to see if it got deleted
+               // Retrieve the Type by name to see if it was deleted.
+               opts := client.NewRequestOptions()
+               opts.QueryParameters.Set("name", typ.Name)
                types, _, err := TOSession.GetTypes(opts)
-               if err != nil {
-                       t.Errorf("error fetching Types filtered by presumably 
deleted name: %v - alerts: %+v", err, types.Alerts)
-               }
-               if len(types.Response) > 0 {
-                       t.Errorf("expected Type '%s' to be deleted", typ.Name)
-               }
+               assert.NoError(t, err, "error fetching Types filtered by 
presumably deleted name: %v - alerts: %+v", err, types.Alerts)
+               assert.Equal(t, 0, len(types.Response), "expected Type '%s' to 
be deleted", typ.Name)
        }
 }

Reply via email to