fix: Make column name a selection box for tableRowInsertedCountToBeBetween test #10284 (#10520)

* fix: Make column name a selection box for `tableRowInsertedCountToBeBetween` test #10284

* sync-translation file

* added unit test for changes
This commit is contained in:
Shailesh Parmar 2023-03-11 13:53:26 +05:30 committed by GitHub
parent b6a951f361
commit 0a2f7ec599
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 203 additions and 13 deletions

View File

@ -63,6 +63,7 @@ export type SelectTestSuiteType = {
export interface ParameterFormProps {
definition: TestDefinition;
table?: Table;
}
export interface EditTestCaseModalProps {

View File

@ -15,6 +15,7 @@ import { Form, FormProps, Input } from 'antd';
import Modal from 'antd/lib/modal/Modal';
import { AxiosError } from 'axios';
import { compare } from 'fast-json-patch';
import { Table } from 'generated/entity/data/table';
import React, {
useCallback,
useEffect,
@ -23,6 +24,7 @@ import React, {
useState,
} from 'react';
import { useTranslation } from 'react-i18next';
import { getTableDetailsByFQN } from 'rest/tableAPI';
import { getTestDefinitionById, updateTestCaseById } from 'rest/testAPI';
import { CSMode } from '../../enums/codemirror.enum';
import { TestCaseParameterValue } from '../../generated/tests/testCase';
@ -58,6 +60,7 @@ const EditTestCaseModal: React.FC<EditTestCaseModalProps> = ({
);
const [isLoading, setIsLoading] = useState(true);
const [isLoadingOnSave, setIsLoadingOnSave] = useState(false);
const [table, setTable] = useState<Table>();
const markdownRef = useRef<EditorContentRef>();
@ -90,11 +93,11 @@ const EditTestCaseModal: React.FC<EditTestCaseModalProps> = ({
);
}
return <ParameterForm definition={selectedDefinition} />;
return <ParameterForm definition={selectedDefinition} table={table} />;
}
return;
}, [testCase, selectedDefinition, sqlQuery]);
}, [testCase, selectedDefinition, sqlQuery, table]);
const fetchTestDefinitionById = async () => {
setIsLoading(true);
@ -176,14 +179,24 @@ const EditTestCaseModal: React.FC<EditTestCaseModalProps> = ({
);
};
const fetchTableDetails = async (fqn: string) => {
try {
const data = await getTableDetailsByFQN(fqn, '');
setTable(data);
} catch (error) {
showErrorToast(error as AxiosError);
}
};
useEffect(() => {
if (testCase) {
fetchTestDefinitionById();
const tableFqn = getEntityFqnFromEntityLink(testCase?.entityLink);
form.setFieldsValue({
name: testCase?.name,
testDefinition: testCase?.testDefinition?.name,
params: getParamsValue(),
table: getNameFromFQN(getEntityFqnFromEntityLink(testCase?.entityLink)),
table: getNameFromFQN(tableFqn),
column: getNameFromFQN(
getEntityFqnFromEntityLink(testCase?.entityLink, isColumn)
),
@ -194,6 +207,13 @@ const EditTestCaseModal: React.FC<EditTestCaseModalProps> = ({
value: '',
}
);
const isContainsColumnName = testCase.parameterValues?.find(
(value) => value.name === 'columnName'
);
if (isContainsColumnName) {
fetchTableDetails(tableFqn);
}
}
}, [testCase]);

View File

@ -0,0 +1,64 @@
/*
* Copyright 2023 Collate.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { act, render, screen } from '@testing-library/react';
import { TestDefinition } from 'generated/tests/testDefinition';
import {
MOCK_TABLE_ROW_INSERTED_COUNT_TO_BE_BETWEEN,
MOCK_TABLE_WITH_DATE_TIME_COLUMNS,
} from 'mocks/TestSuite.mock';
import React from 'react';
import ParameterForm from './ParameterForm';
describe('ParameterForm component test', () => {
it('Select box should render if "columnName" field is present and table data provided', async () => {
await act(async () => {
render(
<ParameterForm
definition={
MOCK_TABLE_ROW_INSERTED_COUNT_TO_BE_BETWEEN as TestDefinition
}
table={MOCK_TABLE_WITH_DATE_TIME_COLUMNS}
/>
);
});
const selectBox = await screen.findByRole('combobox');
const parameters = await screen.findAllByTestId('parameter');
expect(selectBox).toBeInTheDocument();
expect(parameters).toHaveLength(
MOCK_TABLE_ROW_INSERTED_COUNT_TO_BE_BETWEEN.parameterDefinition.length
);
});
it('Select box should not render if "columnName" field is present but table data is not provided', async () => {
await act(async () => {
render(
<ParameterForm
definition={
MOCK_TABLE_ROW_INSERTED_COUNT_TO_BE_BETWEEN as TestDefinition
}
/>
);
});
const selectBox = screen.queryByRole('combobox');
const parameters = await screen.findAllByTestId('parameter');
expect(selectBox).not.toBeInTheDocument();
expect(parameters).toHaveLength(
MOCK_TABLE_ROW_INSERTED_COUNT_TO_BE_BETWEEN.parameterDefinition.length
);
});
});

View File

@ -12,8 +12,10 @@
*/
import { PlusOutlined } from '@ant-design/icons';
import { Button, Form, Input, InputNumber, Switch } from 'antd';
import { Button, Form, Input, InputNumber, Select, Switch } from 'antd';
import 'codemirror/addon/fold/foldgutter.css';
import { SUPPORTED_PARTITION_TYPE } from 'constants/profiler.constant';
import { isUndefined } from 'lodash';
import React from 'react';
import { useTranslation } from 'react-i18next';
import {
@ -24,7 +26,7 @@ import SVGIcons, { Icons } from '../../../utils/SvgUtils';
import '../../TableProfiler/tableProfiler.less';
import { ParameterFormProps } from '../AddDataQualityTest.interface';
const ParameterForm: React.FC<ParameterFormProps> = ({ definition }) => {
const ParameterForm: React.FC<ParameterFormProps> = ({ definition, table }) => {
const { t } = useTranslation();
const prepareForm = (data: TestCaseParameterDefinition) => {
@ -37,13 +39,38 @@ const ParameterForm: React.FC<ParameterFormProps> = ({ definition }) => {
);
switch (data.dataType) {
case TestDataType.String:
Field = (
<Input
placeholder={`${t('message.enter-a-field', {
field: data.displayName,
})}`}
/>
);
if (data.name === 'columnName' && !isUndefined(table)) {
const partitionColumnOptions = table.columns.reduce(
(result, column) => {
if (SUPPORTED_PARTITION_TYPE.includes(column.dataType)) {
return [
...result,
{
value: column.name,
label: column.name,
},
];
}
return result;
},
[] as { value: string; label: string }[]
);
Field = (
<Select
options={partitionColumnOptions}
placeholder={t('message.select-column-name')}
/>
);
} else {
Field = (
<Input
placeholder={`${t('message.enter-a-field', {
field: data.displayName,
})}`}
/>
);
}
break;
case TestDataType.Number:
@ -137,6 +164,7 @@ const ParameterForm: React.FC<ParameterFormProps> = ({ definition }) => {
return (
<Form.Item
data-testid="parameter"
key={data.name}
label={`${data.displayName}:`}
name={data.name}

View File

@ -131,7 +131,7 @@ const TestCaseForm: React.FC<TestCaseFormProps> = ({
);
}
return <ParameterForm definition={selectedDefinition} />;
return <ParameterForm definition={selectedDefinition} table={table} />;
}
return;

View File

@ -502,6 +502,7 @@
"option": "Option",
"or-lowercase": "ou",
"org-url": "OrgUrl",
"override-current-owner": "Override Current Owner",
"owned-lowercase": "owned",
"owner": "Propriétaire",
"owner-lowercase": "owner",
@ -915,6 +916,7 @@
"email-verification-token-expired": "Email Verification Token Expired",
"enable-column-profile": "Activer le profilage de colonne",
"enable-debug-logging": "Enable debug logging",
"enable-override-owner": "Enabling this flag will override current owner with new owner ,if that is fetched during metadata ingestion. Kindly make to keep it enabled for first time metadata ingestion to get the owner.",
"enables-end-to-end-metadata-management": "Activer le management des metadatonnées de bout end bout avec la découverte des données, la dualité des données, l'observabilité, et la collaboration",
"endpoint-should-be-valid": "Endpoint should be valid URL.",
"ensure-airflow-set-up-correctly-before-heading-to-ingest-metadata": "Ensure that you have Airflow set up correctly before heading to ingest metadata.",

View File

@ -502,6 +502,7 @@
"option": "Option",
"or-lowercase": "or",
"org-url": "OrgUrl",
"override-current-owner": "Override Current Owner",
"owned-lowercase": "owned",
"owner": "所有者",
"owner-lowercase": "owner",
@ -915,6 +916,7 @@
"email-verification-token-expired": "Email Verification Token Expired",
"enable-column-profile": "Enable column profile",
"enable-debug-logging": "Enable debug logging",
"enable-override-owner": "Enabling this flag will override current owner with new owner ,if that is fetched during metadata ingestion. Kindly make to keep it enabled for first time metadata ingestion to get the owner.",
"enables-end-to-end-metadata-management": "Enables end-to-end metadata management with data discovery, data duality, observability, and people collaboration",
"endpoint-should-be-valid": "Endpoint should be valid URL.",
"ensure-airflow-set-up-correctly-before-heading-to-ingest-metadata": "Ensure that you have Airflow set up correctly before heading to ingest metadata.",

View File

@ -11,6 +11,7 @@
* limitations under the License.
*/
import { Table } from 'generated/entity/data/table';
import { TestCase } from 'generated/tests/testCase';
export const MOCK_TABLE_DATA = {
@ -665,3 +666,75 @@ export const MOCK_CHART_COLLECTION_DATA = {
},
],
};
export const MOCK_TABLE_WITH_DATE_TIME_COLUMNS = {
id: '975f9119-39bb-4901-b083-69b373cf8fe4',
name: 'dim.product',
columns: [
{
name: 'vendor',
dataType: 'VARCHAR',
dataLength: 100,
dataTypeDisplay: 'varchar',
description: 'description',
fullyQualifiedName:
'sample_data.ecommerce_db.shopify."dim.product".vendor',
tags: [],
ordinalPosition: 4,
},
{
name: 'created_at',
dataType: 'TIMESTAMP',
dataTypeDisplay: 'timestamp',
description: 'description',
fullyQualifiedName:
'sample_data.ecommerce_db.shopify."dim.product".created_at',
tags: [],
ordinalPosition: 5,
},
{
name: 'deleted_at',
dataType: 'TIMESTAMP',
dataTypeDisplay: 'timestamp',
description: 'description',
fullyQualifiedName:
'sample_data.ecommerce_db.shopify."dim.product".deleted_at',
tags: [],
ordinalPosition: 6,
},
],
} as Table;
export const MOCK_TABLE_ROW_INSERTED_COUNT_TO_BE_BETWEEN = {
id: '756c7770-0af3-49a9-9905-75a2886e5eec',
name: 'tableRowInsertedCountToBeBetween',
displayName: 'Table Row Inserted Count To be Between',
fullyQualifiedName: 'tableRowInsertedCountToBeBetween',
description:
'This schema defines the test tableRowInsertedCountToBeBetween. Test the number of rows inserted is between x and y.',
entityType: 'TABLE',
testPlatforms: ['OpenMetadata'],
supportedDataTypes: [],
parameterDefinition: [
{
name: 'columnName',
displayName: 'Column Name',
dataType: 'STRING',
description:
'Name of the Column. It should be a timestamp, date or datetime field.',
required: true,
},
{
name: 'rangeType',
displayName: 'Range Type',
dataType: 'STRING',
description: "One of 'HOUR', 'DAY', 'MONTH', 'YEAR'",
required: true,
},
],
version: 0.1,
updatedAt: 1675211404184,
updatedBy: 'admin',
href: 'http://sandbox-beta.open-metadata.org/api/v1/testDefinition/756c7770-0af3-49a9-9905-75a2886e5eec',
deleted: false,
};