Some checks failed
Tests / Build and Push CICD Complete Image (push) Failing after 4m6s
Tests / TSDoc Lint Check (push) Has been skipped
Tests / Backend Tests (push) Has been skipped
Tests / Frontend Tests (push) Has been skipped
Tests / Integration Tests (push) Has been skipped
Tests / End-to-End Tests (push) Has been skipped
Tests / Trailing Whitespace Check (push) Has been skipped
Tests / End of File Check (push) Has been skipped
Tests / YAML Syntax Check (push) Has been skipped
Tests / Backend Doctests (push) Has been skipped
Tests / TOML Syntax Check (push) Has been skipped
Tests / Mixed Line Ending Check (push) Has been skipped
Tests / TOML Formatting Check (push) Has been skipped
Tests / Ruff Linting (push) Has been skipped
Tests / Pyright Type Check (push) Has been skipped
Tests / Darglint Docstring Check (push) Has been skipped
Tests / No Docstring Types Check (push) Has been skipped
Tests / ESLint Check (push) Has been skipped
Tests / Prettier Format Check (push) Has been skipped
Tests / Ruff Format Check (push) Has been skipped
Tests / TypeScript Type Check (push) Has been skipped
Tests / Build and Push CICD Base Image (push) Successful in 3m27s
Signed-off-by: Cliff Hill <xlorep@darkhelm.org>
64 lines
2.0 KiB
TypeScript
64 lines
2.0 KiB
TypeScript
/**
|
|
* End-to-end tests using Playwright
|
|
*/
|
|
|
|
import { test, expect } from '@playwright/test'
|
|
|
|
// Helper function for network-resilient page navigation
|
|
async function navigateWithRetry(page: any, url: string, maxRetries = 3): Promise<void> {
|
|
for (let i = 0; i < maxRetries; i++) {
|
|
try {
|
|
await page.goto(url, {
|
|
waitUntil: 'networkidle',
|
|
timeout: process.env.CI ? 45000 : 30000
|
|
})
|
|
return // Success
|
|
} catch (error) {
|
|
if (i === maxRetries - 1) throw error // Last attempt failed
|
|
console.log(`Navigation attempt ${i + 1} failed, retrying...`)
|
|
await page.waitForTimeout(2000) // Wait before retry
|
|
}
|
|
}
|
|
}
|
|
|
|
test.describe('Plex Playlist App', () => {
|
|
test('should display app title', async ({ page }) => {
|
|
await navigateWithRetry(page, '/')
|
|
|
|
// Wait for the app to fully load with network resilience
|
|
await page.waitForSelector('h1', { timeout: 15000 })
|
|
await expect(page.locator('h1')).toContainText('Plex Playlist')
|
|
})
|
|
|
|
test('should have welcome message', async ({ page }) => {
|
|
await navigateWithRetry(page, '/')
|
|
|
|
// Wait for the welcome message to appear with network resilience
|
|
await page.waitForSelector('p', { timeout: 15000 })
|
|
await expect(page.locator('p')).toContainText('Welcome to the Plex Playlist Manager')
|
|
})
|
|
|
|
test('should load without errors', async ({ page }) => {
|
|
const errors: string[] = []
|
|
page.on('console', (msg) => {
|
|
if (msg.type() === 'error') {
|
|
// Filter out network-related errors that are acceptable in CI
|
|
const errorText = msg.text()
|
|
if (!errorText.includes('net::') && !errorText.includes('Failed to fetch')) {
|
|
errors.push(errorText)
|
|
}
|
|
}
|
|
})
|
|
|
|
await navigateWithRetry(page, '/')
|
|
|
|
// Wait for app to fully load with extra time for network instability
|
|
await page.waitForLoadState('networkidle')
|
|
|
|
// Give extra time for any async operations in unstable networks
|
|
await page.waitForTimeout(process.env.CI ? 3000 : 1000)
|
|
|
|
expect(errors).toHaveLength(0)
|
|
})
|
|
})
|