{"version":3,"sources":["../../src/test/mock-fetch.ts"],"sourcesContent":["import { fail } from 'node:assert';\nimport { vi } from 'vitest';\n\nexport function mockFetchTextStream({\n url,\n chunks,\n}: {\n url: string;\n chunks: string[];\n}) {\n vi.spyOn(global, 'fetch').mockImplementation(async () => {\n function* generateChunks() {\n for (const chunk of chunks) {\n yield new TextEncoder().encode(chunk);\n }\n }\n\n const chunkGenerator = generateChunks();\n\n return {\n url,\n ok: true,\n status: 200,\n bodyUsed: false,\n headers: new Map() as any as Headers,\n body: {\n getReader() {\n return {\n read() {\n return Promise.resolve(chunkGenerator.next());\n },\n releaseLock() {},\n cancel() {},\n };\n },\n },\n } as unknown as Response;\n });\n}\n\nexport function mockFetchDataStream({\n url,\n chunks,\n maxCalls,\n}: {\n url: string;\n chunks: string[];\n maxCalls?: number;\n}) {\n async function* generateChunks() {\n const encoder = new TextEncoder();\n for (const chunk of chunks) {\n yield encoder.encode(chunk);\n }\n }\n\n return mockFetchDataStreamWithGenerator({\n url,\n chunkGenerator: generateChunks(),\n maxCalls,\n });\n}\n\nexport function mockFetchDataStreamWithGenerator({\n url,\n chunkGenerator,\n maxCalls,\n}: {\n url: string;\n chunkGenerator: AsyncGenerator;\n maxCalls?: number;\n}) {\n let requestBodyResolve: ((value?: unknown) => void) | undefined;\n const requestBodyPromise = new Promise(resolve => {\n requestBodyResolve = resolve;\n });\n\n let callCount = 0;\n\n vi.spyOn(global, 'fetch').mockImplementation(async (url, init) => {\n if (maxCalls !== undefined && ++callCount >= maxCalls) {\n throw new Error('Too many calls');\n }\n\n requestBodyResolve?.(init!.body as string);\n\n return {\n url,\n ok: true,\n status: 200,\n bodyUsed: false,\n body: new ReadableStream({\n async start(controller) {\n for await (const chunk of chunkGenerator) {\n controller.enqueue(chunk);\n }\n controller.close();\n },\n }),\n } as Response;\n });\n\n return {\n requestBody: requestBodyPromise,\n };\n}\n\nexport function mockFetchError({\n statusCode,\n errorMessage,\n}: {\n statusCode: number;\n errorMessage: string;\n}) {\n vi.spyOn(global, 'fetch').mockImplementation(async () => {\n return {\n url: 'https://example.com/api/chat',\n ok: false,\n status: statusCode,\n bodyUsed: false,\n body: {\n getReader() {\n return {\n read() {\n return Promise.resolve(errorMessage);\n },\n releaseLock() {},\n cancel() {},\n };\n },\n },\n text: () => Promise.resolve(errorMessage),\n } as unknown as Response;\n });\n}\n"],"mappings":";AACA,SAAS,UAAU;AAEZ,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAGG;AACD,KAAG,MAAM,QAAQ,OAAO,EAAE,mBAAmB,YAAY;AACvD,cAAU,iBAAiB;AACzB,iBAAW,SAAS,QAAQ;AAC1B,cAAM,IAAI,YAAY,EAAE,OAAO,KAAK;AAAA,MACtC;AAAA,IACF;AAEA,UAAM,iBAAiB,eAAe;AAEtC,WAAO;AAAA,MACL;AAAA,MACA,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS,oBAAI,IAAI;AAAA,MACjB,MAAM;AAAA,QACJ,YAAY;AACV,iBAAO;AAAA,YACL,OAAO;AACL,qBAAO,QAAQ,QAAQ,eAAe,KAAK,CAAC;AAAA,YAC9C;AAAA,YACA,cAAc;AAAA,YAAC;AAAA,YACf,SAAS;AAAA,YAAC;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,kBAAgB,iBAAiB;AAC/B,UAAM,UAAU,IAAI,YAAY;AAChC,eAAW,SAAS,QAAQ;AAC1B,YAAM,QAAQ,OAAO,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO,iCAAiC;AAAA,IACtC;AAAA,IACA,gBAAgB,eAAe;AAAA,IAC/B;AAAA,EACF,CAAC;AACH;AAEO,SAAS,iCAAiC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,MAAI;AACJ,QAAM,qBAAqB,IAAI,QAAQ,aAAW;AAChD,yBAAqB;AAAA,EACvB,CAAC;AAED,MAAI,YAAY;AAEhB,KAAG,MAAM,QAAQ,OAAO,EAAE,mBAAmB,OAAOA,MAAK,SAAS;AAChE,QAAI,aAAa,UAAa,EAAE,aAAa,UAAU;AACrD,YAAM,IAAI,MAAM,gBAAgB;AAAA,IAClC;AAEA,6DAAqB,KAAM;AAE3B,WAAO;AAAA,MACL,KAAAA;AAAA,MACA,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM,IAAI,eAAe;AAAA,QACvB,MAAM,MAAM,YAAY;AACtB,2BAAiB,SAAS,gBAAgB;AACxC,uBAAW,QAAQ,KAAK;AAAA,UAC1B;AACA,qBAAW,MAAM;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,aAAa;AAAA,EACf;AACF;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AACF,GAGG;AACD,KAAG,MAAM,QAAQ,OAAO,EAAE,mBAAmB,YAAY;AACvD,WAAO;AAAA,MACL,KAAK;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,QACJ,YAAY;AACV,iBAAO;AAAA,YACL,OAAO;AACL,qBAAO,QAAQ,QAAQ,YAAY;AAAA,YACrC;AAAA,YACA,cAAc;AAAA,YAAC;AAAA,YACf,SAAS;AAAA,YAAC;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,MAAM,QAAQ,QAAQ,YAAY;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;","names":["url"]}