From 3886842bb73db1d1397cef91519c13ffdf0834c7 Mon Sep 17 00:00:00 2001 From: Teddy Date: Thu, 28 Dec 2023 14:25:49 +0100 Subject: [PATCH] FIXES #14396: Exclude empty test suites from quality page (#14511) * fix: exclude empty test suites * style: ran java linting * fix: update expected test results --- .../openmetadata/service/jdbi3/ListFilter.java | 15 +++++++++++++++ .../resources/dqtests/TestSuiteResource.java | 7 +++++++ .../resources/dqtests/TestSuiteResourceTest.java | 4 ++++ .../TestSuites/TestSuites.component.tsx | 1 + .../DataQuality/TestSuites/TestSuites.test.tsx | 2 ++ .../src/main/resources/ui/src/rest/testAPI.ts | 1 + 6 files changed, 30 insertions(+) diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ListFilter.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ListFilter.java index 2de0300e503..671f6e83141 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ListFilter.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ListFilter.java @@ -58,6 +58,7 @@ public class ListFilter { condition = addCondition(condition, getTestCaseCondition()); condition = addCondition(condition, getTestSuiteTypeCondition()); condition = addCondition(condition, getTestSuiteFQNCondition()); + condition = addCondition(condition, getEmptyTestSuiteCondition()); condition = addCondition(condition, getDomainCondition()); condition = addCondition(condition, getEntityFQNHashCondition()); condition = addCondition(condition, getTestCaseResolutionStatusType()); @@ -227,6 +228,20 @@ public class ListFilter { } } + private String getEmptyTestSuiteCondition() { + String includeEmptyTestSuites = getQueryParam("includeEmptyTestSuites"); + if (includeEmptyTestSuites == null || Boolean.parseBoolean(includeEmptyTestSuites)) { + // if we want to include empty test suites, then we don't need to add a condition + return ""; + } + + if (Boolean.TRUE.equals(DatasourceConfig.getInstance().isMySQL())) { + return "!JSON_CONTAINS(json, JSON_ARRAY() , '$.testCaseResultSummary')"; + } + + return "jsonb_array_length(json#>'{testCaseResultSummary}') != 0"; + } + private String getFqnPrefixCondition(String tableName, String fqnPrefix) { return tableName == null ? String.format( diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/dqtests/TestSuiteResource.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/dqtests/TestSuiteResource.java index 530ff0d0bc5..b40264e37bc 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/dqtests/TestSuiteResource.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/dqtests/TestSuiteResource.java @@ -125,6 +125,12 @@ public class TestSuiteResource extends EntityResource resourceContext = getResourceContext(); diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/dqtests/TestSuiteResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/dqtests/TestSuiteResourceTest.java index e174d57b57a..220f822046e 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/dqtests/TestSuiteResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/dqtests/TestSuiteResourceTest.java @@ -356,6 +356,10 @@ public class TestSuiteResourceTest extends EntityResourceTest assertEquals(false, ts.getExecutable())); + + queryParams.put("includeEmptyTestSuites", "false"); + testSuiteResultList = listEntities(queryParams, ADMIN_AUTH_HEADERS); + assertEquals(0, testSuiteResultList.getData().size()); } @Test diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/TestSuites/TestSuites.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/TestSuites/TestSuites.component.tsx index 7ceffc19c12..62c885e9941 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/TestSuites/TestSuites.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/TestSuites/TestSuites.component.tsx @@ -145,6 +145,7 @@ export const TestSuites = ({ summaryPanel }: { summaryPanel: ReactNode }) => { const result = await getListTestSuites({ ...params, fields: 'owner,summary', + includeEmptyTestSuites: false, testSuiteType: tab === DataQualityPageTabs.TABLES ? TestSuiteType.executable diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/TestSuites/TestSuites.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/TestSuites/TestSuites.test.tsx index 81194231eb2..493c385f3d3 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/TestSuites/TestSuites.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/TestSuites/TestSuites.test.tsx @@ -102,6 +102,7 @@ describe('TestSuites component', () => { ).toBeInTheDocument(); expect(mockGetListTestSuites).toHaveBeenCalledWith({ fields: 'owner,summary', + includeEmptyTestSuites: false, limit: 15, testSuiteType: 'executable', }); @@ -138,6 +139,7 @@ describe('TestSuites component', () => { ).toBeInTheDocument(); expect(mockGetListTestSuites).toHaveBeenCalledWith({ fields: 'owner,summary', + includeEmptyTestSuites: false, limit: 15, testSuiteType: 'logical', }); diff --git a/openmetadata-ui/src/main/resources/ui/src/rest/testAPI.ts b/openmetadata-ui/src/main/resources/ui/src/rest/testAPI.ts index 8d7e3b6fd74..8edd2563a49 100644 --- a/openmetadata-ui/src/main/resources/ui/src/rest/testAPI.ts +++ b/openmetadata-ui/src/main/resources/ui/src/rest/testAPI.ts @@ -34,6 +34,7 @@ export enum TestSuiteType { export type ListTestSuitePrams = ListParams & { testSuiteType?: TestSuiteType; + includeEmptyTestSuites?: boolean; }; export type ListTestCaseParams = ListParams & {