Skip to content

Commit

Permalink
test(e2e): add sse test
Browse files Browse the repository at this point in the history
  • Loading branch information
chimurai committed Apr 29, 2023
1 parent b1a1c7e commit 8857ca5
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 0 deletions.
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
"@commitlint/cli": "17.6.1",
"@commitlint/config-conventional": "17.6.1",
"@types/debug": "4.1.7",
"@types/eventsource": "1.1.11",
"@types/express": "4.17.17",
"@types/is-glob": "4.0.2",
"@types/jest": "29.5.1",
Expand All @@ -63,12 +64,14 @@
"@types/ws": "8.5.4",
"@typescript-eslint/eslint-plugin": "5.59.0",
"@typescript-eslint/parser": "5.59.0",
"better-sse": "0.8.0",
"body-parser": "1.20.2",
"browser-sync": "2.29.1",
"connect": "3.7.0",
"eslint": "8.39.0",
"eslint-config-prettier": "8.8.0",
"eslint-plugin-prettier": "4.2.1",
"eventsource": "2.0.2",
"express": "4.18.2",
"get-port": "5.1.1",
"husky": "8.0.3",
Expand Down
86 changes: 86 additions & 0 deletions test/e2e/sse.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import type * as http from 'http';
import { createSession } from 'better-sse';
import * as EventSource from 'eventsource';
import * as express from 'express';
import * as getPort from 'get-port';
import { createAppWithPath, createProxyMiddleware } from './test-kit';
import { RequestHandler } from '../../src';

describe('E2E SSE proxy', () => {
let proxyServer: http.Server;
let targetSSEServer: http.Server;

const targetSSEApp = express();

targetSSEApp.get('/sse', async (req, res) => {
const session = await createSession(req, res);

// push 4x messages to client (stop character: Ø)
'123Ø'.split('').forEach((val, index) => {
setTimeout(() => {
session.push(`Hello world! (sse message #${val})`);
}, index * 100);
});
});

let sseProxyMiddleware: RequestHandler;

beforeEach(async () => {
const targetSSEServerPort = await getPort();

return new Promise((resolve: any) => {
sseProxyMiddleware = createProxyMiddleware({
target: `http://localhost:${targetSSEServerPort}/sse`,
});

targetSSEServer = targetSSEApp.listen(targetSSEServerPort, resolve);
});
});

afterEach(() => {
return Promise.all([
new Promise((resolve) => targetSSEServer.close(resolve)),
new Promise((resolve) => proxyServer.close(resolve)),
]);
});

it('should proxy SSE request', async () => {
const freePort = await getPort();
proxyServer = createAppWithPath('/sse', sseProxyMiddleware).listen(freePort);

const sse = new EventSource(`http://localhost:${freePort}/sse`);

async function* receiveSseMessages() {
while (true) {
const message: string = await new Promise((resolve, reject) => {
sse.addEventListener('message', ({ data }) => resolve(data));
sse.addEventListener('error', (err) => reject(err));
});

yield message;

// stop generator
if (message.includes('#Ø')) {
return;
}
}
}

const receivedMessages: string[] = [];

for await (const message of receiveSseMessages()) {
receivedMessages.push(message);
}

expect(receivedMessages).toMatchInlineSnapshot(`
[
""Hello world! (sse message #1)"",
""Hello world! (sse message #2)"",
""Hello world! (sse message #3)"",
""Hello world! (sse message #Ø)"",
]
`);

sse.close();
});
});
15 changes: 15 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -987,6 +987,11 @@
dependencies:
"@types/ms" "*"

"@types/eventsource@1.1.11":
version "1.1.11"
resolved "https://registry.yarnpkg.com/@types/eventsource/-/eventsource-1.1.11.tgz#a2c0bfd0436b7db42ed1b2b2117f7ec2e8478dc7"
integrity sha512-L7wLDZlWm5mROzv87W0ofIYeQP5K2UhoFnnUyEWLKM6UBb0ZNRgAqp98qE5DkgfBXdWfc2kYmw9KZm4NLjRbsw==

"@types/express-serve-static-core@^4.17.33":
version "4.17.33"
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543"
Expand Down Expand Up @@ -1523,6 +1528,11 @@ batch@0.6.1:
resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==

better-sse@0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/better-sse/-/better-sse-0.8.0.tgz#2939fae49209f3e00d16da3edfe039a09a941177"
integrity sha512-ymOse8R0L+R2S1W85yOGkkc+yTzAmo52S4erjxPyBVwpqjpS+X228BG7hDwgKsGV/D51YhCYd+eaDwJ+sL5JhA==

binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
Expand Down Expand Up @@ -2497,6 +2507,11 @@ eventemitter3@^4.0.0:
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==

eventsource@2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508"
integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==

execa@^5.0.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
Expand Down

0 comments on commit 8857ca5

Please sign in to comment.