mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2026-08-11 05:13:18 +00:00
CI (https://github.com/paperless-ngx/paperless-ngx/actions/runs/29777331059) failed every e2e test that reloads the document list, with the browser throwing "TypeError: Failed to fetch". Root cause: the e2e harness only starts the Angular dev server (no real backend), and relies entirely on page.routeFromHAR(..., { notFound: 'fallback' }) to mock API responses, falling through to the real network for anything not in a recorded HAR. The new GET /api/documents/filter_selection_data/ request added by this branch fires on every non-search reload() and isn't in any pre-recorded HAR fixture, so it fell through to a real network call with nothing listening on the other end. Added a shared mockFilterSelectionData() helper that stubs an empty response for that endpoint, registered via test.beforeEach() before each affected test's own routeFromHAR() call in every spec file that exercises document-list reload (document-list, dashboard, global-permissions, settings, document-detail). Playwright resolves routes in reverse-registration order, so the later-registered HAR route checks first, calls route.fallback() on a miss, and defers back to this earlier-registered stub instead of hitting the network. Not verified locally (Playwright browser binaries aren't installed in this environment and the user preferred not to install them); relying on CI to confirm. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
69 lines
2.6 KiB
TypeScript
69 lines
2.6 KiB
TypeScript
import { expect, test } from '@playwright/test'
|
|
import path from 'node:path'
|
|
import { mockFilterSelectionData } from '../mock-filter-selection-data'
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
await mockFilterSelectionData(page)
|
|
})
|
|
|
|
const REQUESTS_HAR1 = path.join(__dirname, 'requests/api-dashboard1.har')
|
|
const REQUESTS_HAR2 = path.join(__dirname, 'requests/api-dashboard2.har')
|
|
const REQUESTS_HAR3 = path.join(__dirname, 'requests/api-dashboard3.har')
|
|
const REQUESTS_HAR4 = path.join(__dirname, 'requests/api-dashboard4.har')
|
|
|
|
test('dashboard inbox link', async ({ page }) => {
|
|
await page.routeFromHAR(REQUESTS_HAR1, { notFound: 'fallback' })
|
|
await page.goto('/dashboard')
|
|
await page.getByRole('link', { name: 'Documents in inbox' }).click()
|
|
await expect(page).toHaveURL(/tags__id__in=9/)
|
|
await expect(page.locator('pngx-document-list')).toHaveText(/8 documents/)
|
|
})
|
|
|
|
test('dashboard total documents link', async ({ page }) => {
|
|
await page.routeFromHAR(REQUESTS_HAR2, { notFound: 'fallback' })
|
|
await page.goto('/dashboard')
|
|
await page.getByRole('link').filter({ hasText: 'Total documents' }).click()
|
|
await expect(page).toHaveURL(/documents/)
|
|
await expect(page.locator('pngx-document-list')).toHaveText(/61 documents/)
|
|
await page.getByRole('button', { name: 'Reset filters' })
|
|
})
|
|
|
|
test('dashboard saved view show all', async ({ page }) => {
|
|
await page.routeFromHAR(REQUESTS_HAR3, { notFound: 'fallback' })
|
|
await page.goto('/dashboard')
|
|
await page
|
|
.locator('pngx-widget-frame')
|
|
.filter({ hasText: 'Inbox' })
|
|
.getByRole('link', { name: 'Show all' })
|
|
.first()
|
|
.click()
|
|
await expect(page).toHaveURL(/view\/7/)
|
|
await expect(page.locator('pngx-document-list')).toHaveText(/8 documents/)
|
|
})
|
|
|
|
test('dashboard saved view document links', async ({ page }) => {
|
|
await page.routeFromHAR(REQUESTS_HAR4, { notFound: 'fallback' })
|
|
await page.goto('/dashboard')
|
|
await page
|
|
.locator('pngx-widget-frame')
|
|
.filter({ hasText: 'Inbox' })
|
|
.locator('table')
|
|
.getByRole('link', { name: /test/ })
|
|
.first()
|
|
.click({ position: { x: 0, y: 0 } })
|
|
await expect(page).toHaveURL(/documents\/310\/details/)
|
|
})
|
|
|
|
test('test slim sidebar', async ({ page }) => {
|
|
await page.routeFromHAR(REQUESTS_HAR1, { notFound: 'fallback' })
|
|
await page.goto('/dashboard')
|
|
await page.locator('.sidebar-slim-toggler').click()
|
|
await expect(
|
|
page.getByRole('link', { name: 'Dashboard' }).getByText('Dashboard')
|
|
).toBeHidden()
|
|
await page.locator('.sidebar-slim-toggler').click()
|
|
await expect(
|
|
page.getByRole('link', { name: 'Dashboard' }).getByText('Dashboard')
|
|
).toBeVisible()
|
|
})
|