summaryrefslogtreecommitdiff
path: root/packages/integrations/node/test
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/node/test')
-rw-r--r--packages/integrations/node/test/api-route.test.js153
-rw-r--r--packages/integrations/node/test/assets.test.js44
-rw-r--r--packages/integrations/node/test/bad-urls.test.js49
-rw-r--r--packages/integrations/node/test/encoded.test.js45
-rw-r--r--packages/integrations/node/test/errors.test.js91
-rw-r--r--packages/integrations/node/test/fixtures/api-route/package.json9
-rw-r--r--packages/integrations/node/test/fixtures/api-route/src/pages/astro-redirect.astro3
-rw-r--r--packages/integrations/node/test/fixtures/api-route/src/pages/binary.ts11
-rw-r--r--packages/integrations/node/test/fixtures/api-route/src/pages/hash.ts16
-rw-r--r--packages/integrations/node/test/fixtures/api-route/src/pages/recipes.js24
-rw-r--r--packages/integrations/node/test/fixtures/api-route/src/pages/redirect.ts5
-rw-r--r--packages/integrations/node/test/fixtures/api-route/src/pages/response-redirect.ts5
-rw-r--r--packages/integrations/node/test/fixtures/api-route/src/pages/streaming.ts22
-rw-r--r--packages/integrations/node/test/fixtures/bad-urls/package.json9
-rw-r--r--packages/integrations/node/test/fixtures/bad-urls/src/pages/index.astro1
-rw-r--r--packages/integrations/node/test/fixtures/encoded/package.json9
-rw-r--r--packages/integrations/node/test/fixtures/encoded/src/pages/blog/什么.md1
-rw-r--r--packages/integrations/node/test/fixtures/encoded/src/pages/什么.astro1
-rw-r--r--packages/integrations/node/test/fixtures/errors/package.json9
-rw-r--r--packages/integrations/node/test/fixtures/errors/src/pages/generator.astro11
-rw-r--r--packages/integrations/node/test/fixtures/errors/src/pages/in-stream.astro13
-rw-r--r--packages/integrations/node/test/fixtures/errors/src/pages/offshoot-promise-rejection.astro2
-rw-r--r--packages/integrations/node/test/fixtures/headers/package.json9
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-cookies-multi.astro5
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-cookies-single.astro4
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-response-cookie-multi.astro7
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-response-cookie-single.astro5
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/astro/component-response-cookies-multi.astro5
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/astro/component-response-cookies-single.astro4
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-cookies-multi.ts9
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-cookies-single.ts8
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-response-cookie-multi.ts11
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-response-cookie-single.ts9
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/endpoints/kitchen-sink.ts11
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-cookies-multi.ts7
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-cookies-single.ts6
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-empty-headers-object.ts4
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-undefined-headers-object.ts3
-rw-r--r--packages/integrations/node/test/fixtures/headers/src/pages/endpoints/simple.ts6
-rw-r--r--packages/integrations/node/test/fixtures/image/package.json13
-rw-r--r--packages/integrations/node/test/fixtures/image/src/assets/file.txt1
-rw-r--r--packages/integrations/node/test/fixtures/image/src/assets/some_penguin.pngbin285628 -> 0 bytes
-rw-r--r--packages/integrations/node/test/fixtures/image/src/pages/index.astro6
-rw-r--r--packages/integrations/node/test/fixtures/image/src/pages/text-file.astro14
-rw-r--r--packages/integrations/node/test/fixtures/locals/package.json9
-rw-r--r--packages/integrations/node/test/fixtures/locals/src/middleware.ts6
-rw-r--r--packages/integrations/node/test/fixtures/locals/src/pages/api.js10
-rw-r--r--packages/integrations/node/test/fixtures/locals/src/pages/from-astro-middleware.astro4
-rw-r--r--packages/integrations/node/test/fixtures/locals/src/pages/from-node-middleware.astro4
-rw-r--r--packages/integrations/node/test/fixtures/node-middleware/package.json9
-rw-r--r--packages/integrations/node/test/fixtures/node-middleware/src/pages/404.astro13
-rw-r--r--packages/integrations/node/test/fixtures/node-middleware/src/pages/index.astro11
-rw-r--r--packages/integrations/node/test/fixtures/node-middleware/src/pages/ssr.ts7
-rw-r--r--packages/integrations/node/test/fixtures/prerender-404-500/package.json10
-rw-r--r--packages/integrations/node/test/fixtures/prerender-404-500/src/external-stylesheet.css3
-rw-r--r--packages/integrations/node/test/fixtures/prerender-404-500/src/nondeterminism-404.ts17
-rw-r--r--packages/integrations/node/test/fixtures/prerender-404-500/src/nondeterminism-500.ts17
-rw-r--r--packages/integrations/node/test/fixtures/prerender-404-500/src/pages/404.astro5
-rw-r--r--packages/integrations/node/test/fixtures/prerender-404-500/src/pages/500.astro6
-rw-r--r--packages/integrations/node/test/fixtures/prerender-404-500/src/pages/fivehundred.astro4
-rw-r--r--packages/integrations/node/test/fixtures/prerender-404-500/src/pages/static.astro12
-rw-r--r--packages/integrations/node/test/fixtures/prerender/package.json9
-rw-r--r--packages/integrations/node/test/fixtures/prerender/src/middleware.ts7
-rw-r--r--packages/integrations/node/test/fixtures/prerender/src/pages/one.astro10
-rw-r--r--packages/integrations/node/test/fixtures/prerender/src/pages/third.astro15
-rw-r--r--packages/integrations/node/test/fixtures/prerender/src/pages/two.astro11
-rw-r--r--packages/integrations/node/test/fixtures/prerender/src/shared.ts1
-rw-r--r--packages/integrations/node/test/fixtures/preview-headers/package.json9
-rw-r--r--packages/integrations/node/test/fixtures/preview-headers/src/pages/index.astro1
-rw-r--r--packages/integrations/node/test/fixtures/trailing-slash/astro.config.mjs8
-rw-r--r--packages/integrations/node/test/fixtures/trailing-slash/package.json9
-rw-r--r--packages/integrations/node/test/fixtures/trailing-slash/public/one.css1
-rw-r--r--packages/integrations/node/test/fixtures/trailing-slash/src/pages/index.astro8
-rw-r--r--packages/integrations/node/test/fixtures/trailing-slash/src/pages/one.astro11
-rw-r--r--packages/integrations/node/test/fixtures/url/package.json9
-rw-r--r--packages/integrations/node/test/fixtures/url/src/pages/index.astro9
-rw-r--r--packages/integrations/node/test/fixtures/well-known-locations/package.json9
-rw-r--r--packages/integrations/node/test/fixtures/well-known-locations/public/.hidden/file.json1
-rw-r--r--packages/integrations/node/test/fixtures/well-known-locations/public/.well-known/apple-app-site-association3
-rw-r--r--packages/integrations/node/test/headers.test.js148
-rw-r--r--packages/integrations/node/test/image.test.js36
-rw-r--r--packages/integrations/node/test/locals.test.js81
-rw-r--r--packages/integrations/node/test/node-middleware.test.js88
-rw-r--r--packages/integrations/node/test/prerender-404-500.test.js300
-rw-r--r--packages/integrations/node/test/prerender.test.js438
-rw-r--r--packages/integrations/node/test/preview-headers.test.js38
-rw-r--r--packages/integrations/node/test/server-host.test.js21
-rw-r--r--packages/integrations/node/test/test-utils.js81
-rw-r--r--packages/integrations/node/test/trailing-slash.test.js452
-rw-r--r--packages/integrations/node/test/url.test.js115
-rw-r--r--packages/integrations/node/test/well-known-locations.test.js46
91 files changed, 0 insertions, 2802 deletions
diff --git a/packages/integrations/node/test/api-route.test.js b/packages/integrations/node/test/api-route.test.js
deleted file mode 100644
index 9743ce42d..000000000
--- a/packages/integrations/node/test/api-route.test.js
+++ /dev/null
@@ -1,153 +0,0 @@
-import * as assert from 'node:assert/strict';
-import crypto from 'node:crypto';
-import { after, before, describe, it } from 'node:test';
-import nodejs from '../dist/index.js';
-import { createRequestAndResponse, loadFixture } from './test-utils.js';
-
-describe('API routes', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
- /** @type {import('../../../astro/src/types/public/preview.js').PreviewServer} */
- let previewServer;
- /** @type {URL} */
- let baseUri;
-
- before(async () => {
- fixture = await loadFixture({
- root: './fixtures/api-route/',
- output: 'server',
- adapter: nodejs({ mode: 'middleware' }),
- });
- await fixture.build();
- previewServer = await fixture.preview();
- baseUri = new URL(`http://${previewServer.host ?? 'localhost'}:${previewServer.port}/`);
- });
-
- after(() => previewServer.stop());
-
- it('Can get the request body', async () => {
- const { handler } = await import('./fixtures/api-route/dist/server/entry.mjs');
- let { req, res, done } = createRequestAndResponse({
- method: 'POST',
- url: '/recipes',
- });
-
- req.once('async_iterator', () => {
- req.send(JSON.stringify({ id: 2 }));
- });
-
- handler(req, res);
-
- let [buffer] = await done;
-
- let json = JSON.parse(buffer.toString('utf-8'));
-
- assert.equal(json.length, 1);
-
- assert.equal(json[0].name, 'Broccoli Soup');
- });
-
- it('Can get binary data', async () => {
- const { handler } = await import('./fixtures/api-route/dist/server/entry.mjs');
-
- let { req, res, done } = createRequestAndResponse({
- method: 'POST',
- url: '/binary',
- });
-
- req.once('async_iterator', () => {
- req.send(Buffer.from(new Uint8Array([1, 2, 3, 4, 5])));
- });
-
- handler(req, res);
-
- let [out] = await done;
- let arr = Array.from(new Uint8Array(out.buffer));
- assert.deepEqual(arr, [5, 4, 3, 2, 1]);
- });
-
- it('Can post large binary data', async () => {
- const { handler } = await import('./fixtures/api-route/dist/server/entry.mjs');
-
- let { req, res, done } = createRequestAndResponse({
- method: 'POST',
- url: '/hash',
- });
-
- handler(req, res);
-
- let expectedDigest = null;
- req.once('async_iterator', () => {
- // Send 256MB of garbage data in 256KB chunks. This should be fast (< 1sec).
- let remainingBytes = 256 * 1024 * 1024;
- const chunkSize = 256 * 1024;
-
- const hash = crypto.createHash('sha256');
- while (remainingBytes > 0) {
- const size = Math.min(remainingBytes, chunkSize);
- const chunk = Buffer.alloc(size, Math.floor(Math.random() * 256));
- hash.update(chunk);
- req.emit('data', chunk);
- remainingBytes -= size;
- }
-
- req.emit('end');
- expectedDigest = hash.digest();
- });
-
- let [out] = await done;
- assert.deepEqual(new Uint8Array(out.buffer), new Uint8Array(expectedDigest));
- });
-
- it('Can bail on streaming', async () => {
- const { handler } = await import('./fixtures/api-route/dist/server/entry.mjs');
- let { req, res, done } = createRequestAndResponse({
- url: '/streaming',
- });
-
- let locals = { cancelledByTheServer: false };
-
- handler(req, res, () => {}, locals);
- req.send();
-
- await new Promise((resolve) => setTimeout(resolve, 500));
- res.emit('close');
-
- await done;
-
- assert.deepEqual(locals, { cancelledByTheServer: true });
- });
-
- it('Can respond with SSR redirect', async () => {
- const controller = new AbortController();
- setTimeout(() => controller.abort(), 1000);
- const response = await fetch(new URL('/redirect', baseUri), {
- redirect: 'manual',
- signal: controller.signal,
- });
- assert.equal(response.status, 302);
- assert.equal(response.headers.get('location'), '/destination');
- });
-
- it('Can respond with Astro.redirect', async () => {
- const controller = new AbortController();
- setTimeout(() => controller.abort(), 1000);
- const response = await fetch(new URL('/astro-redirect', baseUri), {
- redirect: 'manual',
- signal: controller.signal,
- });
- assert.equal(response.status, 303);
- assert.equal(response.headers.get('location'), '/destination');
- });
-
- it('Can respond with Response.redirect', async () => {
- const controller = new AbortController();
- setTimeout(() => controller.abort(), 1000);
- const response = await fetch(new URL('/response-redirect', baseUri), {
- redirect: 'manual',
- signal: controller.signal,
- });
- assert.equal(response.status, 307);
- assert.equal(response.headers.get('location'), String(new URL('/destination', baseUri)));
- });
-});
diff --git a/packages/integrations/node/test/assets.test.js b/packages/integrations/node/test/assets.test.js
deleted file mode 100644
index 0b71f94cd..000000000
--- a/packages/integrations/node/test/assets.test.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { after, before, describe, it } from 'node:test';
-import * as cheerio from 'cheerio';
-import nodejs from '../dist/index.js';
-import { loadFixture } from './test-utils.js';
-
-describe('Assets', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
- let devPreview;
-
- before(async () => {
- fixture = await loadFixture({
- root: './fixtures/image/',
- output: 'server',
- adapter: nodejs({ mode: 'standalone' }),
- vite: {
- build: {
- assetsInlineLimit: 0,
- },
- },
- });
- await fixture.build();
- devPreview = await fixture.preview();
- });
-
- after(async () => {
- await devPreview.stop();
- });
-
- it('Assets within the _astro folder should be given immutable headers', async () => {
- let response = await fixture.fetch('/text-file');
- let cacheControl = response.headers.get('cache-control');
- assert.equal(cacheControl, null);
- const html = await response.text();
- const $ = cheerio.load(html);
-
- // Fetch the asset
- const fileURL = $('a').attr('href');
- response = await fixture.fetch(fileURL);
- cacheControl = response.headers.get('cache-control');
- assert.equal(cacheControl, 'public, max-age=31536000, immutable');
- });
-});
diff --git a/packages/integrations/node/test/bad-urls.test.js b/packages/integrations/node/test/bad-urls.test.js
deleted file mode 100644
index 9323516e8..000000000
--- a/packages/integrations/node/test/bad-urls.test.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { after, before, describe, it } from 'node:test';
-import nodejs from '../dist/index.js';
-import { loadFixture } from './test-utils.js';
-
-describe('Bad URLs', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
- let devPreview;
-
- before(async () => {
- fixture = await loadFixture({
- root: './fixtures/bad-urls/',
- output: 'server',
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- devPreview = await fixture.preview();
- });
-
- after(async () => {
- await devPreview.stop();
- });
-
- it('Does not crash on bad urls', async () => {
- const weirdURLs = [
- '/\\xfs.bxss.me%3Fastrojs.com/hello-world',
- '/asdasdasd@ax_zX=.zxczas🐥%/úadasd000%/',
- '%',
- '%80',
- '%c',
- '%c0%80',
- '%20foobar%',
- ];
-
- const statusCodes = [400, 404, 500];
- for (const weirdUrl of weirdURLs) {
- const fetchResult = await fixture.fetch(weirdUrl);
- assert.equal(
- statusCodes.includes(fetchResult.status),
- true,
- `${weirdUrl} returned something else than 400, 404, or 500`,
- );
- }
- const stillWork = await fixture.fetch('/');
- const text = await stillWork.text();
- assert.equal(text, '<!DOCTYPE html>Hello!');
- });
-});
diff --git a/packages/integrations/node/test/encoded.test.js b/packages/integrations/node/test/encoded.test.js
deleted file mode 100644
index edc6ae78b..000000000
--- a/packages/integrations/node/test/encoded.test.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { before, describe, it } from 'node:test';
-import nodejs from '../dist/index.js';
-import { createRequestAndResponse, loadFixture } from './test-utils.js';
-
-describe('Encoded Pathname', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
-
- before(async () => {
- fixture = await loadFixture({
- root: './fixtures/encoded/',
- output: 'server',
- adapter: nodejs({ mode: 'middleware' }),
- });
- await fixture.build();
- });
-
- it('Can get an Astro file', async () => {
- const { handler } = await import('./fixtures/encoded/dist/server/entry.mjs');
- let { req, res, text } = createRequestAndResponse({
- url: '/什么',
- });
-
- handler(req, res);
- req.send();
-
- const html = await text();
- assert.equal(html.includes('什么</h1>'), true);
- });
-
- it('Can get a Markdown file', async () => {
- const { handler } = await import('./fixtures/encoded/dist/server/entry.mjs');
-
- let { req, res, text } = createRequestAndResponse({
- url: '/blog/什么',
- });
-
- handler(req, res);
- req.send();
-
- const html = await text();
- assert.equal(html.includes('什么</h1>'), true);
- });
-});
diff --git a/packages/integrations/node/test/errors.test.js b/packages/integrations/node/test/errors.test.js
deleted file mode 100644
index 802fa6e25..000000000
--- a/packages/integrations/node/test/errors.test.js
+++ /dev/null
@@ -1,91 +0,0 @@
-import assert from 'node:assert/strict';
-import { after, before, describe, it } from 'node:test';
-import { fileURLToPath } from 'node:url';
-import { Worker } from 'node:worker_threads';
-import * as cheerio from 'cheerio';
-import nodejs from '../dist/index.js';
-import { loadFixture } from './test-utils.js';
-
-describe('Errors', () => {
- /** @type {import('./test-utils.js').Fixture} */
- let fixture;
-
- before(async () => {
- fixture = await loadFixture({
- root: './fixtures/errors/',
- output: 'server',
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- });
- let devPreview;
-
- before(async () => {
- // The two tests that need the server to run are skipped
- // devPreview = await fixture.preview();
- });
- after(async () => {
- await devPreview?.stop();
- });
-
- it('stays alive after offshoot promise rejections', async () => {
- // this test needs to happen in a worker because node test runner adds a listener for unhandled rejections in the main thread
- const url = new URL('./fixtures/errors/dist/server/entry.mjs', import.meta.url);
- const worker = new Worker(fileURLToPath(url), {
- type: 'module',
- env: { ASTRO_NODE_LOGGING: 'enabled' },
- });
-
- await new Promise((resolve, reject) => {
- worker.stdout.on('data', (data) => {
- setTimeout(() => reject('Server took too long to start'), 1000);
- if (data.toString().includes('Server listening on http://localhost:4321')) resolve();
- });
- });
-
- await fetch('http://localhost:4321/offshoot-promise-rejection');
-
- // if there was a crash, it becomes an error here
- await worker.terminate();
- });
-
- it(
- 'rejected promise in template',
- { skip: true, todo: 'Review the response from the in-stream' },
- async () => {
- const res = await fixture.fetch('/in-stream');
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal($('p').text().trim(), 'Internal server error');
- },
- );
-
- it(
- 'generator that throws called in template',
- { skip: true, todo: 'Review the response from the generator' },
- async () => {
- const result = ['<!DOCTYPE html><h1>Astro</h1> 1', 'Internal server error'];
-
- /** @type {Response} */
- const res = await fixture.fetch('/generator');
- const reader = res.body.getReader();
- const decoder = new TextDecoder();
- const chunk1 = await reader.read();
- const chunk2 = await reader.read();
- const chunk3 = await reader.read();
- assert.equal(chunk1.done, false);
- console.log(chunk1);
- console.log(chunk2);
- console.log(chunk3);
- if (chunk2.done) {
- assert.equal(decoder.decode(chunk1.value), result.join(''));
- } else if (chunk3.done) {
- assert.equal(decoder.decode(chunk1.value), result[0]);
- assert.equal(decoder.decode(chunk2.value), result[1]);
- } else {
- throw new Error('The response should take at most 2 chunks.');
- }
- },
- );
-});
diff --git a/packages/integrations/node/test/fixtures/api-route/package.json b/packages/integrations/node/test/fixtures/api-route/package.json
deleted file mode 100644
index c4d9bdd2b..000000000
--- a/packages/integrations/node/test/fixtures/api-route/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "@test/nodejs-api-route",
- "version": "0.0.0",
- "private": true,
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/api-route/src/pages/astro-redirect.astro b/packages/integrations/node/test/fixtures/api-route/src/pages/astro-redirect.astro
deleted file mode 100644
index 65a8765e8..000000000
--- a/packages/integrations/node/test/fixtures/api-route/src/pages/astro-redirect.astro
+++ /dev/null
@@ -1,3 +0,0 @@
----
-return Astro.redirect('/destination', 303);
----
diff --git a/packages/integrations/node/test/fixtures/api-route/src/pages/binary.ts b/packages/integrations/node/test/fixtures/api-route/src/pages/binary.ts
deleted file mode 100644
index b1c7ce263..000000000
--- a/packages/integrations/node/test/fixtures/api-route/src/pages/binary.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-
-export async function POST({ request }: { request: Request }) {
- let body = await request.arrayBuffer();
- let data = new Uint8Array(body);
- let r = data.reverse();
- return new Response(r, {
- headers: {
- 'Content-Type': 'application/octet-stream'
- }
- });
-}
diff --git a/packages/integrations/node/test/fixtures/api-route/src/pages/hash.ts b/packages/integrations/node/test/fixtures/api-route/src/pages/hash.ts
deleted file mode 100644
index 3f1b236de..000000000
--- a/packages/integrations/node/test/fixtures/api-route/src/pages/hash.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import crypto from 'node:crypto';
-
-export async function POST({ request }: { request: Request }) {
- const hash = crypto.createHash('sha256');
-
- const iterable = request.body as unknown as AsyncIterable<Uint8Array>;
- for await (const chunk of iterable) {
- hash.update(chunk);
- }
-
- return new Response(hash.digest(), {
- headers: {
- 'Content-Type': 'application/octet-stream'
- }
- });
-}
diff --git a/packages/integrations/node/test/fixtures/api-route/src/pages/recipes.js b/packages/integrations/node/test/fixtures/api-route/src/pages/recipes.js
deleted file mode 100644
index 7297b9643..000000000
--- a/packages/integrations/node/test/fixtures/api-route/src/pages/recipes.js
+++ /dev/null
@@ -1,24 +0,0 @@
-
-export async function POST({ request }) {
- let body = await request.json();
- const recipes = [
- {
- id: 1,
- name: 'Potato Soup'
- },
- {
- id: 2,
- name: 'Broccoli Soup'
- }
- ];
-
- let out = recipes.filter(r => {
- return r.id === body.id;
- });
-
- return new Response(JSON.stringify(out), {
- headers: {
- 'Content-Type': 'application/json'
- }
- });
-}
diff --git a/packages/integrations/node/test/fixtures/api-route/src/pages/redirect.ts b/packages/integrations/node/test/fixtures/api-route/src/pages/redirect.ts
deleted file mode 100644
index baf22c93e..000000000
--- a/packages/integrations/node/test/fixtures/api-route/src/pages/redirect.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { APIContext } from 'astro';
-
-export async function GET({ redirect }: APIContext) {
- return redirect('/destination');
-}
diff --git a/packages/integrations/node/test/fixtures/api-route/src/pages/response-redirect.ts b/packages/integrations/node/test/fixtures/api-route/src/pages/response-redirect.ts
deleted file mode 100644
index 1dfa8bb3c..000000000
--- a/packages/integrations/node/test/fixtures/api-route/src/pages/response-redirect.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { APIContext } from 'astro';
-
-export async function GET({ url: requestUrl }: APIContext) {
- return Response.redirect(new URL('/destination', requestUrl), 307);
-}
diff --git a/packages/integrations/node/test/fixtures/api-route/src/pages/streaming.ts b/packages/integrations/node/test/fixtures/api-route/src/pages/streaming.ts
deleted file mode 100644
index 9ecb884bf..000000000
--- a/packages/integrations/node/test/fixtures/api-route/src/pages/streaming.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-export const GET = ({ locals }) => {
- let sentChunks = 0;
-
- const readableStream = new ReadableStream({
- async pull(controller) {
- if (sentChunks === 3) return controller.close();
- else sentChunks++;
-
- await new Promise(resolve => setTimeout(resolve, 1000));
- controller.enqueue(new TextEncoder().encode('hello\n'));
- },
- cancel() {
- locals.cancelledByTheServer = true;
- }
- });
-
- return new Response(readableStream, {
- headers: {
- "Content-Type": "text/event-stream"
- }
- });
-}
diff --git a/packages/integrations/node/test/fixtures/bad-urls/package.json b/packages/integrations/node/test/fixtures/bad-urls/package.json
deleted file mode 100644
index 73c119663..000000000
--- a/packages/integrations/node/test/fixtures/bad-urls/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "@test/nodejs-badurls",
- "version": "0.0.0",
- "private": true,
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/bad-urls/src/pages/index.astro b/packages/integrations/node/test/fixtures/bad-urls/src/pages/index.astro
deleted file mode 100644
index 10ddd6d25..000000000
--- a/packages/integrations/node/test/fixtures/bad-urls/src/pages/index.astro
+++ /dev/null
@@ -1 +0,0 @@
-Hello!
diff --git a/packages/integrations/node/test/fixtures/encoded/package.json b/packages/integrations/node/test/fixtures/encoded/package.json
deleted file mode 100644
index 350077973..000000000
--- a/packages/integrations/node/test/fixtures/encoded/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "@test/nodejs-encoded",
- "version": "0.0.0",
- "private": true,
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/encoded/src/pages/blog/什么.md b/packages/integrations/node/test/fixtures/encoded/src/pages/blog/什么.md
deleted file mode 100644
index 2820cf17e..000000000
--- a/packages/integrations/node/test/fixtures/encoded/src/pages/blog/什么.md
+++ /dev/null
@@ -1 +0,0 @@
-# 什么
diff --git a/packages/integrations/node/test/fixtures/encoded/src/pages/什么.astro b/packages/integrations/node/test/fixtures/encoded/src/pages/什么.astro
deleted file mode 100644
index c8473f594..000000000
--- a/packages/integrations/node/test/fixtures/encoded/src/pages/什么.astro
+++ /dev/null
@@ -1 +0,0 @@
-<h1>什么</h1>
diff --git a/packages/integrations/node/test/fixtures/errors/package.json b/packages/integrations/node/test/fixtures/errors/package.json
deleted file mode 100644
index e9fcfe654..000000000
--- a/packages/integrations/node/test/fixtures/errors/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "@test/nodejs-errors",
- "version": "0.0.0",
- "private": true,
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/errors/src/pages/generator.astro b/packages/integrations/node/test/fixtures/errors/src/pages/generator.astro
deleted file mode 100644
index 65b8ae62c..000000000
--- a/packages/integrations/node/test/fixtures/errors/src/pages/generator.astro
+++ /dev/null
@@ -1,11 +0,0 @@
----
-function * generator () {
- yield 1
- throw Error('ohnoes')
-}
----
-<h1>Astro</h1>
-{generator()}
-<footer>
- Footer
-</footer> \ No newline at end of file
diff --git a/packages/integrations/node/test/fixtures/errors/src/pages/in-stream.astro b/packages/integrations/node/test/fixtures/errors/src/pages/in-stream.astro
deleted file mode 100644
index b7ee6b4ef..000000000
--- a/packages/integrations/node/test/fixtures/errors/src/pages/in-stream.astro
+++ /dev/null
@@ -1,13 +0,0 @@
----
----
-<html>
- <head>
- <title>One</title>
- </head>
- <body>
- <h1>One</h1>
- <p>
- {Promise.reject('Error in the stream')}
- </p>
- </body>
-</html>
diff --git a/packages/integrations/node/test/fixtures/errors/src/pages/offshoot-promise-rejection.astro b/packages/integrations/node/test/fixtures/errors/src/pages/offshoot-promise-rejection.astro
deleted file mode 100644
index be702d5ef..000000000
--- a/packages/integrations/node/test/fixtures/errors/src/pages/offshoot-promise-rejection.astro
+++ /dev/null
@@ -1,2 +0,0 @@
-{new Promise(async _ => (await {}, Astro.props.undefined.alsoAPropertyOfUndefined))}
-{Astro.props.undefined.propertyOfUndefined} \ No newline at end of file
diff --git a/packages/integrations/node/test/fixtures/headers/package.json b/packages/integrations/node/test/fixtures/headers/package.json
deleted file mode 100644
index 6a0858521..000000000
--- a/packages/integrations/node/test/fixtures/headers/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "@test/nodejs-headers",
- "version": "0.0.0",
- "private": true,
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-cookies-multi.astro b/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-cookies-multi.astro
deleted file mode 100644
index a9ff193df..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-cookies-multi.astro
+++ /dev/null
@@ -1,5 +0,0 @@
----
-Astro.cookies.set('from1', 'astro1');
-Astro.cookies.set('from2', 'astro2');
----
-<p>hello world</p> \ No newline at end of file
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-cookies-single.astro b/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-cookies-single.astro
deleted file mode 100644
index c469fd66f..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-cookies-single.astro
+++ /dev/null
@@ -1,4 +0,0 @@
----
-Astro.cookies.set('from1', 'astro1');
----
-<p>hello world</p> \ No newline at end of file
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-response-cookie-multi.astro b/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-response-cookie-multi.astro
deleted file mode 100644
index 91244e838..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-response-cookie-multi.astro
+++ /dev/null
@@ -1,7 +0,0 @@
----
-Astro.response.headers.append('set-cookie', 'from1=response1');
-Astro.response.headers.append('set-cookie', 'from2=response2');
-Astro.cookies.set('from3', 'astro1');
-Astro.cookies.set('from4', 'astro2');
----
-<p>hello world</p> \ No newline at end of file
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-response-cookie-single.astro b/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-response-cookie-single.astro
deleted file mode 100644
index 97719dfa9..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-astro-response-cookie-single.astro
+++ /dev/null
@@ -1,5 +0,0 @@
----
-Astro.response.headers.append('set-cookie', 'from1=response1');
-Astro.cookies.set('from1', 'astro1');
----
-<p>hello world</p> \ No newline at end of file
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-response-cookies-multi.astro b/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-response-cookies-multi.astro
deleted file mode 100644
index 133cbd423..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-response-cookies-multi.astro
+++ /dev/null
@@ -1,5 +0,0 @@
----
-Astro.response.headers.append('set-cookie', 'from1=value1');
-Astro.response.headers.append('set-cookie', 'from2=value2');
----
-<p>hello world</p> \ No newline at end of file
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-response-cookies-single.astro b/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-response-cookies-single.astro
deleted file mode 100644
index dc76082db..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/astro/component-response-cookies-single.astro
+++ /dev/null
@@ -1,4 +0,0 @@
----
-Astro.response.headers.append('set-cookie', 'from1=value1');
----
-<p>hello world</p> \ No newline at end of file
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-cookies-multi.ts b/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-cookies-multi.ts
deleted file mode 100644
index aaae88e59..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-cookies-multi.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import type { APIContext } from 'astro';
-
-export async function GET({ request, cookies }: APIContext) {
- const headers = new Headers();
- headers.append('content-type', 'text/plain;charset=utf-8');
- cookies.set('from1', 'astro1');
- cookies.set('from2', 'astro2');
- return new Response('hello world', { headers });
-}
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-cookies-single.ts b/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-cookies-single.ts
deleted file mode 100644
index 03e74c604..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-cookies-single.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import type { APIContext } from 'astro';
-
-export async function GET({ request, cookies }: APIContext) {
- const headers = new Headers();
- headers.append('content-type', 'text/plain;charset=utf-8');
- cookies.set('from1', 'astro1');
- return new Response('hello world', { headers });
-}
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-response-cookie-multi.ts b/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-response-cookie-multi.ts
deleted file mode 100644
index 36906da3a..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-response-cookie-multi.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import type { APIContext } from 'astro';
-
-export async function GET({ request, cookies }: APIContext) {
- const headers = new Headers();
- headers.append('content-type', 'text/plain;charset=utf-8');
- headers.append('set-cookie', 'from1=response1');
- headers.append('set-cookie', 'from2=response2');
- cookies.set('from3', 'astro1');
- cookies.set('from4', 'astro2');
- return new Response('hello world', { headers });
-}
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-response-cookie-single.ts b/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-response-cookie-single.ts
deleted file mode 100644
index 3c1fc4775..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/astro-response-cookie-single.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import type { APIContext } from 'astro';
-
-export async function GET({ request, cookies }: APIContext) {
- const headers = new Headers();
- headers.append('content-type', 'text/plain;charset=utf-8');
- headers.append('set-cookie', 'from1=response1');
- cookies.set('from1', 'astro1');
- return new Response('hello world', { headers });
-}
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/kitchen-sink.ts b/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/kitchen-sink.ts
deleted file mode 100644
index fb7c30cbc..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/kitchen-sink.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export async function GET({ request }: { request: Request }) {
- const headers = new Headers();
- headers.append('content-type', 'text/plain;charset=utf-8');
- headers.append('x-SINGLE', 'single');
- headers.append('X-triple', 'one');
- headers.append('x-Triple', 'two');
- headers.append('x-TRIPLE', 'three');
- headers.append('SET-cookie', 'hello1=world1');
- headers.append('Set-Cookie', 'hello2=world2');
- return new Response('hello world', { headers });
-}
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-cookies-multi.ts b/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-cookies-multi.ts
deleted file mode 100644
index d974737ee..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-cookies-multi.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export async function GET({ request }: { request: Request }) {
- const headers = new Headers();
- headers.append('content-type', 'text/plain;charset=utf-8');
- headers.append('Set-Cookie', 'hello1=world1');
- headers.append('SET-COOKIE', 'hello2=world2');
- return new Response('hello world', { headers });
-}
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-cookies-single.ts b/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-cookies-single.ts
deleted file mode 100644
index f543ae062..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-cookies-single.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export async function GET({ request }: { request: Request }) {
- const headers = new Headers();
- headers.append('content-type', 'text/plain;charset=utf-8');
- headers.append('Set-Cookie', 'hello1=world1');
- return new Response('hello world', { headers });
-}
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-empty-headers-object.ts b/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-empty-headers-object.ts
deleted file mode 100644
index b8a9e122e..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-empty-headers-object.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export async function GET({ request }: { request: Request }) {
- const headers = new Headers();
- return new Response('hello world', { headers });
-}
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-undefined-headers-object.ts b/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-undefined-headers-object.ts
deleted file mode 100644
index 72f7af071..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/response-undefined-headers-object.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export async function GET({ request }: { request: Request }) {
- return new Response('hello world', { headers: undefined });
-}
diff --git a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/simple.ts b/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/simple.ts
deleted file mode 100644
index 9c6bcacaa..000000000
--- a/packages/integrations/node/test/fixtures/headers/src/pages/endpoints/simple.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export async function GET({ request }: { request: Request }) {
- const headers = new Headers();
- headers.append('content-type', 'text/plain;charset=utf-8');
- headers.append('X-HELLO', 'world');
- return new Response('hello world', { headers });
-}
diff --git a/packages/integrations/node/test/fixtures/image/package.json b/packages/integrations/node/test/fixtures/image/package.json
deleted file mode 100644
index 94066576d..000000000
--- a/packages/integrations/node/test/fixtures/image/package.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "name": "@test/nodejs-image",
- "version": "0.0.0",
- "private": true,
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- },
- "scripts": {
- "build": "astro build",
- "preview": "astro preview"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/image/src/assets/file.txt b/packages/integrations/node/test/fixtures/image/src/assets/file.txt
deleted file mode 100644
index e9ea42a12..000000000
--- a/packages/integrations/node/test/fixtures/image/src/assets/file.txt
+++ /dev/null
@@ -1 +0,0 @@
-this is a text file
diff --git a/packages/integrations/node/test/fixtures/image/src/assets/some_penguin.png b/packages/integrations/node/test/fixtures/image/src/assets/some_penguin.png
deleted file mode 100644
index a09d7f894..000000000
--- a/packages/integrations/node/test/fixtures/image/src/assets/some_penguin.png
+++ /dev/null
Binary files differ
diff --git a/packages/integrations/node/test/fixtures/image/src/pages/index.astro b/packages/integrations/node/test/fixtures/image/src/pages/index.astro
deleted file mode 100644
index 474a2f0c9..000000000
--- a/packages/integrations/node/test/fixtures/image/src/pages/index.astro
+++ /dev/null
@@ -1,6 +0,0 @@
----
-import { Image } from "astro:assets";
-import penguin from "../assets/some_penguin.png";
----
-
-<Image src={penguin} alt="Penguins" width={50} />
diff --git a/packages/integrations/node/test/fixtures/image/src/pages/text-file.astro b/packages/integrations/node/test/fixtures/image/src/pages/text-file.astro
deleted file mode 100644
index 893250360..000000000
--- a/packages/integrations/node/test/fixtures/image/src/pages/text-file.astro
+++ /dev/null
@@ -1,14 +0,0 @@
----
-import txt from '../assets/file.txt?url';
----
-<html>
- <head>
- <title>Testing</title>
- </head>
- <body>
- <h1>Testing</h1>
- <main>
- <a href={txt} download>Download text file</a>
- </main>
- </body>
-</html>
diff --git a/packages/integrations/node/test/fixtures/locals/package.json b/packages/integrations/node/test/fixtures/locals/package.json
deleted file mode 100644
index 35be7dc01..000000000
--- a/packages/integrations/node/test/fixtures/locals/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "@test/locals",
- "version": "0.0.0",
- "private": true,
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/locals/src/middleware.ts b/packages/integrations/node/test/fixtures/locals/src/middleware.ts
deleted file mode 100644
index e349ca41d..000000000
--- a/packages/integrations/node/test/fixtures/locals/src/middleware.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { defineMiddleware } from 'astro:middleware';
-
-export const onRequest = defineMiddleware(({ url, locals }, next) => {
- if (url.pathname === "/from-astro-middleware") locals.foo = "baz";
- return next();
-})
diff --git a/packages/integrations/node/test/fixtures/locals/src/pages/api.js b/packages/integrations/node/test/fixtures/locals/src/pages/api.js
deleted file mode 100644
index 3c279e37b..000000000
--- a/packages/integrations/node/test/fixtures/locals/src/pages/api.js
+++ /dev/null
@@ -1,10 +0,0 @@
-
-export async function POST({ locals }) {
- const out = { ...locals };
-
- return new Response(JSON.stringify(out), {
- headers: {
- 'Content-Type': 'application/json'
- }
- });
-}
diff --git a/packages/integrations/node/test/fixtures/locals/src/pages/from-astro-middleware.astro b/packages/integrations/node/test/fixtures/locals/src/pages/from-astro-middleware.astro
deleted file mode 100644
index 224a875ec..000000000
--- a/packages/integrations/node/test/fixtures/locals/src/pages/from-astro-middleware.astro
+++ /dev/null
@@ -1,4 +0,0 @@
----
-const { foo } = Astro.locals;
----
-<h1>{foo}</h1>
diff --git a/packages/integrations/node/test/fixtures/locals/src/pages/from-node-middleware.astro b/packages/integrations/node/test/fixtures/locals/src/pages/from-node-middleware.astro
deleted file mode 100644
index 224a875ec..000000000
--- a/packages/integrations/node/test/fixtures/locals/src/pages/from-node-middleware.astro
+++ /dev/null
@@ -1,4 +0,0 @@
----
-const { foo } = Astro.locals;
----
-<h1>{foo}</h1>
diff --git a/packages/integrations/node/test/fixtures/node-middleware/package.json b/packages/integrations/node/test/fixtures/node-middleware/package.json
deleted file mode 100644
index 7a49010f1..000000000
--- a/packages/integrations/node/test/fixtures/node-middleware/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "@test/node-middleware",
- "version": "0.0.0",
- "private": true,
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/node-middleware/src/pages/404.astro b/packages/integrations/node/test/fixtures/node-middleware/src/pages/404.astro
deleted file mode 100644
index 79f4944bc..000000000
--- a/packages/integrations/node/test/fixtures/node-middleware/src/pages/404.astro
+++ /dev/null
@@ -1,13 +0,0 @@
----
----
-
-<!DOCTYPE html>
-<html lang="en">
-<head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>404</title>
-</head>
-<body>Page does not exist</body>
-</html>
diff --git a/packages/integrations/node/test/fixtures/node-middleware/src/pages/index.astro b/packages/integrations/node/test/fixtures/node-middleware/src/pages/index.astro
deleted file mode 100644
index 28ff7d223..000000000
--- a/packages/integrations/node/test/fixtures/node-middleware/src/pages/index.astro
+++ /dev/null
@@ -1,11 +0,0 @@
----
----
-
-<html lang="en">
-<head><title>node-middleware</title></head>
-<style>
-</style>
-<body>
-<div>1</div>
-</body>
-</html>
diff --git a/packages/integrations/node/test/fixtures/node-middleware/src/pages/ssr.ts b/packages/integrations/node/test/fixtures/node-middleware/src/pages/ssr.ts
deleted file mode 100644
index 423db341a..000000000
--- a/packages/integrations/node/test/fixtures/node-middleware/src/pages/ssr.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export async function GET() {
- let number = Math.random();
- return Response.json({
- number,
- message: `Here's a random number: ${number}`,
- });
-}
diff --git a/packages/integrations/node/test/fixtures/prerender-404-500/package.json b/packages/integrations/node/test/fixtures/prerender-404-500/package.json
deleted file mode 100644
index f962fe991..000000000
--- a/packages/integrations/node/test/fixtures/prerender-404-500/package.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "name": "@test/nodejs-prerender-404-500",
- "version": "0.0.0",
- "private": true,
- "type": "module",
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/prerender-404-500/src/external-stylesheet.css b/packages/integrations/node/test/fixtures/prerender-404-500/src/external-stylesheet.css
deleted file mode 100644
index 5f331948a..000000000
--- a/packages/integrations/node/test/fixtures/prerender-404-500/src/external-stylesheet.css
+++ /dev/null
@@ -1,3 +0,0 @@
-body {
- background-color: ivory;
-}
diff --git a/packages/integrations/node/test/fixtures/prerender-404-500/src/nondeterminism-404.ts b/packages/integrations/node/test/fixtures/prerender-404-500/src/nondeterminism-404.ts
deleted file mode 100644
index 1795c26b0..000000000
--- a/packages/integrations/node/test/fixtures/prerender-404-500/src/nondeterminism-404.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-// This module is only used by the prerendered 404.astro.
-// It exhibits different behavior if it's called more than once,
-// which is detected by a test and interpreted as a failure.
-
-let usedOnce = false
-let dynamicMessage = "Page was not prerendered"
-
-export default function () {
- if (usedOnce === false) {
- usedOnce = true
- return "Page does not exist"
- }
-
- dynamicMessage += "+"
-
- return dynamicMessage
-}
diff --git a/packages/integrations/node/test/fixtures/prerender-404-500/src/nondeterminism-500.ts b/packages/integrations/node/test/fixtures/prerender-404-500/src/nondeterminism-500.ts
deleted file mode 100644
index 8f8024a60..000000000
--- a/packages/integrations/node/test/fixtures/prerender-404-500/src/nondeterminism-500.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-// This module is only used by the prerendered 500.astro.
-// It exhibits different behavior if it's called more than once,
-// which is detected by a test and interpreted as a failure.
-
-let usedOnce = false
-let dynamicMessage = "Page was not prerendered"
-
-export default function () {
- if (usedOnce === false) {
- usedOnce = true
- return "Something went wrong"
- }
-
- dynamicMessage += "+"
-
- return dynamicMessage
-}
diff --git a/packages/integrations/node/test/fixtures/prerender-404-500/src/pages/404.astro b/packages/integrations/node/test/fixtures/prerender-404-500/src/pages/404.astro
deleted file mode 100644
index 37fd1c1d3..000000000
--- a/packages/integrations/node/test/fixtures/prerender-404-500/src/pages/404.astro
+++ /dev/null
@@ -1,5 +0,0 @@
----
-import message from "../nondeterminism-404"
-export const prerender = true;
----
-{message()}
diff --git a/packages/integrations/node/test/fixtures/prerender-404-500/src/pages/500.astro b/packages/integrations/node/test/fixtures/prerender-404-500/src/pages/500.astro
deleted file mode 100644
index ef91ad0ff..000000000
--- a/packages/integrations/node/test/fixtures/prerender-404-500/src/pages/500.astro
+++ /dev/null
@@ -1,6 +0,0 @@
----
-import "../external-stylesheet.css"
-import message from "../nondeterminism-500"
-export const prerender = true
----
-<h1>{message()}</h1>
diff --git a/packages/integrations/node/test/fixtures/prerender-404-500/src/pages/fivehundred.astro b/packages/integrations/node/test/fixtures/prerender-404-500/src/pages/fivehundred.astro
deleted file mode 100644
index 99d103567..000000000
--- a/packages/integrations/node/test/fixtures/prerender-404-500/src/pages/fivehundred.astro
+++ /dev/null
@@ -1,4 +0,0 @@
----
-return new Response(null, { status: 500 })
----
-<p>This html will not be served</p>
diff --git a/packages/integrations/node/test/fixtures/prerender-404-500/src/pages/static.astro b/packages/integrations/node/test/fixtures/prerender-404-500/src/pages/static.astro
deleted file mode 100644
index af6bad2fb..000000000
--- a/packages/integrations/node/test/fixtures/prerender-404-500/src/pages/static.astro
+++ /dev/null
@@ -1,12 +0,0 @@
----
-export const prerender = true;
----
-
-<html>
-<head>
- <title>Static Page</title>
-</head>
- <body>
- <h1>Hello world!</h1>
- </body>
-</html>
diff --git a/packages/integrations/node/test/fixtures/prerender/package.json b/packages/integrations/node/test/fixtures/prerender/package.json
deleted file mode 100644
index 0ae3211ab..000000000
--- a/packages/integrations/node/test/fixtures/prerender/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "@test/nodejs-prerender",
- "version": "0.0.0",
- "private": true,
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/prerender/src/middleware.ts b/packages/integrations/node/test/fixtures/prerender/src/middleware.ts
deleted file mode 100644
index 13d619d78..000000000
--- a/packages/integrations/node/test/fixtures/prerender/src/middleware.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { shared } from './shared';
-export const onRequest = (ctx, next) => {
- ctx.locals = {
- name: shared,
- };
- return next();
-};
diff --git a/packages/integrations/node/test/fixtures/prerender/src/pages/one.astro b/packages/integrations/node/test/fixtures/prerender/src/pages/one.astro
deleted file mode 100644
index f3a26721d..000000000
--- a/packages/integrations/node/test/fixtures/prerender/src/pages/one.astro
+++ /dev/null
@@ -1,10 +0,0 @@
----
----
-<html>
- <head>
- <title>One</title>
- </head>
- <body>
- <h1>One</h1>
- </body>
-</html>
diff --git a/packages/integrations/node/test/fixtures/prerender/src/pages/third.astro b/packages/integrations/node/test/fixtures/prerender/src/pages/third.astro
deleted file mode 100644
index e29377d88..000000000
--- a/packages/integrations/node/test/fixtures/prerender/src/pages/third.astro
+++ /dev/null
@@ -1,15 +0,0 @@
----
-import { shared} from "../shared";
-export const prerender = false;
-
-const shared = Astro.locals.name;
----
-
-<html>
-<head>
- <title>One</title>
-</head>
-<body>
-<h1>{shared}</h1>
-</body>
-</html>
diff --git a/packages/integrations/node/test/fixtures/prerender/src/pages/two.astro b/packages/integrations/node/test/fixtures/prerender/src/pages/two.astro
deleted file mode 100644
index c0e5d07aa..000000000
--- a/packages/integrations/node/test/fixtures/prerender/src/pages/two.astro
+++ /dev/null
@@ -1,11 +0,0 @@
----
-export const prerender = import.meta.env.PRERENDER;
----
-<html>
- <head>
- <title>Two</title>
- </head>
- <body>
- <h1>Two</h1>
- </body>
-</html>
diff --git a/packages/integrations/node/test/fixtures/prerender/src/shared.ts b/packages/integrations/node/test/fixtures/prerender/src/shared.ts
deleted file mode 100644
index cd35843de..000000000
--- a/packages/integrations/node/test/fixtures/prerender/src/shared.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const shared = 'shared';
diff --git a/packages/integrations/node/test/fixtures/preview-headers/package.json b/packages/integrations/node/test/fixtures/preview-headers/package.json
deleted file mode 100644
index ec2d5e3cf..000000000
--- a/packages/integrations/node/test/fixtures/preview-headers/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "@test/nodejs-preview-headers",
- "version": "0.0.0",
- "private": true,
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/preview-headers/src/pages/index.astro b/packages/integrations/node/test/fixtures/preview-headers/src/pages/index.astro
deleted file mode 100644
index 10ddd6d25..000000000
--- a/packages/integrations/node/test/fixtures/preview-headers/src/pages/index.astro
+++ /dev/null
@@ -1 +0,0 @@
-Hello!
diff --git a/packages/integrations/node/test/fixtures/trailing-slash/astro.config.mjs b/packages/integrations/node/test/fixtures/trailing-slash/astro.config.mjs
deleted file mode 100644
index 7ee28f213..000000000
--- a/packages/integrations/node/test/fixtures/trailing-slash/astro.config.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-import node from '@astrojs/node'
-
-export default {
- base: '/some-base',
- output: 'hybrid',
- trailingSlash: 'never',
- adapter: node({ mode: 'standalone' })
-};
diff --git a/packages/integrations/node/test/fixtures/trailing-slash/package.json b/packages/integrations/node/test/fixtures/trailing-slash/package.json
deleted file mode 100644
index 50b7b7201..000000000
--- a/packages/integrations/node/test/fixtures/trailing-slash/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "@test/node-trailingslash",
- "version": "0.0.0",
- "private": true,
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/trailing-slash/public/one.css b/packages/integrations/node/test/fixtures/trailing-slash/public/one.css
deleted file mode 100644
index 5ce768ca5..000000000
--- a/packages/integrations/node/test/fixtures/trailing-slash/public/one.css
+++ /dev/null
@@ -1 +0,0 @@
-h1 { color: red; }
diff --git a/packages/integrations/node/test/fixtures/trailing-slash/src/pages/index.astro b/packages/integrations/node/test/fixtures/trailing-slash/src/pages/index.astro
deleted file mode 100644
index a4c415519..000000000
--- a/packages/integrations/node/test/fixtures/trailing-slash/src/pages/index.astro
+++ /dev/null
@@ -1,8 +0,0 @@
-<html>
- <head>
- <title>Index</title>
- </head>
- <body>
- <h1>Index</h1>
- </body>
-</html>
diff --git a/packages/integrations/node/test/fixtures/trailing-slash/src/pages/one.astro b/packages/integrations/node/test/fixtures/trailing-slash/src/pages/one.astro
deleted file mode 100644
index aa370d18d..000000000
--- a/packages/integrations/node/test/fixtures/trailing-slash/src/pages/one.astro
+++ /dev/null
@@ -1,11 +0,0 @@
----
-export const prerender = true;
----
-<html>
- <head>
- <title>One</title>
- </head>
- <body>
- <h1>One</h1>
- </body>
-</html>
diff --git a/packages/integrations/node/test/fixtures/url/package.json b/packages/integrations/node/test/fixtures/url/package.json
deleted file mode 100644
index f349011fd..000000000
--- a/packages/integrations/node/test/fixtures/url/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "@test/url",
- "version": "0.0.0",
- "private": true,
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/url/src/pages/index.astro b/packages/integrations/node/test/fixtures/url/src/pages/index.astro
deleted file mode 100644
index 003429f52..000000000
--- a/packages/integrations/node/test/fixtures/url/src/pages/index.astro
+++ /dev/null
@@ -1,9 +0,0 @@
----
----
-
-<html lang="en">
- <head>
- <title>URL</title>
- </head>
- <body>{Astro.url.href}</body>
-</html>
diff --git a/packages/integrations/node/test/fixtures/well-known-locations/package.json b/packages/integrations/node/test/fixtures/well-known-locations/package.json
deleted file mode 100644
index f018b6ec7..000000000
--- a/packages/integrations/node/test/fixtures/well-known-locations/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "name": "@test/well-known-locations",
- "version": "0.0.0",
- "private": true,
- "dependencies": {
- "astro": "workspace:*",
- "@astrojs/node": "workspace:*"
- }
-}
diff --git a/packages/integrations/node/test/fixtures/well-known-locations/public/.hidden/file.json b/packages/integrations/node/test/fixtures/well-known-locations/public/.hidden/file.json
deleted file mode 100644
index 0967ef424..000000000
--- a/packages/integrations/node/test/fixtures/well-known-locations/public/.hidden/file.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/packages/integrations/node/test/fixtures/well-known-locations/public/.well-known/apple-app-site-association b/packages/integrations/node/test/fixtures/well-known-locations/public/.well-known/apple-app-site-association
deleted file mode 100644
index daae260f1..000000000
--- a/packages/integrations/node/test/fixtures/well-known-locations/public/.well-known/apple-app-site-association
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "applinks": {}
-}
diff --git a/packages/integrations/node/test/headers.test.js b/packages/integrations/node/test/headers.test.js
deleted file mode 100644
index 00b1766c7..000000000
--- a/packages/integrations/node/test/headers.test.js
+++ /dev/null
@@ -1,148 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { before, describe, it } from 'node:test';
-import nodejs from '../dist/index.js';
-import { createRequestAndResponse, loadFixture } from './test-utils.js';
-
-describe('Node Adapter Headers', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
-
- before(async () => {
- fixture = await loadFixture({
- root: './fixtures/headers/',
- output: 'server',
- adapter: nodejs({ mode: 'middleware' }),
- });
- await fixture.build();
- });
-
- it('Endpoint Simple Headers', async () => {
- await runTest('/endpoints/simple', {
- 'content-type': 'text/plain;charset=utf-8',
- 'x-hello': 'world',
- });
- });
-
- it('Endpoint Astro Single Cookie Header', async () => {
- await runTest('/endpoints/astro-cookies-single', {
- 'content-type': 'text/plain;charset=utf-8',
- 'set-cookie': 'from1=astro1',
- });
- });
-
- it('Endpoint Astro Multi Cookie Header', async () => {
- await runTest('/endpoints/astro-cookies-multi', {
- 'content-type': 'text/plain;charset=utf-8',
- 'set-cookie': ['from1=astro1', 'from2=astro2'],
- });
- });
-
- it('Endpoint Response Single Cookie Header', async () => {
- await runTest('/endpoints/response-cookies-single', {
- 'content-type': 'text/plain;charset=utf-8',
- 'set-cookie': 'hello1=world1',
- });
- });
-
- it('Endpoint Response Multi Cookie Header', async () => {
- await runTest('/endpoints/response-cookies-multi', {
- 'content-type': 'text/plain;charset=utf-8',
- 'set-cookie': ['hello1=world1', 'hello2=world2'],
- });
- });
-
- it('Endpoint Complex Headers Kitchen Sink', async () => {
- await runTest('/endpoints/kitchen-sink', {
- 'content-type': 'text/plain;charset=utf-8',
- 'x-single': 'single',
- 'x-triple': 'one, two, three',
- 'set-cookie': ['hello1=world1', 'hello2=world2'],
- });
- });
-
- it('Endpoint Astro and Response Single Cookie Header', async () => {
- await runTest('/endpoints/astro-response-cookie-single', {
- 'content-type': 'text/plain;charset=utf-8',
- 'set-cookie': ['from1=response1', 'from1=astro1'],
- });
- });
-
- it('Endpoint Astro and Response Multi Cookie Header', async () => {
- await runTest('/endpoints/astro-response-cookie-multi', {
- 'content-type': 'text/plain;charset=utf-8',
- 'set-cookie': ['from1=response1', 'from2=response2', 'from3=astro1', 'from4=astro2'],
- });
- });
-
- it('Endpoint Response Empty Headers Object', async () => {
- await runTest('/endpoints/response-empty-headers-object', {
- 'content-type': 'text/plain;charset=UTF-8',
- });
- });
-
- it('Endpoint Response undefined Headers Object', async () => {
- await runTest('/endpoints/response-undefined-headers-object', {
- 'content-type': 'text/plain;charset=UTF-8',
- });
- });
-
- it('Component Astro Single Cookie Header', async () => {
- await runTest('/astro/component-astro-cookies-single', {
- 'content-type': 'text/html',
- 'set-cookie': 'from1=astro1',
- });
- });
-
- it('Component Astro Multi Cookie Header', async () => {
- await runTest('/astro/component-astro-cookies-multi', {
- 'content-type': 'text/html',
- 'set-cookie': ['from1=astro1', 'from2=astro2'],
- });
- });
-
- it('Component Response Single Cookie Header', async () => {
- await runTest('/astro/component-response-cookies-single', {
- 'content-type': 'text/html',
- 'set-cookie': 'from1=value1',
- });
- });
-
- it('Component Response Multi Cookie Header', async () => {
- await runTest('/astro/component-response-cookies-multi', {
- 'content-type': 'text/html',
- 'set-cookie': ['from1=value1', 'from2=value2'],
- });
- });
-
- it('Component Astro and Response Single Cookie Header', async () => {
- await runTest('/astro/component-astro-response-cookie-single', {
- 'content-type': 'text/html',
- 'set-cookie': ['from1=response1', 'from1=astro1'],
- });
- });
-
- it('Component Astro and Response Multi Cookie Header', async () => {
- await runTest('/astro/component-astro-response-cookie-multi', {
- 'content-type': 'text/html',
- 'set-cookie': ['from1=response1', 'from2=response2', 'from3=astro1', 'from4=astro2'],
- });
- });
-});
-
-async function runTest(url, expectedHeaders) {
- const { handler } = await import('./fixtures/headers/dist/server/entry.mjs');
-
- let { req, res, done } = createRequestAndResponse({
- method: 'GET',
- url,
- });
-
- handler(req, res);
-
- req.send();
-
- await done;
- const headers = res.getHeaders();
-
- assert.deepEqual(headers, expectedHeaders);
-}
diff --git a/packages/integrations/node/test/image.test.js b/packages/integrations/node/test/image.test.js
deleted file mode 100644
index 5303fe37e..000000000
--- a/packages/integrations/node/test/image.test.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { after, before, describe, it } from 'node:test';
-import nodejs from '../dist/index.js';
-import { loadFixture } from './test-utils.js';
-
-// Temporary skip until we figure out the "Could not find Sharp" issue as `sharp` is bundled
-describe.skip('Image endpoint', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
- let devPreview;
-
- before(async () => {
- fixture = await loadFixture({
- root: './fixtures/image/',
- output: 'server',
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- devPreview = await fixture.preview();
- });
-
- after(async () => {
- await devPreview.stop();
- });
-
- it('it returns images', async () => {
- const res = await fixture.fetch('/');
- assert.equal(res.status, 200);
-
- const resImage = await fixture.fetch(
- '/_image?href=/_astro/some_penguin.97ef5f92.png&w=50&f=webp',
- );
-
- assert.equal(resImage.status, 200);
- });
-});
diff --git a/packages/integrations/node/test/locals.test.js b/packages/integrations/node/test/locals.test.js
deleted file mode 100644
index 6d2776079..000000000
--- a/packages/integrations/node/test/locals.test.js
+++ /dev/null
@@ -1,81 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { before, describe, it } from 'node:test';
-import nodejs from '../dist/index.js';
-import { createRequestAndResponse, loadFixture } from './test-utils.js';
-
-describe('API routes', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
-
- before(async () => {
- fixture = await loadFixture({
- root: './fixtures/locals/',
- output: 'server',
- adapter: nodejs({ mode: 'middleware' }),
- });
- await fixture.build();
- });
-
- it('Can use locals added by node middleware', async () => {
- const { handler } = await import('./fixtures/locals/dist/server/entry.mjs');
- let { req, res, text } = createRequestAndResponse({
- url: '/from-node-middleware',
- });
-
- let locals = { foo: 'bar' };
-
- handler(req, res, () => {}, locals);
- req.send();
-
- let html = await text();
-
- assert.equal(html.includes('<h1>bar</h1>'), true);
- });
-
- it('Throws an error when provided non-objects as locals', async () => {
- const { handler } = await import('./fixtures/locals/dist/server/entry.mjs');
- let { req, res, done } = createRequestAndResponse({
- url: '/from-node-middleware',
- });
-
- handler(req, res, undefined, 'locals');
- req.send();
-
- await done;
- assert.equal(res.statusCode, 500);
- });
-
- it('Can use locals added by astro middleware', async () => {
- const { handler } = await import('./fixtures/locals/dist/server/entry.mjs');
-
- const { req, res, text } = createRequestAndResponse({
- url: '/from-astro-middleware',
- });
-
- handler(req, res, () => {});
- req.send();
-
- const html = await text();
-
- assert.equal(html.includes('<h1>baz</h1>'), true);
- });
-
- it('Can access locals in API', async () => {
- const { handler } = await import('./fixtures/locals/dist/server/entry.mjs');
- let { req, res, done } = createRequestAndResponse({
- method: 'POST',
- url: '/api',
- });
-
- let locals = { foo: 'bar' };
-
- handler(req, res, () => {}, locals);
- req.send();
-
- let [buffer] = await done;
-
- let json = JSON.parse(buffer.toString('utf-8'));
-
- assert.equal(json.foo, 'bar');
- });
-});
diff --git a/packages/integrations/node/test/node-middleware.test.js b/packages/integrations/node/test/node-middleware.test.js
deleted file mode 100644
index d1b016a51..000000000
--- a/packages/integrations/node/test/node-middleware.test.js
+++ /dev/null
@@ -1,88 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { after, before, describe, it } from 'node:test';
-import * as cheerio from 'cheerio';
-import express from 'express';
-import nodejs from '../dist/index.js';
-import { loadFixture, waitServerListen } from './test-utils.js';
-
-/**
- * @typedef {import('../../../astro/test/test-utils').Fixture} Fixture
- */
-
-describe('behavior from middleware, standalone', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
- let server;
-
- before(async () => {
- process.env.PRERENDER = false;
- fixture = await loadFixture({
- root: './fixtures/node-middleware/',
- output: 'server',
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- describe('404', async () => {
- it('when mode is standalone', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/error-page`);
-
- assert.equal(res.status, 404);
-
- const html = await res.text();
- const $ = cheerio.load(html);
-
- const body = $('body');
- assert.equal(body.text().includes('Page does not exist'), true);
- });
- });
-});
-
-describe('behavior from middleware, middleware', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
- let server;
-
- before(async () => {
- process.env.PRERENDER = false;
- fixture = await loadFixture({
- root: './fixtures/node-middleware/',
- output: 'server',
- adapter: nodejs({ mode: 'middleware' }),
- });
- await fixture.build();
- const { handler } = await fixture.loadAdapterEntryModule();
- const app = express();
- app.use(handler);
- server = app.listen(8888);
- });
-
- after(async () => {
- server.close();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('when mode is standalone', async () => {
- const res = await fetch(`http://localhost:8888/ssr`);
-
- assert.equal(res.status, 200);
-
- const html = await res.text();
- const $ = cheerio.load(html);
-
- const body = $('body');
- assert.equal(body.text().includes("Here's a random number"), true);
- });
-});
diff --git a/packages/integrations/node/test/prerender-404-500.test.js b/packages/integrations/node/test/prerender-404-500.test.js
deleted file mode 100644
index 2535fcb35..000000000
--- a/packages/integrations/node/test/prerender-404-500.test.js
+++ /dev/null
@@ -1,300 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { after, before, describe, it } from 'node:test';
-import * as cheerio from 'cheerio';
-import nodejs from '../dist/index.js';
-import { loadFixture, waitServerListen } from './test-utils.js';
-
-/**
- * @typedef {import('../../../astro/test/test-utils').Fixture} Fixture
- */
-
-describe('Prerender 404', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
- let server;
-
- describe('With base', async () => {
- before(async () => {
- process.env.PRERENDER = true;
-
- fixture = await loadFixture({
- // inconsequential config that differs between tests
- // to bust cache and prevent modules and their state
- // from being reused
- site: 'https://test.dev/',
- base: '/some-base',
- root: './fixtures/prerender-404-500/',
- output: 'server',
- outDir: './dist/server-with-base',
- build: {
- client: './dist/server-with-base/client',
- server: './dist/server-with-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render SSR route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/static`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Hello world!');
- });
-
- it('Can handle prerendered 404', async () => {
- const url = `http://${server.host}:${server.port}/some-base/missing`;
- const res1 = await fetch(url);
- const res2 = await fetch(url);
- const res3 = await fetch(url);
-
- assert.equal(res1.status, 404);
- assert.equal(res2.status, 404);
- assert.equal(res3.status, 404);
-
- const html1 = await res1.text();
- const html2 = await res2.text();
- const html3 = await res3.text();
-
- assert.equal(html1, html2);
- assert.equal(html2, html3);
-
- const $ = cheerio.load(html1);
-
- assert.equal($('body').text(), 'Page does not exist');
- });
-
- it(' Can handle prerendered 500 called indirectly', async () => {
- const url = `http://${server.host}:${server.port}/some-base/fivehundred`;
- const response1 = await fetch(url);
- const response2 = await fetch(url);
- const response3 = await fetch(url);
-
- assert.equal(response1.status, 500);
-
- const html1 = await response1.text();
- const html2 = await response2.text();
- const html3 = await response3.text();
-
- assert.equal(html1.includes('Something went wrong'), true);
-
- assert.equal(html1, html2);
- assert.equal(html2, html3);
- });
-
- it('prerendered 500 page includes expected styles', async () => {
- const response = await fetch(`http://${server.host}:${server.port}/some-base/fivehundred`);
- const html = await response.text();
- const $ = cheerio.load(html);
-
- // length will be 0 if the stylesheet does not get included
- assert.equal($('style').length, 1);
- });
- });
-
- describe('Without base', async () => {
- before(async () => {
- process.env.PRERENDER = true;
-
- fixture = await loadFixture({
- // inconsequential config that differs between tests
- // to bust cache and prevent modules and their state
- // from being reused
- site: 'https://test.info/',
- root: './fixtures/prerender-404-500/',
- output: 'server',
- outDir: './dist/server-without-base',
- build: {
- client: './dist/server-without-base/client',
- server: './dist/server-without-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render SSR route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/static`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Hello world!');
- });
-
- it('Can handle prerendered 404', async () => {
- const url = `http://${server.host}:${server.port}/some-base/missing`;
- const res1 = await fetch(url);
- const res2 = await fetch(url);
- const res3 = await fetch(url);
-
- assert.equal(res1.status, 404);
- assert.equal(res2.status, 404);
- assert.equal(res3.status, 404);
-
- const html1 = await res1.text();
- const html2 = await res2.text();
- const html3 = await res3.text();
-
- assert.equal(html1, html2);
- assert.equal(html2, html3);
-
- const $ = cheerio.load(html1);
-
- assert.equal($('body').text(), 'Page does not exist');
- });
- });
-});
-
-describe('Hybrid 404', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
- let server;
-
- describe('With base', async () => {
- before(async () => {
- process.env.PRERENDER = false;
- fixture = await loadFixture({
- // inconsequential config that differs between tests
- // to bust cache and prevent modules and their state
- // from being reused
- site: 'https://test.com/',
- base: '/some-base',
- root: './fixtures/prerender-404-500/',
- output: 'hybrid',
- outDir: './dist/hybrid-with-base',
- build: {
- client: './dist/hybrid-with-base/client',
- server: './dist/hybrid-with-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render SSR route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/static`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Hello world!');
- });
-
- it('Can handle prerendered 404', async () => {
- const url = `http://${server.host}:${server.port}/some-base/missing`;
- const res1 = await fetch(url);
- const res2 = await fetch(url);
- const res3 = await fetch(url);
-
- assert.equal(res1.status, 404);
- assert.equal(res2.status, 404);
- assert.equal(res3.status, 404);
-
- const html1 = await res1.text();
- const html2 = await res2.text();
- const html3 = await res3.text();
-
- assert.equal(html1, html2);
- assert.equal(html2, html3);
-
- const $ = cheerio.load(html1);
-
- assert.equal($('body').text(), 'Page does not exist');
- });
- });
-
- describe('Without base', async () => {
- before(async () => {
- process.env.PRERENDER = false;
- fixture = await loadFixture({
- // inconsequential config that differs between tests
- // to bust cache and prevent modules and their state
- // from being reused
- site: 'https://test.net/',
- root: './fixtures/prerender-404-500/',
- output: 'hybrid',
- outDir: './dist/hybrid-without-base',
- build: {
- client: './dist/hybrid-without-base/client',
- server: './dist/hybrid-without-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render SSR route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/static`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Hello world!');
- });
-
- it('Can handle prerendered 404', async () => {
- const url = `http://${server.host}:${server.port}/missing`;
- const res1 = await fetch(url);
- const res2 = await fetch(url);
- const res3 = await fetch(url);
-
- assert.equal(res1.status, 404);
- assert.equal(res2.status, 404);
- assert.equal(res3.status, 404);
-
- const html1 = await res1.text();
- const html2 = await res2.text();
- const html3 = await res3.text();
-
- assert.equal(html1, html2);
- assert.equal(html2, html3);
-
- const $ = cheerio.load(html1);
-
- assert.equal($('body').text(), 'Page does not exist');
- });
- });
-});
diff --git a/packages/integrations/node/test/prerender.test.js b/packages/integrations/node/test/prerender.test.js
deleted file mode 100644
index e699a1b3c..000000000
--- a/packages/integrations/node/test/prerender.test.js
+++ /dev/null
@@ -1,438 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { after, before, describe, it } from 'node:test';
-import * as cheerio from 'cheerio';
-import nodejs from '../dist/index.js';
-import { loadFixture, waitServerListen } from './test-utils.js';
-
-/**
- * @typedef {import('../../../astro/test/test-utils').Fixture} Fixture
- */
-
-describe('Prerendering', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
- let server;
-
- describe('With base', async () => {
- before(async () => {
- process.env.PRERENDER = true;
-
- fixture = await loadFixture({
- base: '/some-base',
- root: './fixtures/prerender/',
- output: 'server',
- outDir: './dist/with-base',
- build: {
- client: './dist/with-base/client',
- server: './dist/with-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render SSR route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Can render prerendered route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/two`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Two');
- assert.ok(fixture.pathExists('/client/two/index.html'));
- });
-
- it('Can render prerendered route with redirect and query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/two?foo=bar`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Two');
- });
-
- it('Can render prerendered route with query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/two/?foo=bar`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Two');
- });
-
- it('Can render prerendered route without trailing slash', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/two`, {
- redirect: 'manual',
- });
- const html = await res.text();
- const $ = cheerio.load(html);
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Two');
- });
- });
-
- describe('Without base', async () => {
- before(async () => {
- process.env.PRERENDER = true;
-
- fixture = await loadFixture({
- root: './fixtures/prerender/',
- output: 'server',
- outDir: './dist/without-base',
- build: {
- client: './dist/without-base/client',
- server: './dist/without-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render SSR route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Can render prerendered route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/two`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Two');
- assert.ok(fixture.pathExists('/client/two/index.html'));
- });
-
- it('Can render prerendered route with redirect and query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/two?foo=bar`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Two');
- });
-
- it('Can render prerendered route with query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/two/?foo=bar`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Two');
- });
- });
-
- describe('Via integration', () => {
- before(async () => {
- process.env.PRERENDER = false;
- fixture = await loadFixture({
- root: './fixtures/prerender/',
- output: 'server',
- outDir: './dist/via-integration',
- build: {
- client: './dist/via-integration/client',
- server: './dist/via-integration/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- integrations: [
- {
- name: 'test',
- hooks: {
- 'astro:route:setup': ({ route }) => {
- if (route.component.endsWith('two.astro')) {
- route.prerender = true;
- }
- },
- },
- },
- ],
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render SSR route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Can render prerendered route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/two`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Two');
- assert.ok(fixture.pathExists('/client/two/index.html'));
- });
- });
-
- describe('Dev', () => {
- let devServer;
-
- before(async () => {
- process.env.PRERENDER = true;
-
- fixture = await loadFixture({
- root: './fixtures/prerender/',
- output: 'server',
- outDir: './dist/dev',
- build: {
- client: './dist/dev/client',
- server: './dist/dev/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- devServer = await fixture.startDevServer();
- });
-
- after(async () => {
- await devServer.stop();
- delete process.env.PRERENDER;
- });
-
- it('Can render SSR route', async () => {
- const res = await fixture.fetch(`/one`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Can render prerendered route', async () => {
- const res = await fixture.fetch(`/two`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Two');
- });
- });
-});
-
-describe('Hybrid rendering', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
- let server;
-
- describe('With base', () => {
- before(async () => {
- process.env.PRERENDER = false;
- fixture = await loadFixture({
- base: '/some-base',
- root: './fixtures/prerender/',
- output: 'hybrid',
- outDir: './dist/hybrid-with-base',
- build: {
- client: './dist/hybrid-with-base/client',
- server: './dist/hybrid-with-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render SSR route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/two`);
- const html = await res.text();
- const $ = cheerio.load(html);
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Two');
- });
-
- it('Can render prerendered route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- assert.ok(fixture.pathExists('/client/one/index.html'));
- });
-
- it('Can render prerendered route with redirect and query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one?foo=bar`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Can render prerendered route with query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one/?foo=bar`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Can render prerendered route without trailing slash', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one`, {
- redirect: 'manual',
- });
- const html = await res.text();
- const $ = cheerio.load(html);
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
- });
-
- describe('Without base', () => {
- before(async () => {
- process.env.PRERENDER = false;
- fixture = await loadFixture({
- root: './fixtures/prerender/',
- output: 'hybrid',
- outDir: './dist/hybrid-without-base',
- build: {
- client: './dist/hybrid-without-base/client',
- server: './dist/hybrid-without-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render SSR route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/two`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Two');
- });
-
- it('Can render prerendered route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- assert.ok(fixture.pathExists('/client/one/index.html'));
- });
-
- it('Can render prerendered route with redirect and query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one?foo=bar`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Can render prerendered route with query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one/?foo=bar`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
- });
-
- describe('Shared modules', () => {
- before(async () => {
- process.env.PRERENDER = false;
-
- fixture = await loadFixture({
- root: './fixtures/prerender/',
- output: 'hybrid',
- outDir: './dist/hybrid-shared-modules',
- build: {
- client: './dist/hybrid-shared-modules/client',
- server: './dist/hybrid-shared-modules/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render SSR route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/third`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'shared');
- });
- });
-});
diff --git a/packages/integrations/node/test/preview-headers.test.js b/packages/integrations/node/test/preview-headers.test.js
deleted file mode 100644
index 3fd9d0508..000000000
--- a/packages/integrations/node/test/preview-headers.test.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { after, before, describe, it } from 'node:test';
-import nodejs from '../dist/index.js';
-import { loadFixture } from './test-utils.js';
-
-describe('Astro preview headers', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
- let devPreview;
- const headers = {
- astro: 'test',
- };
-
- before(async () => {
- fixture = await loadFixture({
- root: './fixtures/preview-headers/',
- output: 'server',
- adapter: nodejs({ mode: 'standalone' }),
- server: {
- headers,
- },
- });
- await fixture.build();
- devPreview = await fixture.preview();
- });
-
- after(async () => {
- await devPreview.stop();
- });
-
- describe('Preview Headers', () => {
- it('returns custom headers for valid URLs', async () => {
- const result = await fixture.fetch('/');
- assert.equal(result.status, 200);
- assert.equal(Object.fromEntries(result.headers).astro, headers.astro);
- });
- });
-});
diff --git a/packages/integrations/node/test/server-host.test.js b/packages/integrations/node/test/server-host.test.js
deleted file mode 100644
index facd32d47..000000000
--- a/packages/integrations/node/test/server-host.test.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { describe, it } from 'node:test';
-import { hostOptions } from '../dist/standalone.js';
-
-describe('host', () => {
- it('returns "0.0.0.0" when host is true', () => {
- const options = { host: true };
- assert.equal(hostOptions(options.host), '0.0.0.0');
- });
-
- it('returns "localhost" when host is false', () => {
- const options = { host: false };
- assert.equal(hostOptions(options.host), 'localhost');
- });
-
- it('returns the value of host when host is a string', () => {
- const host = '1.1.1.1';
- const options = { host };
- assert.equal(hostOptions(options.host), host);
- });
-});
diff --git a/packages/integrations/node/test/test-utils.js b/packages/integrations/node/test/test-utils.js
deleted file mode 100644
index 10faba5cf..000000000
--- a/packages/integrations/node/test/test-utils.js
+++ /dev/null
@@ -1,81 +0,0 @@
-import { EventEmitter } from 'node:events';
-import httpMocks from 'node-mocks-http';
-import { loadFixture as baseLoadFixture } from '../../../astro/test/test-utils.js';
-
-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) {
- let req = httpMocks.createRequest(reqOptions);
-
- let res = httpMocks.createResponse({
- eventEmitter: EventEmitter,
- req,
- });
-
- let done = toPromise(res);
-
- // Get the response as text
- const text = async () => {
- let 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)) {
- data = Buffer.from(data.buffer);
- }
- return write.call(this, data, encoding);
- };
- res.on('end', () => {
- let chunks = res._getChunks();
- resolve(chunks);
- });
- });
-}
-
-export function buffersToString(buffers) {
- let 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);
- });
-}
diff --git a/packages/integrations/node/test/trailing-slash.test.js b/packages/integrations/node/test/trailing-slash.test.js
deleted file mode 100644
index 9ea8fcddd..000000000
--- a/packages/integrations/node/test/trailing-slash.test.js
+++ /dev/null
@@ -1,452 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { after, before, describe, it } from 'node:test';
-import * as cheerio from 'cheerio';
-import nodejs from '../dist/index.js';
-import { loadFixture, waitServerListen } from './test-utils.js';
-
-/**
- * @typedef {import('../../../astro/test/test-utils').Fixture} Fixture
- */
-
-describe('Trailing slash', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
- let server;
- describe('Always', async () => {
- describe('With base', async () => {
- before(async () => {
- process.env.ASTRO_NODE_AUTOSTART = 'disabled';
- process.env.PRERENDER = true;
-
- fixture = await loadFixture({
- root: './fixtures/trailing-slash/',
- base: '/some-base',
- output: 'hybrid',
- trailingSlash: 'always',
- outDir: './dist/always-with-base',
- build: {
- client: './dist/always-with-base/client',
- server: './dist/always-with-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render prerendered base route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Index');
- });
-
- it('Can render prerendered route with redirect', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one`, {
- redirect: 'manual',
- });
- assert.equal(res.status, 301);
- assert.equal(res.headers.get('location'), '/some-base/one/');
- });
-
- it('Can render prerendered route with redirect and query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one?foo=bar`, {
- redirect: 'manual',
- });
- assert.equal(res.status, 301);
- assert.equal(res.headers.get('location'), '/some-base/one/?foo=bar');
- });
-
- it('Can render prerendered route with query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one/?foo=bar`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Does not add trailing slash to subresource urls', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one.css`);
- const css = await res.text();
-
- assert.equal(res.status, 200);
- assert.equal(css, 'h1 { color: red; }\n');
- });
- });
- describe('Without base', async () => {
- before(async () => {
- process.env.ASTRO_NODE_AUTOSTART = 'disabled';
- process.env.PRERENDER = true;
-
- fixture = await loadFixture({
- root: './fixtures/trailing-slash/',
- output: 'hybrid',
- trailingSlash: 'always',
- outDir: './dist/always-without-base',
- build: {
- client: './dist/always-without-base/client',
- server: './dist/always-without-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render prerendered base route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Index');
- });
-
- it('Can render prerendered route with redirect', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one`, {
- redirect: 'manual',
- });
- assert.equal(res.status, 301);
- assert.equal(res.headers.get('location'), '/one/');
- });
-
- it('Can render prerendered route with redirect and query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one?foo=bar`, {
- redirect: 'manual',
- });
- assert.equal(res.status, 301);
- assert.equal(res.headers.get('location'), '/one/?foo=bar');
- });
-
- it('Can render prerendered route with query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one/?foo=bar`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Does not add trailing slash to subresource urls', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one.css`);
- const css = await res.text();
-
- assert.equal(res.status, 200);
- assert.equal(css, 'h1 { color: red; }\n');
- });
- });
- });
- describe('Never', async () => {
- describe('With base', async () => {
- before(async () => {
- process.env.ASTRO_NODE_AUTOSTART = 'disabled';
- process.env.PRERENDER = true;
-
- fixture = await loadFixture({
- root: './fixtures/trailing-slash/',
- base: '/some-base',
- output: 'hybrid',
- trailingSlash: 'never',
- outDir: './dist/never-with-base',
- build: {
- client: './dist/never-with-base/client',
- server: './dist/never-with-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render prerendered base route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Index');
- });
-
- it('Can render prerendered route with redirect', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one/`, {
- redirect: 'manual',
- });
- assert.equal(res.status, 301);
- assert.equal(res.headers.get('location'), '/some-base/one');
- });
-
- it('Can render prerendered route with redirect and query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one/?foo=bar`, {
- redirect: 'manual',
- });
-
- assert.equal(res.status, 301);
- assert.equal(res.headers.get('location'), '/some-base/one?foo=bar');
- });
-
- it('Can render prerendered route with query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one?foo=bar`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
- });
- describe('Without base', async () => {
- before(async () => {
- process.env.ASTRO_NODE_AUTOSTART = 'disabled';
- process.env.PRERENDER = true;
-
- fixture = await loadFixture({
- root: './fixtures/trailing-slash/',
- output: 'hybrid',
- trailingSlash: 'never',
- outDir: './dist/never-without-base',
- build: {
- client: './dist/never-without-base/client',
- server: './dist/never-without-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render prerendered base route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Index');
- });
-
- it('Can render prerendered route with redirect', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one/`, {
- redirect: 'manual',
- });
- assert.equal(res.status, 301);
- assert.equal(res.headers.get('location'), '/one');
- });
-
- it('Can render prerendered route with redirect and query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one/?foo=bar`, {
- redirect: 'manual',
- });
-
- assert.equal(res.status, 301);
- assert.equal(res.headers.get('location'), '/one?foo=bar');
- });
-
- it('Can render prerendered route and query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one?foo=bar`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
- });
- });
- describe('Ignore', async () => {
- describe('With base', async () => {
- before(async () => {
- process.env.ASTRO_NODE_AUTOSTART = 'disabled';
- process.env.PRERENDER = true;
-
- fixture = await loadFixture({
- root: './fixtures/trailing-slash/',
- base: '/some-base',
- output: 'hybrid',
- trailingSlash: 'ignore',
- outDir: './dist/ignore-with-base',
- build: {
- client: './dist/ignore-with-base/client',
- server: './dist/ignore-with-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render prerendered base route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Index');
- });
-
- it('Can render prerendered route with slash', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one/`, {
- redirect: 'manual',
- });
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Can render prerendered route without slash', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one`, {
- redirect: 'manual',
- });
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Can render prerendered route with slash and query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one/?foo=bar`, {
- redirect: 'manual',
- });
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Can render prerendered route without slash and with query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/some-base/one?foo=bar`, {
- redirect: 'manual',
- });
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
- });
- describe('Without base', async () => {
- before(async () => {
- process.env.ASTRO_NODE_AUTOSTART = 'disabled';
- process.env.PRERENDER = true;
-
- fixture = await loadFixture({
- root: './fixtures/trailing-slash/',
- output: 'hybrid',
- trailingSlash: 'ignore',
- outDir: './dist/ignore-without-base',
- build: {
- client: './dist/ignore-without-base/client',
- server: './dist/ignore-without-base/server',
- },
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- const { startServer } = await fixture.loadAdapterEntryModule();
- let res = startServer();
- server = res.server;
- await waitServerListen(server.server);
- });
-
- after(async () => {
- await server.stop();
- await fixture.clean();
- delete process.env.PRERENDER;
- });
-
- it('Can render prerendered base route', async () => {
- const res = await fetch(`http://${server.host}:${server.port}`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'Index');
- });
-
- it('Can render prerendered route with slash', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one/`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Can render prerendered route without slash', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Can render prerendered route with slash and query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one/?foo=bar`, {
- redirect: 'manual',
- });
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
-
- it('Can render prerendered route without slash and with query params', async () => {
- const res = await fetch(`http://${server.host}:${server.port}/one?foo=bar`);
- const html = await res.text();
- const $ = cheerio.load(html);
-
- assert.equal(res.status, 200);
- assert.equal($('h1').text(), 'One');
- });
- });
- });
-});
diff --git a/packages/integrations/node/test/url.test.js b/packages/integrations/node/test/url.test.js
deleted file mode 100644
index 77ca45836..000000000
--- a/packages/integrations/node/test/url.test.js
+++ /dev/null
@@ -1,115 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { before, describe, it } from 'node:test';
-import { TLSSocket } from 'node:tls';
-import * as cheerio from 'cheerio';
-import nodejs from '../dist/index.js';
-import { createRequestAndResponse, loadFixture } from './test-utils.js';
-
-describe('URL', () => {
- /** @type {import('./test-utils.js').Fixture} */
- let fixture;
-
- before(async () => {
- fixture = await loadFixture({
- root: './fixtures/url/',
- output: 'server',
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- });
-
- it('return http when non-secure', async () => {
- const { handler } = await import('./fixtures/url/dist/server/entry.mjs');
- let { req, res, text } = createRequestAndResponse({
- url: '/',
- });
-
- handler(req, res);
- req.send();
-
- const html = await text();
- assert.equal(html.includes('http:'), true);
- });
-
- it('return https when secure', async () => {
- const { handler } = await import('./fixtures/url/dist/server/entry.mjs');
- let { req, res, text } = createRequestAndResponse({
- socket: new TLSSocket(),
- url: '/',
- });
-
- handler(req, res);
- req.send();
-
- const html = await text();
- assert.equal(html.includes('https:'), true);
- });
-
- it('return http when the X-Forwarded-Proto header is set to http', async () => {
- const { handler } = await import('./fixtures/url/dist/server/entry.mjs');
- let { req, res, text } = createRequestAndResponse({
- headers: { 'X-Forwarded-Proto': 'http' },
- url: '/',
- });
-
- handler(req, res);
- req.send();
-
- const html = await text();
- assert.equal(html.includes('http:'), true);
- });
-
- it('return https when the X-Forwarded-Proto header is set to https', async () => {
- const { handler } = await import('./fixtures/url/dist/server/entry.mjs');
- let { req, res, text } = createRequestAndResponse({
- headers: { 'X-Forwarded-Proto': 'https' },
- url: '/',
- });
-
- handler(req, res);
- req.send();
-
- const html = await text();
- assert.equal(html.includes('https:'), true);
- });
-
- it('includes forwarded host and port in the url', async () => {
- const { handler } = await import('./fixtures/url/dist/server/entry.mjs');
- let { req, res, text } = createRequestAndResponse({
- headers: {
- 'X-Forwarded-Proto': 'https',
- 'X-Forwarded-Host': 'abc.xyz',
- 'X-Forwarded-Port': '444',
- },
- url: '/',
- });
-
- handler(req, res);
- req.send();
-
- const html = await text();
- const $ = cheerio.load(html);
-
- assert.equal($('body').text(), 'https://abc.xyz:444/');
- });
-
- it('accepts port in forwarded host and forwarded port', async () => {
- const { handler } = await import('./fixtures/url/dist/server/entry.mjs');
- let { req, res, text } = createRequestAndResponse({
- headers: {
- 'X-Forwarded-Proto': 'https',
- 'X-Forwarded-Host': 'abc.xyz:444',
- 'X-Forwarded-Port': '444',
- },
- url: '/',
- });
-
- handler(req, res);
- req.send();
-
- const html = await text();
- const $ = cheerio.load(html);
-
- assert.equal($('body').text(), 'https://abc.xyz:444/');
- });
-});
diff --git a/packages/integrations/node/test/well-known-locations.test.js b/packages/integrations/node/test/well-known-locations.test.js
deleted file mode 100644
index 0951d6c27..000000000
--- a/packages/integrations/node/test/well-known-locations.test.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import * as assert from 'node:assert/strict';
-import { after, before, describe, it } from 'node:test';
-import nodejs from '../dist/index.js';
-import { loadFixture } from './test-utils.js';
-
-describe('test URIs beginning with a dot', () => {
- /** @type {import('./test-utils').Fixture} */
- let fixture;
-
- before(async () => {
- fixture = await loadFixture({
- root: './fixtures/well-known-locations/',
- output: 'server',
- adapter: nodejs({ mode: 'standalone' }),
- });
- await fixture.build();
- });
-
- describe('can load well-known URIs', async () => {
- let devPreview;
-
- before(async () => {
- devPreview = await fixture.preview();
- });
-
- after(async () => {
- await devPreview.stop();
- });
-
- it('can load a valid well-known URI', async () => {
- const res = await fixture.fetch('/.well-known/apple-app-site-association');
-
- assert.equal(res.status, 200);
-
- const json = await res.json();
-
- assert.notEqual(json.applinks, {});
- });
-
- it('cannot load a dot folder that is not a well-known URI', async () => {
- const res = await fixture.fetch('/.hidden/file.json');
-
- assert.equal(res.status, 404);
- });
- });
-});