/** * Outils partagés par les scénarios Playwright. */ /** * Intercepte une réponse JSON de l'API et la modifie avant de la rendre à la page. * * Pourquoi ce helper plutôt que `route.fetch()` en ligne : si la page navigue * pendant que l'interception est en cours, Playwright libère l'objet réponse et * `res.json()` lève « Response has been disposed ». Le test échouait alors une * fois sur trois, sans rapport avec ce qu'il vérifiait — et un test instable * finit par être ignoré, ce qui est pire qu'un test absent. * * On sérialise donc le corps immédiatement, et on abandonne proprement * l'interception si la requête a été annulée entre-temps. * * @param {import('@playwright/test').Page} page * @param {string} pattern motif d'URL Playwright * @param {(body: any) => any} mutate reçoit le corps parsé ; le modifie en place ou en renvoie un nouveau * @param {(route: import('@playwright/test').Route) => boolean} [when] * n'intercepte que si vrai (ex. limiter au GET et laisser passer le PATCH) */ export async function patchJson(page, pattern, mutate, when) { await page.route(pattern, async (route) => { if (when && !when(route)) { await route.continue().catch(() => {}); return; } let payload; try { const response = await route.fetch(); const body = await response.json(); payload = JSON.stringify(mutate(body) ?? body); } catch { // Requête annulée (navigation) : on laisse Playwright suivre son cours. await route.continue().catch(() => {}); return; } await route .fulfill({ status: 200, contentType: "application/json; charset=utf-8", body: payload }) .catch(() => {}); }); }