unleash-server
Version:
Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.
106 lines • 4.06 kB
JavaScript
import noLoggerProvider from '../../fixtures/no-logger.js';
import dbInit from '../helpers/database-init.js';
import SessionService from '../../../lib/services/session-service.js';
import NotFoundError from '../../../lib/error/notfound-error.js';
import { addDays, minutesToMilliseconds } from 'date-fns';
let stores;
let db;
let sessionService;
const newSession = {
sid: 'abc123',
sess: {
cookie: {
originalMaxAge: minutesToMilliseconds(48),
expires: addDays(Date.now(), 1).toDateString(),
secure: false,
httpOnly: true,
path: '/',
},
user: {
id: 1,
username: 'admin',
imageUrl: 'https://gravatar.com/avatar/21232f297a57a5a743894a0e4a801fc3?size=42&default=retro',
seenAt: '2021-04-26T10:59:18.782Z',
loginAttempts: 0,
createdAt: '2021-04-22T05:12:54.368Z',
},
},
};
const otherSession = {
sid: 'xyz321',
sess: {
cookie: {
originalMaxAge: minutesToMilliseconds(48),
expires: addDays(Date.now(), 1).toDateString(),
secure: false,
httpOnly: true,
path: '/',
},
user: {
id: 2,
username: 'editor',
imageUrl: 'https://gravatar.com/avatar/21232f297a57a5a743894a0e4a801fc3?size=42&default=retro',
seenAt: '2021-04-26T10:59:18.782Z',
loginAttempts: 0,
createdAt: '2021-04-22T05:12:54.368Z',
},
},
};
beforeAll(async () => {
db = await dbInit('session_service_serial', noLoggerProvider);
stores = db.stores;
sessionService = new SessionService(stores, {
getLogger: noLoggerProvider,
});
});
beforeEach(async () => {
await db.stores.sessionStore.deleteAll();
});
afterAll(async () => {
if (db) {
await db.destroy();
}
});
test('should list active sessions', async () => {
await sessionService.insertSession(newSession);
await sessionService.insertSession(otherSession);
const sessions = await sessionService.getActiveSessions();
expect(sessions.length).toBe(2);
expect(sessions[0].sess).toEqual(otherSession.sess); // Ordered newest first
expect(sessions[1].sess).toEqual(newSession.sess);
});
test('Should list active sessions for user', async () => {
await sessionService.insertSession(newSession);
await sessionService.insertSession(otherSession);
const sessions = await sessionService.getSessionsForUser(2); // editor session
expect(sessions.length).toBe(1);
expect(sessions[0].sess).toEqual(otherSession.sess);
});
test('Can delete sessions by user', async () => {
await sessionService.insertSession(newSession);
await sessionService.insertSession(otherSession);
const sessions = await sessionService.getActiveSessions();
expect(sessions.length).toBe(2);
await sessionService.deleteSessionsForUser(2);
const noSessions = await sessionService.getSessionsForUser(2);
expect(noSessions.length).toBe(0);
});
test('Can delete session by sid', async () => {
await sessionService.insertSession(newSession);
await sessionService.insertSession(otherSession);
const sessions = await sessionService.getActiveSessions();
expect(sessions.length).toBe(2);
await sessionService.deleteSession('abc123');
await expect(async () => sessionService.getSession('abc123')).rejects.toThrow(NotFoundError);
});
test('Can delete stale sessions', async () => {
await sessionService.insertSession(newSession);
await new Promise((resolve) => setTimeout(resolve, 10)); // Ensure a different createdAt
await sessionService.insertSession({ ...newSession, sid: 'new' });
const sessionsToKeep = 1;
await sessionService.deleteStaleSessionsForUser(newSession.sess.user.id, sessionsToKeep);
const sessions = await sessionService.getSessionsForUser(1);
expect(sessions.length).toBe(1);
expect(sessions[0].sid).toBe('new');
});
//# sourceMappingURL=session-service.e2e.test.js.map