UNPKG

playwright-api-mock

Version:

An automated API response snapshot tool for Playwright. This plugin records API network requests during test runs and reuses them as mocks for fast, reliable, and deterministic tests.

2 lines (1 loc) 1.49 kB
import*as h from"node:fs";import{dirname as d}from"node:path";class r{path;getStoredHeaders;snapshots;constructor(t){if(this.path=t.apiSnapshotsPath,this.getStoredHeaders=t.getStoredHeaders,h.existsSync(this.path))this.snapshots=JSON.parse(h.readFileSync(this.path,"utf-8"));else h.mkdirSync(d(this.path),{recursive:!0}),this.snapshots={}}getStoredSnapshot(t){return this.snapshots[t]}async storeResponse(t,s){let n=await s.json();this.snapshots[t]={status:s.status(),headers:this.getStoredHeaders?.(s.headers()),body:n},h.writeFileSync(this.path,JSON.stringify(this.snapshots,null,2))}}var S=(t)=>t instanceof Error?t:new Error(`${t}`);var e={urlMatch:"**/*",apiSnapshotsPath:"api_snapshots.json",logLevel:"info",mock:!0};class o{page;store;config;constructor(t,s){this.page=t,this.config={...e,...s},this.store=new r(this.config)}log(t){if(this.config.logLevel==="silent")return;if(t instanceof Error)console.error(t);else if(this.config.logLevel==="info")console.info(t)}async record(t){if(t)return await new o(this.page,{...this.config,...t}).record();await this.page.route(this.config.urlMatch,async(s)=>{let a=s.request().url(),i=this.config.mock?this.store.getStoredSnapshot(a):void 0;if(i)return this.log(`[Mocked] ${a}`),await s.fulfill({status:i.status,headers:i.headers,body:JSON.stringify(i.body)});try{let p=await s.fetch();await this.store.storeResponse(a,p),this.log(`[Recorded] ${a}`)}catch(p){this.log(S(p))}finally{await s.continue()}})}}var x=o;export{x as ApiMockPlugin};