String comparison functions working

This commit is contained in:
Joshua Darnell 2020-03-02 12:08:21 -08:00
parent 521920a1f8
commit dbabae2158
4 changed files with 94 additions and 5 deletions

Binary file not shown.

View File

@ -680,7 +680,7 @@
MetallicLevel="Platinum"
Capability="Filterability ($filter)"
WebAPIReference="2.4.4"
OutputFile="REQ-WA103-QO13_Contains.json"
OutputFile="REQ-WA103-QO13.json"
Url="*ClientSettings_WebAPIURI*/*Parameter_EndpointResource*?$top=*Parameter_TopCount*&$select=*Parameter_SelectList*&$filter=*Parameter_ContainsField* ne null and contains(*Parameter_ContainsField*,'*Parameter_ContainsValue*')*Parameter_RequiredParameters*"
/>

View File

@ -324,4 +324,44 @@ Feature: Web API Server 1.0.2 Certification
Then the server responds with a status code of 200
And the response is valid JSON
And the response has results
And "fractional" data in Timestamp Field "Parameter_TimestampField" "lt" "Parameter_FractionalValue"
And "fractional" data in Timestamp Field "Parameter_TimestampField" "lt" "Parameter_FractionalValue"
@REQ-WA103-QO13 @platinum @2.4.4 @filterability-endorsement
Scenario: Query Support: $filter - String: contains
When a GET request is made to the resolved Url in "REQ-WA103-QO13"
Then the server responds with a status code of 200
And the response is valid JSON
And the response has results
And String data in "Parameter_ContainsField" "contains" "Parameter_ContainsValue"
@REQ-WA103-QO14 @platinum @2.4.4 @filterability-endorsement
Scenario: Query Support: $filter - String: ends with
When a GET request is made to the resolved Url in "REQ-WA103-QO14"
Then the server responds with a status code of 200
And the response is valid JSON
And the response has results
And String data in "Parameter_EndsWithField" "endswith" "Parameter_EndsWithValue"
@REQ-WA103-QO15 @platinum @2.4.4 @filterability-endorsement
Scenario: Query Support: $filter - String: starts with
When a GET request is made to the resolved Url in "REQ-WA103-QO15"
Then the server responds with a status code of 200
And the response is valid JSON
And the response has results
And String data in "Parameter_StartsWithField" "startswith" "Parameter_StartsWithValue"
@REQ-WA103-QO16 @platinum @2.4.4 @filterability-endorsement
Scenario: Query Support: $filter - String: tolower() support
When a GET request is made to the resolved Url in "REQ-WA103-QO16"
Then the server responds with a status code of 200
And the response is valid JSON
And the response has results
And String data in "Parameter_ToLowerField" "tolower" "Parameter_ToLowerValue"
@REQ-WA103-QO17 @platinum @2.4.4 @filterability-endorsement
Scenario: Query Support: $filter - String: toupper() support
When a GET request is made to the resolved Url in "REQ-WA103-QO17"
Then the server responds with a status code of 200
And the response is valid JSON
And the response has results
And String data in "Parameter_ToUpperField" "toupper" "Parameter_ToUpperValue"

View File

@ -603,6 +603,7 @@ public class WebAPIServer_1_0_2 implements En {
AtomicReference<Integer> fieldValue = new AtomicReference<>();
AtomicInteger assertedValue = new AtomicInteger();
AtomicReference<String> datePart = new AtomicReference<>(stringDatePart.toLowerCase());
AtomicReference<String> operator = new AtomicReference<>(op.toLowerCase());
try {
assertedValue.set(Integer.parseInt(Settings.resolveParametersString(parameterAssertedValue, settings)));
@ -611,7 +612,7 @@ public class WebAPIServer_1_0_2 implements En {
from(responseData.get()).getList(JSON_VALUE_PATH, HashMap.class).forEach(item -> {
try {
fieldValue.set(Utils.getDatePart(datePart.get(), item.get(fieldName)));
assertTrue(Utils.compare(fieldValue.get(), op, assertedValue.get()));
assertTrue(Utils.compare(fieldValue.get(), operator.get(), assertedValue.get()));
} catch (Exception ex){
//fail();
LOG.error("ERROR: exception thrown." + ex);
@ -632,6 +633,7 @@ public class WebAPIServer_1_0_2 implements En {
AtomicReference<Integer> fieldValue = new AtomicReference<>();
AtomicReference<Integer> assertedValue = new AtomicReference<>();
AtomicReference<String> datePart = new AtomicReference<>(stringDatePart.toLowerCase());
AtomicReference<String> operator = new AtomicReference<>(op.toLowerCase());
try {
assertedValue.set(Integer.parseInt(Settings.resolveParametersString(parameterAssertedValue, settings)));
@ -640,7 +642,7 @@ public class WebAPIServer_1_0_2 implements En {
from(responseData.get()).getList(JSON_VALUE_PATH, HashMap.class).forEach(item -> {
try {
fieldValue.set(Utils.getTimestampPart(datePart.get(), item.get(fieldName).toString()));
assertTrue(Utils.compare(fieldValue.get(), op, assertedValue.get()));
assertTrue(Utils.compare(fieldValue.get(), operator.get(), assertedValue.get()));
} catch (Exception ex){
fail();
LOG.error("ERROR: exception thrown." + ex);
@ -651,6 +653,21 @@ public class WebAPIServer_1_0_2 implements En {
LOG.error("ERROR: exception thrown." + ex);
}
});
/*
* String functions
*/
And("^String data in \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\"$", (String parameterFieldName, String op, String parameterAssertedValue) -> {
String fieldName = Settings.resolveParametersString(parameterFieldName, settings);
AtomicReference<String> fieldValue = new AtomicReference<>();
AtomicReference<String> assertedValue = new AtomicReference(Settings.resolveParametersString(parameterAssertedValue, settings));
AtomicReference<String> operator = new AtomicReference<>(op.toLowerCase());
from(responseData.get()).getList(JSON_VALUE_PATH, HashMap.class).forEach(item -> {
assertTrue(Utils.compare(item.get(fieldName).toString(), operator.get(), assertedValue.get()));
});
});
}
/**
@ -665,7 +682,12 @@ public class WebAPIServer_1_0_2 implements En {
GREATER_THAN = "gt",
GREATER_THAN_OR_EQUAL = "ge",
LESS_THAN = "lt",
LESS_THAN_OR_EQUAL = "le";
LESS_THAN_OR_EQUAL = "le",
CONTAINS = "contains",
ENDS_WITH = "endswith",
STARTS_WITH = "startswith",
TO_LOWER = "tolower",
TO_UPPER = "toupper";
}
private static class DateParts {
@ -750,6 +772,33 @@ public class WebAPIServer_1_0_2 implements En {
return result;
}
/**
* Returns true if each item in the list is true
* @param lhs Integer value
* @param op an OData binary operator for use for comparisons
* @param rhs Integer value
* @return true if lhs op rhs produces true, false otherwise
*/
private static boolean compare(String lhs, String op, String rhs) {
String operator = op.toLowerCase();
boolean result = false;
if (operator.contentEquals(Operators.CONTAINS)) {
result = lhs.contains(rhs);
} else if (operator.contentEquals(Operators.STARTS_WITH)) {
result = lhs.startsWith(rhs);
} else if (operator.contentEquals(Operators.ENDS_WITH)) {
result = lhs.endsWith(rhs);
} else if (operator.contentEquals(Operators.TO_LOWER)) {
result = lhs.toLowerCase().equals(rhs);
} else if (operator.contentEquals(Operators.TO_UPPER)) {
result = lhs.toUpperCase().equals(rhs);
}
LOG.info("Compare: " + operator + "(" + lhs + ") == " + rhs + " ==> " + result);
return result;
}
/**
* Timestamp Comparator
* @param lhs Timestamp to compare