Skip to content

Commit 1cde091

Browse files
Fix(ui): Flaky Table.spec Playwright (open-metadata#23267)
* fixed table.spec * fixed failing tests --------- Co-authored-by: Chirag Madlani <12962843+chirag-madlani@users.noreply.github.com>
1 parent 38c707b commit 1cde091

1 file changed

Lines changed: 121 additions & 28 deletions

File tree

  • openmetadata-ui/src/main/resources/ui/playwright/e2e/Features

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

Lines changed: 121 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -467,48 +467,62 @@ test.describe(
467467

468468
test.afterAll(async ({ browser }) => {
469469
const { apiContext } = await performAdminLogin(browser);
470-
471-
await glossary.delete(apiContext);
472470
await glossaryTerm.delete(apiContext);
471+
await glossary.delete(apiContext);
473472
await testClassification.delete(apiContext);
474473
await testTag.delete(apiContext);
475474
});
476475

477476
test('Glossary term should be consistent for search', async ({
478477
dataConsumerPage: page,
479478
}) => {
479+
// Go to tables page
480480
await page.goto('/table/sample_data.ecommerce_db.shopify.dim_customer');
481481

482-
await page
483-
.locator(
484-
'[data-row-key="sample_data.ecommerce_db.shopify.dim_customer.customer_id"] [data-testid="glossary-tags-0"] [data-testid="entity-tags"] svg'
485-
)
486-
.click();
482+
// Wait for page to be fully loaded
483+
await page.waitForLoadState('networkidle');
484+
await page.waitForSelector('[data-testid="loader"]', {
485+
state: 'detached',
486+
});
487+
488+
// Check if add button exists and is visible
489+
const rowSelector =
490+
'[data-row-key="sample_data.ecommerce_db.shopify.dim_customer.customer_id"] [data-testid="glossary-tags-0"]';
491+
492+
const addButton = await page.$(`${rowSelector} [data-testid="add-tag"]`);
493+
if (addButton && (await addButton.isVisible())) {
494+
await addButton.click();
495+
} else {
496+
await page
497+
.locator(`${rowSelector} [data-testid="edit-button"]`)
498+
.click();
499+
}
500+
487501
await page.waitForSelector('.ant-select-dropdown', { state: 'visible' });
488502
await page.waitForSelector(
489503
'.ant-select-dropdown [data-testid="loader"]',
490504
{
491505
state: 'detached',
492506
}
493507
);
508+
494509
await page
495-
.locator('.ant-select-dropdown')
496-
.getByTestId(`tag-${glossary.responseData.fullyQualifiedName}`)
497-
.getByTestId('expand-icon')
498-
.click();
510+
.locator('[data-testid="tag-selector"] input')
511+
.fill(glossaryTerm.data.name);
512+
499513
await page
500514
.getByTestId(`tag-${glossaryTerm.responseData.fullyQualifiedName}`)
501515
.click();
502-
516+
const saveResponse = page.waitForResponse('api/v1/columns/name/*');
503517
await page.getByTestId('saveAssociatedTag').click();
504518

505-
await page.waitForResponse('api/v1/columns/name/*');
519+
await saveResponse;
506520

507521
await expect(
508522
page.getByTestId(`tag-${glossaryTerm.responseData.fullyQualifiedName}`)
509-
).toContainText(glossaryTerm.responseData.displayName);
523+
).toBeVisible();
510524

511-
const getRequest = page.waitForResponse(
525+
const searchRequest = page.waitForResponse(
512526
'api/v1/tables/name/sample_data.ecommerce_db.shopify.dim_customer/columns/*'
513527
);
514528

@@ -517,25 +531,68 @@ test.describe(
517531
.getByTestId('searchbar')
518532
.fill('customer_id');
519533

520-
await getRequest;
534+
await searchRequest;
535+
await page.waitForSelector(
536+
'[data-testid="entity-table"] [data-testid="loader"]',
537+
{
538+
state: 'detached',
539+
}
540+
);
521541

522542
await expect(
523543
page
524544
.getByTestId('glossary-tags-0')
525545
.getByTestId(`tag-${glossaryTerm.responseData.fullyQualifiedName}`)
526-
).toContainText(glossaryTerm.responseData.displayName);
546+
).toBeVisible();
547+
548+
await page.click(`${rowSelector} [data-testid="edit-button"]`);
549+
550+
await page.waitForSelector('.ant-select-dropdown', { state: 'visible' });
551+
await page.waitForSelector(
552+
'.ant-select-dropdown [data-testid="loader"]',
553+
{
554+
state: 'detached',
555+
}
556+
);
557+
await page
558+
.locator('[data-testid="tag-selector"] input')
559+
.fill(glossaryTerm.data.name);
560+
561+
await page
562+
.locator('.ant-select-dropdown')
563+
.getByTestId(`tag-${glossaryTerm.responseData.fullyQualifiedName}`)
564+
.click();
565+
566+
await page.getByTestId('saveAssociatedTag').click();
567+
568+
await page.waitForResponse('api/v1/columns/name/*');
569+
570+
await expect(
571+
page.getByTestId(`tag-${glossaryTerm.responseData.fullyQualifiedName}`)
572+
).not.toBeVisible();
527573
});
528574

529575
test('Tags term should be consistent for search', async ({
530576
dataConsumerPage: page,
531577
}) => {
532578
await page.goto('/table/sample_data.ecommerce_db.shopify.dim_customer');
533579

534-
await page
535-
.locator(
536-
'[data-row-key="sample_data.ecommerce_db.shopify.dim_customer.customer_id"] [data-testid="classification-tags-0"] [data-testid="entity-tags"] svg'
537-
)
538-
.click();
580+
// Wait for page to be fully loaded
581+
await page.waitForLoadState('networkidle');
582+
await page.waitForSelector('[data-testid="loader"]', {
583+
state: 'detached',
584+
});
585+
586+
// Check if add button exists and is visible
587+
const rowSelector =
588+
'[data-row-key="sample_data.ecommerce_db.shopify.dim_customer.shop_id"] [data-testid="classification-tags-1"]';
589+
590+
const addButton = await page.$(`${rowSelector} [data-testid="add-tag"]`);
591+
if (addButton && (await addButton.isVisible())) {
592+
await addButton.click();
593+
} else {
594+
await page.click(`${rowSelector} [data-testid="edit-button"]`);
595+
}
539596

540597
await page.waitForSelector('.ant-select-dropdown', { state: 'visible' });
541598
await page.waitForSelector(
@@ -558,22 +615,58 @@ test.describe(
558615

559616
await expect(
560617
page.getByTestId(`tag-${testTag.responseData.fullyQualifiedName}`)
561-
).toContainText(testTag.responseData.displayName);
562-
618+
).toBeVisible();
619+
620+
page.reload();
621+
// Wait for page to be fully loaded
622+
await page.waitForLoadState('networkidle');
623+
await page.waitForSelector('[data-testid="loader"]', {
624+
state: 'detached',
625+
});
626+
const getRequest = page.waitForResponse(
627+
'api/v1/tables/name/sample_data.ecommerce_db.shopify.dim_customer/columns/*'
628+
);
563629
await page
564630
.getByTestId('search-bar-container')
565631
.getByTestId('searchbar')
566-
.fill('customer_id');
632+
.fill('shop_id');
567633

568-
await page.waitForResponse(
569-
'api/v1/tables/name/sample_data.ecommerce_db.shopify.dim_customer/columns/*'
634+
await getRequest;
635+
636+
await expect(
637+
page
638+
.getByTestId('classification-tags-0')
639+
.getByTestId(`tag-${testTag.responseData.fullyQualifiedName}`)
640+
).toBeVisible();
641+
642+
await page.click(
643+
`[data-row-key="sample_data.ecommerce_db.shopify.dim_customer.shop_id"] [data-testid="classification-tags-0"] [data-testid="edit-button"]`
570644
);
571645

646+
await page.waitForSelector('.ant-select-dropdown', { state: 'visible' });
647+
await page.waitForSelector(
648+
'.ant-select-dropdown [data-testid="loader"]',
649+
{
650+
state: 'detached',
651+
}
652+
);
653+
await page
654+
.locator('[data-testid="tag-selector"] input')
655+
.fill(testTag.data.name);
656+
await page
657+
.locator('.ant-select-dropdown')
658+
.getByTestId(`tag-${testTag.responseData.fullyQualifiedName}`)
659+
.click();
660+
661+
await page.getByTestId('saveAssociatedTag').click();
662+
663+
await page.waitForResponse('api/v1/columns/name/*');
664+
572665
await expect(
573666
page
574667
.getByTestId('classification-tags-0')
575668
.getByTestId(`tag-${testTag.responseData.fullyQualifiedName}`)
576-
).toContainText(testTag.responseData.displayName);
669+
).not.toBeVisible();
577670
});
578671
}
579672
);

0 commit comments

Comments
 (0)