test: add test in the Node adapter for astro:assets (#7734)
This commit is contained in:
parent
31c4031ba7
commit
d5f526b339
8 changed files with 82 additions and 4 deletions
5
.changeset/warm-gifts-jam.md
Normal file
5
.changeset/warm-gifts-jam.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
'astro': patch
|
||||
---
|
||||
|
||||
Fix some global state related to `astro:assets` not getting cleaned out properly in SSR with no pre-rendered pages
|
|
@ -130,7 +130,12 @@ export async function generatePages(opts: StaticBuildOptions, internals: BuildIn
|
|||
? opts.settings.config.build.server
|
||||
: getOutDirWithinCwd(opts.settings.config.outDir);
|
||||
|
||||
if (ssr && !hasPrerenderedPages(internals)) return;
|
||||
// HACK! `astro:assets` relies on a global to know if its running in dev, prod, ssr, ssg, full moon
|
||||
// If we don't delete it here, it's technically not impossible (albeit improbable) for it to leak
|
||||
if (ssr && !hasPrerenderedPages(internals)) {
|
||||
delete globalThis?.astroAsset?.addStaticImage;
|
||||
return;
|
||||
}
|
||||
|
||||
const verb = ssr ? 'prerendering' : 'generating';
|
||||
info(opts.logging, null, `\n${bgGreen(black(` ${verb} static routes `))}`);
|
||||
|
@ -186,7 +191,7 @@ export async function generatePages(opts: StaticBuildOptions, internals: BuildIn
|
|||
await generateImage(opts, imageData[1].options, imageData[1].path);
|
||||
}
|
||||
|
||||
delete globalThis.astroAsset.addStaticImage;
|
||||
delete globalThis?.astroAsset?.addStaticImage;
|
||||
}
|
||||
|
||||
await runHookBuildGenerated({
|
||||
|
|
|
@ -132,14 +132,14 @@ describe('Assets Prefix - Server', () => {
|
|||
expect(island.attr('renderer-url')).to.match(assetsPrefixRegex);
|
||||
});
|
||||
|
||||
it('markdown image src start with assetsPrefix', async () => {
|
||||
it('markdown optimized image src does not start with assetsPrefix in SSR', async () => {
|
||||
const request = new Request('http://example.com/custom-base/markdown/');
|
||||
const response = await app.render(request);
|
||||
expect(response.status).to.equal(200);
|
||||
const html = await response.text();
|
||||
const $ = cheerio.load(html);
|
||||
const imgAsset = $('img');
|
||||
expect(imgAsset.attr('src')).to.match(assetsPrefixRegex);
|
||||
expect(imgAsset.attr('src')).to.not.match(assetsPrefixRegex);
|
||||
});
|
||||
});
|
||||
|
||||
|
|
13
packages/integrations/node/test/fixtures/image/package.json
vendored
Normal file
13
packages/integrations/node/test/fixtures/image/package.json
vendored
Normal file
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"name": "@test/nodejs-image",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"astro": "workspace:*",
|
||||
"@astrojs/node": "workspace:*"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "astro build",
|
||||
"preview": "astro preview"
|
||||
}
|
||||
}
|
BIN
packages/integrations/node/test/fixtures/image/src/assets/some_penguin.png
vendored
Normal file
BIN
packages/integrations/node/test/fixtures/image/src/assets/some_penguin.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 315 KiB |
6
packages/integrations/node/test/fixtures/image/src/pages/index.astro
vendored
Normal file
6
packages/integrations/node/test/fixtures/image/src/pages/index.astro
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
import { Image } from "astro:assets";
|
||||
import penguin from "../assets/some_penguin.png";
|
||||
---
|
||||
|
||||
<Image src={penguin} alt="Penguins" width={50} />
|
40
packages/integrations/node/test/image.test.js
Normal file
40
packages/integrations/node/test/image.test.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
import { expect } from 'chai';
|
||||
import nodejs from '../dist/index.js';
|
||||
import { loadFixture } from './test-utils.js';
|
||||
|
||||
describe('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' }),
|
||||
experimental: {
|
||||
assets: true,
|
||||
},
|
||||
});
|
||||
await fixture.build();
|
||||
devPreview = await fixture.preview();
|
||||
});
|
||||
|
||||
after(async () => {
|
||||
await devPreview.stop();
|
||||
});
|
||||
|
||||
it('it returns images', async () => {
|
||||
const res = await fixture.fetch('/');
|
||||
expect(res.status).to.equal(200);
|
||||
|
||||
const resImage = await fixture.fetch(
|
||||
'/_image?href=/_astro/some_penguin.97ef5f92.png&w=50&f=webp'
|
||||
);
|
||||
|
||||
console.log(resImage);
|
||||
const content = resImage.text();
|
||||
console.log(content);
|
||||
expect(resImage.status).to.equal(200);
|
||||
});
|
||||
});
|
|
@ -4620,6 +4620,15 @@ importers:
|
|||
specifier: workspace:*
|
||||
version: link:../../../../../astro
|
||||
|
||||
packages/integrations/node/test/fixtures/image:
|
||||
dependencies:
|
||||
'@astrojs/node':
|
||||
specifier: workspace:*
|
||||
version: link:../../..
|
||||
astro:
|
||||
specifier: workspace:*
|
||||
version: link:../../../../../astro
|
||||
|
||||
packages/integrations/node/test/fixtures/locals:
|
||||
dependencies:
|
||||
'@astrojs/node':
|
||||
|
|
Loading…
Reference in a new issue