From 4a7b87f3237f79d0d31b19890d9b2464c403545a Mon Sep 17 00:00:00 2001 From: Richard Walker Date: Mon, 18 Nov 2024 14:58:51 +1300 Subject: [PATCH] test: refactor and expand streaming tests --- tests/layout.test.js | 155 --------------- tests/streaming.test.js | 424 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 424 insertions(+), 155 deletions(-) create mode 100644 tests/streaming.test.js diff --git a/tests/layout.test.js b/tests/layout.test.js index a8eedbcf..cd1fa3fe 100644 --- a/tests/layout.test.js +++ b/tests/layout.test.js @@ -731,158 +731,3 @@ tap.test('Proxy - builds correct proxy url', async (t) => { s1.stop(); s2.stop(); }); - -const podlet = (name, port, assets) => { - const app = express(); - const podlet = new Podlet({ - name, - version: '1.0.0', - pathname: '/', - }); - if (assets && assets.js) { - podlet.js({ value: assets.js, type: 'module' }); - } - if (assets && assets.css) { - podlet.css({ value: assets.css, rel: 'stylesheet', type: 'text/css' }); - } - app.use(podlet.middleware()); - app.get('/manifest.json', (req, res) => res.send(podlet)); - app.get(podlet.content(), (req, res) => res.send(`
${name}
`)); - return stoppable(app.listen(port), 0); -}; - -tap.test('HTTP Streaming', async (t) => { - const p1 = podlet('podlet-registered-name-1', 5053); - const p2 = podlet('podlet-registered-name-2', 5054); - - const app = express(); - const layout = new Layout({ name: 'my-layout', pathname: '/' }); - const p1Client = layout.client.register({ - name: 'podlet-registered-name-1', - uri: 'http://0.0.0.0:5053/manifest.json', - }); - const p2Client = layout.client.register({ - name: 'podlet-registered-name-2', - uri: 'http://0.0.0.0:5054/manifest.json', - }); - app.use(layout.middleware()); - app.get(layout.pathname(), async (req, res) => { - const incoming = res.locals.podium; - const p1fetch = p1Client.fetch(incoming); - const p2fetch = p2Client.fetch(incoming); - - const stream = res.podiumStream(); - - const [p1Content, p2Content] = await Promise.all([p1fetch, p2fetch]); - - stream.send(`
${p1Content}
${p2Content}
`); - - stream.done(); - }); - const l1 = stoppable(app.listen(5064), 0); - - const result = await fetch('http://0.0.0.0:5064'); - const html = await result.text(); - t.match(html, //); - t.match(html, /<\/html>/); - t.match( - html, - /
podlet-registered-name-1<\/div><\/div>
podlet-registered-name-2<\/div><\/div>/, - '', - ); - - p1.stop(); - p2.stop(); - l1.stop(); -}); - -tap.test('HTTP Streaming - with assets', async (t) => { - const p1 = podlet('podlet-registered-name-1', 5073, { - js: '/podlet-registered-name-1.js', - css: '/podlet-registered-name-1.css', - }); - const p2 = podlet('podlet-registered-name-2', 5074, { - js: '/podlet-registered-name-2.js', - css: '/podlet-registered-name-2.css', - }); - - const app = express(); - const layout = new Layout({ name: 'my-layout', pathname: '/' }); - const p1Client = layout.client.register({ - name: 'podlet-registered-name-1', - uri: 'http://0.0.0.0:5073/manifest.json', - }); - const p2Client = layout.client.register({ - name: 'podlet-registered-name-2', - uri: 'http://0.0.0.0:5074/manifest.json', - }); - app.use(layout.middleware()); - app.get(layout.pathname(), async (req, res) => { - const incoming = res.locals.podium; - const p1fetch = p1Client.stream(incoming); - const p2fetch = p2Client.stream(incoming); - - p1fetch.once('beforeStream', ({ js, css }) => { - incoming.js.push(...js); - incoming.css.push(...css); - }); - p2fetch.once('beforeStream', ({ js, css }) => { - incoming.js.push(...js); - incoming.css.push(...css); - }); - - await new Promise((resolve) => { - function checkForAssets() { - if (incoming.js.length === 2 || incoming.css.length === 2) { - resolve(true); - } else { - setTimeout(checkForAssets, 100); - } - } - checkForAssets(); - }); - - const stream = res.podiumStream(); - - const chunks1 = []; - for await (const chunk of p1fetch) { - chunks1.push(chunk); - } - const p1Content = Buffer.concat(chunks1).toString(); - - const chunks2 = []; - for await (const chunk of p2fetch) { - chunks2.push(chunk); - } - const p2Content = Buffer.concat(chunks2).toString(); - - stream.send(`
${p1Content}
${p2Content}
`); - stream.done(); - }); - const l1 = stoppable(app.listen(5075), 0); - - const result = await fetch('http://0.0.0.0:5075'); - const html = await result.text(); - - t.match(html, //); - t.match( - html, - //, - ); - t.match( - html, - //, - ); - t.match( - html, - /
podlet-registered-name-1<\/div><\/div>
podlet-registered-name-2<\/div><\/div>/, - '', - ); - t.match(html, /