test(e2e): replace content card visibility checks with dedicated function for better readability

This commit is contained in:
4gray committed 2026-04-02 08:45:50 +02:00
1 parent a15ac7f7c1
commit bf09b39ffc
3 files changed
+74 -39

No files matched your search

@@ -569,35 +569,22 @@ async function clickButtonToggleOption(
toggleGroup: Locator,
label: string
): Promise<void> {
const radio = toggleGroup.getByRole('radio', {
name: label,
exact: true,
});
if ((await radio.count()) > 0) {
await expect(radio.first()).toBeVisible();
await radio.first().click();
return;
}
const button = toggleGroup.getByRole('button', {
name: label,
exact: true,
});
if ((await button.count()) > 0) {
await expect(button.first()).toBeVisible();
await button.first().click();
return;
}
const toggle = toggleGroup
.locator('mat-button-toggle')
.filter({ hasText: flexibleTextPattern(label) })
.first();
await expect(toggle).toBeVisible();
await toggle.click();
if (!(await isButtonToggleSelected(toggle))) {
await toggle.click();
}
await expect
.poll(() => isButtonToggleSelected(toggle), {
timeout: 10000,
})
.toBe(true);
}
export function channelItemByTitle(page: Page, title: string): Locator {
@@ -616,6 +603,25 @@ export function contentCardByTitle(page: Page, title: string): Locator {
});
}
export async function expectVisibleContentCardTitle(
page: Page,
title: string
): Promise<void> {
await expect
.poll(
async () => {
const titles = await visibleContentCardTitles(page);
return titles.some(
(visibleTitle) =>
normalizeVisibleText(visibleTitle) ===
normalizeVisibleText(title)
);
},
{ timeout: 20000 }
)
.toBe(true);
}
export function gridListCardByTitle(page: Page, title: string): Locator {
return page.locator('.category-content-layout mat-card').filter({
has: page.locator('.title', {
@@ -1372,3 +1378,34 @@ function flexibleTextPattern(value: string): RegExp {
'i'
);
}
async function isButtonToggleSelected(toggle: Locator): Promise<boolean> {
try {
return await toggle.evaluate((element) => {
const host = element as HTMLElement;
const selectedDescendant = host.querySelector(
'[aria-checked="true"], [aria-pressed="true"]'
);
return (
host.classList.contains('mat-button-toggle-checked') ||
host.getAttribute('aria-checked') === 'true' ||
host.getAttribute('aria-pressed') === 'true' ||
selectedDescendant !== null
);
});
} catch {
return false;
}
}
async function visibleContentCardTitles(page: Page): Promise<string[]> {
return page
.locator('app-content-card h3')
.allInnerTexts()
.then((titles) => titles.map((title) => title.trim()).filter(Boolean));
}
function normalizeVisibleText(value: string): string {
return value.trim().replace(/\s+/g, ' ').toLowerCase();
}
+7 -10
View File
@@ -11,6 +11,7 @@ import {
contentCardByTitle,
defaultXtreamPassword,
defaultXtreamUsername,
expectVisibleContentCardTitle,
expect,
importM3uPlaylistFromNativeDialog,
launchElectronApp,
@@ -159,18 +160,18 @@ test.describe('Electron Favorites', () => {
await expect(channelItemByTitle(app.mainWindow, liveTitle)).toHaveCount(1);
await switchUnifiedCollectionContent(app.mainWindow, 'Movies');
await expect(contentCardByTitle(app.mainWindow, movieTitle)).toHaveCount(1);
await expectVisibleContentCardTitle(app.mainWindow, movieTitle);
await switchUnifiedCollectionContent(app.mainWindow, 'Series');
await expect(contentCardByTitle(app.mainWindow, seriesTitle)).toHaveCount(1);
await expectVisibleContentCardTitle(app.mainWindow, seriesTitle);
await switchUnifiedCollectionScope(app.mainWindow, 'All playlists');
await switchUnifiedCollectionContent(app.mainWindow, 'Live TV');
await expect(channelItemByTitle(app.mainWindow, liveTitle)).toHaveCount(1);
await switchUnifiedCollectionContent(app.mainWindow, 'Movies');
await expect(contentCardByTitle(app.mainWindow, movieTitle)).toHaveCount(1);
await expectVisibleContentCardTitle(app.mainWindow, movieTitle);
await switchUnifiedCollectionContent(app.mainWindow, 'Series');
await expect(contentCardByTitle(app.mainWindow, seriesTitle)).toHaveCount(1);
await expectVisibleContentCardTitle(app.mainWindow, seriesTitle);
const restarted = await restartElectronApp(app, dataDir);
app.electronApp = restarted.electronApp;
@@ -189,13 +190,9 @@ test.describe('Electron Favorites', () => {
channelItemByTitle(app.mainWindow, liveTitle)
).toHaveCount(1);
await switchUnifiedCollectionContent(app.mainWindow, 'Movies');
await expect(
contentCardByTitle(app.mainWindow, movieTitle)
).toHaveCount(1);
await expectVisibleContentCardTitle(app.mainWindow, movieTitle);
await switchUnifiedCollectionContent(app.mainWindow, 'Series');
await expect(
contentCardByTitle(app.mainWindow, seriesTitle)
).toHaveCount(1);
await expectVisibleContentCardTitle(app.mainWindow, seriesTitle);
} finally {
await closeElectronApp(app);
}
+7 -6
View File
@@ -11,6 +11,7 @@ import {
contentCardByTitle,
defaultXtreamPassword,
defaultXtreamUsername,
expectVisibleContentCardTitle,
expect,
importM3uPlaylistFromNativeDialog,
launchElectronApp,
@@ -160,17 +161,17 @@ test.describe('Electron Recently Viewed', () => {
await openPlaylistRecent(app.mainWindow);
await expect(channelItemByTitle(app.mainWindow, liveTitle)).toHaveCount(1);
await switchUnifiedCollectionContent(app.mainWindow, 'Movies');
await expect(contentCardByTitle(app.mainWindow, movieTitle)).toHaveCount(1);
await expectVisibleContentCardTitle(app.mainWindow, movieTitle);
await switchUnifiedCollectionContent(app.mainWindow, 'Series');
await expect(contentCardByTitle(app.mainWindow, seriesTitle)).toHaveCount(1);
await expectVisibleContentCardTitle(app.mainWindow, seriesTitle);
await switchUnifiedCollectionScope(app.mainWindow, 'All playlists');
await switchUnifiedCollectionContent(app.mainWindow, 'Live TV');
await expect(channelItemByTitle(app.mainWindow, liveTitle)).toHaveCount(1);
await switchUnifiedCollectionContent(app.mainWindow, 'Movies');
await expect(contentCardByTitle(app.mainWindow, movieTitle)).toHaveCount(1);
await expectVisibleContentCardTitle(app.mainWindow, movieTitle);
await switchUnifiedCollectionContent(app.mainWindow, 'Series');
await expect(contentCardByTitle(app.mainWindow, seriesTitle)).toHaveCount(1);
await expectVisibleContentCardTitle(app.mainWindow, seriesTitle);
const restarted = await restartElectronApp(app, dataDir);
app.electronApp = restarted.electronApp;
@@ -184,9 +185,9 @@ test.describe('Electron Recently Viewed', () => {
await switchUnifiedCollectionContent(app.mainWindow, 'Live TV');
await expect(channelItemByTitle(app.mainWindow, liveTitle)).toHaveCount(1);
await switchUnifiedCollectionContent(app.mainWindow, 'Movies');
await expect(contentCardByTitle(app.mainWindow, movieTitle)).toHaveCount(1);
await expectVisibleContentCardTitle(app.mainWindow, movieTitle);
await switchUnifiedCollectionContent(app.mainWindow, 'Series');
await expect(contentCardByTitle(app.mainWindow, seriesTitle)).toHaveCount(1);
await expectVisibleContentCardTitle(app.mainWindow, seriesTitle);
await switchUnifiedCollectionContent(app.mainWindow, 'Live TV');
await clearRecentItems(app.mainWindow);