From d614ff1c47e153ab97dcb723fb2aed42aa08baca Mon Sep 17 00:00:00 2001 From: Rohit0301 Date: Fri, 24 Apr 2026 15:53:39 +0530 Subject: [PATCH 1/5] Fix PR playwright failures --- .../resources/ui/playwright/e2e/Pages/Glossary.spec.ts | 10 +++++----- .../resources/ui/playwright/e2e/Pages/Users.spec.ts | 3 ++- .../ui/playwright/utils/searchSettingUtils.ts | 1 + 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Glossary.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Glossary.spec.ts index 8bc26779008b..cfd3e5e1fe59 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Glossary.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Glossary.spec.ts @@ -532,7 +532,7 @@ test.describe('Glossary tests', () => { const glossaryRequest = page.waitForResponse( `/api/v1/search/query?q=*&index=glossaryTerm&from=0&size=25&deleted=false&track_total_hits=true&getHierarchy=true` ); - await page.type( + await page.fill( '[data-testid="tag-selector"] #tagsForm_tags', glossaryTerm1.data.name ); @@ -551,7 +551,7 @@ test.describe('Glossary tests', () => { const glossaryRequest2 = page.waitForResponse( `/api/v1/search/query?q=*&index=glossaryTerm&from=0&size=25&deleted=false&track_total_hits=true&getHierarchy=true` ); - await page.type( + await page.fill( '[data-testid="tag-selector"] #tagsForm_tags', glossaryTerm2.data.name ); @@ -587,7 +587,7 @@ test.describe('Glossary tests', () => { const glossaryRequest3 = page.waitForResponse( `/api/v1/search/query?q=*&index=glossaryTerm&from=0&size=25&deleted=false&track_total_hits=true&getHierarchy=true` ); - await page.type( + await page.fill( '[data-testid="tag-selector"] #tagsForm_tags', glossaryTerm3.data.name ); @@ -606,7 +606,7 @@ test.describe('Glossary tests', () => { const glossaryRequest4 = page.waitForResponse( `/api/v1/search/query?q=*&index=glossaryTerm&from=0&size=25&deleted=false&track_total_hits=true&getHierarchy=true` ); - await page.type( + await page.fill( '[data-testid="tag-selector"] #tagsForm_tags', glossaryTerm4.data.name ); @@ -660,7 +660,7 @@ test.describe('Glossary tests', () => { const glossaryRequest5 = page.waitForResponse( `/api/v1/search/query?q=*&index=glossaryTerm&from=0&size=25&deleted=false&track_total_hits=true&getHierarchy=true` ); - await page.type( + await page.fill( '[data-testid="tag-selector"] #tagsForm_tags', glossaryTerm3.data.name ); diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Users.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Users.spec.ts index a1becb2c0e08..3cac661c4b4e 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Users.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Users.spec.ts @@ -10,7 +10,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { expect, Page, test as base } from '@playwright/test'; +import { test as base, expect, Page } from '@playwright/test'; import { DATA_CONSUMER_RULES, DATA_STEWARD_RULES, @@ -33,6 +33,7 @@ import { TeamClass } from '../../support/team/TeamClass'; import { UserClass } from '../../support/user/UserClass'; import { createAdminApiContext, performAdminLogin } from '../../utils/admin'; import { + getApiContext, redirectToHomePage, toastNotification, uuid, diff --git a/openmetadata-ui/src/main/resources/ui/playwright/utils/searchSettingUtils.ts b/openmetadata-ui/src/main/resources/ui/playwright/utils/searchSettingUtils.ts index 055903820850..db4460ddc6c5 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/utils/searchSettingUtils.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/utils/searchSettingUtils.ts @@ -29,6 +29,7 @@ export const mockEntitySearchConfig = { assetType: 'table', searchFields: [ { field: 'displayName.keyword', boost: 20, matchType: 'exact' }, + { field: 'name.keyword', boost: 20, matchType: 'exact' }, { field: 'name', boost: 10, matchType: 'phrase' }, { field: 'name.ngram', boost: 1, matchType: 'fuzzy' }, { field: 'name.compound', boost: 8, matchType: 'standard' }, From 741e17a5f9c1f2c81033fe0b384cf9b43e1f0701 Mon Sep 17 00:00:00 2001 From: Rohit0301 Date: Fri, 24 Apr 2026 15:57:21 +0530 Subject: [PATCH 2/5] fix lint check --- .../src/main/resources/ui/playwright/e2e/Pages/Users.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Users.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Users.spec.ts index 3cac661c4b4e..14aa7d554f6d 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Users.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Users.spec.ts @@ -10,7 +10,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { test as base, expect, Page } from '@playwright/test'; +import { expect, Page, test as base } from '@playwright/test'; import { DATA_CONSUMER_RULES, DATA_STEWARD_RULES, From 73bc64654e9d8dd2798e46f14171bc4cf0d31d7f Mon Sep 17 00:00:00 2001 From: Rohit0301 Date: Fri, 24 Apr 2026 18:57:24 +0530 Subject: [PATCH 3/5] fix glossary spec --- .../ui/playwright/e2e/Pages/Glossary.spec.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Glossary.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Glossary.spec.ts index cfd3e5e1fe59..6580d858f6d8 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Glossary.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Glossary.spec.ts @@ -534,7 +534,7 @@ test.describe('Glossary tests', () => { ); await page.fill( '[data-testid="tag-selector"] #tagsForm_tags', - glossaryTerm1.data.name + glossary1.data.name ); await glossaryRequest; @@ -553,7 +553,7 @@ test.describe('Glossary tests', () => { ); await page.fill( '[data-testid="tag-selector"] #tagsForm_tags', - glossaryTerm2.data.name + glossary1.data.name ); await glossaryRequest2; @@ -578,7 +578,7 @@ test.describe('Glossary tests', () => { // Add non mutually exclusive tags await page.click( - '[data-testid="KnowledgePanel.GlossaryTerms"] [data-testid="glossary-container"] [data-testid="add-tag"]' + '[data-testid="KnowledgePanel.GlossaryTerms"] [data-testid="glossary-container"] [data-testid="edit-button"]' ); // Select 1st term @@ -589,7 +589,7 @@ test.describe('Glossary tests', () => { ); await page.fill( '[data-testid="tag-selector"] #tagsForm_tags', - glossaryTerm3.data.name + glossary2.data.name ); await glossaryRequest3; @@ -608,7 +608,7 @@ test.describe('Glossary tests', () => { ); await page.fill( '[data-testid="tag-selector"] #tagsForm_tags', - glossaryTerm4.data.name + glossary2.data.name ); await glossaryRequest4; @@ -648,7 +648,7 @@ test.describe('Glossary tests', () => { '[data-testid="KnowledgePanel.GlossaryTerms"] [data-testid="glossary-container"] [data-testid="glossary-icon"]' ); - expect(await icons.count()).toBe(2); + expect(await icons.count()).toBe(3); // Add Glossary to Dashboard Charts await page.click( From 1ee36e9144d91282b6afd4328e46d163a9d09632 Mon Sep 17 00:00:00 2001 From: Rohit0301 Date: Sat, 25 Apr 2026 12:09:52 +0530 Subject: [PATCH 4/5] fixed flaky test --- .../ui/playwright/e2e/Pages/Domains.spec.ts | 65 +++++++++++-------- .../resources/ui/playwright/utils/domain.ts | 33 ++++++---- 2 files changed, 58 insertions(+), 40 deletions(-) diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts index a68e25aa363f..62817cfd6b5e 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts @@ -20,8 +20,8 @@ import { DataProduct } from '../../support/domain/DataProduct'; import { Domain } from '../../support/domain/Domain'; import { SubDomain } from '../../support/domain/SubDomain'; import { - EntityTypeEndpoint, ENTITY_PATH, + EntityTypeEndpoint, } from '../../support/entity/Entity.interface'; import { EntityDataClass } from '../../support/entity/EntityDataClass'; import { TableClass } from '../../support/entity/TableClass'; @@ -81,20 +81,12 @@ import { selectActiveGlossaryTerm } from '../../utils/glossary'; import { sidebarClick } from '../../utils/sidebar'; import { selectTagInTagSuggestion } from '../../utils/tag'; import { performUserLogin, visitUserProfilePage } from '../../utils/user'; -const user = new UserClass(); - -const domain = new Domain(); - -const classification = new ClassificationClass({ - provider: 'system', - mutuallyExclusive: true, -}); -const tag = new TagClass({ - classification: classification.data.name, -}); - -const glossary = new Glossary(); -const glossaryTerm = new GlossaryTerm(glossary); +let user: UserClass; +let domain: Domain; +let classification: ClassificationClass; +let tag: TagClass; +let glossary: Glossary; +let glossaryTerm: GlossaryTerm; const test = base.extend<{ page: Page; @@ -119,6 +111,16 @@ test.describe('Domains', () => { test.beforeAll('Setup pre-requests', async ({ browser }) => { test.slow(true); + user = new UserClass(); + domain = new Domain(); + classification = new ClassificationClass({ + provider: 'system', + mutuallyExclusive: true, + }); + tag = new TagClass({ classification: classification.data.name }); + glossary = new Glossary(); + glossaryTerm = new GlossaryTerm(glossary); + const { apiContext, afterAction } = await performAdminLogin(browser); await user.create(apiContext); await classification.create(apiContext); @@ -2669,12 +2671,16 @@ test.describe('Domain Rename Comprehensive Tests', () => { test.describe('Domains Rbac', () => { test.slow(true); - const domain1 = new Domain(); - const domain2 = new Domain(); - const domain3 = new Domain(); - const user1 = new UserClass(); + let domain1: Domain; + let domain2: Domain; + let domain3: Domain; + let user1: UserClass; test.beforeAll('Setup pre-requests', async ({ browser }) => { + domain1 = new Domain(); + domain2 = new Domain(); + domain3 = new Domain(); + user1 = new UserClass(); test.slow(); const { apiContext, afterAction, page } = await performAdminLogin(browser); @@ -2815,15 +2821,10 @@ test.describe('Domains Rbac', () => { test.describe('Data Consumer Domain Ownership', () => { test.slow(true); - const classification = new ClassificationClass({ - provider: 'system', - mutuallyExclusive: true, - }); - const tag = new TagClass({ - classification: classification.data.name, - }); - const glossary = new Glossary(); - const glossaryTerm = new GlossaryTerm(glossary); + let classification: ClassificationClass; + let tag: TagClass; + let glossary: Glossary; + let glossaryTerm: GlossaryTerm; let testResources: { dataConsumerUser: UserClass; @@ -2833,6 +2834,14 @@ test.describe('Data Consumer Domain Ownership', () => { }; test.beforeAll('Setup pre-requests', async ({ browser }) => { + classification = new ClassificationClass({ + provider: 'system', + mutuallyExclusive: true, + }); + tag = new TagClass({ classification: classification.data.name }); + glossary = new Glossary(); + glossaryTerm = new GlossaryTerm(glossary); + const { apiContext, afterAction } = await performAdminLogin(browser); await classification.create(apiContext); await tag.create(apiContext); diff --git a/openmetadata-ui/src/main/resources/ui/playwright/utils/domain.ts b/openmetadata-ui/src/main/resources/ui/playwright/utils/domain.ts index b18b64ef0b1d..d967e1269b40 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/utils/domain.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/utils/domain.ts @@ -1644,34 +1644,43 @@ export const selectDomainFromNavbar = async ( page: Page, domain: Domain['responseData'] ) => { - await page.getByTestId('domain-dropdown').click(); + const domainDropdown = page.getByTestId('domain-dropdown'); const domainTree = page.getByTestId('domain-selectable-tree'); - await domainTree.waitFor({ - state: 'visible', - }); - const searchBar = domainTree.getByTestId('searchbar'); const searchTerm = domain.displayName ?? domain.name; const domainOption = page.getByTestId(`tag-${domain.fullyQualifiedName}`); + const openDropdown = async () => { + await domainDropdown.click(); + await domainTree.waitFor({ state: 'visible' }); + }; + + await openDropdown(); + + const searchBar = domainTree.locator('input[placeholder]').first(); + await expect .poll( async () => { if (!(await domainTree.isVisible().catch(() => false))) { - await page.getByTestId('domain-dropdown').click(); - await domainTree.waitFor({ state: 'visible' }); + await openDropdown(); } - await searchBar.fill(''); - await searchBar.fill(searchTerm); + const isSearchBarVisible = await searchBar + .isVisible() + .catch(() => false); + + if (isSearchBarVisible) { + await searchBar.focus(); + await searchBar.press('Control+a'); + await searchBar.pressSequentially(searchTerm); + } return await domainOption.isVisible().catch(() => false); }, { timeout: 60000, intervals: [1000, 2000, 5000], - message: `Timed out waiting for domain ${ - domain.displayName ?? domain.name - } to appear in navbar selector`, + message: `Timed out waiting for domain ${searchTerm} to appear in navbar selector`, } ) .toBe(true); From 5771071485e8eaddb22df07ce876ba1ebd41e237 Mon Sep 17 00:00:00 2001 From: Rohit0301 Date: Sat, 25 Apr 2026 12:18:15 +0530 Subject: [PATCH 5/5] fix lint issue --- .../src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts index 62817cfd6b5e..fbadd237db9f 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/Domains.spec.ts @@ -20,8 +20,8 @@ import { DataProduct } from '../../support/domain/DataProduct'; import { Domain } from '../../support/domain/Domain'; import { SubDomain } from '../../support/domain/SubDomain'; import { - ENTITY_PATH, EntityTypeEndpoint, + ENTITY_PATH, } from '../../support/entity/Entity.interface'; import { EntityDataClass } from '../../support/entity/EntityDataClass'; import { TableClass } from '../../support/entity/TableClass';