Fixes #12069 - Test Case Summary for testSuite endpoint return 0 (#12076)

This commit is contained in:
Teddy 2023-06-21 20:53:18 +02:00 committed by GitHub
parent 8fac9d8976
commit 6e92dc6938
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 84 additions and 55 deletions

View File

@ -2912,7 +2912,7 @@ public interface CollectionDAO {
@SqlQuery(
"SELECT ranked.json FROM (SELECT json, ROW_NUMBER() OVER(PARTITION BY entityFQNHash ORDER BY timestamp DESC) AS row_num "
+ "FROM entity_extension_time_series WHERE entityFQNHash IN (<entityFQNHashes>)) ranked WHERE ranked.row_num = 1")
+ "FROM entity_extension_time_series WHERE entityFQNHash IN (<entityFQNHashes>) AND extension = :extension) ranked WHERE ranked.row_num = 1")
List<String> getLatestExtensionByFQNs(
@BindList("entityFQNHashes") List<String> entityFQNHashes, @Bind("extension") String extension);

View File

@ -26,7 +26,6 @@ import org.openmetadata.schema.tests.TestCaseParameterValue;
import org.openmetadata.schema.tests.TestDefinition;
import org.openmetadata.schema.tests.TestSuite;
import org.openmetadata.schema.tests.type.TestCaseResult;
import org.openmetadata.schema.tests.type.TestCaseStatus;
import org.openmetadata.schema.tests.type.TestSummary;
import org.openmetadata.schema.type.ChangeDescription;
import org.openmetadata.schema.type.ChangeEvent;
@ -306,32 +305,21 @@ public class TestCaseRepository extends EntityRepository<TestCase> {
return new RestUtil.DeleteResponse<>(testCase, RestUtil.ENTITY_DELETED);
}
public TestSummary getTestSummary() throws IOException {
List<TestCase> testCases = listAll(Fields.EMPTY_FIELDS, new ListFilter());
List<String> testCaseFQNHashes =
testCases.stream()
.map(testCase -> FullyQualifiedName.buildHash(testCase.getFullyQualifiedName()))
.collect(Collectors.toList());
if (testCaseFQNHashes.isEmpty()) return new TestSummary();
List<String> jsonList =
daoCollection
.entityExtensionTimeSeriesDao()
.getLatestExtensionByFQNs(testCaseFQNHashes, TESTCASE_RESULT_EXTENSION);
HashMap<String, Integer> testCaseSummary = new HashMap<>();
for (String json : jsonList) {
TestCaseResult testCaseResult = JsonUtils.readValue(json, TestCaseResult.class);
String status = testCaseResult.getTestCaseStatus().toString();
testCaseSummary.put(status, testCaseSummary.getOrDefault(status, 0) + 1);
public TestSummary getTestSummary(UUID testSuiteId) throws IOException {
List<String> testCaseFQNs;
if (testSuiteId == null) {
List<TestCase> testCases = listAll(Fields.EMPTY_FIELDS, new ListFilter());
testCaseFQNs = testCases.stream().map(TestCase::getFullyQualifiedName).collect(Collectors.toList());
} else {
List<CollectionDAO.EntityRelationshipRecord> testCases =
findTo(testSuiteId, TEST_SUITE, Relationship.CONTAINS, TEST_CASE);
List<EntityReference> testCasesEntityReferences = EntityUtil.getEntityReferences(testCases);
testCaseFQNs =
testCasesEntityReferences.stream().map(EntityReference::getFullyQualifiedName).collect(Collectors.toList());
}
return new TestSummary()
.withAborted(testCaseSummary.getOrDefault(TestCaseStatus.Aborted.toString(), 0))
.withFailed(testCaseSummary.getOrDefault(TestCaseStatus.Failed.toString(), 0))
.withSuccess(testCaseSummary.getOrDefault(TestCaseStatus.Success.toString(), 0))
.withTotal(testCaseFQNHashes.size());
return EntityUtil.getTestCaseExecutionSummary(
daoCollection.entityExtensionTimeSeriesDao(), testCaseFQNs, TESTCASE_RESULT_EXTENSION);
}
@Override

View File

@ -6,15 +6,12 @@ import static org.openmetadata.service.Entity.TEST_SUITE;
import static org.openmetadata.service.jdbi3.TestCaseRepository.TESTCASE_RESULT_EXTENSION;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
import javax.ws.rs.core.SecurityContext;
import lombok.extern.slf4j.Slf4j;
import org.openmetadata.schema.entity.data.Table;
import org.openmetadata.schema.tests.TestSuite;
import org.openmetadata.schema.tests.type.TestCaseResult;
import org.openmetadata.schema.tests.type.TestCaseStatus;
import org.openmetadata.schema.tests.type.TestSummary;
import org.openmetadata.schema.type.EntityReference;
import org.openmetadata.schema.type.Relationship;
@ -49,25 +46,11 @@ public class TestSuiteRepository extends EntityRepository<TestSuite> {
private TestSummary getTestSummary(TestSuite entity) throws IOException {
List<EntityReference> testCases = getTestCases(entity);
HashMap<String, Integer> testCaseSummary = new HashMap<>();
List<String> testCaseFQNs =
testCases.stream().map(EntityReference::getFullyQualifiedName).collect(Collectors.toList());
if (testCaseFQNs.isEmpty()) return new TestSummary();
List<String> jsonList =
daoCollection.entityExtensionTimeSeriesDao().getLatestExtensionByFQNs(testCaseFQNs, TESTCASE_RESULT_EXTENSION);
for (String json : jsonList) {
TestCaseResult testCaseResult = JsonUtils.readValue(json, TestCaseResult.class);
String status = testCaseResult.getTestCaseStatus().toString();
testCaseSummary.put(status, testCaseSummary.getOrDefault(status, 0) + 1);
}
return new TestSummary()
.withAborted(testCaseSummary.getOrDefault(TestCaseStatus.Aborted.toString(), 0))
.withFailed(testCaseSummary.getOrDefault(TestCaseStatus.Failed.toString(), 0))
.withSuccess(testCaseSummary.getOrDefault(TestCaseStatus.Success.toString(), 0))
.withTotal(testCaseFQNs.size());
return EntityUtil.getTestCaseExecutionSummary(
daoCollection.entityExtensionTimeSeriesDao(), testCaseFQNs, TESTCASE_RESULT_EXTENSION);
}
@Override

View File

@ -708,12 +708,19 @@ public class TestCaseResource extends EntityResource<TestCase, TestCaseRepositor
description = "Tests Execution Summary",
content = @Content(mediaType = "application/json", schema = @Schema(implementation = TestSummary.class)))
})
public TestSummary getTestsExecutionSummary(@Context UriInfo uriInfo, @Context SecurityContext securityContext)
public TestSummary getTestsExecutionSummary(
@Context UriInfo uriInfo,
@Context SecurityContext securityContext,
@Parameter(
description = "get summary for a specific test suite",
schema = @Schema(type = "String", format = "uuid"))
@QueryParam("testSuiteId")
UUID testSuiteId)
throws IOException {
ResourceContextInterface resourceContext = TestCaseResourceContext.builder().build();
OperationContext operationContext = new OperationContext(Entity.TABLE, MetadataOperation.VIEW_TESTS);
authorizer.authorize(securityContext, operationContext, resourceContext);
return repository.getTestSummary();
return repository.getTestSummary(testSuiteId);
}
@Override

View File

@ -23,10 +23,12 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import java.util.function.BiPredicate;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import javax.ws.rs.WebApplicationException;
import lombok.Getter;
import lombok.NonNull;
@ -44,11 +46,15 @@ import org.openmetadata.schema.entity.data.Topic;
import org.openmetadata.schema.entity.policies.accessControl.Rule;
import org.openmetadata.schema.entity.type.CustomProperty;
import org.openmetadata.schema.system.FailureDetails;
import org.openmetadata.schema.tests.type.TestCaseResult;
import org.openmetadata.schema.tests.type.TestCaseStatus;
import org.openmetadata.schema.tests.type.TestSummary;
import org.openmetadata.schema.type.*;
import org.openmetadata.schema.type.TagLabel.TagSource;
import org.openmetadata.service.Entity;
import org.openmetadata.service.exception.CatalogExceptionMessage;
import org.openmetadata.service.exception.EntityNotFoundException;
import org.openmetadata.service.jdbi3.CollectionDAO;
import org.openmetadata.service.jdbi3.CollectionDAO.EntityRelationshipRecord;
import org.openmetadata.service.jdbi3.CollectionDAO.EntityVersionPair;
import org.openmetadata.service.jdbi3.CollectionDAO.UsageDAO;
@ -205,6 +211,32 @@ public final class EntityUtil {
return details;
}
public static TestSummary getTestCaseExecutionSummary(
CollectionDAO.EntityExtensionTimeSeriesDAO entityExtensionTimeSeriesDAO,
List<String> testCaseFQNs,
String extensionName)
throws IOException {
List<String> testCaseFQNHashes =
testCaseFQNs.stream().map(fqn -> FullyQualifiedName.buildHash(fqn)).collect(Collectors.toList());
if (testCaseFQNHashes.isEmpty()) return new TestSummary();
List<String> jsonList = entityExtensionTimeSeriesDAO.getLatestExtensionByFQNs(testCaseFQNHashes, extensionName);
HashMap<String, Integer> testCaseSummary = new HashMap<>();
for (String json : jsonList) {
TestCaseResult testCaseResult = JsonUtils.readValue(json, TestCaseResult.class);
String status = testCaseResult.getTestCaseStatus().toString();
testCaseSummary.put(status, testCaseSummary.getOrDefault(status, 0) + 1);
}
return new TestSummary()
.withAborted(testCaseSummary.getOrDefault(TestCaseStatus.Aborted.toString(), 0))
.withFailed(testCaseSummary.getOrDefault(TestCaseStatus.Failed.toString(), 0))
.withSuccess(testCaseSummary.getOrDefault(TestCaseStatus.Success.toString(), 0))
.withTotal(jsonList.size());
}
/** Merge two sets of tags */
public static void mergeTags(List<TagLabel> mergeTo, List<TagLabel> mergeFrom) {
if (nullOrEmpty(mergeFrom)) {

View File

@ -6,6 +6,7 @@ import static javax.ws.rs.core.Response.Status.FORBIDDEN;
import static javax.ws.rs.core.Response.Status.NOT_FOUND;
import static javax.ws.rs.core.Response.Status.OK;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@ -337,10 +338,14 @@ public class TestCaseResourceTest extends EntityResourceTest<TestCase, CreateTes
ADMIN_AUTH_HEADERS);
verifyTestCaseResults(testCaseResults, testCase1ResultList, 4);
TestSummary testSummary = getTestSummary(ADMIN_AUTH_HEADERS);
assertEquals(2, testSummary.getFailed());
assertEquals(2, testSummary.getSuccess());
TestSummary testSummary = getTestSummary(ADMIN_AUTH_HEADERS, null);
assertNotEquals(0, testSummary.getFailed());
assertNotEquals(0, testSummary.getSuccess());
assertNotEquals(0, testSummary.getTotal());
assertEquals(0, testSummary.getAborted());
TestSummary emptyTestSummary = getTestSummary(ADMIN_AUTH_HEADERS, UUID.randomUUID().toString());
assertNull(emptyTestSummary.getFailed());
}
@Test
@ -692,8 +697,11 @@ public class TestCaseResourceTest extends EntityResourceTest<TestCase, CreateTes
return TestUtils.get(target, TestCaseResource.TestCaseResultList.class, authHeaders);
}
private TestSummary getTestSummary(Map<String, String> authHeaders) throws IOException {
private TestSummary getTestSummary(Map<String, String> authHeaders, String testSuiteId) throws IOException {
WebTarget target = getCollection().path("/executionSummary");
if (testSuiteId != null) {
target = target.queryParam("testSuiteId", testSuiteId);
}
return TestUtils.get(target, TestSummary.class, authHeaders);
}

View File

@ -3,7 +3,7 @@ package org.openmetadata.service.resources.dqtests;
import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
import static javax.ws.rs.core.Response.Status.NOT_FOUND;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.openmetadata.service.util.TestUtils.ADMIN_AUTH_HEADERS;
import static org.openmetadata.service.util.TestUtils.LONG_ENTITY_NAME;
@ -13,6 +13,7 @@ import static org.openmetadata.service.util.TestUtils.assertResponse;
import static org.openmetadata.service.util.TestUtils.assertResponseContains;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -31,6 +32,8 @@ import org.openmetadata.schema.api.tests.CreateTestSuite;
import org.openmetadata.schema.entity.data.Table;
import org.openmetadata.schema.tests.TestCase;
import org.openmetadata.schema.tests.TestSuite;
import org.openmetadata.schema.tests.type.TestCaseResult;
import org.openmetadata.schema.tests.type.TestCaseStatus;
import org.openmetadata.schema.type.Column;
import org.openmetadata.schema.type.ColumnDataType;
import org.openmetadata.schema.type.EntityReference;
@ -104,15 +107,21 @@ public class TestSuiteResourceTest extends EntityResourceTest<TestSuite, CreateT
}
@Test
void put_testCaseResults_200() throws IOException {
void put_testCaseResults_200() throws IOException, ParseException {
TestCaseResourceTest testCaseResourceTest = new TestCaseResourceTest();
List<EntityReference> testCases1 = new ArrayList<>();
TestCaseResult testCaseResult =
new TestCaseResult()
.withResult("tested")
.withTestCaseStatus(TestCaseStatus.Success)
.withTimestamp(TestUtils.dateToTimestamp("2021-09-09"));
for (int i = 0; i < 5; i++) {
CreateTestCase createTestCase =
testCaseResourceTest.createRequest("test_testSuite_" + i).withTestSuite(TEST_SUITE1.getFullyQualifiedName());
TestCase testCase = testCaseResourceTest.createAndCheckEntity(createTestCase, ADMIN_AUTH_HEADERS);
testCases1.add(testCase.getEntityReference());
testCaseResourceTest.putTestCaseResult(testCase.getFullyQualifiedName(), testCaseResult, ADMIN_AUTH_HEADERS);
}
for (int i = 5; i < 10; i++) {
@ -120,7 +129,8 @@ public class TestSuiteResourceTest extends EntityResourceTest<TestSuite, CreateT
testCaseResourceTest
.createRequest("test_testSuite_2_" + i)
.withTestSuite(TEST_SUITE2.getFullyQualifiedName());
testCaseResourceTest.createAndCheckEntity(create, ADMIN_AUTH_HEADERS);
TestCase testCase = testCaseResourceTest.createAndCheckEntity(create, ADMIN_AUTH_HEADERS);
testCaseResourceTest.putTestCaseResult(testCase.getFullyQualifiedName(), testCaseResult, ADMIN_AUTH_HEADERS);
}
ResultList<TestSuite> actualTestSuites = getTestSuites(10, "*", ADMIN_AUTH_HEADERS);
@ -446,7 +456,8 @@ public class TestSuiteResourceTest extends EntityResourceTest<TestSuite, CreateT
TestSuite storedTestSuite = testSuiteMap.get(result.getName());
if (storedTestSuite == null) continue;
validateCreatedEntity(storedTestSuite, result, ADMIN_AUTH_HEADERS);
assertNotNull(storedTestSuite.getSummary());
assertNotEquals(0, storedTestSuite.getSummary().getSuccess());
assertNotEquals(0, storedTestSuite.getSummary().getTotal());
}
}