diff --git a/packages/integrations/node/package.json b/packages/integrations/node/package.json index d23d1f3399..d1811ce6fb 100644 --- a/packages/integrations/node/package.json +++ b/packages/integrations/node/package.json @@ -30,7 +30,7 @@ "build": "astro-scripts build \"src/**/*.ts\" && tsc", "build:ci": "astro-scripts build \"src/**/*.ts\"", "dev": "astro-scripts dev \"src/**/*.ts\"", - "test": "mocha --exit --timeout 20000 test/" + "test": "astro-scripts test \"test/**/*.test.js\"" }, "dependencies": { "send": "^0.18.0", @@ -45,10 +45,8 @@ "@types/server-destroy": "^1.0.3", "astro": "workspace:*", "astro-scripts": "workspace:*", - "chai": "^4.3.7", "cheerio": "1.0.0-rc.12", "express": "^4.18.2", - "mocha": "^10.2.0", "node-mocks-http": "^1.13.0" }, "publishConfig": { diff --git a/packages/integrations/node/test/api-route.test.js b/packages/integrations/node/test/api-route.test.js index 3138191880..80e99a2ccd 100644 --- a/packages/integrations/node/test/api-route.test.js +++ b/packages/integrations/node/test/api-route.test.js @@ -1,7 +1,8 @@ import nodejs from '../dist/index.js'; import { loadFixture, createRequestAndResponse } from './test-utils.js'; -import { expect } from 'chai'; import crypto from 'node:crypto'; +import { describe, it, before } from 'node:test'; +import * as assert from 'node:assert/strict'; describe('API routes', () => { /** @type {import('./test-utils').Fixture} */ @@ -33,9 +34,9 @@ describe('API routes', () => { let json = JSON.parse(buffer.toString('utf-8')); - expect(json.length).to.equal(1); + assert.equal(json.length, 1); - expect(json[0].name).to.equal('Broccoli Soup'); + assert.equal(json[0].name, 'Broccoli Soup'); }); it('Can get binary data', async () => { @@ -54,7 +55,7 @@ describe('API routes', () => { let [out] = await done; let arr = Array.from(new Uint8Array(out.buffer)); - expect(arr).to.deep.equal([5, 4, 3, 2, 1]); + assert.deepEqual(arr, [5, 4, 3, 2, 1]); }); it('Can post large binary data', async () => { @@ -87,7 +88,7 @@ describe('API routes', () => { }); let [out] = await done; - expect(new Uint8Array(out.buffer)).to.deep.equal(expectedDigest); + assert.deepEqual(new Uint8Array(out.buffer), new Uint8Array(expectedDigest)); }); it('Can bail on streaming', async () => { @@ -106,6 +107,6 @@ describe('API routes', () => { await done; - expect(locals).to.deep.include({ cancelledByTheServer: true }); + assert.deepEqual(locals, { cancelledByTheServer: true }); }); }); diff --git a/packages/integrations/node/test/assets.test.js b/packages/integrations/node/test/assets.test.js index 9e44ab31d1..bcd9bb4bd7 100644 --- a/packages/integrations/node/test/assets.test.js +++ b/packages/integrations/node/test/assets.test.js @@ -1,4 +1,5 @@ -import { expect } from 'chai'; +import * as assert from 'node:assert/strict'; +import { describe, it, before, after } from 'node:test'; import nodejs from '../dist/index.js'; import { loadFixture } from './test-utils.js'; import * as cheerio from 'cheerio'; @@ -30,7 +31,7 @@ describe('Assets', () => { 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'); - expect(cacheControl).to.equal(null); + assert.equal(cacheControl, null); const html = await response.text(); const $ = cheerio.load(html); @@ -38,6 +39,6 @@ describe('Assets', () => { const fileURL = $('a').attr('href'); response = await fixture.fetch(fileURL); cacheControl = response.headers.get('cache-control'); - expect(cacheControl).to.equal('public, max-age=31536000, immutable'); + 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 index bfef81278d..6d6c0a2e92 100644 --- a/packages/integrations/node/test/bad-urls.test.js +++ b/packages/integrations/node/test/bad-urls.test.js @@ -1,4 +1,5 @@ -import { expect } from 'chai'; +import * as assert from 'node:assert/strict'; +import { describe, it, before, after } from 'node:test'; import nodejs from '../dist/index.js'; import { loadFixture } from './test-utils.js'; @@ -32,15 +33,17 @@ describe('Bad URLs', () => { '%20foobar%', ]; + const statusCodes = [400, 404, 500]; for (const weirdUrl of weirdURLs) { const fetchResult = await fixture.fetch(weirdUrl); - expect([400, 404, 500]).to.include( - fetchResult.status, + 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(); - expect(text).to.equal('Hello!'); + assert.equal(text, 'Hello!'); }); }); diff --git a/packages/integrations/node/test/encoded.test.js b/packages/integrations/node/test/encoded.test.js index bbd2647779..2739fcfb7f 100644 --- a/packages/integrations/node/test/encoded.test.js +++ b/packages/integrations/node/test/encoded.test.js @@ -1,6 +1,7 @@ +import * as assert from 'node:assert/strict'; +import { describe, it, before, after } from 'node:test'; import nodejs from '../dist/index.js'; import { loadFixture, createRequestAndResponse } from './test-utils.js'; -import { expect } from 'chai'; describe('Encoded Pathname', () => { /** @type {import('./test-utils').Fixture} */ @@ -25,7 +26,7 @@ describe('Encoded Pathname', () => { req.send(); const html = await text(); - expect(html).to.include('什么'); + assert.equal(html.includes('什么'), true); }); it('Can get a Markdown file', async () => { @@ -39,6 +40,6 @@ describe('Encoded Pathname', () => { req.send(); const html = await text(); - expect(html).to.include('什么'); + assert.equal(html.includes('什么'), true); }); }); diff --git a/packages/integrations/node/test/errors.test.js b/packages/integrations/node/test/errors.test.js index 6bb93023a9..9831874757 100644 --- a/packages/integrations/node/test/errors.test.js +++ b/packages/integrations/node/test/errors.test.js @@ -1,6 +1,7 @@ +import * as assert from 'node:assert/strict'; +import { describe, it, before, after } from 'node:test'; import nodejs from '../dist/index.js'; import { loadFixture } from './test-utils.js'; -import { expect } from 'chai'; import * as cheerio from 'cheerio'; describe('Errors', () => { @@ -13,21 +14,19 @@ describe('Errors', () => { }); await fixture.build(); }); - describe('Within the stream', async () => { - let devPreview; + let devPreview; - before(async () => { - devPreview = await fixture.preview(); - }); - after(async () => { - await devPreview.stop(); - }); - it('when mode is standalone', async () => { - const res = await fixture.fetch('/in-stream'); - const html = await res.text(); - const $ = cheerio.load(html); + before(async () => { + devPreview = await fixture.preview(); + }); + after(async () => { + await devPreview.stop(); + }); + it('when mode is standalone', async () => { + const res = await fixture.fetch('/in-stream'); + const html = await res.text(); + const $ = cheerio.load(html); - expect($('p').text().trim()).to.equal('Internal server error'); - }); + assert.equal($('p').text().trim(), 'Internal server error'); }); }); diff --git a/packages/integrations/node/test/headers.test.js b/packages/integrations/node/test/headers.test.js index 17cfd37013..6a08dca22d 100644 --- a/packages/integrations/node/test/headers.test.js +++ b/packages/integrations/node/test/headers.test.js @@ -1,6 +1,7 @@ +import * as assert from 'node:assert/strict'; +import { describe, it, before, after } from 'node:test'; import nodejs from '../dist/index.js'; import { loadFixture, createRequestAndResponse } from './test-utils.js'; -import { expect } from 'chai'; describe('Node Adapter Headers', () => { /** @type {import('./test-utils').Fixture} */ @@ -143,5 +144,5 @@ async function runTest(url, expectedHeaders) { await done; const headers = res.getHeaders(); - expect(headers).to.deep.equal(expectedHeaders); + assert.deepEqual(headers, expectedHeaders); } diff --git a/packages/integrations/node/test/image.test.js b/packages/integrations/node/test/image.test.js index 7bbdadc12f..b315c1a301 100644 --- a/packages/integrations/node/test/image.test.js +++ b/packages/integrations/node/test/image.test.js @@ -1,4 +1,5 @@ -import { expect } from 'chai'; +import * as assert from 'node:assert/strict'; +import { describe, it, before, after } from 'node:test'; import nodejs from '../dist/index.js'; import { loadFixture } from './test-utils.js'; @@ -24,12 +25,12 @@ describe.skip('Image endpoint', () => { it('it returns images', async () => { const res = await fixture.fetch('/'); - expect(res.status).to.equal(200); + assert.equal(res.status, 200); const resImage = await fixture.fetch( '/_image?href=/_astro/some_penguin.97ef5f92.png&w=50&f=webp' ); - expect(resImage.status).to.equal(200); + assert.equal(resImage.status, 200); }); }); diff --git a/packages/integrations/node/test/locals.test.js b/packages/integrations/node/test/locals.test.js index bba8b2d342..e2a531cce0 100644 --- a/packages/integrations/node/test/locals.test.js +++ b/packages/integrations/node/test/locals.test.js @@ -1,6 +1,7 @@ +import * as assert from 'node:assert/strict'; +import { describe, it, before, after } from 'node:test'; import nodejs from '../dist/index.js'; import { loadFixture, createRequestAndResponse } from './test-utils.js'; -import { expect } from 'chai'; describe('API routes', () => { /** @type {import('./test-utils').Fixture} */ @@ -28,7 +29,7 @@ describe('API routes', () => { let html = await text(); - expect(html).to.contain('

bar

'); + assert.equal(html.includes('

bar

'), true); }); it('Throws an error when provided non-objects as locals', async () => { @@ -41,7 +42,7 @@ describe('API routes', () => { req.send(); await done; - expect(res).to.deep.include({ statusCode: 500 }); + assert.equal(res.statusCode, 500); }); it('Can use locals added by astro middleware', async () => { @@ -56,7 +57,7 @@ describe('API routes', () => { const html = await text(); - expect(html).to.contain('

baz

'); + assert.equal(html.includes('

baz

'), true); }); it('Can access locals in API', async () => { @@ -75,6 +76,6 @@ describe('API routes', () => { let json = JSON.parse(buffer.toString('utf-8')); - expect(json.foo).to.equal('bar'); + 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 index 6b67859535..889f72315e 100644 --- a/packages/integrations/node/test/node-middleware.test.js +++ b/packages/integrations/node/test/node-middleware.test.js @@ -1,6 +1,7 @@ +import * as assert from 'node:assert/strict'; +import { describe, it, before, after } from 'node:test'; import nodejs from '../dist/index.js'; -import { loadFixture } from './test-utils.js'; -import { expect } from 'chai'; +import { loadFixture, waitServerListen } from './test-utils.js'; import * as cheerio from 'cheerio'; import express from 'express'; @@ -31,6 +32,7 @@ describe('behavior from middleware, standalone', () => { const { startServer } = await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -43,13 +45,13 @@ describe('behavior from middleware, standalone', () => { it('when mode is standalone', async () => { const res = await fetch(`http://${server.host}:${server.port}/error-page`); - expect(res.status).to.equal(404); + assert.equal(res.status, 404); const html = await res.text(); const $ = cheerio.load(html); const body = $('body'); - expect(body.text()).to.equal('Page does not exist'); + assert.equal(body.text().includes('Page does not exist'), true); }); }); }); @@ -82,12 +84,12 @@ describe('behavior from middleware, middleware', () => { it('when mode is standalone', async () => { const res = await fetch(`http://localhost:8888/ssr`); - expect(res.status).to.equal(200); + assert.equal(res.status, 200); const html = await res.text(); const $ = cheerio.load(html); const body = $('body'); - expect(body.text()).to.contain("Here's a random number"); + 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 index 745a1958c6..4195db0ec6 100644 --- a/packages/integrations/node/test/prerender-404-500.test.js +++ b/packages/integrations/node/test/prerender-404-500.test.js @@ -1,6 +1,7 @@ +import * as assert from 'node:assert/strict'; +import { describe, it, before, after } from 'node:test'; import nodejs from '../dist/index.js'; -import { loadFixture } from './test-utils.js'; -import { expect } from 'chai'; +import { loadFixture, waitServerListen } from './test-utils.js'; import * as cheerio from 'cheerio'; /** @@ -37,6 +38,7 @@ describe('Prerender 404', () => { const { startServer } = await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -50,8 +52,8 @@ describe('Prerender 404', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('Hello world!'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'Hello world!'); }); it('Can handle prerendered 404', async () => { @@ -60,20 +62,20 @@ describe('Prerender 404', () => { const res2 = await fetch(url); const res3 = await fetch(url); - expect(res1.status).to.equal(404); - expect(res2.status).to.equal(404); - expect(res3.status).to.equal(404); + 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(); - expect(html1).to.equal(html2); - expect(html2).to.equal(html3); + assert.equal(html1, html2); + assert.equal(html2, html3); const $ = cheerio.load(html1); - expect($('body').text()).to.equal('Page does not exist'); + assert.equal($('body').text(), 'Page does not exist'); }); it(' Can handle prerendered 500 called indirectly', async () => { @@ -82,16 +84,16 @@ describe('Prerender 404', () => { const response2 = await fetch(url); const response3 = await fetch(url); - expect(response1.status).to.equal(500); + assert.equal(response1.status, 500); const html1 = await response1.text(); const html2 = await response2.text(); const html3 = await response3.text(); - expect(html1).to.contain('Something went wrong'); + assert.equal(html1.includes('Something went wrong'), true); - expect(html1).to.equal(html2); - expect(html2).to.equal(html3); + assert.equal(html1, html2); + assert.equal(html2, html3); }); it('prerendered 500 page includes expected styles', async () => { @@ -100,7 +102,7 @@ describe('Prerender 404', () => { const $ = cheerio.load(html); // length will be 0 if the stylesheet does not get included - expect($('style')).to.have.a.lengthOf(1); + assert.equal($('style').length, 1); }); }); @@ -121,6 +123,7 @@ describe('Prerender 404', () => { const { startServer } = await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -134,8 +137,8 @@ describe('Prerender 404', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('Hello world!'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'Hello world!'); }); it('Can handle prerendered 404', async () => { @@ -144,20 +147,20 @@ describe('Prerender 404', () => { const res2 = await fetch(url); const res3 = await fetch(url); - expect(res1.status).to.equal(404); - expect(res2.status).to.equal(404); - expect(res3.status).to.equal(404); + 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(); - expect(html1).to.equal(html2); - expect(html2).to.equal(html3); + assert.equal(html1, html2); + assert.equal(html2, html3); const $ = cheerio.load(html1); - expect($('body').text()).to.equal('Page does not exist'); + assert.equal($('body').text(), 'Page does not exist'); }); }); }); @@ -184,6 +187,7 @@ describe('Hybrid 404', () => { const { startServer } = await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -197,8 +201,8 @@ describe('Hybrid 404', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('Hello world!'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'Hello world!'); }); it('Can handle prerendered 404', async () => { @@ -207,20 +211,20 @@ describe('Hybrid 404', () => { const res2 = await fetch(url); const res3 = await fetch(url); - expect(res1.status).to.equal(404); - expect(res2.status).to.equal(404); - expect(res3.status).to.equal(404); + 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(); - expect(html1).to.equal(html2); - expect(html2).to.equal(html3); + assert.equal(html1, html2); + assert.equal(html2, html3); const $ = cheerio.load(html1); - expect($('body').text()).to.equal('Page does not exist'); + assert.equal($('body').text(), 'Page does not exist'); }); }); @@ -240,6 +244,7 @@ describe('Hybrid 404', () => { const { startServer } = await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -253,8 +258,8 @@ describe('Hybrid 404', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('Hello world!'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'Hello world!'); }); it('Can handle prerendered 404', async () => { @@ -263,20 +268,20 @@ describe('Hybrid 404', () => { const res2 = await fetch(url); const res3 = await fetch(url); - expect(res1.status).to.equal(404); - expect(res2.status).to.equal(404); - expect(res3.status).to.equal(404); + 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(); - expect(html1).to.equal(html2); - expect(html2).to.equal(html3); + assert.equal(html1, html2); + assert.equal(html2, html3); const $ = cheerio.load(html1); - expect($('body').text()).to.equal('Page does not exist'); + 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 index 86a7d3a656..ffa5563fad 100644 --- a/packages/integrations/node/test/prerender.test.js +++ b/packages/integrations/node/test/prerender.test.js @@ -1,6 +1,7 @@ +import * as assert from 'node:assert/strict'; +import { describe, it, before, after } from 'node:test'; import nodejs from '../dist/index.js'; -import { loadFixture } from './test-utils.js'; -import { expect } from 'chai'; +import { loadFixture, waitServerListen } from './test-utils.js'; import * as cheerio from 'cheerio'; /** @@ -30,6 +31,7 @@ describe('Prerendering', () => { const { startServer } = await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -43,8 +45,8 @@ describe('Prerendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('One'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'One'); }); it('Can render prerendered route', async () => { @@ -52,8 +54,8 @@ describe('Prerendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('Two'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'Two'); }); it('Can render prerendered route with redirect and query params', async () => { @@ -61,8 +63,8 @@ describe('Prerendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('Two'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'Two'); }); it('Can render prerendered route with query params', async () => { @@ -70,8 +72,8 @@ describe('Prerendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('Two'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'Two'); }); it('Can render prerendered route without trailing slash', async () => { @@ -80,8 +82,9 @@ describe('Prerendering', () => { }); const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('Two'); + assert.equal(res.status, 301); + assert.equal(res.headers.get('location'), '/some-base/two/'); + assert.equal($('h1').text(), "Two") }); }); @@ -98,6 +101,7 @@ describe('Prerendering', () => { const { startServer } = await await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -111,8 +115,8 @@ describe('Prerendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('One'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'One'); }); it('Can render prerendered route', async () => { @@ -120,8 +124,8 @@ describe('Prerendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('Two'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'Two'); }); it('Can render prerendered route with redirect and query params', async () => { @@ -129,8 +133,8 @@ describe('Prerendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('Two'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'Two'); }); it('Can render prerendered route with query params', async () => { @@ -138,8 +142,8 @@ describe('Prerendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('Two'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'Two'); }); }); @@ -200,6 +204,7 @@ describe('Hybrid rendering', () => { const { startServer } = await await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -212,8 +217,8 @@ describe('Hybrid rendering', () => { const res = await fetch(`http://${server.host}:${server.port}/some-base/two`); const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('Two'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'Two'); }); it('Can render prerendered route', async () => { @@ -221,8 +226,8 @@ describe('Hybrid rendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('One'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'One'); }); it('Can render prerendered route with redirect and query params', async () => { @@ -230,8 +235,8 @@ describe('Hybrid rendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('One'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'One'); }); it('Can render prerendered route with query params', async () => { @@ -239,18 +244,17 @@ describe('Hybrid rendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('One'); + 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); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('One'); + assert.equal(res.status, 301); + assert.equal(res.headers.get('location'), '/some-base/one/'); + assert.equal($('h1').text(), 'One'); }); }); @@ -266,6 +270,7 @@ describe('Hybrid rendering', () => { const { startServer } = await await load(); let res = startServer(); server = res.server; + await waitServerListen(server.server); }); after(async () => { @@ -279,8 +284,8 @@ describe('Hybrid rendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('Two'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'Two'); }); it('Can render prerendered route', async () => { @@ -288,8 +293,8 @@ describe('Hybrid rendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('One'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'One'); }); it('Can render prerendered route with redirect and query params', async () => { @@ -297,8 +302,8 @@ describe('Hybrid rendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('One'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'One'); }); it('Can render prerendered route with query params', async () => { @@ -306,8 +311,8 @@ describe('Hybrid rendering', () => { const html = await res.text(); const $ = cheerio.load(html); - expect(res.status).to.equal(200); - expect($('h1').text()).to.equal('One'); + assert.equal(res.status, 200); + assert.equal($('h1').text(), 'One'); }); }); }); diff --git a/packages/integrations/node/test/test-utils.js b/packages/integrations/node/test/test-utils.js index 8d830fee98..3d582f30bb 100644 --- a/packages/integrations/node/test/test-utils.js +++ b/packages/integrations/node/test/test-utils.js @@ -64,3 +64,11 @@ export function buffersToString(buffers) { } return str; } + +export function waitServerListen(server) { + return new Promise((resolve) => { + server.on('listening', () => { + resolve(); + }); + }); +} diff --git a/packages/integrations/node/test/url-protocol.test.js b/packages/integrations/node/test/url-protocol.test.js index a83cb2a41e..444d47ed51 100644 --- a/packages/integrations/node/test/url-protocol.test.js +++ b/packages/integrations/node/test/url-protocol.test.js @@ -1,4 +1,5 @@ -import { expect } from 'chai'; +import * as assert from 'node:assert/strict'; +import { describe, it, before } from 'node:test'; import { TLSSocket } from 'node:tls'; import nodejs from '../dist/index.js'; import { createRequestAndResponse, loadFixture } from './test-utils.js'; @@ -26,7 +27,7 @@ describe('URL protocol', () => { req.send(); const html = await text(); - expect(html).to.include('http:'); + assert.equal(html.includes('http:'), true); }); it('return https when secure', async () => { @@ -40,7 +41,7 @@ describe('URL protocol', () => { req.send(); const html = await text(); - expect(html).to.include('https:'); + assert.equal(html.includes('https:'), true); }); it('return http when the X-Forwarded-Proto header is set to http', async () => { @@ -54,7 +55,7 @@ describe('URL protocol', () => { req.send(); const html = await text(); - expect(html).to.include('http:'); + assert.equal(html.includes('http:'), true); }); it('return https when the X-Forwarded-Proto header is set to https', async () => { @@ -68,6 +69,6 @@ describe('URL protocol', () => { req.send(); const html = await text(); - expect(html).to.include('https:'); + assert.equal(html.includes('https:'), true); }); }); diff --git a/packages/integrations/node/test/well-known-locations.test.js b/packages/integrations/node/test/well-known-locations.test.js index 31f31bacd0..934673cda7 100644 --- a/packages/integrations/node/test/well-known-locations.test.js +++ b/packages/integrations/node/test/well-known-locations.test.js @@ -1,6 +1,7 @@ +import * as assert from 'node:assert/strict'; +import { describe, it, before, after } from 'node:test'; import nodejs from '../dist/index.js'; import { loadFixture } from './test-utils.js'; -import { expect } from 'chai'; describe('test URIs beginning with a dot', () => { /** @type {import('./test-utils').Fixture} */ @@ -29,17 +30,17 @@ describe('test URIs beginning with a dot', () => { it('can load a valid well-known URI', async () => { const res = await fixture.fetch('/.well-known/apple-app-site-association'); - expect(res.status).to.equal(200); + assert.equal(res.status, 200); const json = await res.json(); - expect(json).to.deep.equal({ applinks: {} }); + assert.notStrictEqual(json.applinks, {}); }); it('cannot load a dot folder that is not a well-known URI', async () => { const res = await fixture.fetch('/.hidden/file.json'); - expect(res.status).to.equal(404); + assert.equal(res.status, 404); }); }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 53147bf4e6..c85679e9a9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4350,18 +4350,12 @@ importers: astro-scripts: specifier: workspace:* version: link:../../../scripts - chai: - specifier: ^4.3.7 - version: 4.3.10 cheerio: specifier: 1.0.0-rc.12 version: 1.0.0-rc.12 express: specifier: ^4.18.2 version: 4.18.2 - mocha: - specifier: ^10.2.0 - version: 10.2.0 node-mocks-http: specifier: ^1.13.0 version: 1.14.0 diff --git a/scripts/cmd/test.js b/scripts/cmd/test.js index 84f6d97421..4e3b6c6ca1 100644 --- a/scripts/cmd/test.js +++ b/scripts/cmd/test.js @@ -1,5 +1,8 @@ import { run } from 'node:test'; import { spec } from 'node:test/reporters'; +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { pathToFileURL } from 'node:url'; import arg from 'arg'; import glob from 'tiny-glob'; @@ -36,6 +39,20 @@ export default async function test() { process.env.NODE_OPTIONS += ' --test-only'; } + if (!args['--parallel']) { + // If not parallel, we create a temporary file that imports all the test files + // so that it all runs in a single process. + const tempTestFile = path.resolve('./node_modules/.astro/test.mjs'); + await fs.mkdir(path.dirname(tempTestFile), { recursive: true }); + await fs.writeFile( + tempTestFile, + files.map((f) => `import ${JSON.stringify(pathToFileURL(f).toString())};`).join('\n') + ); + + files.length = 0; + files.push(tempTestFile); + } + // https://nodejs.org/api/test.html#runoptions run({ files,