const { test, expect } = require('@playwright/test'); test('search index tab shows source coverage and runs bounded repair actions', async ({ page }) => { const actions = []; await page.route('**/api/**', async route => { const req = route.request(), url = new URL(req.url()); let body = { ok: true }; if (url.pathname === '/api/admin/me') body = { enabled: true, admin: true }; else if (url.pathname === '/api/admin/index/health') body = { ok: true, total: 100, urlCount: 90, detailCount: 40, thumbnailCount: 75, urlCoverage: .9, detailCoverage: .4, thumbnailCoverage: .75, sources: [{ source: 'deep', videos: 70, discoveries: 300, lastSeen: 1791900000000 }], lastRun: { status: 'complete', createdAt: 1791900000000, progress: { queriesDone: 20, newVideos: 400 } }, backfill: [{ source: 'media_cache', cursor: 10, ceiling: 20, done: false }] }; else if (url.pathname === '/api/admin/index/backfill' && req.method() === 'POST') { actions.push('backfill'); body.processed = 3; } else if (url.pathname === '/api/admin/index/cleanup' && req.method() === 'POST') { actions.push('cleanup'); body.removed = 2; } else if (url.pathname === '/api/admin/media') body.media = []; else if (url.pathname === '/api/uploads') body.uploads = []; else if (url.pathname === '/api/admin/flags') body.flags = []; await route.fulfill({ contentType: 'application/json', body: JSON.stringify(body) }); }); await page.goto('/admin.html#index'); await expect(page.locator('#indexMetrics')).toContainText('90%'); await expect(page.locator('#indexSources')).toContainText('deep'); await page.locator('#indexBackfill').click(); await expect(page.locator('#indexStatus')).toContainText('Processed 3'); page.once('dialog', dialog => dialog.accept()); await page.locator('#indexCleanup').click(); await expect(page.locator('#indexStatus')).toContainText('Removed 2'); expect(actions).toEqual(['backfill', 'cleanup']); });