diff --git a/openmetadata-ui/src/main/resources/ui/src/assets/svg/icon-test-suite.svg b/openmetadata-ui/src/main/resources/ui/src/assets/svg/icon-test-suite.svg index 49829897792..96467671c81 100644 --- a/openmetadata-ui/src/main/resources/ui/src/assets/svg/icon-test-suite.svg +++ b/openmetadata-ui/src/main/resources/ui/src/assets/svg/icon-test-suite.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/TestSuiteDetailsPage/TestSuiteDetailsPage.component.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/TestSuiteDetailsPage/TestSuiteDetailsPage.component.tsx index eae0a14d747..9444aef2916 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/TestSuiteDetailsPage/TestSuiteDetailsPage.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/TestSuiteDetailsPage/TestSuiteDetailsPage.component.tsx @@ -11,12 +11,14 @@ * limitations under the License. */ -import { Button, Col, Modal, Row, Space, Tabs } from 'antd'; +import { Button, Col, Divider, Modal, Row, Space, Tabs } from 'antd'; import { AxiosError } from 'axios'; import { compare } from 'fast-json-patch'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useHistory } from 'react-router-dom'; +import { ReactComponent as TestSuiteIcon } from '../../assets/svg/icon-test-suite.svg'; +import { DomainLabel } from '../../components/common/DomainLabel/DomainLabel.component'; import DescriptionV1 from '../../components/common/EntityDescription/DescriptionV1'; import ManageButton from '../../components/common/EntityPageInfos/ManageButton/ManageButton'; import ErrorPlaceHolder from '../../components/common/ErrorWithPlaceholder/ErrorPlaceHolder'; @@ -31,6 +33,8 @@ import { TitleBreadcrumbProps } from '../../components/common/TitleBreadcrumb/Ti import DataQualityTab from '../../components/Database/Profiler/DataQualityTab/DataQualityTab'; import { AddTestCaseList } from '../../components/DataQuality/AddTestCaseList/AddTestCaseList.component'; import TestSuitePipelineTab from '../../components/DataQuality/TestSuite/TestSuitePipelineTab/TestSuitePipelineTab.component'; +import EntityHeaderTitle from '../../components/Entity/EntityHeaderTitle/EntityHeaderTitle.component'; +import { EntityName } from '../../components/Modals/EntityNameModal/EntityNameModal.interface'; import PageLayoutV1 from '../../components/PageLayoutV1/PageLayoutV1'; import { INITIAL_PAGING_VALUE } from '../../constants/constants'; import { DEFAULT_SORT_ORDER } from '../../constants/profiler.constant'; @@ -39,14 +43,14 @@ import { OperationPermission, ResourceEntity, } from '../../context/PermissionProvider/PermissionProvider.interface'; -import { ACTION_TYPE, ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum'; +import { ERROR_PLACEHOLDER_TYPE } from '../../enums/common.enum'; import { EntityTabs, EntityType, TabSpecificField, } from '../../enums/entity.enum'; import { TestCase } from '../../generated/tests/testCase'; -import { TestSuite } from '../../generated/tests/testSuite'; +import { EntityReference, TestSuite } from '../../generated/tests/testSuite'; import { Include } from '../../generated/type/include'; import { useAuth } from '../../hooks/authHooks'; import { usePaging } from '../../hooks/paging/usePaging'; @@ -229,38 +233,35 @@ const TestSuiteDetailsPage = () => { } }; - const updateTestSuiteData = (updatedTestSuite: TestSuite, type: string) => { - saveAndUpdateTestSuiteData(updatedTestSuite) - .then((res) => { - if (res) { - setTestSuite(res); - } else { - showErrorToast(t('server.unexpected-response')); - } - }) - .catch((err: AxiosError) => { - showErrorToast( - err, - t( - `server.entity-${ - type === ACTION_TYPE.UPDATE ? 'updating' : 'removing' - }-error`, - { - entity: t('label.owner'), - } - ) - ); - }); + const updateTestSuiteData = async (updatedTestSuite: TestSuite) => { + try { + const res = await saveAndUpdateTestSuiteData(updatedTestSuite); + setTestSuite(res); + } catch (error) { + showErrorToast(error as AxiosError); + } }; const onUpdateOwner = useCallback( - (updatedOwners: TestSuite['owners']) => { + async (updatedOwners: TestSuite['owners']) => { const updatedTestSuite = { ...testSuite, owners: updatedOwners, } as TestSuite; - updateTestSuiteData(updatedTestSuite, ACTION_TYPE.UPDATE); + await updateTestSuiteData(updatedTestSuite); + }, + [testOwners, testSuite] + ); + + const handleDomainUpdate = useCallback( + async (updateDomain?: EntityReference | EntityReference[]) => { + const updatedTestSuite: TestSuite = { + ...testSuite, + domain: updateDomain, + } as TestSuite; + + await updateTestSuiteData(updatedTestSuite); }, [testOwners, testSuite] ); @@ -287,6 +288,28 @@ const TestSuiteDetailsPage = () => { } }; + const handleDisplayNameChange = async (entityName?: EntityName) => { + try { + if (testSuite) { + const updatedTestSuite = { + ...testSuite, + ...entityName, + }; + const jsonPatch = compare(testSuite, updatedTestSuite); + + if (jsonPatch.length && testSuite.id) { + const response = await saveAndUpdateTestSuiteData( + updatedTestSuite as TestSuite + ); + + setTestSuite(response); + } + } + } catch (error) { + showErrorToast(error as AxiosError); + } + }; + const handleTestCasePaging = ({ currentPage }: PagingHandlerParams) => { if (currentPage) { handlePageChange(currentPage); @@ -389,47 +412,78 @@ const TestSuiteDetailsPage = () => { pageTitle={t('label.entity-detail-plural', { entity: getEntityName(testSuite), })}> - + - - - - {(testSuitePermissions.EditAll || - testSuitePermissions.EditTests) && ( - - )} - + + + + + } + name={testSuite?.name ?? ''} + serviceName="testSuite" /> - - + + + + {(testSuitePermissions.EditAll || + testSuitePermissions.EditTests) && ( + + )} + + + -
- -
+ +
+ + + +
+ +
+ + ({ .mockImplementation(() => Promise.resolve(mockEntityPermissions)), })), })); +jest.mock( + '../../components/Entity/EntityHeaderTitle/EntityHeaderTitle.component', + () => { + return jest + .fn() + .mockImplementation(() =>
EntityHeaderTitle.component
); + } +); +jest.mock('../../components/common/DomainLabel/DomainLabel.component', () => { + return { + DomainLabel: jest + .fn() + .mockImplementation(() =>
DomainLabel.component
), + }; +}); describe('TestSuiteDetailsPage component', () => { it('component should render', async () => { @@ -110,6 +125,12 @@ describe('TestSuiteDetailsPage component', () => { expect( await screen.findByText('TitleBreadcrumb.component') ).toBeInTheDocument(); + expect( + await screen.findByText('EntityHeaderTitle.component') + ).toBeInTheDocument(); + expect( + await screen.findByText('DomainLabel.component') + ).toBeInTheDocument(); expect( await screen.findByText('ManageButton.component') ).toBeInTheDocument();