diff options
author | 2025-02-05 16:05:26 +0000 | |
---|---|---|
committer | 2025-02-05 16:05:26 +0000 | |
commit | 43a37c1956d415c54bb5847e3b29927e16bef1e3 (patch) | |
tree | 67c7b4b086c1d41e5a09c1c64dab3aa01e541310 /packages/integrations/node/test/test-utils.js | |
parent | 817fe553899d0a8a0e4ff27c8d062bf1e24ca566 (diff) | |
parent | 0f3e23b50afe3f6f82caaf3e964c451280aa0688 (diff) | |
download | astro-43a37c1956d415c54bb5847e3b29927e16bef1e3.tar.gz astro-43a37c1956d415c54bb5847e3b29927e16bef1e3.tar.zst astro-43a37c1956d415c54bb5847e3b29927e16bef1e3.zip |
Merge branch 'main' of ../../temp/adapters into move-node
Diffstat (limited to 'packages/integrations/node/test/test-utils.js')
-rw-r--r-- | packages/integrations/node/test/test-utils.js | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/packages/integrations/node/test/test-utils.js b/packages/integrations/node/test/test-utils.js new file mode 100644 index 000000000..37389d6d7 --- /dev/null +++ b/packages/integrations/node/test/test-utils.js @@ -0,0 +1,82 @@ +import { EventEmitter } from 'node:events'; +import { loadFixture as baseLoadFixture } from '@astrojs/test-utils'; +import httpMocks from 'node-mocks-http'; + +process.env.ASTRO_NODE_AUTOSTART = 'disabled'; +process.env.ASTRO_NODE_LOGGING = 'disabled'; +/** + * @typedef {import('../../../astro/test/test-utils').Fixture} Fixture + */ + +export function loadFixture(inlineConfig) { + if (!inlineConfig?.root) throw new Error("Must provide { root: './fixtures/...' }"); + + // resolve the relative root (i.e. "./fixtures/tailwindcss") to a full filepath + // without this, the main `loadFixture` helper will resolve relative to `packages/astro/test` + return baseLoadFixture({ + ...inlineConfig, + root: new URL(inlineConfig.root, import.meta.url).toString(), + }); +} + +export function createRequestAndResponse(reqOptions) { + const req = httpMocks.createRequest(reqOptions); + + const res = httpMocks.createResponse({ + eventEmitter: EventEmitter, + req, + }); + + const done = toPromise(res); + + // Get the response as text + const text = async () => { + const chunks = await done; + return buffersToString(chunks); + }; + + return { req, res, done, text }; +} + +export function toPromise(res) { + return new Promise((resolve) => { + // node-mocks-http doesn't correctly handle non-Buffer typed arrays, + // so override the write method to fix it. + const write = res.write; + res.write = function (data, encoding) { + if (ArrayBuffer.isView(data) && !Buffer.isBuffer(data)) { + // biome-ignore lint/style/noParameterAssign: <explanation> + data = Buffer.from(data.buffer); + } + return write.call(this, data, encoding); + }; + res.on('end', () => { + const chunks = res._getChunks(); + resolve(chunks); + }); + }); +} + +export function buffersToString(buffers) { + const decoder = new TextDecoder(); + let str = ''; + for (const buffer of buffers) { + str += decoder.decode(buffer); + } + return str; +} + +export function waitServerListen(server) { + return new Promise((resolve, reject) => { + function onListen() { + server.off('error', onError); + resolve(); + } + function onError(error) { + server.off('listening', onListen); + reject(error); + } + server.once('listening', onListen); + server.once('error', onError); + }); +} |