diff --git a/packages/astro/test/astro-response.test.js b/packages/astro/test/astro-response.test.js deleted file mode 100644 index 2440c7362b22..000000000000 --- a/packages/astro/test/astro-response.test.js +++ /dev/null @@ -1,45 +0,0 @@ -// @ts-check -import assert from 'node:assert/strict'; -import { after, before, describe, it } from 'node:test'; -import { loadFixture } from './test-utils.js'; - -// Asset bundling -describe('Returning responses', () => { - /** @type {Awaited>} */ - let fixture; - /** @type {import('./test-utils').DevServer} */ - let devServer; - - before(async () => { - fixture = await loadFixture({ - root: './fixtures/astro-response/', - }); - - devServer = await fixture.startDevServer(); - }); - - after(async () => { - await devServer.stop(); - }); - - it('Works from a page', async () => { - const response = await fixture.fetch('/not-found'); - assert.equal(response.status, 404); - }); - - it('Returns the default 404 is body is null', async () => { - const response = await fixture.fetch('/not-found'); - const html = await response.text(); - - assert.equal(response.status, 404); - assert.equal(html.includes('
Path: /not-found
'), true); - }); - - it('Returns the page is body is not null', async () => { - const response = await fixture.fetch('/not-found-custom'); - const html = await response.text(); - - assert.equal(response.status, 404); - assert.equal(html.includes('Custom 404'), true); - }); -}); diff --git a/packages/astro/test/fixtures/astro-response/package.json b/packages/astro/test/fixtures/astro-response/package.json deleted file mode 100644 index a832534901e2..000000000000 --- a/packages/astro/test/fixtures/astro-response/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "@test/astro-response", - "version": "0.0.0", - "private": true, - "dependencies": { - "astro": "workspace:*" - } -} diff --git a/packages/astro/test/fixtures/astro-response/src/pages/not-found-custom.astro b/packages/astro/test/fixtures/astro-response/src/pages/not-found-custom.astro deleted file mode 100644 index 482331ebc5da..000000000000 --- a/packages/astro/test/fixtures/astro-response/src/pages/not-found-custom.astro +++ /dev/null @@ -1,4 +0,0 @@ ---- -Astro.response.status = 404 ---- -
Custom 404
\ No newline at end of file diff --git a/packages/astro/test/fixtures/astro-response/src/pages/not-found.astro b/packages/astro/test/fixtures/astro-response/src/pages/not-found.astro deleted file mode 100644 index dd339e72b775..000000000000 --- a/packages/astro/test/fixtures/astro-response/src/pages/not-found.astro +++ /dev/null @@ -1,6 +0,0 @@ ---- -return new Response(null, { - status: 404, - statusText: `Not found` -}); ---- diff --git a/packages/astro/test/units/app/astro-response.test.js b/packages/astro/test/units/app/astro-response.test.js new file mode 100644 index 000000000000..0e619bb9e937 --- /dev/null +++ b/packages/astro/test/units/app/astro-response.test.js @@ -0,0 +1,98 @@ +// @ts-check +import assert from 'node:assert/strict'; +import { describe, it } from 'node:test'; +import { App } from '../../../dist/core/app/app.js'; +import { createComponent, render } from '../../../dist/runtime/server/index.js'; +import { createManifest, createRouteInfo } from './test-helpers.js'; + +const notFoundRouteData = { + route: '/not-found', + component: 'src/pages/not-found.astro', + params: [], + pathname: '/not-found', + distURL: [], + pattern: /^\/not-found\/?$/, + segments: [[{ content: 'not-found', dynamic: false, spread: false }]], + type: 'page', + prerender: false, + fallbackRoutes: [], + isIndex: false, + origin: 'project', +}; + +const notFoundCustomRouteData = { + route: '/not-found-custom', + component: 'src/pages/not-found-custom.astro', + params: [], + pathname: '/not-found-custom', + distURL: [], + pattern: /^\/not-found-custom\/?$/, + segments: [[{ content: 'not-found-custom', dynamic: false, spread: false }]], + type: 'page', + prerender: false, + fallbackRoutes: [], + isIndex: false, + origin: 'project', +}; + +const notFoundPage = createComponent(() => { + return new Response(null, { + status: 404, + statusText: 'Not found', + }); +}); + +const notFoundCustomPage = createComponent((result, props, slots) => { + const Astro = result.createAstro(props, slots); + Astro.response.status = 404; + return render`
Custom 404
`; +}); + +const pageMap = new Map([ + [ + notFoundRouteData.component, + async () => ({ + page: async () => ({ + default: notFoundPage, + }), + }), + ], + [ + notFoundCustomRouteData.component, + async () => ({ + page: async () => ({ + default: notFoundCustomPage, + }), + }), + ], +]); + +const app = new App( + createManifest({ + routes: [createRouteInfo(notFoundRouteData), createRouteInfo(notFoundCustomRouteData)], + pageMap, + }), +); + +describe('Returning responses', () => { + it('Works from a page', async () => { + const response = await app.render(new Request('http://example.com/not-found')); + assert.equal(response.status, 404); + }); + + it('Returns the default 404 if body is null', async () => { + const response = await app.render(new Request('http://example.com/not-found')); + const html = await response.text(); + + assert.equal(response.status, 404); + assert.equal(html.includes('
Path: /not-found
'), true); + }); + + it('Returns the page if body is not null', async () => { + const response = await app.render(new Request('http://example.com/not-found-custom')); + const html = await response.text(); + + assert.equal(response.status, 404); + assert.equal(html.includes('Custom 404'), true); + }); +}); diff --git a/packages/astro/test/units/app/error-pages.test.js b/packages/astro/test/units/app/error-pages.test.js index 352a7b83d8ff..325a1ba77562 100644 --- a/packages/astro/test/units/app/error-pages.test.js +++ b/packages/astro/test/units/app/error-pages.test.js @@ -3,60 +3,7 @@ import assert from 'node:assert/strict'; import { describe, it } from 'node:test'; import { App } from '../../../dist/core/app/app.js'; import { createComponent, maybeRenderHead, render } from '../../../dist/runtime/server/index.js'; - -function createManifest({ routes, pageMap, trailingSlash = 'ignore' }) { - const rootDir = new URL('file:///astro-test/'); - const buildDir = new URL('file:///astro-test/dist/'); - - return { - adapterName: 'test-adapter', - routes, - site: undefined, - base: '/', - userAssetsBase: undefined, - trailingSlash, - buildFormat: 'directory', - compressHTML: false, - assetsPrefix: undefined, - renderers: [], - serverLike: true, - clientDirectives: new Map(), - entryModules: {}, - inlinedScripts: new Map(), - assets: new Set(), - componentMetadata: new Map(), - pageModule: undefined, - pageMap, - serverIslandMappings: undefined, - key: Promise.resolve(/** @type {CryptoKey} */ ({})), - i18n: undefined, - middleware: undefined, - actions: undefined, - sessionDriver: undefined, - checkOrigin: false, - allowedDomains: undefined, - sessionConfig: undefined, - cacheDir: rootDir, - srcDir: rootDir, - outDir: buildDir, - rootDir, - publicDir: rootDir, - assetsDir: 'assets', - buildClientDir: buildDir, - buildServerDir: buildDir, - csp: undefined, - image: {}, - shouldInjectCspMetaTags: false, - devToolbar: { - enabled: false, - latestAstroVersion: undefined, - debugInfoOutput: undefined, - placement: undefined, - }, - internalFetchHeaders: undefined, - logLevel: 'silent', - }; -} +import { createManifest } from './test-helpers.js'; describe('App render error pages', () => { it('preserves headers and body for 500 responses from routes', async () => { diff --git a/packages/astro/test/units/app/locals.test.js b/packages/astro/test/units/app/locals.test.js index c5aa18655410..907b4ac74d0b 100644 --- a/packages/astro/test/units/app/locals.test.js +++ b/packages/astro/test/units/app/locals.test.js @@ -2,60 +2,7 @@ import assert from 'node:assert/strict'; import { describe, it } from 'node:test'; import { App } from '../../../dist/core/app/app.js'; import { createComponent, render } from '../../../dist/runtime/server/index.js'; - -function createManifest({ routes, pageMap }) { - const rootDir = new URL('file:///astro-test/'); - const buildDir = new URL('file:///astro-test/dist/'); - - return { - adapterName: 'test-adapter', - routes, - site: undefined, - base: '/', - userAssetsBase: undefined, - trailingSlash: 'ignore', - buildFormat: 'directory', - compressHTML: false, - assetsPrefix: undefined, - renderers: [], - serverLike: true, - clientDirectives: new Map(), - entryModules: {}, - inlinedScripts: new Map(), - assets: new Set(), - componentMetadata: new Map(), - pageModule: undefined, - pageMap, - serverIslandMappings: undefined, - key: Promise.resolve(/** @type {CryptoKey} */ ({})), - i18n: undefined, - middleware: undefined, - actions: undefined, - sessionDriver: undefined, - checkOrigin: false, - allowedDomains: undefined, - sessionConfig: undefined, - cacheDir: rootDir, - srcDir: rootDir, - outDir: buildDir, - rootDir, - publicDir: rootDir, - assetsDir: 'assets', - buildClientDir: buildDir, - buildServerDir: buildDir, - csp: undefined, - image: {}, - shouldInjectCspMetaTags: false, - devToolbar: { - enabled: false, - latestAstroVersion: undefined, - debugInfoOutput: undefined, - placement: undefined, - }, - internalFetchHeaders: undefined, - logLevel: 'silent', - }; -} +import { createManifest } from './test-helpers.js'; const fooRouteData = { route: '/foo', diff --git a/packages/astro/test/units/app/response.test.js b/packages/astro/test/units/app/response.test.js index 2b289e634d77..ad46d52090d3 100644 --- a/packages/astro/test/units/app/response.test.js +++ b/packages/astro/test/units/app/response.test.js @@ -2,60 +2,7 @@ import assert from 'node:assert/strict'; import { describe, it } from 'node:test'; import { App } from '../../../dist/core/app/app.js'; import { createComponent, render } from '../../../dist/runtime/server/index.js'; - -function createManifest({ routes, pageMap }) { - const rootDir = new URL('file:///astro-test/'); - const buildDir = new URL('file:///astro-test/dist/'); - - return { - adapterName: 'test-adapter', - routes, - site: undefined, - base: '/', - userAssetsBase: undefined, - trailingSlash: 'ignore', - buildFormat: 'directory', - compressHTML: false, - assetsPrefix: undefined, - renderers: [], - serverLike: true, - clientDirectives: new Map(), - entryModules: {}, - inlinedScripts: new Map(), - assets: new Set(), - componentMetadata: new Map(), - pageModule: undefined, - pageMap, - serverIslandMappings: undefined, - key: Promise.resolve(/** @type {CryptoKey} */ ({})), - i18n: undefined, - middleware: undefined, - actions: undefined, - sessionDriver: undefined, - checkOrigin: false, - allowedDomains: undefined, - sessionConfig: undefined, - cacheDir: rootDir, - srcDir: rootDir, - outDir: buildDir, - rootDir, - publicDir: rootDir, - assetsDir: 'assets', - buildClientDir: buildDir, - buildServerDir: buildDir, - csp: undefined, - image: {}, - shouldInjectCspMetaTags: false, - devToolbar: { - enabled: false, - latestAstroVersion: undefined, - debugInfoOutput: undefined, - placement: undefined, - }, - internalFetchHeaders: undefined, - logLevel: 'silent', - }; -} +import { createManifest } from './test-helpers.js'; const statusRouteData = { route: '/status-code', diff --git a/packages/astro/test/units/app/test-helpers.js b/packages/astro/test/units/app/test-helpers.js new file mode 100644 index 000000000000..d76a79d47b6a --- /dev/null +++ b/packages/astro/test/units/app/test-helpers.js @@ -0,0 +1,65 @@ +// @ts-check + +export function createManifest({ routes, pageMap, base = '/', trailingSlash = 'ignore' } = {}) { + const rootDir = new URL('file:///astro-test/'); + const buildDir = new URL('file:///astro-test/dist/'); + + return { + adapterName: 'test-adapter', + routes, + site: undefined, + base, + userAssetsBase: undefined, + trailingSlash: /** @type {'always' | 'never' | 'ignore'} */ (trailingSlash), + buildFormat: /** @type {'directory'} */ ('directory'), + compressHTML: false, + assetsPrefix: undefined, + renderers: [], + serverLike: true, + clientDirectives: new Map(), + entryModules: {}, + inlinedScripts: new Map(), + assets: new Set(), + componentMetadata: new Map(), + pageModule: undefined, + pageMap, + serverIslandMappings: undefined, + key: Promise.resolve(/** @type {CryptoKey} */ ({})), + i18n: undefined, + middleware: undefined, + actions: undefined, + sessionDriver: undefined, + checkOrigin: false, + allowedDomains: undefined, + sessionConfig: undefined, + cacheDir: rootDir, + srcDir: rootDir, + outDir: buildDir, + rootDir, + publicDir: rootDir, + assetsDir: 'assets', + buildClientDir: buildDir, + buildServerDir: buildDir, + csp: undefined, + image: {}, + shouldInjectCspMetaTags: false, + devToolbar: { + enabled: false, + latestAstroVersion: undefined, + debugInfoOutput: undefined, + placement: undefined, + }, + internalFetchHeaders: undefined, + logLevel: /** @type {'silent'} */ ('silent'), + }; +} + +export function createRouteInfo(routeData) { + return { + routeData, + file: routeData.component, + links: [], + scripts: [], + styles: [], + }; +} diff --git a/packages/astro/test/units/app/trailing-slash.test.js b/packages/astro/test/units/app/trailing-slash.test.js index 5f5b5f08bc09..063c228e1dc3 100644 --- a/packages/astro/test/units/app/trailing-slash.test.js +++ b/packages/astro/test/units/app/trailing-slash.test.js @@ -2,60 +2,7 @@ import assert from 'node:assert/strict'; import { describe, it } from 'node:test'; import { App } from '../../../dist/core/app/app.js'; import { createComponent, render } from '../../../dist/runtime/server/index.js'; - -function createManifest({ routes, pageMap, base = '/', trailingSlash = 'ignore' }) { - const rootDir = new URL('file:///astro-test/'); - const buildDir = new URL('file:///astro-test/dist/'); - - return { - adapterName: 'test-adapter', - routes, - site: undefined, - base, - userAssetsBase: undefined, - trailingSlash, - buildFormat: 'directory', - compressHTML: false, - assetsPrefix: undefined, - renderers: [], - serverLike: true, - clientDirectives: new Map(), - entryModules: {}, - inlinedScripts: new Map(), - assets: new Set(), - componentMetadata: new Map(), - pageModule: undefined, - pageMap, - serverIslandMappings: undefined, - key: Promise.resolve(/** @type {CryptoKey} */ ({})), - i18n: undefined, - middleware: undefined, - actions: undefined, - sessionDriver: undefined, - checkOrigin: false, - allowedDomains: undefined, - sessionConfig: undefined, - cacheDir: rootDir, - srcDir: rootDir, - outDir: buildDir, - rootDir, - publicDir: rootDir, - assetsDir: 'assets', - buildClientDir: buildDir, - buildServerDir: buildDir, - csp: undefined, - image: {}, - shouldInjectCspMetaTags: false, - devToolbar: { - enabled: false, - latestAstroVersion: undefined, - debugInfoOutput: undefined, - placement: undefined, - }, - internalFetchHeaders: undefined, - logLevel: 'silent', - }; -} +import { createManifest } from './test-helpers.js'; function escapeRoute(route) { return route.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f262bb3308db..d29f6b2cd4ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2467,12 +2467,6 @@ importers: specifier: workspace:* version: link:../../.. - packages/astro/test/fixtures/astro-response: - dependencies: - astro: - specifier: workspace:* - version: link:../../.. - packages/astro/test/fixtures/astro-scripts: dependencies: '@tailwindcss/vite':