package com.griddynamics.jagger.test.jaas.validator.metrics; import com.griddynamics.jagger.engine.e1.services.data.service.MetricEntity; import com.griddynamics.jagger.invoker.v2.JHttpEndpoint; import com.griddynamics.jagger.invoker.v2.JHttpQuery; import com.griddynamics.jagger.invoker.v2.JHttpResponse; import com.griddynamics.jagger.test.jaas.util.TestContext; import com.griddynamics.jagger.test.jaas.validator.BaseHttpResponseValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; /** * Validates response of /sessions/{sessionId}/tests/{testName}/metrics. * Expected: * - list of records is of size 1 and greater; * - the list's size is the same as the one's available via DataService; * - the list contains no duplicates; * - expected and actual sets are the same. */ public class MetricsListResponseContentValidator extends BaseHttpResponseValidator<MetricEntity[]> { private static final Logger LOGGER = LoggerFactory.getLogger(MetricsListResponseContentValidator.class); @Override public String getName() { return "MetricsListResponseContentValidator"; } @Override public boolean isValid(JHttpQuery<String> query, JHttpEndpoint endpoint, JHttpResponse<MetricEntity[]> result) { List<MetricEntity> actualEntities = Arrays.asList(result.getBody()); String sessionId = getSessionIdFromQuery(query); Set<MetricEntity> expectedEntities = TestContext.getMetricsBySessionIdAndTestName(sessionId, getTestNameFromQuery(query)); int actlSize = actualEntities.size(); int expctdSize = expectedEntities.size(); assertTrue("At least one metrics record is expected. Check returned list's size", 0 < actlSize); List<MetricEntity> noDuplicatesActualList = actualEntities.stream().distinct().collect(Collectors.toList()); assertEquals("Response contains duplicate records", actlSize, noDuplicatesActualList.size()); assertEquals("Actual list's size is not the same as expected one's.", actlSize, expctdSize); //TODO: Refactor when JFG-943 is ready. assertTrue("Actual list is not the same as expected set.", compareIgnoringTestDto(expectedEntities, actualEntities)); return true; } private String getSessionIdFromQuery(JHttpQuery query) { // ${jaas.rest.root}/sessions/{sessionId}/tests/{testName}/metrics => ${jaas.rest.root} + sessions + {sessionId} + tests + {testName} + metrics String[] parts = query.getPath().split("/"); return parts[parts.length - 4]; } private String getTestNameFromQuery(JHttpQuery query) { // ${jaas.rest.root}/sessions/{sessionId}/tests/{testName}/metrics => ${jaas.rest.root} + sessions + {sessionId} + tests + {testName} + metrics String[] parts = query.getPath().split("/"); return parts[parts.length - 2]; } private boolean compareIgnoringTestDto(Set<MetricEntity> expectedSet, List<MetricEntity> actualList) { boolean result = true; for (MetricEntity expected : expectedSet) { MetricEntity actual = actualList.stream().filter(m -> m.getMetricId().equals(expected.getMetricId())).findFirst().orElse(null); if (!areEqualIgnoringTestDto(expected, actual)) { result = false; LOGGER.warn("Metric entities are not equal. \nExp: {} \nAct: {}", expected, actual); break; } } return result; } /** * Compares MetricEntity ignoring internal "test" instances (to avoid comparison of uniqueIds which are not equal in our case). * See JFG-943. */ private boolean areEqualIgnoringTestDto(MetricEntity ent1, MetricEntity ent2) { return ent1 == ent2 || !(ent2 == null || ent1.getClass() != ent2.getClass()) && ent1.isPlotAvailable() == ent2.isPlotAvailable() && ent1.isSummaryAvailable() == ent2.isSummaryAvailable() && ent1.getMetricId().equals(ent2.getMetricId()) && ent1.getDisplayName().equals(ent2.getDisplayName()); } }