diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataQuality/TestCaseResultPermissions.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataQuality/TestCaseResultPermissions.spec.ts index 689d395c030c..f6731edac01a 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataQuality/TestCaseResultPermissions.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataQuality/TestCaseResultPermissions.spec.ts @@ -218,6 +218,59 @@ test.describe( } }); + test('User with TEST_CASE.VIEW_ALL can view library test SQL expression in UI', async ({ + viewResultsPage, + }) => { + const sqlExpression = 'SELECT COUNT(*) FROM {table}'; + let testDefinitionRequestUrl = ''; + + await viewResultsPage.route( + '**/api/v1/dataQuality/testDefinitions/*', + async (route) => { + testDefinitionRequestUrl = route.request().url(); + + await route.fulfill({ + status: 200, + contentType: 'application/json', + json: { + id: 'test-definition-id', + name: 'tableRowCountToBeBetween', + parameterDefinition: [], + sqlExpression, + }, + }); + } + ); + + const testDefinitionResponse = viewResultsPage.waitForResponse( + (response) => + response.url().includes('/api/v1/dataQuality/testDefinitions/') && + response.request().method() === 'GET' && + response.ok() + ); + + await visitTestCaseDetailsPage(viewResultsPage); + await testDefinitionResponse; + await waitForAllLoadersToDisappear(viewResultsPage); + + await expect( + viewResultsPage.getByTestId('test-case-result-tab-container') + ).toBeVisible(); + expect(decodeURIComponent(testDefinitionRequestUrl)).toContain( + 'sqlExpression' + ); + const sqlExpressionContainer = viewResultsPage.getByTestId( + 'sql-expression-container' + ); + await expect(sqlExpressionContainer).toBeVisible({ timeout: 15000 }); + await expect(sqlExpressionContainer).toContainText('SQL Expression'); + await expect(sqlExpressionContainer).toContainText(sqlExpression); + + await viewResultsPage.unroute( + '**/api/v1/dataQuality/testDefinitions/*' + ); + }); + test('User with TABLE.VIEW_TESTS can view test case and results in UI (alternative)', async ({ tableEditResultsPage, }) => { diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/IncidentManager/TestCaseResultTab/TestCaseResultTab.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/IncidentManager/TestCaseResultTab/TestCaseResultTab.component.tsx index 5a5b599e1c8a..c66749c8208c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/IncidentManager/TestCaseResultTab/TestCaseResultTab.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/IncidentManager/TestCaseResultTab/TestCaseResultTab.component.tsx @@ -18,7 +18,6 @@ import { compare } from 'fast-json-patch'; import chunk from 'lodash/chunk'; import isEmpty from 'lodash/isEmpty'; import isUndefined from 'lodash/isUndefined'; -import startCase from 'lodash/startCase'; import toString from 'lodash/toString'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -102,7 +101,10 @@ const TestCaseResultTab = () => { if (testCaseData?.testDefinition?.id) { try { const definition = await getTestDefinitionById( - testCaseData.testDefinition.id + testCaseData.testDefinition.id, + { + fields: ['parameterDefinition', 'sqlExpression'], + } ); setTestDefinition(definition); } catch (error) { @@ -181,6 +183,30 @@ const TestCaseResultTab = () => { ); }, [testCaseData?.parameterValues]); + const sqlExpressionItems = useMemo(() => { + if (!isEmpty(withSqlParams)) { + return withSqlParams.map((param) => ({ + isEditable: true, + key: param.name ?? 'sqlExpression', + label: t('label.sql-expression'), + value: param.value ?? '', + })); + } + + if (!isEmpty(testDefinition?.sqlExpression)) { + return [ + { + isEditable: false, + key: 'test-definition-sql-expression', + label: t('label.sql-expression'), + value: testDefinition?.sqlExpression ?? '', + }, + ]; + } + + return []; + }, [testDefinition?.sqlExpression, t, withSqlParams]); + const handleTagSelection = async (selectedTags: EntityTags[]) => { if (!testCaseData) { return; @@ -489,21 +515,21 @@ const TestCaseResultTab = () => { - {!isUndefined(withSqlParams) && !isVersionPage ? ( + {!isEmpty(sqlExpressionItems) && !isVersionPage ? (