diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataQualityAndProfiler.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataQualityAndProfiler.spec.ts index 863ee233f22..a66bbd8afa7 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataQualityAndProfiler.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataQualityAndProfiler.spec.ts @@ -95,327 +95,302 @@ test.beforeEach(async ({ page }) => { await redirectToHomePage(page); }); -test.fixme( - 'Table test case', - PLAYWRIGHT_INGESTION_TAG_OBJ, - async ({ page }) => { - test.slow(); +test('Table test case', PLAYWRIGHT_INGESTION_TAG_OBJ, async ({ page }) => { + test.slow(); - const NEW_TABLE_TEST_CASE = { - name: `table_column_name_to_exist_in_id_${uuid()}`, - label: 'Table Column Name To Exist', - type: 'tableColumnNameToExist', - field: 'testCase', - description: 'New table test case for TableColumnNameToExist', - }; - await visitDataQualityTab(page, table1); + const NEW_TABLE_TEST_CASE = { + name: `table_column_name_to_exist_in_id_${uuid()}`, + label: 'Table Column Name To Exist', + type: 'tableColumnNameToExist', + field: 'testCase', + description: 'New table test case for TableColumnNameToExist', + }; + await visitDataQualityTab(page, table1); - await page.click('[data-testid="profiler-add-table-test-btn"]'); - await page.click('[data-testid="table"]'); + await page.click('[data-testid="profiler-add-table-test-btn"]'); + await page.click('[data-testid="table"]'); - await test.step('Create', async () => { - await page.fill( - '[data-testid="test-case-name"]', - NEW_TABLE_TEST_CASE.name - ); - await page.click('#testCaseFormV1_testTypeId'); - await page.waitForSelector(`text=${NEW_TABLE_TEST_CASE.label}`); - await page.click(`text=${NEW_TABLE_TEST_CASE.label}`); - await page.fill( - '#testCaseFormV1_params_columnName', - NEW_TABLE_TEST_CASE.field - ); - await page.locator(descriptionBox).fill(NEW_TABLE_TEST_CASE.description); + await test.step('Create', async () => { + await page.fill('[data-testid="test-case-name"]', NEW_TABLE_TEST_CASE.name); + await page.click('#testCaseFormV1_testTypeId'); + await page.waitForSelector(`text=${NEW_TABLE_TEST_CASE.label}`); + await page.click(`text=${NEW_TABLE_TEST_CASE.label}`); + await page.fill( + '#testCaseFormV1_params_columnName', + NEW_TABLE_TEST_CASE.field + ); + await page.locator(descriptionBox).fill(NEW_TABLE_TEST_CASE.description); - // Add tags to test case - await page.click('[data-testid="tags-selector"] input'); - const tagsSearchResponse = page.waitForResponse( - `/api/v1/search/query?q=*index=tag_search_index*` - ); - await page.fill( - '[data-testid="tags-selector"] input', - testTag1.data.name - ); - await tagsSearchResponse; - await page - .getByTestId(`tag-${testTag1.responseData.fullyQualifiedName}`) - .click(); + // Add tags to test case + await page.click('[data-testid="tags-selector"] input'); + const tagsSearchResponse = page.waitForResponse( + `/api/v1/search/query?q=*index=tag_search_index*` + ); + await page.fill('[data-testid="tags-selector"] input', testTag1.data.name); + await tagsSearchResponse; + await page + .getByTestId(`tag-${testTag1.responseData.fullyQualifiedName}`) + .click(); - await clickOutside(page); - // Add glossary terms to test case - await page.click('[data-testid="glossary-terms-selector"] input'); - const glossarySearchResponse = page.waitForResponse( - `/api/v1/search/query?q=*index=glossary_term_search_index*` - ); - await page.fill( - '[data-testid="glossary-terms-selector"] input', - testGlossaryTerm1.data.name - ); - await glossarySearchResponse; - await page - .getByTestId(`tag-${testGlossaryTerm1.responseData.fullyQualifiedName}`) - .click(); + await clickOutside(page); + // Add glossary terms to test case + await page.click('[data-testid="glossary-terms-selector"] input'); + const glossarySearchResponse = page.waitForResponse( + `/api/v1/search/query?q=*index=glossary_term_search_index*` + ); + await page.fill( + '[data-testid="glossary-terms-selector"] input', + testGlossaryTerm1.data.name + ); + await glossarySearchResponse; + await page + .getByTestId(`tag-${testGlossaryTerm1.responseData.fullyQualifiedName}`) + .click(); - await clickOutside(page); - const ingestionPipelines = page.waitForResponse( - '/api/v1/services/ingestionPipelines' - ); - const deploy = page.waitForResponse( - '/api/v1/services/ingestionPipelines/deploy/*' - ); - await page.click('[data-testid="create-btn"]'); + await clickOutside(page); + const ingestionPipelines = page.waitForResponse( + '/api/v1/services/ingestionPipelines' + ); + const deploy = page.waitForResponse( + '/api/v1/services/ingestionPipelines/deploy/*' + ); + await page.click('[data-testid="create-btn"]'); - await ingestionPipelines; - await deploy; + await ingestionPipelines; + await deploy; - await toastNotification(page, 'Test case created successfully.'); + await toastNotification(page, 'Test case created successfully.'); - await expect(page.getByTestId(NEW_TABLE_TEST_CASE.name)).toBeVisible(); + await expect(page.getByTestId(NEW_TABLE_TEST_CASE.name)).toBeVisible(); + }); + + await test.step('Edit', async () => { + await page.click(`[data-testid="edit-${NEW_TABLE_TEST_CASE.name}"]`); + + await expect(page.getByTestId('edit-test-case-drawer-title')).toHaveText( + `Edit ${NEW_TABLE_TEST_CASE.name}` + ); + + await page.locator('#tableTestForm_params_columnName').clear(); + await page.fill('#tableTestForm_params_columnName', 'new_column_name'); + + // Remove existing tag and add new one + await page.click( + `[data-testid="selected-tag-${testTag1.responseData.fullyQualifiedName}"] svg` + ); + + await page.click('[data-testid="tags-selector"] input'); + const newTagsSearchResponse = page.waitForResponse( + `/api/v1/search/query?q=*index=tag_search_index*` + ); + await page.fill('[data-testid="tags-selector"] input', testTag2.data.name); + await newTagsSearchResponse; + await page + .getByTestId(`tag-${testTag2.responseData.fullyQualifiedName}`) + .click(); + + await clickOutside(page); + + // Remove existing glossary term and add new one + await page.click( + `[data-testid="glossary-terms-selector"] [data-testid="remove-tags"]` + ); + await page.click('[data-testid="glossary-terms-selector"] input'); + const newGlossarySearchResponse = page.waitForResponse( + `/api/v1/search/query?q=*index=glossary_term_search_index*` + ); + await page.fill( + '[data-testid="glossary-terms-selector"] input', + testGlossaryTerm2.data.name + ); + await newGlossarySearchResponse; + await page + .getByTestId(`tag-${testGlossaryTerm2.responseData.fullyQualifiedName}`) + .click(); + + await clickOutside(page); + + const updateTestCaseResponse = page.waitForResponse( + '/api/v1/dataQuality/testCases/*' + ); + + await page.getByTestId('update-btn').click(); + await updateTestCaseResponse; + await toastNotification(page, 'Test case updated successfully.'); + await page.waitForSelector('[data-testid="alert-bar"]', { + state: 'detached', }); - await test.step('Edit', async () => { - await page.click(`[data-testid="edit-${NEW_TABLE_TEST_CASE.name}"]`); + const testDefinitionResponse = page.waitForResponse( + '/api/v1/dataQuality/testDefinitions/*' + ); + await page.click(`[data-testid="edit-${NEW_TABLE_TEST_CASE.name}"]`); + await testDefinitionResponse; - await expect(page.getByTestId('edit-test-case-drawer-title')).toHaveText( - `Edit ${NEW_TABLE_TEST_CASE.name}` - ); + await page.waitForSelector('#tableTestForm_params_columnName'); - await page.locator('#tableTestForm_params_columnName').clear(); - await page.fill('#tableTestForm_params_columnName', 'new_column_name'); + await expect(page.locator('#tableTestForm_params_columnName')).toHaveValue( + 'new_column_name' + ); - // Remove existing tag and add new one - await page.click( - `[data-testid="selected-tag-${testTag1.responseData.fullyQualifiedName}"] svg` - ); + await page.getByRole('button', { name: 'Cancel' }).click(); + }); - await page.click('[data-testid="tags-selector"] input'); - const newTagsSearchResponse = page.waitForResponse( - `/api/v1/search/query?q=*index=tag_search_index*` - ); - await page.fill( - '[data-testid="tags-selector"] input', - testTag2.data.name - ); - await newTagsSearchResponse; - await page - .getByTestId(`tag-${testTag2.responseData.fullyQualifiedName}`) - .click(); + await test.step('Delete', async () => { + await deleteTestCase(page, NEW_TABLE_TEST_CASE.name); + }); +}); - await clickOutside(page); +test('Column test case', PLAYWRIGHT_INGESTION_TAG_OBJ, async ({ page }) => { + test.slow(); - // Remove existing glossary term and add new one - await page.click( - `[data-testid="glossary-terms-selector"] [data-testid="remove-tags"]` - ); - await page.click('[data-testid="glossary-terms-selector"] input'); - const newGlossarySearchResponse = page.waitForResponse( - `/api/v1/search/query?q=*index=glossary_term_search_index*` - ); - await page.fill( - '[data-testid="glossary-terms-selector"] input', - testGlossaryTerm2.data.name - ); - await newGlossarySearchResponse; - await page - .getByTestId(`tag-${testGlossaryTerm2.responseData.fullyQualifiedName}`) - .click(); + const NEW_COLUMN_TEST_CASE = { + name: 'email_column_value_lengths_to_be_between', + column: table1.entity?.columns[3].name, + type: 'columnValueLengthsToBeBetween', + label: 'Column Value Lengths To Be Between', + min: '3', + max: '6', + description: 'New table test case for columnValueLengthsToBeBetween', + }; - await clickOutside(page); + await visitDataQualityTab(page, table1); + await page.click('[data-testid="profiler-add-table-test-btn"]'); + await page.click('[data-testid="column"]'); - const updateTestCaseResponse = page.waitForResponse( - '/api/v1/dataQuality/testCases/*' - ); + await test.step('Create', async () => { + const testDefinitionResponse = page.waitForResponse( + '/api/v1/dataQuality/testDefinitions?limit=*&entityType=COLUMN&testPlatform=OpenMetadata&supportedDataType=VARCHAR' + ); + await page.click('#testCaseFormV1_selectedColumn'); + await page.click(`[title="${NEW_COLUMN_TEST_CASE.column}"]`); + await testDefinitionResponse; - await page.getByTestId('update-btn').click(); - await updateTestCaseResponse; - await toastNotification(page, 'Test case updated successfully.'); - await page.waitForSelector('[data-testid="alert-bar"]', { - state: 'detached', - }); + await page.fill( + '[data-testid="test-case-name"]', + NEW_COLUMN_TEST_CASE.name + ); + await page.click('#testCaseFormV1_testTypeId'); + await page.click(`[data-testid="${NEW_COLUMN_TEST_CASE.type}"]`); + await page.fill( + '#testCaseFormV1_params_minLength', + NEW_COLUMN_TEST_CASE.min + ); + await page.fill( + '#testCaseFormV1_params_maxLength', + NEW_COLUMN_TEST_CASE.max + ); + await page.locator(descriptionBox).fill(NEW_COLUMN_TEST_CASE.description); - const testDefinitionResponse = page.waitForResponse( - '/api/v1/dataQuality/testDefinitions/*' - ); - await page.click(`[data-testid="edit-${NEW_TABLE_TEST_CASE.name}"]`); - await testDefinitionResponse; + // Add tags to column test case + await page.click('[data-testid="tags-selector"] input'); + const columnTagsSearchResponse = page.waitForResponse( + `/api/v1/search/query?q=*index=tag_search_index*` + ); + await page.fill('[data-testid="tags-selector"] input', testTag1.data.name); + await columnTagsSearchResponse; + await page + .getByTestId(`tag-${testTag1.responseData.fullyQualifiedName}`) + .click(); - await page.waitForSelector('#tableTestForm_params_columnName'); + await clickOutside(page); - await expect( - page.locator('#tableTestForm_params_columnName') - ).toHaveValue('new_column_name'); + // Add glossary terms to column test case + await page.click('[data-testid="glossary-terms-selector"] input'); + const columnGlossarySearchResponse = page.waitForResponse( + `/api/v1/search/query?q=*index=glossary_term_search_index*` + ); + await page.fill( + '[data-testid="glossary-terms-selector"] input', + testGlossaryTerm1.data.name + ); + await columnGlossarySearchResponse; + await page + .getByTestId(`tag-${testGlossaryTerm1.responseData.fullyQualifiedName}`) + .click(); - await page.getByRole('button', { name: 'Cancel' }).click(); - }); + await clickOutside(page); - await test.step('Delete', async () => { - await deleteTestCase(page, NEW_TABLE_TEST_CASE.name); - }); - } -); + await page.click('[data-testid="create-btn"]'); + await toastNotification(page, 'Test case created successfully.'); -test.fixme( - 'Column test case', - PLAYWRIGHT_INGESTION_TAG_OBJ, - async ({ page }) => { - test.slow(); + await page.waitForSelector(`[data-testid="${NEW_COLUMN_TEST_CASE.name}"]`); - const NEW_COLUMN_TEST_CASE = { - name: 'email_column_value_lengths_to_be_between', - column: table1.entity?.columns[3].name, - type: 'columnValueLengthsToBeBetween', - label: 'Column Value Lengths To Be Between', - min: '3', - max: '6', - description: 'New table test case for columnValueLengthsToBeBetween', - }; + await expect( + page.locator(`[data-testid="${NEW_COLUMN_TEST_CASE.name}"]`) + ).toBeVisible(); + }); - await visitDataQualityTab(page, table1); - await page.click('[data-testid="profiler-add-table-test-btn"]'); - await page.click('[data-testid="column"]'); + await test.step('Edit', async () => { + await page.click(`[data-testid="edit-${NEW_COLUMN_TEST_CASE.name}"]`); + await page.waitForSelector('#tableTestForm_params_minLength'); + await page.locator('#tableTestForm_params_minLength').clear(); + await page.fill('#tableTestForm_params_minLength', '4'); - await test.step('Create', async () => { - const testDefinitionResponse = page.waitForResponse( - '/api/v1/dataQuality/testDefinitions?limit=*&entityType=COLUMN&testPlatform=OpenMetadata&supportedDataType=VARCHAR' - ); - await page.click('#testCaseFormV1_selectedColumn'); - await page.click(`[title="${NEW_COLUMN_TEST_CASE.column}"]`); - await testDefinitionResponse; + // Remove existing tag and add new one for column test case + await page.click( + `[data-testid="selected-tag-${testTag1.responseData.fullyQualifiedName}"] svg` + ); + await page.click('[data-testid="tags-selector"] input'); + const columnNewTagsSearchResponse = page.waitForResponse( + `/api/v1/search/query?q=*index=tag_search_index*` + ); + await page.fill('[data-testid="tags-selector"] input', testTag2.data.name); + await columnNewTagsSearchResponse; + await page + .getByTestId(`tag-${testTag2.responseData.fullyQualifiedName}`) + .click(); - await page.fill( - '[data-testid="test-case-name"]', - NEW_COLUMN_TEST_CASE.name - ); - await page.click('#testCaseFormV1_testTypeId'); - await page.click(`[data-testid="${NEW_COLUMN_TEST_CASE.type}"]`); - await page.fill( - '#testCaseFormV1_params_minLength', - NEW_COLUMN_TEST_CASE.min - ); - await page.fill( - '#testCaseFormV1_params_maxLength', - NEW_COLUMN_TEST_CASE.max - ); - await page.locator(descriptionBox).fill(NEW_COLUMN_TEST_CASE.description); + await clickOutside(page); - // Add tags to column test case - await page.click('[data-testid="tags-selector"] input'); - const columnTagsSearchResponse = page.waitForResponse( - `/api/v1/search/query?q=*index=tag_search_index*` - ); - await page.fill( - '[data-testid="tags-selector"] input', - testTag1.data.name - ); - await columnTagsSearchResponse; - await page - .getByTestId(`tag-${testTag1.responseData.fullyQualifiedName}`) - .click(); + // Remove existing glossary term and add new one for column test case + await page.click( + `[data-testid="glossary-terms-selector"] [data-testid="remove-tags"]` + ); + await page.click('[data-testid="glossary-terms-selector"] input'); + const columnNewGlossarySearchResponse = page.waitForResponse( + `/api/v1/search/query?q=*index=glossary_term_search_index*` + ); + await page.fill( + '[data-testid="glossary-terms-selector"] input', + testGlossaryTerm2.data.name + ); + await columnNewGlossarySearchResponse; + await page + .getByTestId(`tag-${testGlossaryTerm2.responseData.fullyQualifiedName}`) + .click(); - await clickOutside(page); + await clickOutside(page); - // Add glossary terms to column test case - await page.click('[data-testid="glossary-terms-selector"] input'); - const columnGlossarySearchResponse = page.waitForResponse( - `/api/v1/search/query?q=*index=glossary_term_search_index*` - ); - await page.fill( - '[data-testid="glossary-terms-selector"] input', - testGlossaryTerm1.data.name - ); - await columnGlossarySearchResponse; - await page - .getByTestId(`tag-${testGlossaryTerm1.responseData.fullyQualifiedName}`) - .click(); + const updateTestCaseResponse = page.waitForResponse( + '/api/v1/dataQuality/testCases/*' + ); - await clickOutside(page); + await page.getByTestId('update-btn').click(); + await updateTestCaseResponse; + await toastNotification(page, 'Test case updated successfully.'); - await page.click('[data-testid="create-btn"]'); - await toastNotification(page, 'Test case created successfully.'); + const testDefinitionResponse = page.waitForResponse( + '/api/v1/dataQuality/testDefinitions/*' + ); + await page.click(`[data-testid="edit-${NEW_COLUMN_TEST_CASE.name}"]`); + await testDefinitionResponse; + await page.waitForSelector('#tableTestForm_params_minLength'); + const minLengthValue = await page + .locator('#tableTestForm_params_minLength') + .inputValue(); - await page.waitForSelector( - `[data-testid="${NEW_COLUMN_TEST_CASE.name}"]` - ); + expect(minLengthValue).toBe('4'); - await expect( - page.locator(`[data-testid="${NEW_COLUMN_TEST_CASE.name}"]`) - ).toBeVisible(); - }); + await page.locator('button').getByText('Cancel').click(); + }); - await test.step('Edit', async () => { - await page.click(`[data-testid="edit-${NEW_COLUMN_TEST_CASE.name}"]`); - await page.waitForSelector('#tableTestForm_params_minLength'); - await page.locator('#tableTestForm_params_minLength').clear(); - await page.fill('#tableTestForm_params_minLength', '4'); + await test.step('Delete', async () => { + await deleteTestCase(page, NEW_COLUMN_TEST_CASE.name); + }); +}); - // Remove existing tag and add new one for column test case - await page.click( - `[data-testid="selected-tag-${testTag1.responseData.fullyQualifiedName}"] svg` - ); - await page.click('[data-testid="tags-selector"] input'); - const columnNewTagsSearchResponse = page.waitForResponse( - `/api/v1/search/query?q=*index=tag_search_index*` - ); - await page.fill( - '[data-testid="tags-selector"] input', - testTag2.data.name - ); - await columnNewTagsSearchResponse; - await page - .getByTestId(`tag-${testTag2.responseData.fullyQualifiedName}`) - .click(); - - await clickOutside(page); - - // Remove existing glossary term and add new one for column test case - await page.click( - `[data-testid="glossary-terms-selector"] [data-testid="remove-tags"]` - ); - await page.click('[data-testid="glossary-terms-selector"] input'); - const columnNewGlossarySearchResponse = page.waitForResponse( - `/api/v1/search/query?q=*index=glossary_term_search_index*` - ); - await page.fill( - '[data-testid="glossary-terms-selector"] input', - testGlossaryTerm2.data.name - ); - await columnNewGlossarySearchResponse; - await page - .getByTestId(`tag-${testGlossaryTerm2.responseData.fullyQualifiedName}`) - .click(); - - await clickOutside(page); - - const updateTestCaseResponse = page.waitForResponse( - '/api/v1/dataQuality/testCases/*' - ); - - await page.getByTestId('update-btn').click(); - await updateTestCaseResponse; - await toastNotification(page, 'Test case updated successfully.'); - - const testDefinitionResponse = page.waitForResponse( - '/api/v1/dataQuality/testDefinitions/*' - ); - await page.click(`[data-testid="edit-${NEW_COLUMN_TEST_CASE.name}"]`); - await testDefinitionResponse; - await page.waitForSelector('#tableTestForm_params_minLength'); - const minLengthValue = await page - .locator('#tableTestForm_params_minLength') - .inputValue(); - - expect(minLengthValue).toBe('4'); - - await page.locator('button').getByText('Cancel').click(); - }); - - await test.step('Delete', async () => { - await deleteTestCase(page, NEW_COLUMN_TEST_CASE.name); - }); - } -); - -test.fixme( +test( 'Profiler matrix and test case graph should visible for admin, data consumer and data steward', PLAYWRIGHT_INGESTION_TAG_OBJ, async ({ page: adminPage, dataConsumerPage, dataStewardPage }) => { @@ -520,7 +495,7 @@ test.fixme( } ); -test.fixme( +test( 'TestCase with Array params value', PLAYWRIGHT_INGESTION_TAG_OBJ, async ({ page }) => { @@ -695,7 +670,7 @@ test.fixme( } ); -test.fixme( +test( 'Update profiler setting modal', PLAYWRIGHT_INGESTION_TAG_OBJ, async ({ page }) => { @@ -854,415 +829,404 @@ test.fixme( } ); -test.fixme( - 'TestCase filters', - PLAYWRIGHT_INGESTION_TAG_OBJ, - async ({ page }) => { - test.setTimeout(360000); +test('TestCase filters', PLAYWRIGHT_INGESTION_TAG_OBJ, async ({ page }) => { + test.setTimeout(360000); - const { apiContext, afterAction } = await getApiContext(page); - const filterTable1 = new TableClass(); + const { apiContext, afterAction } = await getApiContext(page); + const filterTable1 = new TableClass(); - await filterTable1.create(apiContext); - const filterTable2 = { - ...filterTable1.entity, - name: `${filterTable1.entity.name}-model`, - }; - const filterTable2Response = await apiContext - .post('/api/v1/tables', { - data: filterTable2, - }) - .then((response) => response.json()); - const domain = new Domain(); - await domain.create(apiContext); + await filterTable1.create(apiContext); + const filterTable2 = { + ...filterTable1.entity, + name: `${filterTable1.entity.name}-model`, + }; + const filterTable2Response = await apiContext + .post('/api/v1/tables', { + data: filterTable2, + }) + .then((response) => response.json()); + const domain = new Domain(); + await domain.create(apiContext); - // Add domain to table - await filterTable1.visitEntityPage(page); - await assignDomain(page, domain.responseData); - const testCases = [ - `pw_first_table_column_count_to_be_between_${uuid()}`, - `pw_second_table_column_count_to_be_between_${uuid()}`, - `pw_third_table_column_count_to_be_between_${uuid()}`, - ]; - const smilerNameTestCase = testCases.map((test) => `${test}_version_2`); - await filterTable1.patch({ - apiContext, - patchData: [ - { - op: 'add', - path: '/tags/0', - value: { - tagFQN: 'PII.None', - name: 'None', - description: 'Non PII', - source: 'Classification', - labelType: 'Manual', - state: 'Confirmed', - }, + // Add domain to table + await filterTable1.visitEntityPage(page); + await assignDomain(page, domain.responseData); + const testCases = [ + `pw_first_table_column_count_to_be_between_${uuid()}`, + `pw_second_table_column_count_to_be_between_${uuid()}`, + `pw_third_table_column_count_to_be_between_${uuid()}`, + ]; + const smilerNameTestCase = testCases.map((test) => `${test}_version_2`); + await filterTable1.patch({ + apiContext, + patchData: [ + { + op: 'add', + path: '/tags/0', + value: { + tagFQN: 'PII.None', + name: 'None', + description: 'Non PII', + source: 'Classification', + labelType: 'Manual', + state: 'Confirmed', }, - { - op: 'add', - path: '/tags/1', - value: { - tagFQN: 'Tier.Tier2', - name: 'Tier2', - source: 'Classification', - labelType: 'Manual', - state: 'Confirmed', - }, + }, + { + op: 'add', + path: '/tags/1', + value: { + tagFQN: 'Tier.Tier2', + name: 'Tier2', + source: 'Classification', + labelType: 'Manual', + state: 'Confirmed', }, - ], + }, + ], + }); + await filterTable1.createTestSuiteAndPipelines(apiContext); + + const testCaseResult = { + result: 'Found min=10001, max=27809 vs. the expected min=90001, max=96162.', + testCaseStatus: 'Failed', + testResultValue: [ + { + name: 'minValueForMaxInCol', + value: '10001', + }, + { + name: 'maxValueForMaxInCol', + value: '27809', + }, + ], + timestamp: getCurrentMillis(), + }; + for (let i = 0; i < testCases.length; i++) { + const testCase1 = await filterTable1.createTestCase(apiContext, { + name: testCases[i], }); - await filterTable1.createTestSuiteAndPipelines(apiContext); + await filterTable1.addTestCaseResult( + apiContext, + testCase1?.['fullyQualifiedName'], + testCaseResult + ); + const testCase2 = await filterTable1.createTestCase(apiContext, { + name: smilerNameTestCase[i], + entityLink: `<#E::table::${filterTable2Response?.['fullyQualifiedName']}>`, + }); + await filterTable1.addTestCaseResult( + apiContext, + testCase2?.['fullyQualifiedName'], + testCaseResult + ); + } - const testCaseResult = { - result: - 'Found min=10001, max=27809 vs. the expected min=90001, max=96162.', - testCaseStatus: 'Failed', - testResultValue: [ - { - name: 'minValueForMaxInCol', - value: '10001', - }, - { - name: 'maxValueForMaxInCol', - value: '27809', - }, - ], - timestamp: getCurrentMillis(), - }; - for (let i = 0; i < testCases.length; i++) { - const testCase1 = await filterTable1.createTestCase(apiContext, { - name: testCases[i], - }); - await filterTable1.addTestCaseResult( - apiContext, - testCase1?.['fullyQualifiedName'], - testCaseResult - ); - const testCase2 = await filterTable1.createTestCase(apiContext, { - name: smilerNameTestCase[i], - entityLink: `<#E::table::${filterTable2Response?.['fullyQualifiedName']}>`, - }); - await filterTable1.addTestCaseResult( - apiContext, - testCase2?.['fullyQualifiedName'], - testCaseResult - ); + const verifyFilterTestCase = async (page: Page) => { + for (const testCase of testCases) { + const element = page.locator(`[data-testid="${testCase}"]`); + + await expect(element).toBeVisible(); } + }; - const verifyFilterTestCase = async (page: Page) => { - for (const testCase of testCases) { - const element = page.locator(`[data-testid="${testCase}"]`); - + const verifyFilter2TestCase = async (page: Page, negation = false) => { + for (const testCase of smilerNameTestCase) { + const element = page.locator(`[data-testid="${testCase}"]`); + if (negation) { + await expect(element).not.toBeVisible(); + } else { await expect(element).toBeVisible(); } - }; - - const verifyFilter2TestCase = async (page: Page, negation = false) => { - for (const testCase of smilerNameTestCase) { - const element = page.locator(`[data-testid="${testCase}"]`); - if (negation) { - await expect(element).not.toBeVisible(); - } else { - await expect(element).toBeVisible(); - } - } - }; - - try { - await sidebarClick(page, SidebarItem.DATA_QUALITY); - - await page.click('[data-testid="test-cases"]'); - await page.waitForLoadState('networkidle'); - await page.waitForSelector('[data-testid="loader"]', { - state: 'detached', - }); - - // get all the filters - await page.click('[data-testid="advanced-filter"]'); - await page.click('[value="testPlatforms"]'); - await page.click('[data-testid="advanced-filter"]'); - await page.click('[value="lastRunRange"]'); - await page.click('[data-testid="advanced-filter"]'); - await page.click('[value="serviceName"]'); - await page.click('[data-testid="advanced-filter"]'); - await page.click('[value="tier"]'); - - // Test case search filter - const searchTestCaseResponse = page.waitForResponse( - (url) => - url.url().includes('/api/v1/dataQuality/testCases/search/list') && - url.url().includes(testCases[0]) - ); - await page.fill( - '[data-testid="test-case-container"] [data-testid="searchbar"]', - testCases[0] - ); - await searchTestCaseResponse; - - await expect( - page.locator(`[data-testid="${testCases[0]}"]`) - ).toBeVisible(); - - // clear the search filter - const getTestCaseResponse = page.waitForResponse( - '/api/v1/dataQuality/testCases/search/list?*' - ); - await page.locator('.ant-input-clear-icon').click(); - await getTestCaseResponse; - - // Test case filter by service name - const serviceResponse = page.waitForResponse( - '/api/v1/search/query?q=*index=database_service_search_index*' - ); - await page.fill('#serviceName', filterTable1.service.name); - await serviceResponse; - - const testCaseByServiceName = page.waitForResponse( - `/api/v1/dataQuality/testCases/search/list?*serviceName=${filterTable1.service.name}*` - ); - await page - .locator('.ant-select-dropdown') - .filter({ - hasNot: page.locator('.ant-select-dropdown-hidden'), - has: page.locator(`[data-testid="${filterTable1.service.name}"]`), - }) - .click(); - await testCaseByServiceName; - await verifyFilterTestCase(page); - await verifyFilter2TestCase(page); - - // remove service filter - await page.click('[data-testid="advanced-filter"]'); - const getTestCase = page.waitForResponse( - '/api/v1/dataQuality/testCases/search/list?*' - ); - await page.click('[value="serviceName"]'); - await getTestCase; - - // Test case filter by Tags - const tagResponse = page.waitForResponse( - '/api/v1/search/query?q=*index=tag_search_index*' - ); - await page - .getByTestId('tags-select-filter') - .locator('div') - .filter({ hasText: 'Tags' }) - .click(); - await page.fill('#tags', 'PII.None'); - await tagResponse; - - const getTestCaseByTag = page.waitForResponse( - '/api/v1/dataQuality/testCases/search/list?*tags=PII.None*' - ); - await page - .locator('.ant-select-dropdown') - .filter({ - hasNot: page.locator('.ant-select-dropdown-hidden'), - has: page.locator(`[data-testid="PII.None"]`), - }) - .click(); - await getTestCaseByTag; - await verifyFilterTestCase(page); - await verifyFilter2TestCase(page, true); - - // remove tags filter - await page.click('[data-testid="advanced-filter"]'); - const getTestCaseWithoutTag = page.waitForResponse( - '/api/v1/dataQuality/testCases/search/list?*' - ); - await page.click('[value="tags"]'); - await getTestCaseWithoutTag; - - // Test case filter by Tier - - await page.click('#tier'); - await page.fill('#tier', 'Tier2'); - await page.waitForLoadState('domcontentloaded'); - const getTestCaseByTier = page.waitForResponse( - '/api/v1/dataQuality/testCases/search/list?*tier=Tier.Tier2*' - ); - await page.getByTestId('Tier.Tier2').getByText('Tier.Tier2').click(); - await getTestCaseByTier; - await verifyFilterTestCase(page); - await verifyFilter2TestCase(page, true); - - // remove tier filter - await page.click('[data-testid="advanced-filter"]'); - const getTestCaseWithoutTier = page.waitForResponse( - '/api/v1/dataQuality/testCases/search/list?*' - ); - await page.click('[value="tier"]'); - await getTestCaseWithoutTier; - - // Test case filter by table name - const tableSearchResponse = page.waitForResponse( - `/api/v1/search/query?q=*index=table_search_index*` - ); - await page.fill('#tableFqn', filterTable1.entity.name); - await tableSearchResponse; - const getTestCaseByTable = page.waitForResponse( - `/api/v1/dataQuality/testCases/search/list?*entityLink=*${filterTable1.entity.name}*` - ); - - await page - .getByTestId(filterTable1.entityResponseData?.['fullyQualifiedName']) - .click(); - await getTestCaseByTable; - await verifyFilterTestCase(page); - await verifyFilter2TestCase(page, true); - - // Test case filter by test type column - const testCaseTypeByColumn = page.waitForResponse( - `/api/v1/dataQuality/testCases/search/list?*testCaseType=column*` - ); - await page.getByTestId('test-case-type-select-filter').click(); - await page.getByTitle('Column').click(); - await testCaseTypeByColumn; - - await expect( - page.locator('[data-testid="search-error-placeholder"]') - ).toBeVisible(); - - // Test case filter by test type table - const testCaseTypeByTable = page.waitForResponse( - `/api/v1/dataQuality/testCases/search/list?*testCaseType=table*` - ); - await page.getByTestId('test-case-type-select-filter').click(); - await page - .locator('.ant-select-dropdown') - .filter({ - hasNot: page.locator('.ant-select-dropdown-hidden'), - has: page.locator(`[title="Table"]`), - hasText: 'Table', - }) - .click(); - await testCaseTypeByTable; - await verifyFilterTestCase(page); - - // Test case filter by test type all - const testCaseTypeByAll = page.waitForResponse( - `/api/v1/dataQuality/testCases/search/list?*testCaseType=all*` - ); - await page.getByTestId('test-case-type-select-filter').click(); - await page.getByTitle('All').nth(1).click(); - await testCaseTypeByAll; - - // Test case filter by status - const testCaseStatusBySuccess = page.waitForResponse( - `/api/v1/dataQuality/testCases/search/list?*testCaseStatus=Success*` - ); - await page.getByTestId('status-select-filter').click(); - await page.getByTitle('Success').click(); - await testCaseStatusBySuccess; - - await expect( - page.locator('[data-testid="search-error-placeholder"]') - ).toBeVisible(); - - // Test case filter by status - const testCaseStatusByFailed = page.waitForResponse( - `/api/v1/dataQuality/testCases/search/list?*testCaseStatus=Failed*` - ); - await page.getByTestId('status-select-filter').click(); - await page.getByTitle('Failed').click(); - await testCaseStatusByFailed; - await verifyFilterTestCase(page); - await verifyFilter2TestCase(page, true); - - // Test case filter by platform - const testCasePlatformByDBT = page.waitForResponse( - `/api/v1/dataQuality/testCases/search/list?*testPlatforms=DBT*` - ); - await page.getByTestId('platform-select-filter').click(); - await page.getByTitle('DBT').click(); - await testCasePlatformByDBT; - - await expect( - page.locator('[data-testid="search-error-placeholder"]') - ).toBeVisible(); - - const getTestCaseWithoutPlatform = page.waitForResponse( - '/api/v1/dataQuality/testCases/search/list?*' - ); - await page - .getByTestId('platform-select-filter') - .locator('.ant-select-clear') - .click(); - await getTestCaseWithoutPlatform; - const testCasePlatformByOpenMetadata = page.waitForResponse( - `/api/v1/dataQuality/testCases/search/list?*testPlatforms=OpenMetadata*` - ); - await page.getByTestId('platform-select-filter').click(); - await page.getByTitle('OpenMetadata').click(); - await testCasePlatformByOpenMetadata; - await clickOutside(page); - await verifyFilterTestCase(page); - await verifyFilter2TestCase(page, true); - const url = page.url(); - await page.reload(); - - await expect(page.url()).toBe(url); - - await page.getByTestId('advanced-filter').click(); - await page.click('[value="testPlatforms"]'); - await page.waitForTimeout(200); - - await expect( - page.getByTestId('platform-select-filter') - ).not.toBeVisible(); - - await page.reload(); - - await expect(page.locator('[value="tier"]')).not.toBeVisible(); - - // Apply domain globally - await page.getByTestId('domain-dropdown').click(); - - await page - .getByTestId(`tag-${domain.responseData.fullyQualifiedName}`) - .click(); - - await sidebarClick(page, SidebarItem.DATA_QUALITY); - - await page.click('[data-testid="test-cases"]'); - await page.waitForLoadState('networkidle'); - await page.waitForSelector('[data-testid="loader"]', { - state: 'detached', - }); - await verifyFilterTestCase(page); - await verifyFilter2TestCase(page, true); - await visitDataQualityTab(page, filterTable1); - const searchTestCase = page.waitForResponse( - (url) => - url.url().includes('/api/v1/dataQuality/testCases/search/list') && - url.url().includes(testCases[0]) - ); - await page - .getByTestId('table-profiler-container') - .getByTestId('searchbar') - .fill(testCases[0]); - await searchTestCase; - - await expect( - page.locator(`[data-testid="${testCases[0]}"]`) - ).toBeVisible(); - await expect( - page.locator(`[data-testid="${testCases[1]}"]`) - ).not.toBeVisible(); - await expect( - page.locator(`[data-testid="${testCases[2]}"]`) - ).not.toBeVisible(); - } finally { - await filterTable1.delete(apiContext); - await domain.delete(apiContext); - await afterAction(); } - } -); + }; -test.fixme('Pagination functionality in test cases list', async ({ page }) => { + try { + await sidebarClick(page, SidebarItem.DATA_QUALITY); + + await page.click('[data-testid="test-cases"]'); + await page.waitForLoadState('networkidle'); + await page.waitForSelector('[data-testid="loader"]', { + state: 'detached', + }); + + // get all the filters + await page.click('[data-testid="advanced-filter"]'); + await page.click('[value="testPlatforms"]'); + await page.click('[data-testid="advanced-filter"]'); + await page.click('[value="lastRunRange"]'); + await page.click('[data-testid="advanced-filter"]'); + await page.click('[value="serviceName"]'); + await page.click('[data-testid="advanced-filter"]'); + await page.click('[value="tier"]'); + + // Test case search filter + const searchTestCaseResponse = page.waitForResponse( + (url) => + url.url().includes('/api/v1/dataQuality/testCases/search/list') && + url.url().includes(testCases[0]) + ); + await page.fill( + '[data-testid="test-case-container"] [data-testid="searchbar"]', + testCases[0] + ); + await searchTestCaseResponse; + + await expect(page.locator(`[data-testid="${testCases[0]}"]`)).toBeVisible(); + + // clear the search filter + const getTestCaseResponse = page.waitForResponse( + '/api/v1/dataQuality/testCases/search/list?*' + ); + await page.locator('.ant-input-clear-icon').click(); + await getTestCaseResponse; + + // Test case filter by service name + const serviceResponse = page.waitForResponse( + '/api/v1/search/query?q=*index=database_service_search_index*' + ); + await page.fill('#serviceName', filterTable1.service.name); + await serviceResponse; + + const testCaseByServiceName = page.waitForResponse( + `/api/v1/dataQuality/testCases/search/list?*serviceName=${filterTable1.service.name}*` + ); + await page + .locator('.ant-select-dropdown') + .filter({ + hasNot: page.locator('.ant-select-dropdown-hidden'), + has: page.locator(`[data-testid="${filterTable1.service.name}"]`), + }) + .click(); + await testCaseByServiceName; + await verifyFilterTestCase(page); + await verifyFilter2TestCase(page); + + // remove service filter + await page.click('[data-testid="advanced-filter"]'); + const getTestCase = page.waitForResponse( + '/api/v1/dataQuality/testCases/search/list?*' + ); + await page.click('[value="serviceName"]'); + await getTestCase; + + // Test case filter by Tags + const tagResponse = page.waitForResponse( + '/api/v1/search/query?q=*index=tag_search_index*' + ); + await page + .getByTestId('tags-select-filter') + .locator('div') + .filter({ hasText: 'Tags' }) + .click(); + await page.fill('#tags', 'PII.None'); + await tagResponse; + + const getTestCaseByTag = page.waitForResponse( + '/api/v1/dataQuality/testCases/search/list?*tags=PII.None*' + ); + await page + .locator('.ant-select-dropdown') + .filter({ + hasNot: page.locator('.ant-select-dropdown-hidden'), + has: page.locator(`[data-testid="PII.None"]`), + }) + .click(); + await getTestCaseByTag; + await verifyFilterTestCase(page); + await verifyFilter2TestCase(page, true); + + // remove tags filter + await page.click('[data-testid="advanced-filter"]'); + const getTestCaseWithoutTag = page.waitForResponse( + '/api/v1/dataQuality/testCases/search/list?*' + ); + await page.click('[value="tags"]'); + await getTestCaseWithoutTag; + + // Test case filter by Tier + + await page.click('#tier'); + await page.fill('#tier', 'Tier2'); + await page.waitForLoadState('domcontentloaded'); + const getTestCaseByTier = page.waitForResponse( + '/api/v1/dataQuality/testCases/search/list?*tier=Tier.Tier2*' + ); + await page.getByTestId('Tier.Tier2').getByText('Tier.Tier2').click(); + await getTestCaseByTier; + await verifyFilterTestCase(page); + await verifyFilter2TestCase(page, true); + + // remove tier filter + await page.click('[data-testid="advanced-filter"]'); + const getTestCaseWithoutTier = page.waitForResponse( + '/api/v1/dataQuality/testCases/search/list?*' + ); + await page.click('[value="tier"]'); + await getTestCaseWithoutTier; + + // Test case filter by table name + const tableSearchResponse = page.waitForResponse( + `/api/v1/search/query?q=*index=table_search_index*` + ); + await page.fill('#tableFqn', filterTable1.entity.name); + await tableSearchResponse; + const getTestCaseByTable = page.waitForResponse( + `/api/v1/dataQuality/testCases/search/list?*entityLink=*${filterTable1.entity.name}*` + ); + + await page + .getByTestId(filterTable1.entityResponseData?.['fullyQualifiedName']) + .click(); + await getTestCaseByTable; + await verifyFilterTestCase(page); + await verifyFilter2TestCase(page, true); + + // Test case filter by test type column + const testCaseTypeByColumn = page.waitForResponse( + `/api/v1/dataQuality/testCases/search/list?*testCaseType=column*` + ); + await page.getByTestId('test-case-type-select-filter').click(); + await page.getByTitle('Column').click(); + await testCaseTypeByColumn; + + await expect( + page.locator('[data-testid="search-error-placeholder"]') + ).toBeVisible(); + + // Test case filter by test type table + const testCaseTypeByTable = page.waitForResponse( + `/api/v1/dataQuality/testCases/search/list?*testCaseType=table*` + ); + await page.getByTestId('test-case-type-select-filter').click(); + await page + .locator('.ant-select-dropdown') + .filter({ + hasNot: page.locator('.ant-select-dropdown-hidden'), + has: page.locator(`[title="Table"]`), + hasText: 'Table', + }) + .click(); + await testCaseTypeByTable; + await verifyFilterTestCase(page); + + // Test case filter by test type all + const testCaseTypeByAll = page.waitForResponse( + `/api/v1/dataQuality/testCases/search/list?*testCaseType=all*` + ); + await page.getByTestId('test-case-type-select-filter').click(); + await page.getByTitle('All').nth(1).click(); + await testCaseTypeByAll; + + // Test case filter by status + const testCaseStatusBySuccess = page.waitForResponse( + `/api/v1/dataQuality/testCases/search/list?*testCaseStatus=Success*` + ); + await page.getByTestId('status-select-filter').click(); + await page.getByTitle('Success').click(); + await testCaseStatusBySuccess; + + await expect( + page.locator('[data-testid="search-error-placeholder"]') + ).toBeVisible(); + + // Test case filter by status + const testCaseStatusByFailed = page.waitForResponse( + `/api/v1/dataQuality/testCases/search/list?*testCaseStatus=Failed*` + ); + await page.getByTestId('status-select-filter').click(); + await page.getByTitle('Failed').click(); + await testCaseStatusByFailed; + await verifyFilterTestCase(page); + await verifyFilter2TestCase(page, true); + + // Test case filter by platform + const testCasePlatformByDBT = page.waitForResponse( + `/api/v1/dataQuality/testCases/search/list?*testPlatforms=DBT*` + ); + await page.getByTestId('platform-select-filter').click(); + await page.getByTitle('DBT').click(); + await testCasePlatformByDBT; + + await expect( + page.locator('[data-testid="search-error-placeholder"]') + ).toBeVisible(); + + const getTestCaseWithoutPlatform = page.waitForResponse( + '/api/v1/dataQuality/testCases/search/list?*' + ); + await page + .getByTestId('platform-select-filter') + .locator('.ant-select-clear') + .click(); + await getTestCaseWithoutPlatform; + const testCasePlatformByOpenMetadata = page.waitForResponse( + `/api/v1/dataQuality/testCases/search/list?*testPlatforms=OpenMetadata*` + ); + await page.getByTestId('platform-select-filter').click(); + await page.getByTitle('OpenMetadata').click(); + await testCasePlatformByOpenMetadata; + await clickOutside(page); + await verifyFilterTestCase(page); + await verifyFilter2TestCase(page, true); + const url = page.url(); + await page.reload(); + + await expect(page.url()).toBe(url); + + await page.getByTestId('advanced-filter').click(); + await page.click('[value="testPlatforms"]'); + await page.waitForTimeout(200); + + await expect(page.getByTestId('platform-select-filter')).not.toBeVisible(); + + await page.reload(); + + await expect(page.locator('[value="tier"]')).not.toBeVisible(); + + // Apply domain globally + await page.getByTestId('domain-dropdown').click(); + + await page + .getByTestId(`tag-${domain.responseData.fullyQualifiedName}`) + .click(); + + await sidebarClick(page, SidebarItem.DATA_QUALITY); + + await page.click('[data-testid="test-cases"]'); + await page.waitForLoadState('networkidle'); + await page.waitForSelector('[data-testid="loader"]', { + state: 'detached', + }); + await verifyFilterTestCase(page); + await verifyFilter2TestCase(page, true); + await visitDataQualityTab(page, filterTable1); + const searchTestCase = page.waitForResponse( + (url) => + url.url().includes('/api/v1/dataQuality/testCases/search/list') && + url.url().includes(testCases[0]) + ); + await page + .getByTestId('table-profiler-container') + .getByTestId('searchbar') + .fill(testCases[0]); + await searchTestCase; + + await expect(page.locator(`[data-testid="${testCases[0]}"]`)).toBeVisible(); + await expect( + page.locator(`[data-testid="${testCases[1]}"]`) + ).not.toBeVisible(); + await expect( + page.locator(`[data-testid="${testCases[2]}"]`) + ).not.toBeVisible(); + } finally { + await filterTable1.delete(apiContext); + await domain.delete(apiContext); + await afterAction(); + } +}); + +test('Pagination functionality in test cases list', async ({ page }) => { test.slow(); const { apiContext, afterAction } = await getApiContext(page);