mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-10-02 12:26:42 +00:00
test: fix Playwright domain and subdomain test selectors
- Add data-testid to table rows for reliable subdomain selection - Fix race conditions using Promise.all() pattern - Update search box locator from getByRole to getByPlaceholder - Add skipDomainSelection parameter to prevent redundant navigation - Update IngestionBot test to skip domain selection when already on page 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
f4026d5b84
commit
107aeb0383
@ -101,7 +101,7 @@ test.describe('Ingestion Bot ', () => {
|
|||||||
state: 'detached',
|
state: 'detached',
|
||||||
});
|
});
|
||||||
await selectDomain(page, domain1.data);
|
await selectDomain(page, domain1.data);
|
||||||
await addAssetsToDomain(page, domain1, domainAsset1);
|
await addAssetsToDomain(page, domain1, domainAsset1, true, true);
|
||||||
|
|
||||||
// Add assets to domain 2
|
// Add assets to domain 2
|
||||||
await sidebarClick(page, SidebarItem.DOMAIN);
|
await sidebarClick(page, SidebarItem.DOMAIN);
|
||||||
@ -110,7 +110,7 @@ test.describe('Ingestion Bot ', () => {
|
|||||||
state: 'detached',
|
state: 'detached',
|
||||||
});
|
});
|
||||||
await selectDomain(page, domain2.data);
|
await selectDomain(page, domain2.data);
|
||||||
await addAssetsToDomain(page, domain2, domainAsset2);
|
await addAssetsToDomain(page, domain2, domainAsset2, true, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
await test.step(
|
await test.step(
|
||||||
|
@ -452,11 +452,10 @@ test.describe('Domains', () => {
|
|||||||
state: 'detached',
|
state: 'detached',
|
||||||
});
|
});
|
||||||
|
|
||||||
const domainApiRes = page.waitForResponse('/api/v1/domains/name/*');
|
await Promise.all([
|
||||||
|
page.getByTestId(subDomain.data.name).click(),
|
||||||
await page.getByRole('row', { name: subDomain.data.displayName }).click();
|
page.waitForResponse('/api/v1/domains/name/*'),
|
||||||
|
]);
|
||||||
await domainApiRes;
|
|
||||||
|
|
||||||
await verifyDomain(page, subDomain.data, domain.data, false);
|
await verifyDomain(page, subDomain.data, domain.data, false);
|
||||||
// Follow domain
|
// Follow domain
|
||||||
@ -516,9 +515,10 @@ test.describe('Domains', () => {
|
|||||||
state: 'detached',
|
state: 'detached',
|
||||||
});
|
});
|
||||||
|
|
||||||
const domainApiRes1 = page.waitForResponse('/api/v1/domains/name/*');
|
await Promise.all([
|
||||||
await page.getByRole('row', { name: subDomain.data.displayName }).click();
|
page.getByTestId(subDomain.data.name).click(),
|
||||||
await domainApiRes1;
|
page.waitForResponse('/api/v1/domains/name/*'),
|
||||||
|
]);
|
||||||
await verifyDomain(page, nestedSubDomain.data, domain.data, false);
|
await verifyDomain(page, nestedSubDomain.data, domain.data, false);
|
||||||
} finally {
|
} finally {
|
||||||
await nestedSubDomain.delete(apiContext);
|
await nestedSubDomain.delete(apiContext);
|
||||||
|
@ -121,25 +121,21 @@ export const validateDomainForm = async (page: Page) => {
|
|||||||
export const selectDomain = async (page: Page, domain: Domain['data']) => {
|
export const selectDomain = async (page: Page, domain: Domain['data']) => {
|
||||||
const searchBox = page
|
const searchBox = page
|
||||||
.getByTestId('page-layout-v1')
|
.getByTestId('page-layout-v1')
|
||||||
.getByRole('textbox', { name: 'Search' });
|
.getByPlaceholder('Search');
|
||||||
|
|
||||||
const domainRes = page.waitForResponse(
|
await Promise.all([
|
||||||
'/api/v1/search/query?q=*&index=domain_search_index*'
|
searchBox.fill(domain.name),
|
||||||
);
|
page.waitForResponse('/api/v1/search/query?q=*&index=domain_search_index*'),
|
||||||
|
]);
|
||||||
await searchBox.fill(domain.name);
|
|
||||||
|
|
||||||
await domainRes;
|
|
||||||
|
|
||||||
await page.waitForSelector('[data-testid="loader"]', {
|
await page.waitForSelector('[data-testid="loader"]', {
|
||||||
state: 'detached',
|
state: 'detached',
|
||||||
});
|
});
|
||||||
|
|
||||||
const domainApiRes = page.waitForResponse('/api/v1/domains/name/*');
|
await Promise.all([
|
||||||
|
page.locator('td').filter({ hasText: domain.displayName }).click(),
|
||||||
await page.locator('td').filter({ hasText: domain.displayName }).click();
|
page.waitForResponse('/api/v1/domains/name/*'),
|
||||||
|
]);
|
||||||
await domainApiRes;
|
|
||||||
|
|
||||||
await page.waitForLoadState('networkidle');
|
await page.waitForLoadState('networkidle');
|
||||||
|
|
||||||
@ -197,13 +193,13 @@ export const selectDataProductFromTab = async (
|
|||||||
|
|
||||||
await page.waitForSelector('[data-testid="loader"]', { state: 'detached' });
|
await page.waitForSelector('[data-testid="loader"]', { state: 'detached' });
|
||||||
|
|
||||||
const dpDataRes = page.waitForResponse('/api/v1/dataProducts/name/*');
|
await Promise.all([
|
||||||
|
page
|
||||||
await page
|
.getByTestId(`explore-card-${dataProduct.name}`)
|
||||||
.getByTestId(`explore-card-${dataProduct.name}`)
|
.getByTestId('entity-link')
|
||||||
.getByTestId('entity-link')
|
.click(),
|
||||||
.click();
|
page.waitForResponse('/api/v1/dataProducts/name/*'),
|
||||||
await dpDataRes;
|
]);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const selectDataProduct = async (
|
export const selectDataProduct = async (
|
||||||
@ -212,38 +208,44 @@ export const selectDataProduct = async (
|
|||||||
) => {
|
) => {
|
||||||
const searchBox = page
|
const searchBox = page
|
||||||
.getByTestId('page-layout-v1')
|
.getByTestId('page-layout-v1')
|
||||||
.getByRole('textbox', { name: 'Search' });
|
.getByPlaceholder('Search');
|
||||||
|
|
||||||
const dpRes = page.waitForResponse(
|
await Promise.all([
|
||||||
'/api/v1/search/query?q=*&index=data_product_search_index*'
|
searchBox.fill(dataProduct.name),
|
||||||
);
|
page.waitForResponse(
|
||||||
|
'/api/v1/search/query?q=*&index=data_product_search_index*'
|
||||||
await searchBox.fill(dataProduct.name);
|
),
|
||||||
|
]);
|
||||||
await dpRes;
|
|
||||||
|
|
||||||
await page.waitForSelector('[data-testid="loader"]', {
|
await page.waitForSelector('[data-testid="loader"]', {
|
||||||
state: 'detached',
|
state: 'detached',
|
||||||
});
|
});
|
||||||
|
|
||||||
const dpApiRes = page.waitForResponse('/api/v1/dataProducts/name/*');
|
await Promise.all([
|
||||||
|
page.locator('td').filter({ hasText: dataProduct.displayName }).click(),
|
||||||
await page.locator('td').filter({ hasText: dataProduct.displayName }).click();
|
page.waitForResponse('/api/v1/dataProducts/name/*'),
|
||||||
|
]);
|
||||||
await dpApiRes;
|
|
||||||
|
|
||||||
await page.waitForSelector('[data-testid="loader"]', {
|
await page.waitForSelector('[data-testid="loader"]', {
|
||||||
state: 'detached',
|
state: 'detached',
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const goToAssetsTab = async (page: Page, domain: Domain['data']) => {
|
const goToAssetsTab = async (
|
||||||
await selectDomain(page, domain);
|
page: Page,
|
||||||
|
domain: Domain['data'],
|
||||||
|
skipDomainSelection = false
|
||||||
|
) => {
|
||||||
|
if (!skipDomainSelection) {
|
||||||
|
await selectDomain(page, domain);
|
||||||
|
}
|
||||||
|
|
||||||
await checkDomainDisplayName(page, domain.displayName);
|
await checkDomainDisplayName(page, domain.displayName);
|
||||||
|
|
||||||
const assetRes = page.waitForResponse('/api/v1/search/query?q=&index=all*');
|
await Promise.all([
|
||||||
await page.getByTestId('assets').click({ timeout: 15000 });
|
page.getByTestId('assets').click({ timeout: 15000 }),
|
||||||
await assetRes;
|
page.waitForResponse('/api/v1/search/query?q=&index=all*'),
|
||||||
|
]);
|
||||||
|
|
||||||
await page.waitForLoadState('networkidle');
|
await page.waitForLoadState('networkidle');
|
||||||
await page.waitForSelector('[data-testid="loader"]', { state: 'detached' });
|
await page.waitForSelector('[data-testid="loader"]', { state: 'detached' });
|
||||||
@ -388,10 +390,11 @@ export const addAssetsToDomain = async (
|
|||||||
page: Page,
|
page: Page,
|
||||||
domain: Domain,
|
domain: Domain,
|
||||||
assets: EntityClass[],
|
assets: EntityClass[],
|
||||||
navigateToAssetsTab = true
|
navigateToAssetsTab = true,
|
||||||
|
skipDomainSelection = false
|
||||||
) => {
|
) => {
|
||||||
if (navigateToAssetsTab) {
|
if (navigateToAssetsTab) {
|
||||||
await goToAssetsTab(page, domain.data);
|
await goToAssetsTab(page, domain.data, skipDomainSelection);
|
||||||
}
|
}
|
||||||
await checkAssetsCount(page, 0);
|
await checkAssetsCount(page, 0);
|
||||||
|
|
||||||
|
@ -50,6 +50,7 @@ export const useTableRow = <T extends { id: string }>(
|
|||||||
() => (
|
() => (
|
||||||
<TableRow
|
<TableRow
|
||||||
hover
|
hover
|
||||||
|
data-testid={(config.entity as any).name}
|
||||||
sx={{ cursor: 'pointer' }}
|
sx={{ cursor: 'pointer' }}
|
||||||
onClick={() => config.onEntityClick(config.entity)}>
|
onClick={() => config.onEntityClick(config.entity)}>
|
||||||
{config.enableSelection && (
|
{config.enableSelection && (
|
||||||
|
Loading…
x
Reference in New Issue
Block a user