MINOR: added TestCase inspection query to backend and sample data (#16003)

* added TestCase inspection query to backend and sample data

* format

* format
This commit is contained in:
Imri Paran 2024-04-26 11:49:08 +02:00 committed by GitHub
parent f7e0912ecb
commit 4ac5912d4c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 96 additions and 2 deletions

View File

@ -654,7 +654,8 @@
"(830)112-9566x8681" "(830)112-9566x8681"
] ]
] ]
} },
"inspectionQuery": "SELECT * FROM ecommerce_db.shopify.dim_address\nWHERE zip NOT BETWEEN 90001 AND 96162\nLIMIT 50;"
} }
] ]
} }

View File

@ -362,3 +362,18 @@ class OMetaTestsMixin:
) )
return None return None
def ingest_inspection_query(
self, test_case: TestCase, inspection_query: str
) -> Optional[TestCase]:
"""
PUT inspection query for a test case.
:param test_case: The test case that failed
:param inspection_query: SQL query to inspect the failed rows
"""
resp = self.client.put(
f"{self.get_suffix(TestCase)}/{test_case.id.__root__}/inspectionQuery",
data=inspection_query,
)
return TestCase(**resp)

View File

@ -1529,6 +1529,11 @@ class SampleDataSource(
columns=test_case_results["failedRowsSample"]["columns"], columns=test_case_results["failedRowsSample"]["columns"],
), ),
) )
if test_case_results.get("inspectionQuery"):
self.metadata.ingest_inspection_query(
case,
test_case_results["inspectionQuery"],
)
def ingest_data_insights(self) -> Iterable[Either[OMetaDataInsightSample]]: def ingest_data_insights(self) -> Iterable[Either[OMetaDataInsightSample]]:
"""Iterate over all the data insights and ingest them""" """Iterate over all the data insights and ingest them"""

View File

@ -745,6 +745,17 @@ public class TestCaseRepository extends EntityRepository<TestCase> {
return testCase.withFailedRowsSample(tableData); return testCase.withFailedRowsSample(tableData);
} }
@Transaction
public TestCase addInspectionQuery(UriInfo uri, UUID testCaseId, String sql) {
TestCase original = get(uri, testCaseId, getFields(PATCH_FIELDS));
TestCase updated =
JsonUtils.readValue(JsonUtils.pojoToJson(original), TestCase.class)
.withInspectionQuery(sql);
EntityUpdater entityUpdater = getUpdater(original, updated, Operation.PATCH);
entityUpdater.update();
return updated;
}
@Transaction @Transaction
public RestUtil.DeleteResponse<TableData> deleteTestCaseFailedRowsSample(UUID id) { public RestUtil.DeleteResponse<TableData> deleteTestCaseFailedRowsSample(UUID id) {
daoCollection.entityExtensionDAO().delete(id, FAILED_ROWS_SAMPLE_EXTENSION); daoCollection.entityExtensionDAO().delete(id, FAILED_ROWS_SAMPLE_EXTENSION);
@ -908,6 +919,7 @@ public class TestCaseRepository extends EntityRepository<TestCase> {
TEST_CASE, TEST_CASE,
updated.getId()); updated.getId());
recordChange("parameterValues", original.getParameterValues(), updated.getParameterValues()); recordChange("parameterValues", original.getParameterValues(), updated.getParameterValues());
recordChange("inspectionQuery", original.getInspectionQuery(), updated.getInspectionQuery());
recordChange( recordChange(
"computePassedFailedRowCount", "computePassedFailedRowCount",
original.getComputePassedFailedRowCount(), original.getComputePassedFailedRowCount(),

View File

@ -981,6 +981,34 @@ public class TestCaseResource extends EntityResource<TestCase, TestCaseRepositor
return addHref(uriInfo, repository.addFailedRowsSample(testCase, tableData)); return addHref(uriInfo, repository.addFailedRowsSample(testCase, tableData));
} }
@PUT
@Path("/{id}/inspectionQuery")
@Operation(
operationId = "addInspectionQuery",
summary = "Add inspection query data",
description = "Add an inspection query for this test case.",
responses = {
@ApiResponse(
responseCode = "200",
description = "Successfully update the test case with an inspection query.",
content =
@Content(
mediaType = "application/json",
schema = @Schema(implementation = TestCase.class)))
})
public TestCase addInspectionQuery(
@Context UriInfo uriInfo,
@Context SecurityContext securityContext,
@Parameter(description = "Id of the test case", schema = @Schema(type = "UUID"))
@PathParam("id")
UUID id,
@Valid String query) {
OperationContext operationContext =
new OperationContext(entityType, MetadataOperation.EDIT_TESTS);
authorizer.authorize(securityContext, operationContext, getResourceContextById(id));
return addHref(uriInfo, repository.addInspectionQuery(uriInfo, id, query));
}
@GET @GET
@Path("/{id}/failedRowsSample") @Path("/{id}/failedRowsSample")
@Operation( @Operation(

View File

@ -1853,7 +1853,7 @@ public class TestCaseResourceTest extends EntityResourceTest<TestCase, CreateTes
public TestCase getTestCase(String fqn, Map<String, String> authHeaders) public TestCase getTestCase(String fqn, Map<String, String> authHeaders)
throws HttpResponseException { throws HttpResponseException {
WebTarget target = getCollection().path("/name/" + fqn); WebTarget target = getCollection().path("/name/" + fqn);
target = target.queryParam("fields", "incidentId"); target = target.queryParam("fields", "incidentId,inspectionQuery");
return TestUtils.get(target, TestCase.class, authHeaders); return TestUtils.get(target, TestCase.class, authHeaders);
} }
@ -2348,6 +2348,29 @@ public class TestCaseResourceTest extends EntityResourceTest<TestCase, CreateTes
.count()); .count());
} }
@Test
void test_addInspectionQuery(TestInfo test) throws IOException {
CreateTestCase create =
createRequest(test)
.withEntityLink(TABLE_LINK)
.withTestSuite(TEST_SUITE1.getFullyQualifiedName())
.withTestDefinition(TEST_DEFINITION3.getFullyQualifiedName())
.withParameterValues(
List.of(
new TestCaseParameterValue().withValue("100").withName("missingCountValue")));
TestCase testCase = createAndCheckEntity(create, ADMIN_AUTH_HEADERS);
String inspectionQuery = "SELECT * FROM test_table WHERE column1 = 'value1'";
putInspectionQuery(testCase, inspectionQuery, ADMIN_AUTH_HEADERS);
TestCase updated = getTestCase(testCase.getFullyQualifiedName(), ADMIN_AUTH_HEADERS);
assertEquals(updated.getInspectionQuery(), inspectionQuery);
}
private void putInspectionQuery(TestCase testCase, String sql, Map<String, String> authHeaders)
throws IOException {
TestCase putResponse = putInspectionQuery(testCase.getId(), sql, authHeaders);
assertEquals(sql, putResponse.getInspectionQuery());
}
private void putFailedRowsSample( private void putFailedRowsSample(
TestCase testCase, TestCase testCase,
List<String> columns, List<String> columns,
@ -2375,6 +2398,12 @@ public class TestCaseResourceTest extends EntityResourceTest<TestCase, CreateTes
return TestUtils.put(target, data, TestCase.class, OK, authHeaders); return TestUtils.put(target, data, TestCase.class, OK, authHeaders);
} }
public TestCase putInspectionQuery(UUID testCaseId, String sql, Map<String, String> authHeaders)
throws HttpResponseException {
WebTarget target = getResource(testCaseId).path("/inspectionQuery");
return TestUtils.put(target, sql, TestCase.class, OK, authHeaders);
}
public TableData getSampleData(UUID testCaseId, Map<String, String> authHeaders) public TableData getSampleData(UUID testCaseId, Map<String, String> authHeaders)
throws HttpResponseException { throws HttpResponseException {
WebTarget target = getResource(testCaseId).path("/failedRowsSample"); WebTarget target = getResource(testCaseId).path("/failedRowsSample");

View File

@ -115,6 +115,10 @@
"description": "Sample of failed rows for this test case.", "description": "Sample of failed rows for this test case.",
"$ref": "../entity/data/table.json#/definitions/tableData" "$ref": "../entity/data/table.json#/definitions/tableData"
}, },
"inspectionQuery": {
"description": "SQL query to retrieve the failed rows for this test case.",
"$ref": "../type/basic.json#/definitions/sqlQuery"
},
"domain" : { "domain" : {
"description": "Domain the test case belongs to. When not set, the test case inherits the domain from the table it belongs to.", "description": "Domain the test case belongs to. When not set, the test case inherits the domain from the table it belongs to.",
"$ref": "../type/entityReference.json" "$ref": "../type/entityReference.json"