Error handling robustness

Cleanup of some things I missed yesterday...
This commit is contained in:
Matt Visnovsky 2024-06-07 16:35:06 -06:00
parent fdc145bffd
commit 23f844d871
3 changed files with 77 additions and 78 deletions

View File

@ -301,7 +301,7 @@
</div> </div>
<div class="flex-grow-1"> <div class="flex-grow-1">
<label for="expectedValue" class="form-label">{{ $t("Expected Value") }}</label> <label for="expectedValue" class="form-label">{{ $t("Expected Value") }}</label>
<input v-if="monitor.jsonPathOperator !== 'contains' && monitor.jsonPathOperator !== '=='" id="expectedValue" v-model="monitor.expectedValue" type="number" class="form-control" required step=".01"> <input v-if="monitor.jsonPathOperator !== 'contains' && monitor.jsonPathOperator !== '==' && monitor.jsonPathOperator !== '!='" id="expectedValue" v-model="monitor.expectedValue" type="number" class="form-control" required step=".01">
<input v-else id="expectedValue" v-model="monitor.expectedValue" type="text" class="form-control" required> <input v-else id="expectedValue" v-model="monitor.expectedValue" type="text" class="form-control" required>
</div> </div>
</div> </div>

View File

@ -405,23 +405,19 @@ async function evaluateJsonQuery(data, jsonPath, jsonPathOperator, expectedValue
catch (_a) { catch (_a) {
response = typeof data === "number" || typeof data === "object" ? data : data.toString(); response = typeof data === "number" || typeof data === "object" ? data : data.toString();
} }
if (jsonPath && typeof data === "object") {
try { try {
response = await jsonata(jsonPath).evaluate(response); response = (jsonPath) ? await jsonata(jsonPath).evaluate(response) : response;
}
catch (err) {
throw new Error(`Error evaluating JSON query: ${err.message}`);
}
}
let jsonQueryExpression; let jsonQueryExpression;
switch (jsonPathOperator) { switch (jsonPathOperator) {
case ">": case ">":
case ">=": case ">=":
case "<": case "<":
case "<=": case "<=":
case "!=":
jsonQueryExpression = `$.value ${jsonPathOperator} $.expected`; jsonQueryExpression = `$.value ${jsonPathOperator} $.expected`;
break; break;
case "!=":
jsonQueryExpression = "$string($.value) != $string($.expected)";
break;
case "==": case "==":
jsonQueryExpression = "$string($.value) = $string($.expected)"; jsonQueryExpression = "$string($.value) = $string($.expected)";
break; break;
@ -433,15 +429,19 @@ async function evaluateJsonQuery(data, jsonPath, jsonPathOperator, expectedValue
} }
const expression = jsonata(jsonQueryExpression); const expression = jsonata(jsonQueryExpression);
const status = await expression.evaluate({ const status = await expression.evaluate({
value: response.toString(), value: response,
expected: expectedValue.toString() expected: expectedValue
}); });
if (response === undefined || status === undefined) { if (response === undefined || status === undefined) {
throw new Error("Query evaluation returned undefined. Check your query syntax and the structure of the response data."); throw new Error("Query evaluation returned undefined. Check query syntax and the structure of the response data");
} }
return { return {
status, status,
response response
}; };
}
catch (err) {
throw new Error(`Error evaluating JSON query: ${err.message}. Response from server was: ${response}`);
}
} }
exports.evaluateJsonQuery = evaluateJsonQuery; exports.evaluateJsonQuery = evaluateJsonQuery;

View File

@ -663,16 +663,10 @@ export async function evaluateJsonQuery(data: any, jsonPath: string, jsonPathOpe
response = typeof data === "number" || typeof data === "object" ? data : data.toString(); response = typeof data === "number" || typeof data === "object" ? data : data.toString();
} }
// If a JSON path is provided, pre-evaluate the data using it.
if (jsonPath && typeof data === "object") {
try { try {
response = await jsonata(jsonPath).evaluate(response); // If a JSON path is provided, pre-evaluate the data using it.
} catch (err: any) { response = (jsonPath) ? await jsonata(jsonPath).evaluate(response) : response;
throw new Error(`Error evaluating JSON query: ${err.message}`);
}
}
// Perform the comparison logic using the chosen operator
// Perform the comparison logic using the chosen operator // Perform the comparison logic using the chosen operator
let jsonQueryExpression; let jsonQueryExpression;
switch (jsonPathOperator) { switch (jsonPathOperator) {
@ -680,9 +674,11 @@ export async function evaluateJsonQuery(data: any, jsonPath: string, jsonPathOpe
case ">=": case ">=":
case "<": case "<":
case "<=": case "<=":
case "!=":
jsonQueryExpression = `$.value ${jsonPathOperator} $.expected`; jsonQueryExpression = `$.value ${jsonPathOperator} $.expected`;
break; break;
case "!=":
jsonQueryExpression = "$string($.value) != $string($.expected)";
break;
case "==": case "==":
jsonQueryExpression = "$string($.value) = $string($.expected)"; jsonQueryExpression = "$string($.value) = $string($.expected)";
break; break;
@ -696,16 +692,19 @@ export async function evaluateJsonQuery(data: any, jsonPath: string, jsonPathOpe
// Evaluate the JSON Query Expression // Evaluate the JSON Query Expression
const expression = jsonata(jsonQueryExpression); const expression = jsonata(jsonQueryExpression);
const status = await expression.evaluate({ const status = await expression.evaluate({
value: response.toString(), value: response,
expected: expectedValue.toString() expected: expectedValue
}); });
if (response === undefined || status === undefined) { if (response === undefined || status === undefined) {
throw new Error("Query evaluation returned undefined. Check your query syntax and the structure of the response data."); throw new Error("Query evaluation returned undefined. Check query syntax and the structure of the response data");
} }
return { return {
status, // The evaluation of the json query status, // The evaluation of the json query
response // The response from the server or result from initial json-query evaluation response // The response from the server or result from initial json-query evaluation
}; };
} catch (err: any) {
throw new Error(`Error evaluating JSON query: ${err.message}. Response from server was: ${response}`);
}
} }