Skip to content

Commit 3fa65e6

Browse files
TeddyCrCopilot
andauthored
ISSUE #27718 - make data type required for OpenMetadata test types (#27721)
* fix: make data type required for OpenMetadata test types * Update openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataQuality/TestLibrary.spec.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * chore: fix failing playwright tests * chore: ran typescript linting * chore: fix test library playwright failure --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 1fd724b commit 3fa65e6

2 files changed

Lines changed: 149 additions & 2 deletions

File tree

openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/DataQuality/TestLibrary.spec.ts

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,15 @@ test.describe(
111111
.first()
112112
.click();
113113

114+
// Select supported data types (required when OpenMetadata platform is selected)
115+
await page.locator('#supportedDataTypes').click();
116+
await page.locator('#supportedDataTypes').fill('NUMBER');
117+
await page
118+
.locator('.ant-select-dropdown:visible')
119+
.getByTitle('NUMBER')
120+
.click();
121+
await page.keyboard.press('Escape');
122+
114123
// Select test platform
115124
await page.locator('#testPlatforms').click();
116125
await page
@@ -285,6 +294,105 @@ test.describe(
285294
).toBeVisible();
286295
});
287296

297+
test('should require supported data types only when OpenMetadata platform is selected', async ({
298+
page,
299+
}) => {
300+
test.slow();
301+
let createdTestDefinitionId: string | undefined;
302+
303+
try {
304+
await test.step('Open create form', async () => {
305+
await page.goto('/test-library');
306+
await page.getByTestId('add-test-definition-button').click();
307+
await page.locator('.ant-drawer').waitFor({ state: 'visible' });
308+
});
309+
310+
await test.step('Verify supported data types is required with default OpenMetadata platform', async () => {
311+
// Fill required fields except supportedDataTypes
312+
await page.locator('#name').fill(`validation-test-${uuid()}`);
313+
await page.locator('#entityType').click();
314+
await page
315+
.locator('.ant-select-dropdown:visible')
316+
.locator('.ant-select-item-option-content:has-text("TABLE")')
317+
.first()
318+
.click();
319+
320+
// Wait for entity type dropdown to close before submitting
321+
await expect(
322+
page.locator('.ant-select-dropdown:visible')
323+
).not.toBeVisible();
324+
325+
// Submit the form
326+
await page.getByTestId('save-test-definition').click();
327+
328+
// Expect validation error on supportedDataTypes
329+
const supportedDataTypesItem = page
330+
.locator('.ant-form-item')
331+
.filter({ hasText: 'Supported Data Types' });
332+
333+
await expect(
334+
supportedDataTypesItem.locator('.ant-form-item-explain-error')
335+
).toBeVisible();
336+
});
337+
338+
await test.step('Remove OpenMetadata and select only dbt — field should not be required', async () => {
339+
// Remove OpenMetadata from testPlatforms
340+
const testPlatformsSelector = page
341+
.locator('.ant-form-item')
342+
.filter({ hasText: 'Test Platforms' })
343+
.locator('.ant-select');
344+
const openMetadataTag = testPlatformsSelector.locator(
345+
'.ant-select-selection-item[title="OpenMetadata"] .ant-select-selection-item-remove'
346+
);
347+
await openMetadataTag.click();
348+
349+
// Add dbt
350+
await page.locator('#testPlatforms').click();
351+
await page
352+
.locator('.ant-select-dropdown:visible')
353+
.locator('.ant-select-item-option-content:has-text("dbt")')
354+
.first()
355+
.click();
356+
357+
// Close dropdown
358+
await page.keyboard.press('Escape');
359+
360+
// Wait for the validation error to clear after removing OpenMetadata
361+
const supportedDataTypesItem = page
362+
.locator('.ant-form-item')
363+
.filter({ hasText: 'Supported Data Types' });
364+
await expect(
365+
supportedDataTypesItem.locator('.ant-form-item-explain-error')
366+
).not.toBeVisible();
367+
368+
// Submit the form — supportedDataTypes should no longer block submission
369+
const testDefinitionResponse = page.waitForResponse(
370+
(response) =>
371+
response.url().includes('/api/v1/dataQuality/testDefinitions') &&
372+
response.request().method() === 'POST'
373+
);
374+
await page.getByTestId('save-test-definition').click();
375+
376+
const responseData = await testDefinitionResponse;
377+
expect(responseData.status()).toBe(201);
378+
379+
const responseBody = await responseData.json();
380+
createdTestDefinitionId = responseBody.id;
381+
382+
await expect(page.getByText(/created successfully/i)).toBeVisible();
383+
});
384+
} finally {
385+
if (createdTestDefinitionId) {
386+
const { apiContext } = await getApiContext(page);
387+
const deleteResponse = await apiContext.delete(
388+
`/api/v1/dataQuality/testDefinitions/${createdTestDefinitionId}`
389+
);
390+
391+
expect(deleteResponse.ok()).toBeTruthy();
392+
}
393+
}
394+
});
395+
288396
test('should cancel form and close drawer', async ({ page }) => {
289397
// Navigate to Test Library
290398
await page.goto('/test-library');
@@ -667,6 +775,15 @@ test.describe(
667775
page.locator('.ant-select-dropdown:visible')
668776
).not.toBeVisible();
669777

778+
// Select supported data types (required when OpenMetadata platform is selected)
779+
await page.locator('#supportedDataTypes').click();
780+
await page.locator('#supportedDataTypes').fill('NUMBER');
781+
await page
782+
.locator('.ant-select-dropdown:visible')
783+
.getByTitle('NUMBER')
784+
.click();
785+
await page.keyboard.press('Escape');
786+
670787
await page.locator('#supportedServices').click();
671788
await page.locator('#supportedServices').fill('Mysql');
672789
const mysqlOption = page
@@ -966,6 +1083,15 @@ test.describe(
9661083
page.locator('.ant-select-dropdown:visible')
9671084
).not.toBeVisible();
9681085

1086+
// Select supported data types (required when OpenMetadata platform is selected)
1087+
await page.locator('#supportedDataTypes').click();
1088+
await page.locator('#supportedDataTypes').fill('NUMBER');
1089+
await page
1090+
.locator('.ant-select-dropdown:visible')
1091+
.getByTitle('NUMBER')
1092+
.click();
1093+
await page.keyboard.press('Escape');
1094+
9691095
const createResponse = page.waitForResponse(
9701096
(response) =>
9711097
response.url().includes('/api/v1/dataQuality/testDefinitions') &&

openmetadata-ui/src/main/resources/ui/src/components/TestLibrary/TestDefinitionForm/TestDefinitionForm.component.tsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,17 @@
1212
*/
1313

1414
import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons';
15-
import { Button, Card, Drawer, Form, Input, Select, Space, Switch } from 'antd';
15+
import {
16+
Button,
17+
Card,
18+
Drawer,
19+
Form,
20+
FormInstance,
21+
Input,
22+
Select,
23+
Space,
24+
Switch,
25+
} from 'antd';
1626
import { AxiosError } from 'axios';
1727
import { compare } from 'fast-json-patch';
1828
import React, { useMemo, useState } from 'react';
@@ -345,8 +355,19 @@ const TestDefinitionForm: React.FC<TestDefinitionFormProps> = ({
345355
</Form.Item>
346356

347357
<Form.Item
358+
dependencies={['testPlatforms']}
348359
label={t('label.supported-data-type-plural')}
349-
name="supportedDataTypes">
360+
name="supportedDataTypes"
361+
rules={[
362+
({ getFieldValue }: Pick<FormInstance, 'getFieldValue'>) => ({
363+
required: (getFieldValue('testPlatforms') ?? []).includes(
364+
TestPlatform.OpenMetadata
365+
),
366+
message: t('message.field-text-is-required', {
367+
fieldText: t('label.supported-data-type-plural'),
368+
}),
369+
}),
370+
]}>
350371
<Select
351372
disabled={isReadOnlyField}
352373
mode="multiple"

0 commit comments

Comments
 (0)