@furystack/websocket-api
Version:
HTTP Api FuryStack package
94 lines • 3.83 kB
JavaScript
import { addStore, InMemoryStore, StoreManager, User } from '@furystack/core';
import { getPort } from '@furystack/core/port-generator';
import { Injector } from '@furystack/inject';
import { DefaultSession, HttpUserContext, ServerManager, useHttpAuthentication, useRestService, } from '@furystack/rest-service';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { WebSocket } from 'ws';
import { WhoAmI } from './actions/whoami.js';
import { useWebsockets } from './helpers.js';
describe('WebSocket Integration tests', () => {
const host = 'localhost';
const path = '/ws';
let i;
let client;
let port;
beforeEach(async () => {
i = new Injector();
port = getPort();
await useRestService({
injector: i,
api: {},
root: '',
port,
hostName: host,
});
addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })).addStore(new InMemoryStore({ model: DefaultSession, primaryKey: 'sessionId' }));
useHttpAuthentication(i, {});
useWebsockets(i, { actions: [WhoAmI], path, port, host });
await new Promise((resolve, reject) => {
i.getInstance(ServerManager)
.getOrCreate({ port })
.then(() => {
client = new WebSocket(`ws://${host}:${port}/ws`);
client
.on('open', () => {
resolve();
})
.on('error', reject);
})
.catch(reject);
});
});
afterEach(async () => {
await i[Symbol.asyncDispose]();
});
const getWhoAmIResult = async (subjectClient) => {
return new Promise((resolve, reject) => {
subjectClient.once('message', (data) => {
resolve(JSON.parse(data.toString()));
});
subjectClient.once('error', reject);
subjectClient.send('whoami');
});
};
describe('Authentication', () => {
it('Should be unauthenticated by default', async () => {
expect((await getWhoAmIResult(client)).currentUser).toBe(null);
});
});
it('Should be authenticated, roles should be updated and should be logged out', async () => {
const testUser = { username: 'test', password: 'test', roles: [] };
const userStore = i.getInstance(StoreManager).getStoreFor(User, 'username');
await userStore.add(testUser);
const userCtx = i.getInstance(HttpUserContext);
let cookie = '';
await userCtx.cookieLogin(testUser, {
setHeader: (_setCookie, cookieValue) => {
cookie = cookieValue;
},
});
const authenticatedClient = await new Promise((done, reject) => {
const cl = new WebSocket(`ws://${host}:${port}/ws`, {
headers: { cookie },
});
cl.once('open', () => {
done(cl);
}).once('error', reject);
});
const whoAmIResult = await getWhoAmIResult(authenticatedClient);
expect(whoAmIResult.currentUser).toEqual(testUser);
await userStore.update(testUser.username, { ...testUser, roles: ['newFancyRole'] });
const updatedWhoAmIResult = await getWhoAmIResult(authenticatedClient);
expect(updatedWhoAmIResult.currentUser.roles).toEqual(['newFancyRole']);
await userCtx.cookieLogout({
headers: {
cookie,
},
}, {
setHeader: vi.fn(),
});
const loggedOutWhoAmIResult = await getWhoAmIResult(authenticatedClient);
expect(loggedOutWhoAmIResult.currentUser).toBe(null);
});
});
//# sourceMappingURL=websocket-integration.spec.js.map