0
Fork 0
mirror of https://github.com/withastro/astro.git synced 2025-03-10 23:01:26 -05:00
astro/packages/integrations/cloudflare/test/routes-json.test.js
Alexander Niebuhr 03f15c41f1 chore: update adapters to better support astro v5 (#454)
Co-authored-by: Florian Lefebvre <contact@florian-lefebvre.dev>
2025-01-07 16:52:23 +01:00

343 lines
7.4 KiB
JavaScript

import * as assert from 'node:assert/strict';
import { before, describe, it } from 'node:test';
import { loadFixture } from '@astrojs/test-utils';
import cloudflare from '../dist/index.js';
/** @type {import('./test-utils.js').Fixture} */
describe('_routes.json generation', () => {
describe('of on-demand and prerenderd', () => {
let fixture;
before(async () => {
fixture = await loadFixture({
root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
srcDir: './src/mixed',
adapter: cloudflare({}),
});
await fixture.build();
});
it('creates `include` for on-demand and `exclude` for prerenderd', async () => {
const _routesJson = await fixture.readFile('/_routes.json');
const routes = JSON.parse(_routesJson);
assert.deepEqual(routes, {
version: 1,
include: ['/_server-islands/*', '/_image', '/a/*'],
exclude: ['/_astro/*', '/redirectme', '/public.txt', '/a', '/a/redirect', '/404', '/b'],
});
});
});
describe('of only on-demand', () => {
let fixture;
before(async () => {
fixture = await loadFixture({
root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
srcDir: './src/dynamicOnly',
adapter: cloudflare({}),
});
await fixture.build();
});
it('creates a wildcard `include` and `exclude` only for static assets and redirects', async () => {
const _routesJson = await fixture.readFile('/_routes.json');
const routes = JSON.parse(_routesJson);
assert.deepEqual(routes, {
version: 1,
include: ['/*'],
exclude: ['/_astro/*', '/redirectme', '/public.txt', '/a/*'],
});
});
});
describe('of only prerenderd', () => {
let fixture;
before(async () => {
fixture = await loadFixture({
root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
srcDir: './src/staticOnly',
adapter: cloudflare({}),
});
await fixture.build();
});
it('create only one `include` and `exclude` that are supposed to match nothing', async () => {
const _routesJson = await fixture.readFile('/_routes.json');
const routes = JSON.parse(_routesJson);
assert.deepEqual(routes, {
version: 1,
include: [],
exclude: [],
});
});
});
describe('with additional `include` entries', () => {
let fixture;
before(async () => {
fixture = await loadFixture({
root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
srcDir: './src/mixed',
adapter: cloudflare({
routes: {
extend: {
include: [{ pattern: '/another' }],
},
},
}),
});
await fixture.build();
});
it('creates `include` for functions and `exclude` for static files where needed', async () => {
const _routesJson = await fixture.readFile('/_routes.json');
const routes = JSON.parse(_routesJson);
assert.deepEqual(routes, {
version: 1,
include: ['/_server-islands/*', '/_image', '/a/*', '/another'],
exclude: ['/_astro/*', '/redirectme', '/public.txt', '/a', '/a/redirect', '/404', '/b'],
});
});
});
describe('with additional `exclude` entries', () => {
let fixture;
before(async () => {
fixture = await loadFixture({
root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
srcDir: './src/mixed',
adapter: cloudflare({
routes: {
extend: {
exclude: [{ pattern: '/another' }, { pattern: '/a/index.html' }],
},
},
}),
});
await fixture.build();
});
it('creates `include` for functions and `exclude` for static files where needed', async () => {
const _routesJson = await fixture.readFile('/_routes.json');
const routes = JSON.parse(_routesJson);
assert.deepEqual(routes, {
version: 1,
include: ['/_server-islands/*', '/_image', '/a/*'],
exclude: [
'/_astro/*',
'/redirectme',
'/public.txt',
'/a',
'/a/redirect',
'/404',
'/b',
'/another',
'/a/index.html',
],
});
});
});
describe('with nested on demand and prerendered routes', () => {
let fixture;
before(async () => {
fixture = await loadFixture({
root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
srcDir: './src/reduceComplexity',
adapter: cloudflare({}),
});
await fixture.build();
});
it('reduces the amount of include and exclude entries by applying wildcards wherever possible', async () => {
const _routesJson = await fixture.readFile('/_routes.json');
const routes = JSON.parse(_routesJson);
assert.deepEqual(routes, {
version: 1,
include: [
'/',
'/_server-islands/*',
'/_image',
'/dynamicPages/*',
'/mixedPages/dynamic',
'/mixedPages/subfolder/dynamic',
],
exclude: [
'/_astro/*',
'/redirectme',
'/public.txt',
'/a/*',
'/404',
'/mixedPages/static',
'/mixedPages/subfolder/static',
'/staticPages/*',
],
});
});
});
describe('with many static files', () => {
let fixture;
before(async () => {
fixture = await loadFixture({
root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
srcDir: './src/manyStatic',
adapter: cloudflare({}),
});
await fixture.build();
});
it('creates a wildcard `include` and `exclude` for as many static assets and redirects as possible, truncating after 100 rules', async () => {
const _routesJson = await fixture.readFile('/_routes.json');
const routes = JSON.parse(_routesJson);
assert.deepEqual(routes, {
version: 1,
include: ['/*'],
exclude: [
'/_astro/*',
'/redirectme',
'/public.txt',
'/a/*',
...Array.from({ length: 95 }, (_, i) => `/${i}`),
],
});
});
});
describe('with many static files when a static 404 is present', () => {
let fixture;
before(async () => {
fixture = await loadFixture({
root: new URL('./fixtures/routes-json/', import.meta.url).toString(),
srcDir: './src/manyStaticWith404',
adapter: cloudflare({}),
});
await fixture.build();
});
it('creates `include` for on-demand and `exclude` that are supposed to match nothing', async () => {
const _routesJson = await fixture.readFile('/_routes.json');
const routes = JSON.parse(_routesJson);
assert.deepEqual(routes, {
version: 1,
include: ['/*'],
exclude: [
'/_astro/*',
'/redirectme',
'/public.txt',
'/a/*',
'/404',
'/0',
'/1',
'/2',
'/3',
'/4',
'/5',
'/6',
'/7',
'/8',
'/9',
'/10',
'/11',
'/12',
'/13',
'/14',
'/15',
'/16',
'/17',
'/18',
'/19',
'/20',
'/21',
'/22',
'/23',
'/24',
'/25',
'/26',
'/27',
'/28',
'/29',
'/30',
'/31',
'/32',
'/33',
'/34',
'/35',
'/36',
'/37',
'/38',
'/39',
'/40',
'/41',
'/42',
'/43',
'/44',
'/45',
'/46',
'/47',
'/48',
'/49',
'/50',
'/51',
'/52',
'/53',
'/54',
'/55',
'/56',
'/57',
'/58',
'/59',
'/60',
'/61',
'/62',
'/63',
'/64',
'/65',
'/66',
'/67',
'/68',
'/69',
'/70',
'/71',
'/72',
'/73',
'/74',
'/75',
'/76',
'/77',
'/78',
'/79',
'/80',
'/81',
'/82',
'/83',
'/84',
'/85',
'/86',
'/87',
'/88',
'/89',
'/90',
'/91',
'/92',
'/93',
],
});
});
});
});