package com.restfiddle.handler; import java.util.List; import java.util.Map; import net.minidev.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import com.restfiddle.controller.rest.AssertionController; import com.restfiddle.dto.AssertionDTO; import com.restfiddle.dto.BodyAssertDTO; import com.restfiddle.dto.RfResponseDTO; @Component public class AssertHandler { @Autowired private AssertionController assertionController; Logger logger = LoggerFactory.getLogger(AssertHandler.class); public void runAssert(RfResponseDTO rfResponseDTO, String nodeId) { AssertionDTO assertionDTO = rfResponseDTO.getAssertionDTO(); if (assertionDTO == null) return; List<BodyAssertDTO> bodyAssertDTOs = assertionDTO.getBodyAssertDTOs(); if (bodyAssertDTOs == null) return; try { BodyAssertTool tool = new BodyAssertTool(rfResponseDTO.getBody()); for (BodyAssertDTO bodyAssertDTO : bodyAssertDTOs) { tool.doAssert(bodyAssertDTO); } assertionController.update(nodeId, assertionDTO); } catch (Exception e) { logger.debug("Body is not json"); } return; } private class BodyAssertTool { Object body; public BodyAssertTool(String body) { this.body = Configuration.defaultConfiguration().jsonProvider().parse(body); } @SuppressWarnings("unchecked") public void doAssert(BodyAssertDTO bodyAssertDTO) { String propertyName = bodyAssertDTO.getPropertyName(); if (propertyName.startsWith("[")) { propertyName = "$" + propertyName; } else { propertyName = "$." + propertyName; } boolean success = false; try { Object actualValue = JsonPath.read(body, propertyName); bodyAssertDTO.setActualValue(actualValue.toString()); if (actualValue instanceof Number) { success = evaluate(bodyAssertDTO.getExpectedValue(), bodyAssertDTO.getComparator(), (Number) actualValue); } else if (actualValue instanceof String) { success = evaluate(bodyAssertDTO.getExpectedValue(), bodyAssertDTO.getComparator(), (String) actualValue); } else if (actualValue instanceof Map) { JSONObject json = new JSONObject((Map<String, ?>) actualValue); bodyAssertDTO.setActualValue(json.toString()); success = evaluate(bodyAssertDTO.getExpectedValue(), bodyAssertDTO.getComparator(), json); } else if (actualValue instanceof List) { success = evaluate(bodyAssertDTO.getExpectedValue(), bodyAssertDTO.getComparator(), (List<Object>) actualValue); } } catch (Exception e) { logger.debug("propery not found"); } bodyAssertDTO.setSuccess(success); } private boolean evaluate(String expectedValue, String comparator, String actualValue) { boolean result = false; switch (comparator) { case "=": result = actualValue.equals(expectedValue); break; case "!=": result = !actualValue.equals(expectedValue); break; case "Contains": result = actualValue.contains(expectedValue); break; case "! Contains": result = !actualValue.contains(expectedValue); break; default: break; } return result; } private boolean evaluate(String expectedValue, String comparator, Number actualValue) { boolean result = false; double expected = Double.parseDouble(expectedValue); double actual = actualValue.doubleValue(); switch (comparator) { case "=": result = actual == expected; break; case "!=": result = actual != expected; break; case "<": result = actual < expected; break; case "<=": result = actual <= expected; break; case ">": result = actual > expected; break; case ">=": result = actual >= expected; break; default: break; } return result; } private boolean evaluate(String expectedValue, String comparator, JSONObject actualValue) { boolean result = false; switch (comparator) { case "Contains Key": result = actualValue.containsKey(expectedValue); break; case "! Contains Key": result = !actualValue.containsKey(expectedValue); break; case "Contains Value": result = actualValue.containsValue(expectedValue); ; break; case "! Contains Value": result = !actualValue.containsValue(expectedValue); break; default: break; } return result; } private boolean evaluate(String expectedValue, String comparator, List<Object> actualValue) { boolean result = false; if(comparator.equals("Contains Value")) { result = actualValue.contains(expectedValue); } else if(comparator.equals("! Contains Value")) { result = !actualValue.contains(expectedValue); } return result; } } }