Refactor some integration tests (#7303)

This commit is contained in:
Bjorn Lu 2023-06-07 18:04:34 +08:00 committed by GitHub
parent a4176f98b8
commit 9c525d3f11
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 197 additions and 185 deletions

View file

@ -51,7 +51,7 @@ describe('getStaticPaths - dev calls', () => {
});
after(async () => {
devServer.stop();
await devServer.stop();
});
it('only calls getStaticPaths once', async () => {

View file

@ -3,14 +3,20 @@ import * as cheerio from 'cheerio';
import { loadFixture } from './test-utils.js';
import addClasses from './fixtures/astro-markdown-plugins/add-classes.mjs';
async function buildFixture(config) {
const fixture = await loadFixture({
root: './fixtures/astro-markdown-plugins/',
...config,
});
await fixture.build();
return fixture;
}
const defaultMarkdownConfig = {
gfm: true,
smartypants: true,
remarkPlugins: [
remarkExamplePlugin,
'remark-code-titles',
['rehype-autolink-headings', { behavior: 'prepend' }],
],
rehypePlugins: [
'rehype-slug',
['rehype-toc', { headings: ['h2', 'h3'] }],
[addClasses, { 'h1,h2,h3': 'title' }],
],
};
function remarkExamplePlugin() {
return (tree) => {
@ -22,97 +28,96 @@ function remarkExamplePlugin() {
}
describe('Astro Markdown plugins', () => {
it('Can render markdown with plugins', async () => {
const fixture = await buildFixture({
markdown: {
remarkPlugins: [
'remark-code-titles',
['rehype-autolink-headings', { behavior: 'prepend' }],
],
rehypePlugins: [
'rehype-slug',
['rehype-toc', { headings: ['h2', 'h3'] }],
[addClasses, { 'h1,h2,h3': 'title' }],
],
},
});
const html = await fixture.readFile('/index.html');
const $ = cheerio.load(html);
describe('Default test plugins', () => {
let fixture;
// test 1: Added a TOC
expect($('.toc')).to.have.lengthOf(1);
// test 2: Added .title to h1
expect($('#hello-world').hasClass('title')).to.equal(true);
});
// Asserts Astro 1.0 behavior is removed. Test can be removed in Astro 3.0.
it('Still applies default plugins when user plugins are provided', async () => {
const fixture = await buildFixture({
markdown: {
remarkPlugins: [remarkExamplePlugin],
rehypePlugins: [[addClasses, { 'h1,h2,h3': 'title' }]],
},
});
const gfmHtml = await fixture.readFile('/with-gfm/index.html');
const $1 = cheerio.load(gfmHtml);
expect($1('a[href="https://example.com"]')).to.have.lengthOf(1);
const smartypantsHtml = await fixture.readFile('/with-smartypants/index.html');
const $2 = cheerio.load(smartypantsHtml);
expect($2('p').html()).to.equal('“Smartypants” is — awesome');
testRemark(gfmHtml);
testRehype(gfmHtml, '#github-flavored-markdown-test');
});
for (const gfm of [true, false]) {
it(`Handles GFM when gfm = ${gfm}`, async () => {
const fixture = await buildFixture({
markdown: {
remarkPlugins: [remarkExamplePlugin],
rehypePlugins: [[addClasses, { 'h1,h2,h3': 'title' }]],
gfm,
},
before(async () => {
fixture = await loadFixture({
root: './fixtures/astro-markdown-plugins/',
markdown: defaultMarkdownConfig,
});
await fixture.build();
});
it('Can render markdown with plugins', async () => {
const html = await fixture.readFile('/index.html');
const $ = cheerio.load(html);
// test 1: Added a TOC
expect($('.toc')).to.have.lengthOf(1);
// test 2: Added .title to h1
expect($('#hello-world').hasClass('title')).to.equal(true);
});
// Asserts Astro 1.0 behavior is removed. Test can be removed in Astro 3.0.
it('Still applies default plugins when user plugins are provided', async () => {
const gfmHtml = await fixture.readFile('/with-gfm/index.html');
const $1 = cheerio.load(gfmHtml);
expect($1('a[href="https://example.com"]')).to.have.lengthOf(1);
const smartypantsHtml = await fixture.readFile('/with-smartypants/index.html');
const $2 = cheerio.load(smartypantsHtml);
expect($2('p').html()).to.equal('“Smartypants” is — awesome');
testRemark(gfmHtml);
testRehype(gfmHtml, '#github-flavored-markdown-test');
});
it(`Handles GFM when gfm = true`, async () => {
const html = await fixture.readFile('/with-gfm/index.html');
const $ = cheerio.load(html);
// test 1: GFM autolink applied correctly
if (gfm === true) {
expect($('a[href="https://example.com"]')).to.have.lengthOf(1);
} else {
expect($('a[href="https://example.com"]')).to.have.lengthOf(0);
}
expect($('a[href="https://example.com"]')).to.have.lengthOf(1);
testRemark(html);
testRehype(html, '#github-flavored-markdown-test');
});
}
for (const smartypants of [true, false]) {
it(`Handles SmartyPants when smartypants = ${smartypants}`, async () => {
const fixture = await buildFixture({
markdown: {
remarkPlugins: [remarkExamplePlugin],
rehypePlugins: [[addClasses, { 'h1,h2,h3': 'title' }]],
smartypants,
},
});
it(`Handles SmartyPants when smartypants = true`, async () => {
const html = await fixture.readFile('/with-smartypants/index.html');
const $ = cheerio.load(html);
// test 1: GFM autolink applied correctly
if (smartypants === true) {
expect($('p').html()).to.equal('“Smartypants” is — awesome');
} else {
expect($('p').html()).to.equal('"Smartypants" is -- awesome');
}
// test 1: smartypants applied correctly
expect($('p').html()).to.equal('“Smartypants” is — awesome');
testRemark(html);
testRehype(html, '#smartypants-test');
});
}
});
it(`Handles GFM when gfm = false`, async () => {
const fixture = await loadFixture({
root: './fixtures/astro-markdown-plugins/',
markdown: { ...defaultMarkdownConfig, gfm: false },
});
await fixture.build();
const html = await fixture.readFile('/with-gfm/index.html');
const $ = cheerio.load(html);
expect($('a[href="https://example.com"]')).to.have.lengthOf(0);
testRemark(html);
testRehype(html, '#github-flavored-markdown-test');
});
it(`Handles SmartyPants when smartypants = false`, async () => {
const fixture = await loadFixture({
root: './fixtures/astro-markdown-plugins/',
markdown: { ...defaultMarkdownConfig, smartypants: false },
});
await fixture.build();
const html = await fixture.readFile('/with-smartypants/index.html');
const $ = cheerio.load(html);
expect($('p').html()).to.equal('"Smartypants" is -- awesome');
testRemark(html);
testRehype(html, '#smartypants-test');
});
});
function testRehype(html, headingId) {

View file

@ -183,23 +183,3 @@ describe('astro cli', () => {
});
});
});
describe('astro cli i18n', () => {
const LOCALES = ['en_US', 'sv_SE', 'es_419.UTF-8', 'es_ES@euro', 'C'];
LOCALES.forEach((locale) => {
it(`astro does NOT throw on "${locale}" locales`, async () => {
const projectRootURL = new URL('./fixtures/astro-basic/', import.meta.url);
let error = null;
try {
const proc = cli('dev', '--root', fileURLToPath(projectRootURL), {
env: { LANG: locale },
});
await parseCliDevStart(proc);
} catch (e) {
console.log(e);
error = e.message;
}
expect(error).to.be.null;
});
});
});

View file

@ -1,7 +1,6 @@
import { expect } from 'chai';
import { loadFixture } from './test-utils.js';
import { loadFixture, silentLogging } from './test-utils.js';
import testAdapter from './test-adapter.js';
import { nodeLogDestination } from '../dist/core/logger/node.js';
import * as cheerio from 'cheerio';
describe('Astro.clientAddress', () => {
@ -110,11 +109,7 @@ describe('Astro.clientAddress', () => {
before(async () => {
// We expect an error, so silence the output
const logging = {
dest: nodeLogDestination,
level: 'silent',
};
devServer = await fixture.startDevServer({ logging });
devServer = await fixture.startDevServer({ logging: silentLogging });
});
after(async () => {

View file

@ -2,10 +2,10 @@ import { expect } from 'chai';
import * as cheerio from 'cheerio';
import { basename } from 'node:path';
import { Writable } from 'node:stream';
import { fileURLToPath } from 'node:url';
import { removeDir } from '../dist/core/fs/index.js';
import testAdapter from './test-adapter.js';
import { loadFixture } from './test-utils.js';
import { testImageService } from './test-image-service.js';
describe('astro:image', () => {
/** @type {import('./test-utils').Fixture} */
@ -23,6 +23,9 @@ describe('astro:image', () => {
experimental: {
assets: true,
},
image: {
service: testImageService({ foo: 'bar' }),
},
});
devServer = await fixture.startDevServer({
@ -377,6 +380,32 @@ describe('astro:image', () => {
expect($('img').attr('src').includes('/src')).to.equal(true);
});
});
describe('custom service', () => {
it('custom service implements getHTMLAttributes', async () => {
const response = await fixture.fetch('/');
const html = await response.text();
const $ = cheerio.load(html);
expect($('#local img').attr('data-service')).to.equal('my-custom-service');
});
it('custom service works in Markdown', async () => {
const response = await fixture.fetch('/post');
const html = await response.text();
const $ = cheerio.load(html);
expect($('img').attr('data-service')).to.equal('my-custom-service');
});
it('gets service config', async () => {
const response = await fixture.fetch('/');
const html = await response.text();
const $ = cheerio.load(html);
expect($('#local img').attr('data-service-config')).to.equal('bar');
});
});
});
describe('proper errors', () => {
@ -391,6 +420,9 @@ describe('astro:image', () => {
experimental: {
assets: true,
},
image: {
service: testImageService(),
},
});
devServer = await fixture.startDevServer({
@ -456,6 +488,9 @@ describe('astro:image', () => {
experimental: {
assets: true,
},
image: {
service: testImageService(),
},
base: '/blog',
});
await fixture.build();
@ -509,6 +544,9 @@ describe('astro:image', () => {
experimental: {
assets: true,
},
image: {
service: testImageService(),
},
base: '/blog',
});
await fixtureWithBase.build();
@ -530,6 +568,9 @@ describe('astro:image', () => {
experimental: {
assets: true,
},
image: {
service: testImageService(),
},
});
// Remove cache directory
removeDir(new URL('./fixtures/core-image-ssg/node_modules/.astro', import.meta.url));
@ -693,6 +734,9 @@ describe('astro:image', () => {
experimental: {
assets: true,
},
image: {
service: testImageService(),
},
});
devServer = await fixture.startDevServer();
});
@ -717,6 +761,9 @@ describe('astro:image', () => {
experimental: {
assets: true,
},
image: {
service: testImageService(),
},
});
await fixture.build();
});
@ -746,50 +793,4 @@ describe('astro:image', () => {
expect(imgData).to.be.an.instanceOf(Buffer);
});
});
describe('custom service', () => {
/** @type {import('./test-utils').DevServer} */
let devServer;
before(async () => {
fixture = await loadFixture({
root: './fixtures/core-image/',
experimental: {
assets: true,
},
image: {
service: {
entrypoint: fileURLToPath(
new URL('./fixtures/core-image/service.mjs', import.meta.url)
),
config: { foo: 'bar' },
},
},
});
devServer = await fixture.startDevServer();
});
it('custom service implements getHTMLAttributes', async () => {
const response = await fixture.fetch('/');
const html = await response.text();
const $ = cheerio.load(html);
expect($('#local img').attr('data-service')).to.equal('my-custom-service');
});
it('custom service works in Markdown', async () => {
const response = await fixture.fetch('/post');
const html = await response.text();
const $ = cheerio.load(html);
expect($('img').attr('data-service')).to.equal('my-custom-service');
});
it('gets service config', async () => {
const response = await fixture.fetch('/');
const html = await response.text();
const $ = cheerio.load(html);
expect($('#local img').attr('data-service-config')).to.equal('bar');
});
});
});

View file

@ -1,23 +0,0 @@
import squoosh from 'astro/assets/services/squoosh';
const service = {
validateOptions(options) {
return squoosh.validateOptions(options);
},
getURL(options) {
return squoosh.getURL(options);
},
getHTMLAttributes(options, serviceConfig) {
options['data-service'] = 'my-custom-service';
options['data-service-config'] = serviceConfig.foo;
return squoosh.getHTMLAttributes(options);
},
parseURL(url) {
return squoosh.parseURL(url);
},
transform(buffer, options) {
return squoosh.transform(buffer, options);
},
};
export default service;

View file

@ -4,6 +4,6 @@ import { One as OneWrapper } from '../components/One';
<html>
<head><title>Testing</title></head>
<body>
<OneWrapper client:load />
<OneWrapper />
</body>
</html>

View file

@ -33,7 +33,7 @@ describe('HTML minification', () => {
});
after(async () => {
devServer.stop();
await devServer.stop();
});
it('should emit compressed HTML in the emitted file', async () => {

View file

@ -56,7 +56,7 @@ describe('Prerender', () => {
});
after(async () => {
devServer.stop();
await devServer.stop();
});
it('only calls prerender getStaticPaths once', async () => {
@ -188,7 +188,7 @@ describe('Prerender', () => {
});
after(async () => {
devServer.stop();
await devServer.stop();
});
it('only calls hybrid getStaticPaths once', async () => {

View file

@ -0,0 +1,31 @@
import { fileURLToPath } from 'node:url';
import { baseService } from '../dist/assets/services/service.js';
/**
* stub image service that returns images as-is without optimization
* @param {{ foo?: string }} [config]
*/
export function testImageService(config = {}) {
return {
entrypoint: fileURLToPath(import.meta.url),
config,
};
}
/** @type {import("../dist/@types/astro").LocalImageService} */
export default {
...baseService,
getHTMLAttributes(options, serviceConfig) {
options['data-service'] = 'my-custom-service';
if (serviceConfig.foo) {
options['data-service-config'] = serviceConfig.foo;
}
return baseService.getHTMLAttributes(options);
},
async transform(buffer, transform) {
return {
data: buffer,
format: transform.format,
};
},
};

View file

@ -0,0 +1,21 @@
import { expect } from 'chai';
const LOCALES = ['en_US', 'sv_SE', 'es_419.UTF-8', 'es_ES@euro', 'C'];
describe('logger - dateTimeFormat', () => {
const originalLang = process.env.LANG;
after(() => {
process.env.LANG = originalLang;
});
LOCALES.forEach((locale, i) => {
it(`works with process.env.LANG="${locale}"`, async () => {
process.env.LANG = locale;
const { dateTimeFormat } = await import('../../../dist/core/logger/core.js?cachebust=' + i);
expect(() => {
dateTimeFormat.format(new Date());
}).not.to.throw();
});
});
});

View file

@ -20,7 +20,8 @@ describe('<Code />', () => {
it('uses the bundles themes for built-in themes', async () => {
const { resolveHighlighterOptions } = mod;
const opts = await resolveHighlighterOptions({ theme: 'css-variables' });
// NOTE: pass empty `langs` to prevent Shiki from loading all langs by default, which slows down the test
const opts = await resolveHighlighterOptions({ theme: 'css-variables', langs: [] });
const themes = opts.themes;
expect(themes).to.have.a.lengthOf(1);
@ -29,7 +30,8 @@ describe('<Code />', () => {
it('uses the string theme name for custom themes', async () => {
const { resolveHighlighterOptions } = mod;
const opts = await resolveHighlighterOptions({ theme: 'some-custom-theme' });
// NOTE: pass empty `langs` to prevent Shiki from loading all langs by default, which slows down the test
const opts = await resolveHighlighterOptions({ theme: 'some-custom-theme', langs: [] });
const themes = opts.themes;
expect(themes).to.have.a.lengthOf(1);