You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@trafficcontrol.apache.org by GitBox <gi...@apache.org> on 2021/04/29 07:12:09 UTC

[GitHub] [trafficcontrol] dmohan001c opened a new pull request #5797: Add TO Client api for Parameters Automation

dmohan001c opened a new pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797


   <!--
   ************ STOP!! ************
   If this Pull Request is intended to fix a security vulnerability, DO NOT submit it! Instead, contact
   the Apache Software Foundation Security Team at security@trafficcontrol.apache.org and follow the
   guidelines at https://www.apache.org/security/ regarding vulnerability disclosure.
   -->
   ## What does this PR (Pull Request) do?
   <!-- Explain the changes you made here. If this fixes an Issue, identify it by
   replacing the text in the checkbox item with the Issue number e.g.
   
   - [x] This PR fixes #9001 OR is not related to any Issue
   
   ^ This will automatically close Issue number 9001 when the Pull Request is
   merged (The '#' is important).
   
   Be sure you check the box properly, see the "The following criteria are ALL
   met by this PR" section for details.
   -->
   
   - [x] This PR is not related to any Issue
   
   
   ## Which Traffic Control components are affected by this PR?
   <!-- Please delete all components from this list that are NOT affected by this
   Pull Request. Also, feel free to add the name of a tool or script that is
   affected but not on the list.
   
   Additionally, if this Pull Request does NOT affect documentation, please
   explain why documentation is not required. -->
   
   - CDN in a Box
   - Traffic Control Client <!-- Please specify which; e.g. 'Python', 'Go', 'Java' -->
   - Traffic Ops
   - CI tests
   
   ## What is the best way to verify this PR?
   Execute all the Integration tests and make sure the tests passed.
   
   
   ## The following criteria are ALL met by this PR
   <!-- Check the boxes to signify that the associated statement is true. To
   "check a box", replace the space inside of the square brackets with an 'x'.
   e.g.
   
   - [ x] <- Wrong
   - [x ] <- Wrong
   - [] <- Wrong
   - [*] <- Wrong
   - [x] <- Correct!
   
   -->
   
   - [ ] This PR includes tests OR I have explained why tests are unnecessary
   - [ ] This PR includes documentation OR I have explained why documentation is unnecessary
   - [ ] This PR includes an update to CHANGELOG.md OR such an update is not necessary
   - [ ] This PR includes any and all required license headers
   - [ ] This PR **DOES NOT FIX A SERIOUS SECURITY VULNERABILITY** (see [the Apache Software Foundation's security guidelines](https://www.apache.org/security/) for details)
   
   
   ## Additional Information
   <!-- If you would like to include any additional information on the PR for
   potential reviewers please put it here.
   
   Some examples of this would be:
   
   - Before and after screenshots/gifs of the Traffic Portal if it is affected
   - Links to other dependent Pull Requests
   - References to relevant context (e.g. new/updates to dependent libraries,
   mailing list records, blueprints)
   
   Feel free to leave this section blank (or, preferably, delete it entirely).
   -->
   
   <!--
   Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
   
       http://www.apache.org/licenses/LICENSE-2.0
   
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.
   -->
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r634033821



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {

Review comment:
       Added failure checks




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r627996276



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +349,213 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByName(parameters.Name, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	resp, _, err := TOSession.GetParameterByID(10000, nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByName("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByConfigFile("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByValue("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	resp, _, _ := TOSession.GetParameters(nil, nil)
+	if len(resp) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp[0])
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       Added failure checks for empty data.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626248232



##########
File path: traffic_ops/v4-client/parameter.go
##########
@@ -53,7 +53,7 @@ func (to *Session) UpdateParameter(id int, pl tc.Parameter, header http.Header)
 }
 
 // GetParameters returns all Parameters in Traffic Ops.
-func (to *Session) GetParameters(header http.Header, params url.Values) ([]tc.Parameter, toclientlib.ReqInf, error) {
+func (to *Session) GetParameters(params url.Values, header http.Header) ([]tc.Parameter, toclientlib.ReqInf, error) {

Review comment:
       Okay.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] ocket8888 commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
ocket8888 commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626861085



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +340,204 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		_, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}

Review comment:
       That shouldn't be possible - unless there are Parameters in the testing data that aren't supposed to be created successfully, but if that were true, then I would expect the CreateMultipleParameters method's test to fail.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r627995895



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			old := resp[0]
+			expectedParameterValue := "UPDATED"
+			expectedParameterConfigFile := "updatedConfigFile"
+			expectedParameterName := "updateName"
+			remoteParameter.Value = expectedParameterValue
+			remoteParameter.ConfigFile = expectedParameterConfigFile
+			remoteParameter.Name = expectedParameterName
+			var alert tc.Alerts
+			alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
 
-	firstParameter := testData.Parameters[0]
-	// Retrieve the Parameter by name so we can get the id for the Update
-	params := url.Values{}
-	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
-	}
-	remoteParameter := resp[0]
-	expectedParameterValue := "UPDATED"
-	remoteParameter.Value = expectedParameterValue
-	var alert tc.Alerts
-	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
-	if err != nil {
-		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			// Retrieve the parameter to check parameter name got updated
+			resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
+			if err != nil {
+				t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+			}
+			if len(resp) > 0 {
+				respParameter := resp[0]
+				if respParameter.Value != expectedParameterValue {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.ConfigFile != expectedParameterConfigFile {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.Name != expectedParameterName {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				//update back to old value for safe deletion in pre-requisite
+				alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+				if err != nil {
+					t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+				}
+			} else {
+				t.Errorf("Not able to GET the parameter to test the updated value")
+			}
+		}
 	}
+}
 
-	// Retrieve the Parameter to check Parameter name got updated
-	resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       Added failure checks for empty data.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r634047743



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.ConfigFile = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]
+		//Parameters can be updated with empty value, so no error while updating
+		remoteParameter.Value = ""
+		opts = client.NewRequestOptions()
+		var alert tc.Alerts
+		alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, opts)
+		if err != nil {
+			t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]
+		remoteParameter.Name = ""
+		opts = client.NewRequestOptions()
+		var alert tc.Alerts

Review comment:
       removed unnecessary variable declaration

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.ConfigFile = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]
+		//Parameters can be updated with empty value, so no error while updating
+		remoteParameter.Value = ""
+		opts = client.NewRequestOptions()
+		var alert tc.Alerts
+		alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, opts)
+		if err != nil {
+			t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]
+		remoteParameter.Name = ""
+		opts = client.NewRequestOptions()
+		var alert tc.Alerts

Review comment:
       removed unnecessary variable declaration.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] ocket8888 commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
ocket8888 commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r634393573



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +261,331 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", parameters.ConfigFile)
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", parameters.Value)
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Value")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", parameters.Name)
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	} else {
+		t.Errorf("No existing parameters available to validate duplicate functionality")
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {

Review comment:
       This test will silently pass if the test data is in a bad state and the test cannot proceed

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +261,331 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", parameters.ConfigFile)
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", parameters.Value)
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Value")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", parameters.Name)
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	} else {
+		t.Errorf("No existing parameters available to validate duplicate functionality")
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {

Review comment:
       This test will silently pass if the test data is in a bad state and the test cannot proceed




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r628748862



##########
File path: traffic_ops/testing/api/v4/phys_locations_test.go
##########
@@ -238,3 +240,86 @@ func DeleteTestPhysLocations(t *testing.T) {
 		}
 	}
 }
+
+func GetTestPaginationSupportPhysLocation(t *testing.T) {

Review comment:
       yes, I revoked back with new commits.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r627994063



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {

Review comment:
       Added failure checks for a response.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626396567



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusOK {
+		t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidName(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	remoteParameter.Name = ""
 
+	var alert tc.Alerts

Review comment:
       Removed the duplicate declaration.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] ocket8888 commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
ocket8888 commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626210019



##########
File path: traffic_ops/v4-client/parameter.go
##########
@@ -53,7 +53,7 @@ func (to *Session) UpdateParameter(id int, pl tc.Parameter, header http.Header)
 }
 
 // GetParameters returns all Parameters in Traffic Ops.
-func (to *Session) GetParameters(header http.Header, params url.Values) ([]tc.Parameter, toclientlib.ReqInf, error) {
+func (to *Session) GetParameters(params url.Values, header http.Header) ([]tc.Parameter, toclientlib.ReqInf, error) {

Review comment:
       Don't bother swapping these around; I'm already overhauling the client method signatures in #5747 so the change will be overwritten anyway, and it adds changes to a lot of files that would otherwise be unaffected

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -110,6 +128,21 @@ func CreateTestParameters(t *testing.T) {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
+
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+
+	pls := []tc.Parameter{}
+	for _, pl := range testData.Parameters {
+		pls = append(pls, pl)
+	}

Review comment:
       You don't need to do this; you can just pass `testData.Parameters` directly to the method. Or, you could use the slice spread operator if making a copy is important for some reason:
   ```go
   resp, _, err := TOSession.CreateMultipleParameters(append([]tc.Parameter{}, ...testData.Parameters))
   ```
   but I don't think it is, is it?

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +340,204 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		_, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByName(parameters.Name, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	resp, _, err := TOSession.GetParameterByID(10000, nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByName("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByConfigFile("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByValue("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	resp, _, _ := TOSession.GetParameters(nil, nil)
+	_, reqInf, _ := TOSession.CreateParameter(resp[0])
+	if reqInf.StatusCode != http.StatusBadRequest {
+		t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	firstParameter.Name = ""
+	_, reqInf, _ := TOSession.CreateParameter(firstParameter)
+	if reqInf.StatusCode != http.StatusBadRequest {
+		t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	firstParameter := testData.Parameters[0]

Review comment:
       This will segfault if the testing data is in a bad state

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +340,204 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		_, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByName(parameters.Name, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	resp, _, err := TOSession.GetParameterByID(10000, nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByName("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByConfigFile("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByValue("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	resp, _, _ := TOSession.GetParameters(nil, nil)
+	_, reqInf, _ := TOSession.CreateParameter(resp[0])

Review comment:
       This will segfault if Traffic Ops returns a bad response

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusOK {
+		t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidName(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	remoteParameter.Name = ""
 
+	var alert tc.Alerts

Review comment:
       you don't need to declare this variable, since it's being assigned with := on the line below

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusOK {
+		t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidName(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	remoteParameter.Name = ""
 
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err == nil {
+		t.Errorf("Invalid name has been updated by ID: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusBadRequest {
+		t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidConfigFile(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]

Review comment:
       This will segfault if Traffic Ops returns an improper response

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -119,13 +152,18 @@ func UpdateTestParameters(t *testing.T) {
 	// Retrieve the Parameter by name so we can get the id for the Update
 	params := url.Values{}
 	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
+	resp, _, err := TOSession.GetParameters(params, nil)
 	if err != nil {
 		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
 	}
 	remoteParameter := resp[0]
+	old := resp[0]
 	expectedParameterValue := "UPDATED"
+	expectedParameterConfigFile := "updatedConfigFile"
+	expectedParameterName := "updateName"
 	remoteParameter.Value = expectedParameterValue
+	remoteParameter.ConfigFile = expectedParameterConfigFile
+	remoteParameter.Name = expectedParameterName

Review comment:
       Did you mean to compare the result to these values after the update? I don't think you wound up doing that

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusOK {
+		t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidName(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	remoteParameter.Name = ""
 
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err == nil {
+		t.Errorf("Invalid name has been updated by ID: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusBadRequest {
+		t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidConfigFile(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	remoteParameter.ConfigFile = ""
+
+	var alert tc.Alerts

Review comment:
       you don't need to declare this variable, since it's being assigned with := on the line below

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -110,6 +128,21 @@ func CreateTestParameters(t *testing.T) {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
+
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+
+	pls := []tc.Parameter{}
+	for _, pl := range testData.Parameters {
+		pls = append(pls, pl)
+	}
+	resp, _, err := TOSession.CreateMultipleParameters(pls)
+	t.Log("Response: ", resp)

Review comment:
       The response is only useful in the event of an error, because that's the only time you'd be looking at the logs, so this should probably just go below in the `t.Errorf`.

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]

Review comment:
       This will segfault if Traffic Ops returns an improper response

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts

Review comment:
       you don't need to declare this variable, since it's being assigned with `:=` on the line below

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusOK {
+		t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidName(t *testing.T) {
+	firstParameter := testData.Parameters[0]

Review comment:
       This will segfault if the testing data is in a bad state

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusOK {
+		t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidName(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]

Review comment:
       This will segfault if Traffic Ops returns an improper response

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +340,204 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		_, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByName(parameters.Name, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	resp, _, err := TOSession.GetParameterByID(10000, nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByName("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByConfigFile("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByValue("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	resp, _, _ := TOSession.GetParameters(nil, nil)
+	_, reqInf, _ := TOSession.CreateParameter(resp[0])
+	if reqInf.StatusCode != http.StatusBadRequest {
+		t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	firstParameter := testData.Parameters[0]

Review comment:
       This will segfault if the testing data is in a bad state

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusOK {
+		t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidName(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	remoteParameter.Name = ""
 
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err == nil {
+		t.Errorf("Invalid name has been updated by ID: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusBadRequest {
+		t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidConfigFile(t *testing.T) {
+	firstParameter := testData.Parameters[0]

Review comment:
       This will segfault if the testing data is in a bad state

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]

Review comment:
       This will segfault if the testing data is in a bad state

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {

Review comment:
       Is this updating a Parameter with an "Invalid Value"? It seems like the expectation is for the update to succeed

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +340,204 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		_, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}

Review comment:
       How come this test doesn't look for `len(resp) <=0` like the ones above and below?




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626384512



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]

Review comment:
       Added null value check




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r634043120



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.ConfigFile = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]
+		//Parameters can be updated with empty value, so no error while updating
+		remoteParameter.Value = ""
+		opts = client.NewRequestOptions()
+		var alert tc.Alerts

Review comment:
       removed unnecessary variable declaration.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626629673



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +340,204 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		_, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}

Review comment:
       added that validation also. I skipped it because the value can be null.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] ocket8888 merged pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
ocket8888 merged pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797


   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] ocket8888 commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
ocket8888 commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r633785573



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))

Review comment:
       You don't need `url.QueryEscape` when adding things to a `url.Values`, the encoding is handled when `.Encode()` is called.

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -157,7 +176,31 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+}
 
+func UpdateParametersEmptyConfigFile(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       This test will silently pass if the test data is in a bad state and the test cannot proceed

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -157,7 +176,31 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+}
 
+func UpdateParametersEmptyConfigFile(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(firstParameter.Name))
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp.Response) > 0 {

Review comment:
       This test will silently pass if the test cannot proceed because Traffic Ops is returning improper responses and/or has no Parameters stored to use in testing.

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {

Review comment:
       this test will silently pass if it cannot run because there are no Parameters in Traffic Ops.

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.ConfigFile = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]
+		//Parameters can be updated with empty value, so no error while updating
+		remoteParameter.Value = ""
+		opts = client.NewRequestOptions()
+		var alert tc.Alerts

Review comment:
       variable declaration is unnecessary because it's assigned with `:=` on the next line.

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.ConfigFile = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]

Review comment:
       This will segfault if Traffic Ops returns an empty response.

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.ConfigFile = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]
+		//Parameters can be updated with empty value, so no error while updating
+		remoteParameter.Value = ""
+		opts = client.NewRequestOptions()
+		var alert tc.Alerts
+		alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, opts)
+		if err != nil {
+			t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]

Review comment:
       This will segfault if Traffic Ops returns an empty response

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.ConfigFile = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]
+		//Parameters can be updated with empty value, so no error while updating
+		remoteParameter.Value = ""
+		opts = client.NewRequestOptions()
+		var alert tc.Alerts
+		alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, opts)
+		if err != nil {
+			t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       This test will silently pass if the test data is in a bad state and the test cannot proceed

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.ConfigFile = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       This test will silently pass if the test data is in a bad state and the test cannot proceed

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.ConfigFile = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]
+		//Parameters can be updated with empty value, so no error while updating
+		remoteParameter.Value = ""
+		opts = client.NewRequestOptions()
+		var alert tc.Alerts
+		alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, opts)
+		if err != nil {
+			t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]
+		remoteParameter.Name = ""
+		opts = client.NewRequestOptions()
+		var alert tc.Alerts

Review comment:
       variable declaration is unnecessary because it's assigned with `:=` on the next line.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626395792



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]

Review comment:
       Added the null check for response.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626272118



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -110,6 +128,21 @@ func CreateTestParameters(t *testing.T) {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
+
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+
+	pls := []tc.Parameter{}
+	for _, pl := range testData.Parameters {
+		pls = append(pls, pl)
+	}
+	resp, _, err := TOSession.CreateMultipleParameters(pls)
+	t.Log("Response: ", resp)

Review comment:
       Fixed it.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r634037826



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.ConfigFile = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       Added failure checks
   
   

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.ConfigFile = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]
+		//Parameters can be updated with empty value, so no error while updating
+		remoteParameter.Value = ""
+		opts = client.NewRequestOptions()
+		var alert tc.Alerts
+		alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, opts)
+		if err != nil {
+			t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       Added failure checks
   
   




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r627994231



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       Added failure checks for an empty data.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r627996055



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			old := resp[0]
+			expectedParameterValue := "UPDATED"
+			expectedParameterConfigFile := "updatedConfigFile"
+			expectedParameterName := "updateName"
+			remoteParameter.Value = expectedParameterValue
+			remoteParameter.ConfigFile = expectedParameterConfigFile
+			remoteParameter.Name = expectedParameterName
+			var alert tc.Alerts
+			alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
 
-	firstParameter := testData.Parameters[0]
-	// Retrieve the Parameter by name so we can get the id for the Update
-	params := url.Values{}
-	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
-	}
-	remoteParameter := resp[0]
-	expectedParameterValue := "UPDATED"
-	remoteParameter.Value = expectedParameterValue
-	var alert tc.Alerts
-	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
-	if err != nil {
-		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			// Retrieve the parameter to check parameter name got updated
+			resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
+			if err != nil {
+				t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+			}
+			if len(resp) > 0 {
+				respParameter := resp[0]
+				if respParameter.Value != expectedParameterValue {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.ConfigFile != expectedParameterConfigFile {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.Name != expectedParameterName {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				//update back to old value for safe deletion in pre-requisite
+				alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+				if err != nil {
+					t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+				}
+			} else {
+				t.Errorf("Not able to GET the parameter to test the updated value")
+			}
+		}
 	}
+}
 
-	// Retrieve the Parameter to check Parameter name got updated
-	resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			//Parameters can be updated with empty value, so no error while updating
+			remoteParameter.Value = ""
+
+			alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
+			if reqInf.StatusCode != http.StatusOK {
+				t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+			}
+		}
 	}
-	respParameter := resp[0]
-	if respParameter.Value != expectedParameterValue {
-		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       Added failure checks for empty data.
   
   

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			old := resp[0]
+			expectedParameterValue := "UPDATED"
+			expectedParameterConfigFile := "updatedConfigFile"
+			expectedParameterName := "updateName"
+			remoteParameter.Value = expectedParameterValue
+			remoteParameter.ConfigFile = expectedParameterConfigFile
+			remoteParameter.Name = expectedParameterName
+			var alert tc.Alerts
+			alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
 
-	firstParameter := testData.Parameters[0]
-	// Retrieve the Parameter by name so we can get the id for the Update
-	params := url.Values{}
-	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
-	}
-	remoteParameter := resp[0]
-	expectedParameterValue := "UPDATED"
-	remoteParameter.Value = expectedParameterValue
-	var alert tc.Alerts
-	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
-	if err != nil {
-		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			// Retrieve the parameter to check parameter name got updated
+			resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
+			if err != nil {
+				t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+			}
+			if len(resp) > 0 {
+				respParameter := resp[0]
+				if respParameter.Value != expectedParameterValue {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.ConfigFile != expectedParameterConfigFile {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.Name != expectedParameterName {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				//update back to old value for safe deletion in pre-requisite
+				alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+				if err != nil {
+					t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+				}
+			} else {
+				t.Errorf("Not able to GET the parameter to test the updated value")
+			}
+		}
 	}
+}
 
-	// Retrieve the Parameter to check Parameter name got updated
-	resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			//Parameters can be updated with empty value, so no error while updating
+			remoteParameter.Value = ""
+
+			alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
+			if reqInf.StatusCode != http.StatusOK {
+				t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+			}
+		}
 	}
-	respParameter := resp[0]
-	if respParameter.Value != expectedParameterValue {
-		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			remoteParameter.Name = ""
+
+			alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err == nil {
+				t.Errorf("Invalid name has been updated by ID: %v - %v", err, alert)
+			}
+			if reqInf.StatusCode != http.StatusBadRequest {
+				t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+			}
+		}
 	}
+}
 
+func UpdateParametersEmptyConfigFile(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       Added failure checks for empty data.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626396842



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusOK {
+		t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidName(t *testing.T) {
+	firstParameter := testData.Parameters[0]

Review comment:
       Added null check for getting values.

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusOK {
+		t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidName(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	remoteParameter.Name = ""
 
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err == nil {
+		t.Errorf("Invalid name has been updated by ID: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusBadRequest {
+		t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidConfigFile(t *testing.T) {
+	firstParameter := testData.Parameters[0]

Review comment:
       Added null check for getting values.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626397078



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusOK {
+		t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidName(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	remoteParameter.Name = ""
 
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err == nil {
+		t.Errorf("Invalid name has been updated by ID: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusBadRequest {
+		t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidConfigFile(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]

Review comment:
       Added the null check for a response.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626631860



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +340,204 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		_, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByName(parameters.Name, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	resp, _, err := TOSession.GetParameterByID(10000, nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByName("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByConfigFile("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByValue("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	resp, _, _ := TOSession.GetParameters(nil, nil)
+	_, reqInf, _ := TOSession.CreateParameter(resp[0])

Review comment:
       Added length checks

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +340,204 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		_, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByName(parameters.Name, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	resp, _, err := TOSession.GetParameterByID(10000, nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByName("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByConfigFile("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByValue("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	resp, _, _ := TOSession.GetParameters(nil, nil)
+	_, reqInf, _ := TOSession.CreateParameter(resp[0])
+	if reqInf.StatusCode != http.StatusBadRequest {
+		t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	firstParameter := testData.Parameters[0]

Review comment:
       Added null checks.

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +340,204 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		_, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByName(parameters.Name, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	resp, _, err := TOSession.GetParameterByID(10000, nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByName("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByConfigFile("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByValue("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	resp, _, _ := TOSession.GetParameters(nil, nil)
+	_, reqInf, _ := TOSession.CreateParameter(resp[0])
+	if reqInf.StatusCode != http.StatusBadRequest {
+		t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	firstParameter.Name = ""
+	_, reqInf, _ := TOSession.CreateParameter(firstParameter)
+	if reqInf.StatusCode != http.StatusBadRequest {
+		t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	firstParameter := testData.Parameters[0]

Review comment:
       Added null checks.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626396370



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusOK {
+		t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidName(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]

Review comment:
       Added the null check for response




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r635754691



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +261,331 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", parameters.ConfigFile)
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", parameters.Value)
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Value")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", parameters.Name)
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	} else {
+		t.Errorf("No existing parameters available to validate duplicate functionality")
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {

Review comment:
       Added failure checks




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626312798



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -119,13 +152,18 @@ func UpdateTestParameters(t *testing.T) {
 	// Retrieve the Parameter by name so we can get the id for the Update
 	params := url.Values{}
 	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
+	resp, _, err := TOSession.GetParameters(params, nil)
 	if err != nil {
 		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
 	}
 	remoteParameter := resp[0]
+	old := resp[0]
 	expectedParameterValue := "UPDATED"
+	expectedParameterConfigFile := "updatedConfigFile"
+	expectedParameterName := "updateName"
 	remoteParameter.Value = expectedParameterValue
+	remoteParameter.ConfigFile = expectedParameterConfigFile
+	remoteParameter.Name = expectedParameterName

Review comment:
       This statement is for updating the values, at the end, I am comparing the expected vs actual.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r627996644



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			old := resp[0]
+			expectedParameterValue := "UPDATED"
+			expectedParameterConfigFile := "updatedConfigFile"
+			expectedParameterName := "updateName"
+			remoteParameter.Value = expectedParameterValue
+			remoteParameter.ConfigFile = expectedParameterConfigFile
+			remoteParameter.Name = expectedParameterName
+			var alert tc.Alerts
+			alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
 
-	firstParameter := testData.Parameters[0]
-	// Retrieve the Parameter by name so we can get the id for the Update
-	params := url.Values{}
-	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
-	}
-	remoteParameter := resp[0]
-	expectedParameterValue := "UPDATED"
-	remoteParameter.Value = expectedParameterValue
-	var alert tc.Alerts
-	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
-	if err != nil {
-		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			// Retrieve the parameter to check parameter name got updated
+			resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
+			if err != nil {
+				t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+			}
+			if len(resp) > 0 {
+				respParameter := resp[0]
+				if respParameter.Value != expectedParameterValue {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.ConfigFile != expectedParameterConfigFile {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.Name != expectedParameterName {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				//update back to old value for safe deletion in pre-requisite
+				alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+				if err != nil {
+					t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+				}
+			} else {
+				t.Errorf("Not able to GET the parameter to test the updated value")
+			}
+		}
 	}
+}
 
-	// Retrieve the Parameter to check Parameter name got updated
-	resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {

Review comment:
       Added failure checks for a response.

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			old := resp[0]
+			expectedParameterValue := "UPDATED"
+			expectedParameterConfigFile := "updatedConfigFile"
+			expectedParameterName := "updateName"
+			remoteParameter.Value = expectedParameterValue
+			remoteParameter.ConfigFile = expectedParameterConfigFile
+			remoteParameter.Name = expectedParameterName
+			var alert tc.Alerts
+			alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
 
-	firstParameter := testData.Parameters[0]
-	// Retrieve the Parameter by name so we can get the id for the Update
-	params := url.Values{}
-	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
-	}
-	remoteParameter := resp[0]
-	expectedParameterValue := "UPDATED"
-	remoteParameter.Value = expectedParameterValue
-	var alert tc.Alerts
-	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
-	if err != nil {
-		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			// Retrieve the parameter to check parameter name got updated
+			resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
+			if err != nil {
+				t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+			}
+			if len(resp) > 0 {
+				respParameter := resp[0]
+				if respParameter.Value != expectedParameterValue {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.ConfigFile != expectedParameterConfigFile {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.Name != expectedParameterName {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				//update back to old value for safe deletion in pre-requisite
+				alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+				if err != nil {
+					t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+				}
+			} else {
+				t.Errorf("Not able to GET the parameter to test the updated value")
+			}
+		}
 	}
+}
 
-	// Retrieve the Parameter to check Parameter name got updated
-	resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			//Parameters can be updated with empty value, so no error while updating
+			remoteParameter.Value = ""
+
+			alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
+			if reqInf.StatusCode != http.StatusOK {
+				t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+			}
+		}
 	}
-	respParameter := resp[0]
-	if respParameter.Value != expectedParameterValue {
-		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {

Review comment:
       Added failure checks for a response.

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			old := resp[0]
+			expectedParameterValue := "UPDATED"
+			expectedParameterConfigFile := "updatedConfigFile"
+			expectedParameterName := "updateName"
+			remoteParameter.Value = expectedParameterValue
+			remoteParameter.ConfigFile = expectedParameterConfigFile
+			remoteParameter.Name = expectedParameterName
+			var alert tc.Alerts
+			alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
 
-	firstParameter := testData.Parameters[0]
-	// Retrieve the Parameter by name so we can get the id for the Update
-	params := url.Values{}
-	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
-	}
-	remoteParameter := resp[0]
-	expectedParameterValue := "UPDATED"
-	remoteParameter.Value = expectedParameterValue
-	var alert tc.Alerts
-	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
-	if err != nil {
-		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			// Retrieve the parameter to check parameter name got updated
+			resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
+			if err != nil {
+				t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+			}
+			if len(resp) > 0 {
+				respParameter := resp[0]
+				if respParameter.Value != expectedParameterValue {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.ConfigFile != expectedParameterConfigFile {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.Name != expectedParameterName {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				//update back to old value for safe deletion in pre-requisite
+				alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+				if err != nil {
+					t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+				}
+			} else {
+				t.Errorf("Not able to GET the parameter to test the updated value")
+			}
+		}
 	}
+}
 
-	// Retrieve the Parameter to check Parameter name got updated
-	resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			//Parameters can be updated with empty value, so no error while updating
+			remoteParameter.Value = ""
+
+			alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
+			if reqInf.StatusCode != http.StatusOK {
+				t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+			}
+		}
 	}
-	respParameter := resp[0]
-	if respParameter.Value != expectedParameterValue {
-		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			remoteParameter.Name = ""
+
+			alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err == nil {
+				t.Errorf("Invalid name has been updated by ID: %v - %v", err, alert)
+			}
+			if reqInf.StatusCode != http.StatusBadRequest {
+				t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+			}
+		}
 	}
+}
 
+func UpdateParametersEmptyConfigFile(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {

Review comment:
       Added failure checks for a response.

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +349,213 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByName(parameters.Name, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	resp, _, err := TOSession.GetParameterByID(10000, nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByName("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByConfigFile("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByValue("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	resp, _, _ := TOSession.GetParameters(nil, nil)
+	if len(resp) > 0 {

Review comment:
       Added failure checks for a response.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r634042693



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -157,7 +176,31 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+}
 
+func UpdateParametersEmptyConfigFile(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       Added failure checks
   
   

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -157,7 +176,31 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+}
 
+func UpdateParametersEmptyConfigFile(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(firstParameter.Name))
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp.Response) > 0 {

Review comment:
       Added failure checks
   
   




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r627072420



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +340,204 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		_, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}

Review comment:
       Before executing the CreateMultipleParameters, I am deleting all the parameters that have created before.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626271787



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -110,6 +128,21 @@ func CreateTestParameters(t *testing.T) {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
+
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+
+	pls := []tc.Parameter{}
+	for _, pl := range testData.Parameters {
+		pls = append(pls, pl)
+	}

Review comment:
       I fixed it by passing the parameters directly.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r627996157



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +349,213 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByName(parameters.Name, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	resp, _, err := TOSession.GetParameterByID(10000, nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByName("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByConfigFile("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByValue("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	resp, _, _ := TOSession.GetParameters(nil, nil)
+	if len(resp) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp[0])
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       Added failure checks for empty data.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626398711



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {

Review comment:
       changed the function name to UpdateParametersEmptyValue - updating parameters can take empty value. so the tests are succeed.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r634029110



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))

Review comment:
       Removed url.QueryEscape




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] ocket8888 commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
ocket8888 commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626894618



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -119,13 +152,18 @@ func UpdateTestParameters(t *testing.T) {
 	// Retrieve the Parameter by name so we can get the id for the Update
 	params := url.Values{}
 	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
+	resp, _, err := TOSession.GetParameters(params, nil)
 	if err != nil {
 		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
 	}
 	remoteParameter := resp[0]
+	old := resp[0]
 	expectedParameterValue := "UPDATED"
+	expectedParameterConfigFile := "updatedConfigFile"
+	expectedParameterName := "updateName"
 	remoteParameter.Value = expectedParameterValue
+	remoteParameter.ConfigFile = expectedParameterConfigFile
+	remoteParameter.Name = expectedParameterName

Review comment:
       right, I guess I missed that before




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626397223



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusOK {
+		t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidName(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	remoteParameter.Name = ""
 
+	var alert tc.Alerts
+	alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+	if err == nil {
+		t.Errorf("Invalid name has been updated by ID: %v - %v", err, alert)
+	}
+	if reqInf.StatusCode != http.StatusBadRequest {
+		t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func UpdateParametersInvalidConfigFile(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	remoteParameter.ConfigFile = ""
+
+	var alert tc.Alerts

Review comment:
       removed the duplicate declaration




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] ocket8888 commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
ocket8888 commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r628337323



##########
File path: traffic_ops/testing/api/v4/phys_locations_test.go
##########
@@ -238,3 +240,86 @@ func DeleteTestPhysLocations(t *testing.T) {
 		}
 	}
 }
+
+func GetTestPaginationSupportPhysLocation(t *testing.T) {

Review comment:
       It looks like you accidentally committed changes from #5822 




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] ocket8888 commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
ocket8888 commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626891913



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			old := resp[0]
+			expectedParameterValue := "UPDATED"
+			expectedParameterConfigFile := "updatedConfigFile"
+			expectedParameterName := "updateName"
+			remoteParameter.Value = expectedParameterValue
+			remoteParameter.ConfigFile = expectedParameterConfigFile
+			remoteParameter.Name = expectedParameterName
+			var alert tc.Alerts
+			alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
 
-	firstParameter := testData.Parameters[0]
-	// Retrieve the Parameter by name so we can get the id for the Update
-	params := url.Values{}
-	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
-	}
-	remoteParameter := resp[0]
-	expectedParameterValue := "UPDATED"
-	remoteParameter.Value = expectedParameterValue
-	var alert tc.Alerts
-	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
-	if err != nil {
-		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			// Retrieve the parameter to check parameter name got updated
+			resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
+			if err != nil {
+				t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+			}
+			if len(resp) > 0 {
+				respParameter := resp[0]
+				if respParameter.Value != expectedParameterValue {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.ConfigFile != expectedParameterConfigFile {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.Name != expectedParameterName {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				//update back to old value for safe deletion in pre-requisite
+				alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+				if err != nil {
+					t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+				}
+			} else {
+				t.Errorf("Not able to GET the parameter to test the updated value")
+			}
+		}
 	}
+}
 
-	// Retrieve the Parameter to check Parameter name got updated
-	resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       This test will silently pass if the test data is in a bad state and the test cannot proceed

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +349,213 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByName(parameters.Name, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	resp, _, err := TOSession.GetParameterByID(10000, nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByName("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByConfigFile("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByValue("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	resp, _, _ := TOSession.GetParameters(nil, nil)
+	if len(resp) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp[0])
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       This test will silently pass if the test data is in a bad state and the test cannot proceed

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {

Review comment:
       This test will silently pass if Traffic Ops did not create the Parameter with the given name from the test data but incorrectly returns a success code/message from the creation, or if the `name` query string parameter is not being properly handled by Traffic Ops, or if the Go client is returning improper objects.
   
   There are possibly other tests that would fail in these scenarios, but in general it's safer, easier and more future-proof in tests to just fail if any expectation is ever not met. You seem to like the pattern:
   ```go
   if conditionsAreAsExpected {
       // proceed
   } else {
       t.Error("expectation failed")
   }
   ```
   and that works, that's totally fine. But just if it were me, personally, I'd do something more like:
   ```go
   if !conditionsAreAsExpected {
       t.Fatal("expectation failed")
   }
   // proceed
   ```
   I just think it's easier than having to track down matching braces to remember if I've handled a condition.

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       This test will silently pass if the test data is in a bad state and the test cannot proceed

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +349,213 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByName(parameters.Name, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	resp, _, err := TOSession.GetParameterByID(10000, nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByName("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByConfigFile("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByValue("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	resp, _, _ := TOSession.GetParameters(nil, nil)
+	if len(resp) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp[0])
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       This test will silently pass if the test data is in a bad state and the test cannot proceed

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			old := resp[0]
+			expectedParameterValue := "UPDATED"
+			expectedParameterConfigFile := "updatedConfigFile"
+			expectedParameterName := "updateName"
+			remoteParameter.Value = expectedParameterValue
+			remoteParameter.ConfigFile = expectedParameterConfigFile
+			remoteParameter.Name = expectedParameterName
+			var alert tc.Alerts
+			alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
 
-	firstParameter := testData.Parameters[0]
-	// Retrieve the Parameter by name so we can get the id for the Update
-	params := url.Values{}
-	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
-	}
-	remoteParameter := resp[0]
-	expectedParameterValue := "UPDATED"
-	remoteParameter.Value = expectedParameterValue
-	var alert tc.Alerts
-	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
-	if err != nil {
-		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			// Retrieve the parameter to check parameter name got updated
+			resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
+			if err != nil {
+				t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+			}
+			if len(resp) > 0 {
+				respParameter := resp[0]
+				if respParameter.Value != expectedParameterValue {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.ConfigFile != expectedParameterConfigFile {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.Name != expectedParameterName {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				//update back to old value for safe deletion in pre-requisite
+				alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+				if err != nil {
+					t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+				}
+			} else {
+				t.Errorf("Not able to GET the parameter to test the updated value")
+			}
+		}
 	}
+}
 
-	// Retrieve the Parameter to check Parameter name got updated
-	resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			//Parameters can be updated with empty value, so no error while updating
+			remoteParameter.Value = ""
+
+			alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
+			if reqInf.StatusCode != http.StatusOK {
+				t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+			}
+		}
 	}
-	respParameter := resp[0]
-	if respParameter.Value != expectedParameterValue {
-		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       This test will silently pass if the test data is in a bad state and the test cannot proceed

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			old := resp[0]
+			expectedParameterValue := "UPDATED"
+			expectedParameterConfigFile := "updatedConfigFile"
+			expectedParameterName := "updateName"
+			remoteParameter.Value = expectedParameterValue
+			remoteParameter.ConfigFile = expectedParameterConfigFile
+			remoteParameter.Name = expectedParameterName
+			var alert tc.Alerts
+			alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
 
-	firstParameter := testData.Parameters[0]
-	// Retrieve the Parameter by name so we can get the id for the Update
-	params := url.Values{}
-	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
-	}
-	remoteParameter := resp[0]
-	expectedParameterValue := "UPDATED"
-	remoteParameter.Value = expectedParameterValue
-	var alert tc.Alerts
-	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
-	if err != nil {
-		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			// Retrieve the parameter to check parameter name got updated
+			resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
+			if err != nil {
+				t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+			}
+			if len(resp) > 0 {
+				respParameter := resp[0]
+				if respParameter.Value != expectedParameterValue {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.ConfigFile != expectedParameterConfigFile {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.Name != expectedParameterName {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				//update back to old value for safe deletion in pre-requisite
+				alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+				if err != nil {
+					t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+				}
+			} else {
+				t.Errorf("Not able to GET the parameter to test the updated value")
+			}
+		}
 	}
+}
 
-	// Retrieve the Parameter to check Parameter name got updated
-	resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			//Parameters can be updated with empty value, so no error while updating
+			remoteParameter.Value = ""
+
+			alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
+			if reqInf.StatusCode != http.StatusOK {
+				t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+			}
+		}
 	}
-	respParameter := resp[0]
-	if respParameter.Value != expectedParameterValue {
-		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {

Review comment:
       This test can silently pass if Traffic Ops fails to behave as expected

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			old := resp[0]
+			expectedParameterValue := "UPDATED"
+			expectedParameterConfigFile := "updatedConfigFile"
+			expectedParameterName := "updateName"
+			remoteParameter.Value = expectedParameterValue
+			remoteParameter.ConfigFile = expectedParameterConfigFile
+			remoteParameter.Name = expectedParameterName
+			var alert tc.Alerts
+			alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
 
-	firstParameter := testData.Parameters[0]
-	// Retrieve the Parameter by name so we can get the id for the Update
-	params := url.Values{}
-	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
-	}
-	remoteParameter := resp[0]
-	expectedParameterValue := "UPDATED"
-	remoteParameter.Value = expectedParameterValue
-	var alert tc.Alerts
-	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
-	if err != nil {
-		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			// Retrieve the parameter to check parameter name got updated
+			resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
+			if err != nil {
+				t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+			}
+			if len(resp) > 0 {
+				respParameter := resp[0]
+				if respParameter.Value != expectedParameterValue {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.ConfigFile != expectedParameterConfigFile {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.Name != expectedParameterName {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				//update back to old value for safe deletion in pre-requisite
+				alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+				if err != nil {
+					t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+				}
+			} else {
+				t.Errorf("Not able to GET the parameter to test the updated value")
+			}
+		}
 	}
+}
 
-	// Retrieve the Parameter to check Parameter name got updated
-	resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			//Parameters can be updated with empty value, so no error while updating
+			remoteParameter.Value = ""
+
+			alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
+			if reqInf.StatusCode != http.StatusOK {
+				t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+			}
+		}
 	}
-	respParameter := resp[0]
-	if respParameter.Value != expectedParameterValue {
-		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			remoteParameter.Name = ""
+
+			alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err == nil {
+				t.Errorf("Invalid name has been updated by ID: %v - %v", err, alert)
+			}
+			if reqInf.StatusCode != http.StatusBadRequest {
+				t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+			}
+		}
 	}
+}
 
+func UpdateParametersEmptyConfigFile(t *testing.T) {
+	if len(testData.Parameters) > 0 {

Review comment:
       This test will silently pass if the test data is in a bad state and the test cannot proceed

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			old := resp[0]
+			expectedParameterValue := "UPDATED"
+			expectedParameterConfigFile := "updatedConfigFile"
+			expectedParameterName := "updateName"
+			remoteParameter.Value = expectedParameterValue
+			remoteParameter.ConfigFile = expectedParameterConfigFile
+			remoteParameter.Name = expectedParameterName
+			var alert tc.Alerts
+			alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
 
-	firstParameter := testData.Parameters[0]
-	// Retrieve the Parameter by name so we can get the id for the Update
-	params := url.Values{}
-	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
-	}
-	remoteParameter := resp[0]
-	expectedParameterValue := "UPDATED"
-	remoteParameter.Value = expectedParameterValue
-	var alert tc.Alerts
-	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
-	if err != nil {
-		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			// Retrieve the parameter to check parameter name got updated
+			resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
+			if err != nil {
+				t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+			}
+			if len(resp) > 0 {
+				respParameter := resp[0]
+				if respParameter.Value != expectedParameterValue {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.ConfigFile != expectedParameterConfigFile {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.Name != expectedParameterName {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				//update back to old value for safe deletion in pre-requisite
+				alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+				if err != nil {
+					t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+				}
+			} else {
+				t.Errorf("Not able to GET the parameter to test the updated value")
+			}
+		}
 	}
+}
 
-	// Retrieve the Parameter to check Parameter name got updated
-	resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			//Parameters can be updated with empty value, so no error while updating
+			remoteParameter.Value = ""
+
+			alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
+			if reqInf.StatusCode != http.StatusOK {
+				t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+			}
+		}
 	}
-	respParameter := resp[0]
-	if respParameter.Value != expectedParameterValue {
-		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			remoteParameter.Name = ""
+
+			alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err == nil {
+				t.Errorf("Invalid name has been updated by ID: %v - %v", err, alert)
+			}
+			if reqInf.StatusCode != http.StatusBadRequest {
+				t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+			}
+		}
 	}
+}
 
+func UpdateParametersEmptyConfigFile(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {

Review comment:
       This test can silently pass if Traffic Ops fails to behave as expected

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -91,57 +109,162 @@ func GetTestParametersIMSAfterChange(t *testing.T, header http.Header) {
 	header.Set(rfc.IfModifiedSince, timeStr)
 	for _, pl := range testData.Parameters {
 		params.Set("name", pl.Name)
-		_, reqInf, err := TOSession.GetParameters(header, params)
+		_, reqInf, err := TOSession.GetParameters(params, header)
 		if err != nil {
-			t.Fatalf("Expected no error, but got %v", err.Error())
+			t.Errorf("Expected no error, but got %v", err.Error())
 		}
 		if reqInf.StatusCode != http.StatusNotModified {
-			t.Fatalf("Expected 304 status code, got %v", reqInf.StatusCode)
+			t.Errorf("Expected 304 status code, got %v", reqInf.StatusCode)
 		}
 	}
 }
 
 func CreateTestParameters(t *testing.T) {
 
 	for _, pl := range testData.Parameters {
-		resp, _, err := TOSession.CreateParameter(pl)
-		t.Log("Response: ", resp)
+		_, _, err := TOSession.CreateParameter(pl)
 		if err != nil {
 			t.Errorf("could not CREATE parameters: %v", err)
 		}
 	}
+}
 
+func CreateMultipleTestParameters(t *testing.T) {
+	//To avoid duplicate issue, deleting and creating new parameters
+	DeleteTestParameters(t)
+	_, _, err := TOSession.CreateMultipleParameters(testData.Parameters)
+	if err != nil {
+		t.Errorf("could not CREATE parameters: %v", err)
+	}
 }
 
 func UpdateTestParameters(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {
+			remoteParameter := resp[0]
+			old := resp[0]
+			expectedParameterValue := "UPDATED"
+			expectedParameterConfigFile := "updatedConfigFile"
+			expectedParameterName := "updateName"
+			remoteParameter.Value = expectedParameterValue
+			remoteParameter.ConfigFile = expectedParameterConfigFile
+			remoteParameter.Name = expectedParameterName
+			var alert tc.Alerts
+			alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
+			if err != nil {
+				t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			}
 
-	firstParameter := testData.Parameters[0]
-	// Retrieve the Parameter by name so we can get the id for the Update
-	params := url.Values{}
-	params.Set("name", firstParameter.Name)
-	resp, _, err := TOSession.GetParameters(nil, params)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
-	}
-	remoteParameter := resp[0]
-	expectedParameterValue := "UPDATED"
-	remoteParameter.Value = expectedParameterValue
-	var alert tc.Alerts
-	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, nil)
-	if err != nil {
-		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+			// Retrieve the parameter to check parameter name got updated
+			resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
+			if err != nil {
+				t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+			}
+			if len(resp) > 0 {
+				respParameter := resp[0]
+				if respParameter.Value != expectedParameterValue {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.ConfigFile != expectedParameterConfigFile {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				if respParameter.Name != expectedParameterName {
+					t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
+				}
+				//update back to old value for safe deletion in pre-requisite
+				alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+				if err != nil {
+					t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+				}
+			} else {
+				t.Errorf("Not able to GET the parameter to test the updated value")
+			}
+		}
 	}
+}
 
-	// Retrieve the Parameter to check Parameter name got updated
-	resp, _, err = TOSession.GetParameterByID(remoteParameter.ID, nil)
-	if err != nil {
-		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		params := url.Values{}
+		params.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(params, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		if len(resp) > 0 {

Review comment:
       This test can silently pass if Traffic Ops fails to behave as expected

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -231,3 +349,213 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	delResp, reqInf, err := TOSession.DeleteParameter(10000)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	qparams := url.Values{}
+	qparams.Set("orderby", "id")
+	parameters, _, err := TOSession.GetParameters(qparams, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameters: %v", err)
+	}
+
+	if len(parameters) > 0 {
+		qparams = url.Values{}
+		qparams.Set("orderby", "id")
+		qparams.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(qparams, nil)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Error("Error in getting parameter by limit")
+		}
+		if len(parameters) > 1 {
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameter by limit and offset")
+			}
+
+			qparams = url.Values{}
+			qparams.Set("orderby", "id")
+			qparams.Set("limit", "1")
+			qparams.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(qparams, nil)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Error("Error in getting parameters by limit and page")
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("offset", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: " + err.Error())
+	}
+
+	qparams = url.Values{}
+	qparams.Set("limit", "1")
+	qparams.Set("page", "0")
+	_, _, err = TOSession.GetParameters(qparams, nil)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: " + err.Error())
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByConfigFile(parameters.ConfigFile, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByValue(parameters.Value, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		resp, reqInf, err := TOSession.GetParametersByName(parameters.Name, nil)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	resp, _, err := TOSession.GetParameterByID(10000, nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByName("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByConfigFile("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	resp, _, err := TOSession.GetParametersByValue("abcd", nil)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	resp, _, _ := TOSession.GetParameters(nil, nil)
+	if len(resp) > 0 {

Review comment:
       This test can silently pass if Traffic Ops fails to behave as expected




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r635754625



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +261,331 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", parameters.ConfigFile)
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", parameters.Value)
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Value")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", parameters.Name)
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	} else {
+		t.Errorf("No existing parameters available to validate duplicate functionality")
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {

Review comment:
       Added failure checks




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r626396146



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -141,7 +179,78 @@ func UpdateTestParameters(t *testing.T) {
 	if respParameter.Value != expectedParameterValue {
 		t.Errorf("results do not match actual: %s, expected: %s", respParameter.Value, expectedParameterValue)
 	}
+	//update back to old value for safe deletion in pre-requisite
+	alert, _, err = TOSession.UpdateParameter(remoteParameter.ID, old, nil)
+	if err != nil {
+		t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+	}
+}
+
+func UpdateParametersInvalidValue(t *testing.T) {
+	firstParameter := testData.Parameters[0]
+	// Retrieve the Parameter by name so we can get the id for the Update
+	params := url.Values{}
+	params.Set("name", firstParameter.Name)
+	resp, _, err := TOSession.GetParameters(params, nil)
+	if err != nil {
+		t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+	}
+	remoteParameter := resp[0]
+	//Parameters can be updated with empty value, so no error while updating
+	remoteParameter.Value = ""
+
+	var alert tc.Alerts

Review comment:
       Removed the duplicate declaration.




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [trafficcontrol] dmohan001c commented on a change in pull request #5797: Add TO Client api for Parameters Automation

Posted by GitBox <gi...@apache.org>.
dmohan001c commented on a change in pull request #5797:
URL: https://github.com/apache/trafficcontrol/pull/5797#discussion_r634044753



##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.ConfigFile = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]

Review comment:
       Added null checks

##########
File path: traffic_ops/testing/api/v4/parameters_test.go
##########
@@ -246,3 +287,290 @@ func DeleteTestParameter(t *testing.T, pl tc.Parameter) {
 		}
 	}
 }
+
+func DeleteTestParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	delResp, reqInf, err := TOSession.DeleteParameter(10000, opts)
+	if err == nil {
+		t.Errorf("cannot DELETE Parameters by Invalid ID: %v - %v", err, delResp)
+	}
+	if reqInf.StatusCode != http.StatusNotFound {
+		t.Errorf("Expected 404 status code, got %v", reqInf.StatusCode)
+	}
+}
+
+func GetTestPaginationSupportParameters(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("orderby", "id")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Unexpected error getting Parameters: %v - alerts: %+v", err, resp.Alerts)
+	}
+	parameters := resp.Response
+	if len(parameters) > 0 {
+		opts.QueryParameters = url.Values{}
+		opts.QueryParameters.Set("orderby", "id")
+		opts.QueryParameters.Set("limit", "1")
+		parametersWithLimit, _, err := TOSession.GetParameters(opts)
+		if err == nil {
+			if !reflect.DeepEqual(parameters[:1], parametersWithLimit.Response) {
+				t.Error("expected GET Parameters with limit = 1 to return first result")
+			}
+		} else {
+			t.Errorf("Unexpected error getting Parameters with a limit: %v - alerts: %+v", err, parametersWithLimit.Alerts)
+		}
+		if len(parameters) > 1 {
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("offset", "1")
+			parametersWithOffset, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithOffset.Response) {
+					t.Error("expected GET Parameters with limit = 1, offset = 1 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and an offset: %v - alerts: %+v", err, parametersWithOffset.Alerts)
+			}
+
+			opts.QueryParameters = url.Values{}
+			opts.QueryParameters.Set("orderby", "id")
+			opts.QueryParameters.Set("limit", "1")
+			opts.QueryParameters.Set("page", "2")
+			parametersWithPage, _, err := TOSession.GetParameters(opts)
+			if err == nil {
+				if !reflect.DeepEqual(parameters[1:2], parametersWithPage.Response) {
+					t.Error("expected GET Parameters with limit = 1, page = 2 to return second result")
+				}
+			} else {
+				t.Errorf("Unexpected error getting Parameters with a limit and a page: %v - alerts: %+v", err, parametersWithPage.Alerts)
+			}
+		} else {
+			t.Errorf("only one parameters found, so offset functionality can't test")
+		}
+	} else {
+		t.Errorf("No parameters found to check pagination")
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "-2")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for limit is not bigger than -1, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("offset", "0")
+	resp, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for offset is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+
+	opts.QueryParameters = url.Values{}
+	opts.QueryParameters.Set("limit", "1")
+	opts.QueryParameters.Set("page", "0")
+	_, _, err = TOSession.GetParameters(opts)
+	if err == nil {
+		t.Error("expected GET Parameters 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 Parameters to return an error for page is not a positive integer, actual error: %v - alerts: %+v", err, resp.Alerts)
+	}
+}
+
+func GetTestParametersByConfigfile(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("configFile", url.QueryEscape(parameters.ConfigFile))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Config File: %v - %v", parameters.ConfigFile, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByValue(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("value", url.QueryEscape(parameters.Value))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Value: %v - %v", parameters.Value, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Config file")
+		}
+	}
+}
+
+func GetTestParametersByName(t *testing.T) {
+	for _, parameters := range testData.Parameters {
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", url.QueryEscape(parameters.Name))
+		resp, reqInf, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by Name: %v - %v", parameters.Name, err)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+		if len(resp.Response) <= 0 {
+			t.Errorf("No data available for Get Parameters by Name")
+		}
+	}
+}
+
+func GetParametersByInvalidId(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("id", strconv.Itoa(10000))
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ID %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid ID shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("name", "invalidname")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid Name %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid name shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidConfigfile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("configFile", "invalidfile")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid ConfigFile %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid config file shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func GetParametersByInvalidValue(t *testing.T) {
+	opts := client.NewRequestOptions()
+	opts.QueryParameters.Set("value", "invalidvalue")
+	resp, _, err := TOSession.GetParameters(opts)
+	if err != nil {
+		t.Errorf("Getting Parameters by Invalid value %v", err)
+	}
+	if len(resp.Response) >= 1 {
+		t.Errorf("Invalid value shouldn't have any response %v Error %v", resp, err)
+	}
+}
+
+func CreateTestParametersAlreadyExist(t *testing.T) {
+	opts := client.NewRequestOptions()
+	resp, _, _ := TOSession.GetParameters(opts)
+	if len(resp.Response) > 0 {
+		_, reqInf, _ := TOSession.CreateParameter(resp.Response[0], opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingName(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.Name = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func CreateTestParametersMissingconfigFile(t *testing.T) {
+	opts := client.NewRequestOptions()
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		firstParameter.ConfigFile = ""
+		_, reqInf, _ := TOSession.CreateParameter(firstParameter, opts)
+		if reqInf.StatusCode != http.StatusBadRequest {
+			t.Errorf("Expected 400 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyValue(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]
+		//Parameters can be updated with empty value, so no error while updating
+		remoteParameter.Value = ""
+		opts = client.NewRequestOptions()
+		var alert tc.Alerts
+		alert, reqInf, err := TOSession.UpdateParameter(remoteParameter.ID, remoteParameter, opts)
+		if err != nil {
+			t.Errorf("cannot UPDATE Parameter by id: %v - %v", err, alert)
+		}
+		if reqInf.StatusCode != http.StatusOK {
+			t.Errorf("Expected 200 status code, got %v", reqInf.StatusCode)
+		}
+	}
+}
+
+func UpdateParametersEmptyName(t *testing.T) {
+	if len(testData.Parameters) > 0 {
+		firstParameter := testData.Parameters[0]
+		// Retrieve the Parameter by name so we can get the id for the Update
+		opts := client.NewRequestOptions()
+		opts.QueryParameters.Set("name", firstParameter.Name)
+		resp, _, err := TOSession.GetParameters(opts)
+		if err != nil {
+			t.Errorf("cannot GET Parameter by name: %v - %v", firstParameter.Name, err)
+		}
+		remoteParameter := resp.Response[0]

Review comment:
       Added failure checks




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org